from repo_cloner.lib.default_cloner_config import DefaultClonerConfig class ClonerConfig(DefaultClonerConfig): def __init__(self): super().__init__() self.__properties = list(filter(self.has_property, dir(self))) self.__values = {} def __try_default(self, key: str, default_value): if not self.has_property(key): raise KeyError(f"{key} is not recognized config option") if key in self.__values: return self.__values[key] return default_value @property def cloner_project_name(self) -> str: return self.__try_default("cloner_project_name", super(ClonerConfig, self).cloner_project_name) @property def cloner_repo_url(self) -> str: return self.__try_default("cloner_repo_url", super(ClonerConfig, self).cloner_repo_url) @property def cloner_interval(self) -> int: return self.__try_default("cloner_interval", super(ClonerConfig, self).cloner_interval) @property def cloner_submodules(self) -> bool: return self.__try_default("cloner_submodules", super(ClonerConfig, self).cloner_submodules) @property def cloner_submodule_depth(self) -> int: return self.__try_default("cloner_submodule_depth", super(ClonerConfig, self).cloner_submodule_depth) def _set_property(self, key: str, value): if not self.has_property(key): raise KeyError(f"{key} is not recognized config option") if not isinstance(value, type(self.__getattribute__(key))): raise ValueError(f"Invalid value for key {key}: type is {type(value)}") self.__values[key] = value