From bf7f36174f0b875f49e8d1d355182fb91aedffda Mon Sep 17 00:00:00 2001 From: Jim Martens Date: Thu, 4 Jul 2019 15:36:29 +0200 Subject: [PATCH] Implemented config functionality Signed-off-by: Jim Martens --- src/twomartens/masterthesis/config.py | 83 ++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/src/twomartens/masterthesis/config.py b/src/twomartens/masterthesis/config.py index 7ac97d4..31d48b4 100644 --- a/src/twomartens/masterthesis/config.py +++ b/src/twomartens/masterthesis/config.py @@ -18,26 +18,95 @@ """ Takes care of config functionality. +Constants: + CONFIG_FILE: name of config file relative to working directory + Functions: - get_property(key: str): returns the value of given property + get_property(key: str): returns the value of given property (e.g. "section.option") set_property(key: str, value: str): sets the given property to given value list_property_values(): prints out list of config values get_config(): returns key-value store """ -from typing import Union, Dict +import configparser +import os + + +CONFIG_FILE = "tm-masterthesis-config.ini" +_CONFIG_PROPS = { + "Paths": { + "coco": (str, ""), + "scenenet": (str, ""), + "scenenet_gt_train": (str, ""), + "scenenet_gt_val": (str, ""), + "scenenet_gt_test": (str, ""), + "output": (str, ""), + "summaries": (str, ""), + "weights": (str, "") + }, + "Debug": { + "summaries": (bool, True), + "train_images": (bool, False) + } +} def get_property(key: str) -> str: - raise NotImplementedError + parser = configparser.ConfigParser() + config_file = f"{os.getcwd()}/{CONFIG_FILE}" + + _initialise_config(config_file) + parser.read(config_file) + + section, prop = tuple(key.split(".")) + return str(parser.get(section, prop)) def set_property(key: str, value: str) -> None: - raise NotImplementedError + parser = configparser.ConfigParser() + config_file = f"{os.getcwd()}/{CONFIG_FILE}" + + _initialise_config(config_file) + parser.read(config_file) + + section, prop = tuple(key.split(".")) + cast_method = _CONFIG_PROPS[section][key][0] + parser.set(section, prop, cast_method(value)) def list_property_values() -> None: - raise NotImplementedError + parser = configparser.ConfigParser() + config_file = f"{os.getcwd()}/{CONFIG_FILE}" + + _initialise_config(config_file) + parser.read(config_file) + + print(parser) # simple implementation, more sophisticated might follow -def get_config() -> Dict[str, Union[str, int, float, bool]]: - raise NotImplementedError +def get_config() -> configparser.ConfigParser: + parser = configparser.ConfigParser() + config_file = f"{os.getcwd()}/{CONFIG_FILE}" + _initialise_config(config_file) + parser.read(config_file) + + return parser + + +def _initialise_config(config_file: str) -> None: + # work-around for implementation detail of config parser + # a non-existing file does not lead to an exception but is simply ignored + # therefore a manual check via this construction is required + + try: + with open(config_file, "r"): + pass + except FileNotFoundError: + with open(config_file, "w") as file: + parser = configparser.ConfigParser() + for section in _CONFIG_PROPS: + parser[section] = {} + for option in _CONFIG_PROPS[section]: + _, default = _CONFIG_PROPS[section][option] + parser[section][option] = default + + parser.write(file)