From 7081b93b8ed4f98c628400e05d22d0523f41a842 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 27 Feb 2021 12:24:37 +0100 Subject: Fixing #16 - Adding support for custom config file in user directory --- minishell_test/config.py | 192 ++++++++++++++++++++++------------------------- 1 file changed, 89 insertions(+), 103 deletions(-) (limited to 'minishell_test/config.py') diff --git a/minishell_test/config.py b/minishell_test/config.py index ac5b3ca..8f2f712 100644 --- a/minishell_test/config.py +++ b/minishell_test/config.py @@ -3,118 +3,104 @@ # ::: :::::::: # # config.py :+: :+: :+: # # +:+ +:+ +:+ # -# By: charles +#+ +:+ +#+ # +# By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # -# Created: 2020/07/15 18:24:19 by charles #+# #+# # -# Updated: 2021/02/24 07:50:26 by cacharle ### ########.fr # +# Created: 2021/02/26 09:40:36 by cacharle #+# #+# # +# Updated: 2021/02/27 12:18:55 by cacharle ### ########.fr # # # # ############################################################################ # -################################################################################ -# Minishell configuration file # -################################################################################ - import os +import sys +import configparser +import inspect import shutil -import distutils.spawn -from typing import List - -# run the bonus tests -# can be changed with `export MINISHELL_TEST_BONUS=yes` in your shell rc file. -BONUS = False - -# minishell dir path -MINISHELL_DIR = "." - -# minishell executable -MINISHELL_EXEC = "minishell" - -# make minishell before executing the test if set to True -MINISHELL_MAKE = True - -# path to reference shell (shell which will be compared minishell) -# has to support the -c option (sh, bash and zsh support it) -REFERENCE_PATH = "/bin/bash" -# can be changed with `export MINISHELL_TEST_ARGS=--poxix,--otherarg` -REFERENCE_ARGS: List[str] = [] # ["--posix"] - -# pager to use with --pager option -# can be changed with `export MINISHELL_TEST_PAGER=yourpager` -PAGER = "less" - -# log file path -LOG_PATH = "minishell_test_result.log" - -# path to the sandbox directory -# WARNING: will be rm -rf so be careful -SANDBOX_PATH = "sandbox" - -# where the availables commands are stored -EXECUTABLES_PATH = "/tmp/minishell_test_bin" - -# commands available in test" -AVAILABLE_COMMANDS = ["rmdir", "env", "cat", "touch", "ls", "grep", "sh", "head"] - -# $PATH environment variable passed to the shell -PATH_VARIABLE = os.path.abspath(EXECUTABLES_PATH) - -# test timeout -TIMEOUT = 0.5 - -# check leaks test timeout -CHECK_LEAKS_TIMEOUT = 10 - -LOREM = """ -Mollitia asperiores assumenda excepturi et ipsa. Nihil corporis facere aut a rem consequatur. -Quas molestiae corporis et quibusdam maiores. Molestiae sed unde aut at sed. -Deserunt quidem quidem aspernatur pariatur vel illum voluptatum. Culpa unde dolor aspernatur sit. -Mollitia tenetur sed eaque autem placeat a aut in. Ipsam ea consequuntur omnis. -Non et qui vel corrupti similique eum aut voluptatibus. Iste consequatur voluptatum et omnis debitis. -Sit quia neque nihil consequatur sint. Velit libero ut aut et et rerum. -Placeat cumque incidunt non repellat sunt perspiciatis ullam. -Repellendus repudiandae nostrum quia quis corrupti. -Rerum veniam earum cumque pariatur accusantium voluptatum omnis. -Alias ut et et adipisci. Tempore omnis numquam ullam et animi et eveniet. -Dolor itaque distinctio in. Magnam rerum quia est laboriosam repellat perspiciatis eos. -Consequuntur quae corrupti atque. Numquam enim ut ut. -Perspiciatis ut maxime et libero quo voluptas consequatur illum. Pariatur porro dolor cumque molestiae harum. -""" -LOREM = ' '.join(LOREM.split('\n')) - -############################################################################### -# You probably shouldn't edit after # -############################################################################### - -MINISHELL_PATH = os.path.abspath( - os.path.join(MINISHELL_DIR, MINISHELL_EXEC) -) - -VALGRIND_CMD: List[str] = [ - distutils.spawn.find_executable("valgrind") or "couldn't find valgrind", - # "valgrind", - "--trace-children=no", - "--leak-check=yes", - "--child-silent-after-fork=yes", - "--show-leak-kinds=definite", - MINISHELL_PATH, -] - -# 0, 1, 2 -VERBOSE_LEVEL = 1 - -MINISHELL_ERROR_BEGIN = os.path.basename(MINISHELL_PATH) + ": " -REFERENCE_ERROR_BEGIN = REFERENCE_PATH + ": line 0: " +import distutils +from pathlib import Path -TERM_COLS = shutil.get_terminal_size().columns -if TERM_COLS < 40: - raise RuntimeError("You're terminal isn't wide enough") +import minishell_test.data +from minishell_test.args import parse_args + + +DATA_DIR = Path(inspect.getfile(minishell_test.data)).parent +CONFIG_FILENAME = Path('minishell_test.cfg') + +config = configparser.ConfigParser() +config.read(DATA_DIR / 'default.cfg') + +# TODO check user_config for unkown stuff +user_config = configparser.ConfigParser() +user_config.read(Path(".") / CONFIG_FILENAME) +config.read_dict({**config, **user_config}) + +args = parse_args() + +BONUS = config.getboolean('minishell_test', 'bonus') +EXEC_NAME = Path(config.get('minishell_test', 'exec_name')) +MAKE = config.getboolean('minishell_test', 'make') +PAGER = config.getboolean('minishell_test', 'pager') +PAGER_PROG = config.get('minishell_test', 'pager_prog') +LOG_PATH = Path(config.get('minishell_test', 'log_path')) + +SHELL_AVAILABLE_COMMANDS = config.get('shell', 'available_commands').strip().split('\n') +SHELL_PATH_VARIABLE = config.get('shell', 'path_variable') + +SHELL_REFERENCE_PATH = Path(config.get('shell:reference', 'path')) -PLATFORM = os.uname().sysname +reference_args = config.get('shell:reference', 'args') +SHELL_REFERENCE_ARGS = reference_args.strip().split(' ') if len(reference_args) != 0 else [] -EXIT_FIRST = False +TIMEOUT_TEST = config.getfloat('timeout', 'test') +TIMEOUT_LEAKS = config.getfloat('timeout', 'leaks') -CHECK_LEAKS = False -SHOW_RANGE = False +xdg_cache_home = os.environ.get('XDG_CACHE_HOME') +home = os.environ.get('HOME') +if xdg_cache_home is not None: + CACHE_DIR = Path(xdg_cache_home) / 'minishell_test' +elif home is not None: + CACHE_DIR = Path(home) / '.cache' / 'minishell_test' +else: + CACHE_DIR = Path('.cache', 'minishell_test') + +SANDBOX_DIR = CACHE_DIR / 'sandbox' +SHELL_AVAILABLE_COMMANDS_DIR = CACHE_DIR / 'bin' + +SHELL_PATH_VARIABLE = SHELL_PATH_VARIABLE.format(shell_available_commands_dir=SHELL_AVAILABLE_COMMANDS_DIR) + +with open(DATA_DIR / 'lorem') as f: + LOREM = ' '.join(f.read().split('\n')) + +MINISHELL_DIR = Path(args.path) +MINISHELL_EXEC_PATH = MINISHELL_DIR / EXEC_NAME + +EXIT_FIRST = args.exit_first +RANGE = args.range +CHECK_LEAKS = args.check_leaks + +if RANGE is not None or CHECK_LEAKS: + SHOW_RANGE = True +else: + SHOW_RANGE = args.show_range + +if CHECK_LEAKS: + valgrind_path = distutils.spawn.find_executable("valgrind") + if valgrind_path is None: + raise RuntimeError("Could not find valgrind command on your system") + VALGRIND_CMD = [ + str(valgrind_path), + "--trace-children=no", + "--leak-check=yes", + "--child-silent-after-fork=yes", + "--show-leak-kinds=definite", + str(MINISHELL_EXEC_PATH), + ] + +TERM_COLS = shutil.get_terminal_size().columns +if TERM_COLS < 40: + raise RuntimeError("You're terminal isn't wide enough 40 cols minimum required") -RANGE = None +PLATFORM = sys.platform +supported = ['linux', 'darwin'] +if PLATFORM not in supported: + raise RuntimeError("Your platform ({PLATFORM}) is not supported, supported platforms are: {', '.join(supported)}") -- cgit From c92f2be21c6be2d44cd836dd7f362e545b9a1a90 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 27 Feb 2021 14:46:21 +0100 Subject: Added make_args and check_error_messages configuration options --- minishell_test/config.py | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) (limited to 'minishell_test/config.py') diff --git a/minishell_test/config.py b/minishell_test/config.py index 8f2f712..ab40afe 100644 --- a/minishell_test/config.py +++ b/minishell_test/config.py @@ -6,7 +6,7 @@ # By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2021/02/26 09:40:36 by cacharle #+# #+# # -# Updated: 2021/02/27 12:18:55 by cacharle ### ########.fr # +# Updated: 2021/02/27 14:44:12 by cacharle ### ########.fr # # # # ############################################################################ # @@ -25,30 +25,47 @@ from minishell_test.args import parse_args DATA_DIR = Path(inspect.getfile(minishell_test.data)).parent CONFIG_FILENAME = Path('minishell_test.cfg') -config = configparser.ConfigParser() + +class ConfigParser(configparser.ConfigParser): + def __init__(self): + super().__init__(self) + + def getpath(self, section, options): + return Path(self.get(section, options)).resolve() + + def getargs(self, section, options): + value = self.get(section, options) + return value.strip().split(' ') if len(value) != 0 else [] + + def getmultiline(self, section, options): + return self.get(section, options).strip().split('\n') + + + +config = ConfigParser() config.read(DATA_DIR / 'default.cfg') # TODO check user_config for unkown stuff -user_config = configparser.ConfigParser() +user_config = ConfigParser() user_config.read(Path(".") / CONFIG_FILENAME) config.read_dict({**config, **user_config}) args = parse_args() BONUS = config.getboolean('minishell_test', 'bonus') -EXEC_NAME = Path(config.get('minishell_test', 'exec_name')) +EXEC_NAME = config.get('minishell_test', 'exec_name') MAKE = config.getboolean('minishell_test', 'make') +MAKE_ARGS = config.getargs('minishell_test', 'make_args') PAGER = config.getboolean('minishell_test', 'pager') PAGER_PROG = config.get('minishell_test', 'pager_prog') -LOG_PATH = Path(config.get('minishell_test', 'log_path')) +LOG_PATH = config.getpath('minishell_test', 'log_path') +CHECK_ERROR_MESSAGES = config.getboolean('minishell_test', 'check_error_messages') -SHELL_AVAILABLE_COMMANDS = config.get('shell', 'available_commands').strip().split('\n') +SHELL_AVAILABLE_COMMANDS = config.getmultiline('shell', 'available_commands') SHELL_PATH_VARIABLE = config.get('shell', 'path_variable') -SHELL_REFERENCE_PATH = Path(config.get('shell:reference', 'path')) - -reference_args = config.get('shell:reference', 'args') -SHELL_REFERENCE_ARGS = reference_args.strip().split(' ') if len(reference_args) != 0 else [] +SHELL_REFERENCE_PATH = config.getpath('shell:reference', 'path') +SHELL_REFERENCE_ARGS = config.getargs('shell:reference', 'args') TIMEOUT_TEST = config.getfloat('timeout', 'test') TIMEOUT_LEAKS = config.getfloat('timeout', 'leaks') @@ -63,7 +80,7 @@ elif home is not None: else: CACHE_DIR = Path('.cache', 'minishell_test') -SANDBOX_DIR = CACHE_DIR / 'sandbox' +SANDBOX_DIR = CACHE_DIR / 'sandbox' SHELL_AVAILABLE_COMMANDS_DIR = CACHE_DIR / 'bin' SHELL_PATH_VARIABLE = SHELL_PATH_VARIABLE.format(shell_available_commands_dir=SHELL_AVAILABLE_COMMANDS_DIR) @@ -71,7 +88,7 @@ SHELL_PATH_VARIABLE = SHELL_PATH_VARIABLE.format(shell_available_commands_dir=SH with open(DATA_DIR / 'lorem') as f: LOREM = ' '.join(f.read().split('\n')) -MINISHELL_DIR = Path(args.path) +MINISHELL_DIR = Path(args.path).resolve() MINISHELL_EXEC_PATH = MINISHELL_DIR / EXEC_NAME EXIT_FIRST = args.exit_first -- cgit From 0cf5f137f886bd4e80868dcf2cf74b3f3b2c28d3 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 27 Feb 2021 15:43:07 +0100 Subject: Fixing #10 - bash error line with number 0 or 1 --- minishell_test/config.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'minishell_test/config.py') diff --git a/minishell_test/config.py b/minishell_test/config.py index ab40afe..5a45e8b 100644 --- a/minishell_test/config.py +++ b/minishell_test/config.py @@ -6,7 +6,7 @@ # By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2021/02/26 09:40:36 by cacharle #+# #+# # -# Updated: 2021/02/27 14:44:12 by cacharle ### ########.fr # +# Updated: 2021/02/27 15:13:19 by cacharle ### ########.fr # # # # ############################################################################ # @@ -22,11 +22,12 @@ import minishell_test.data from minishell_test.args import parse_args -DATA_DIR = Path(inspect.getfile(minishell_test.data)).parent -CONFIG_FILENAME = Path('minishell_test.cfg') +DATA_DIR = Path(inspect.getfile(minishell_test.data)).parent class ConfigParser(configparser.ConfigParser): + BOOLEAN_STATES = {'true': True, 'false': False} + def __init__(self): super().__init__(self) @@ -41,16 +42,19 @@ class ConfigParser(configparser.ConfigParser): return self.get(section, options).strip().split('\n') +args = parse_args() +MINISHELL_DIR = Path(args.path).resolve() + +CONFIG_FILENAME = Path('minishell_test.cfg') config = ConfigParser() config.read(DATA_DIR / 'default.cfg') # TODO check user_config for unkown stuff user_config = ConfigParser() -user_config.read(Path(".") / CONFIG_FILENAME) +user_config.read(MINISHELL_DIR / CONFIG_FILENAME) config.read_dict({**config, **user_config}) -args = parse_args() BONUS = config.getboolean('minishell_test', 'bonus') EXEC_NAME = config.get('minishell_test', 'exec_name') @@ -70,7 +74,6 @@ SHELL_REFERENCE_ARGS = config.getargs('shell:reference', 'args') TIMEOUT_TEST = config.getfloat('timeout', 'test') TIMEOUT_LEAKS = config.getfloat('timeout', 'leaks') - xdg_cache_home = os.environ.get('XDG_CACHE_HOME') home = os.environ.get('HOME') if xdg_cache_home is not None: @@ -88,9 +91,11 @@ SHELL_PATH_VARIABLE = SHELL_PATH_VARIABLE.format(shell_available_commands_dir=SH with open(DATA_DIR / 'lorem') as f: LOREM = ' '.join(f.read().split('\n')) -MINISHELL_DIR = Path(args.path).resolve() MINISHELL_EXEC_PATH = MINISHELL_DIR / EXEC_NAME +MINISHELL_PREFIX = EXEC_NAME + ": " +SHELL_REFERENCE_PREFIX = str(SHELL_REFERENCE_PATH) + ": " + EXIT_FIRST = args.exit_first RANGE = args.range CHECK_LEAKS = args.check_leaks -- cgit From 820d1ee00975d2e7859e4b2aded88dbf56a3b347 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sat, 27 Feb 2021 16:12:34 +0100 Subject: Added configuration file section/key names check --- minishell_test/config.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'minishell_test/config.py') diff --git a/minishell_test/config.py b/minishell_test/config.py index 5a45e8b..1368740 100644 --- a/minishell_test/config.py +++ b/minishell_test/config.py @@ -6,7 +6,7 @@ # By: cacharle +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2021/02/26 09:40:36 by cacharle #+# #+# # -# Updated: 2021/02/27 15:13:19 by cacharle ### ########.fr # +# Updated: 2021/02/27 16:11:46 by cacharle ### ########.fr # # # # ############################################################################ # @@ -49,12 +49,17 @@ CONFIG_FILENAME = Path('minishell_test.cfg') config = ConfigParser() config.read(DATA_DIR / 'default.cfg') - -# TODO check user_config for unkown stuff user_config = ConfigParser() user_config.read(MINISHELL_DIR / CONFIG_FILENAME) -config.read_dict({**config, **user_config}) +for section in user_config: + if section not in config: + raise RuntimeError(f"Unknown section name: {section}") + for key in user_config[section]: + if key not in config[section]: + raise RuntimeError(f"Unknown key name: {key}") + +config.read_dict({**config, **user_config}) BONUS = config.getboolean('minishell_test', 'bonus') EXEC_NAME = config.get('minishell_test', 'exec_name') @@ -68,6 +73,7 @@ CHECK_ERROR_MESSAGES = config.getboolean('minishell_test', 'check_error_mess SHELL_AVAILABLE_COMMANDS = config.getmultiline('shell', 'available_commands') SHELL_PATH_VARIABLE = config.get('shell', 'path_variable') + SHELL_REFERENCE_PATH = config.getpath('shell:reference', 'path') SHELL_REFERENCE_ARGS = config.getargs('shell:reference', 'args') -- cgit