aboutsummaryrefslogtreecommitdiff
path: root/minishell_test/config.py
blob: 8f2f712667d5547c993b385b39f46be4569ca02a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# ############################################################################ #
#                                                                              #
#                                                         :::      ::::::::    #
#    config.py                                          :+:      :+:    :+:    #
#                                                     +:+ +:+         +:+      #
#    By: cacharle <me@cacharle.xyz>                 +#+  +:+       +#+         #
#                                                 +#+#+#+#+#+   +#+            #
#    Created: 2021/02/26 09:40:36 by cacharle          #+#    #+#              #
#    Updated: 2021/02/27 12:18:55 by cacharle         ###   ########.fr        #
#                                                                              #
# ############################################################################ #

import os
import sys
import configparser
import inspect
import shutil
import distutils
from pathlib import Path

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'))

reference_args = config.get('shell:reference', 'args')
SHELL_REFERENCE_ARGS = reference_args.strip().split(' ') if len(reference_args) != 0 else []

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:
    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")

PLATFORM = sys.platform
supported = ['linux', 'darwin']
if PLATFORM not in supported:
    raise RuntimeError("Your platform ({PLATFORM}) is not supported, supported platforms are: {', '.join(supported)}")