diff --git a/panaetius/config.py b/panaetius/config.py index b5ec026..75152fb 100644 --- a/panaetius/config.py +++ b/panaetius/config.py @@ -39,7 +39,25 @@ class Config: # no config file, look for env vars return self._get_env_value(env_key, default, coerce) - def _get_config_value_key_split_once(self, key: str, mask: bool) -> Any: + def _get_config_value( + self, env_key: str, key: str, default: Any, mask: bool, coerce: bool = False + ) -> Any: + try: + # look under top header + if len(key.split(".")) == 1: + return self.__get_config_value_key_split_once(key, mask) + if len(key.split(".")) == 2: + return self.__get_config_value_key_split_twice(key, mask) + + except (KeyError, TypeError): + value = os.environ.get(env_key.replace("-", "_")) + if value is None: + return self.__get_config_value_missing_key_value_is_none(default) + # if env var, coerce value if flag is set, else return a TOML string + value = self.__get_config_value_missing_key_value_is_not_none(value, coerce) + return self.__get_config_value_missing_key_value_is_not_none(value, coerce) + + def __get_config_value_key_split_once(self, key: str, mask: bool) -> Any: if mask: # TODO: write mask logic here pass @@ -47,7 +65,7 @@ class Config: name = key.lower() return self.config[self.header_variable][name] - def _get_config_value_key_split_twice(self, key: str, mask: bool) -> Any: + def __get_config_value_key_split_twice(self, key: str, mask: bool) -> Any: if mask: # TODO: write mask logic here pass @@ -55,42 +73,13 @@ class Config: section, name = key.lower().split(".") return self.config[self.header_variable][section][name] - def _get_config_value_missing_key_value_is_none(self, default: Any) -> Any: - if isinstance(default, str): - # if default is a string, wrap TOML value in quotes - return toml.loads(f'value = "{default}"')["value"] - # if default is not a string, leave TOML value as is - # if default is a bool, convert to lower case for TOML syntax - default = str(default).lower() if isinstance(default, bool) else default - return ( - toml.loads(f"value = {default}")["value"] if default is not None else None - ) + def __get_config_value_missing_key_value_is_none(self, default: Any) -> Any: + return self.__load_default_value(default) - def _get_config_value_missing_key_value_is_not_none( + def __get_config_value_missing_key_value_is_not_none( self, value: str, coerce: bool ) -> Any: - return ( - toml.loads(f"value = {value}")["value"] - if coerce - else toml.loads(f'value = "{value}"')["value"] - ) - - def _get_config_value( - self, env_key: str, key: str, default: Any, mask: bool, coerce: bool = False - ) -> Any: - try: - # look under top header - if len(key.split(".")) == 1: - return self._get_config_value_key_split_once(key, mask) - if len(key.split(".")) == 2: - return self._get_config_value_key_split_twice(key, mask) - - except (KeyError, TypeError): - value = os.environ.get(env_key.replace("-", "_")) - if value is None: - return self._get_config_value_missing_key_value_is_none(default) - # if env var, coerce value if flag is set, else return a TOML string - return self._get_config_value_missing_key_value_is_not_none(value, coerce) + return self.__load_value(value, coerce) def _get_env_value( # noqa self, env_key: str, default: Any, coerce: bool = False @@ -98,19 +87,21 @@ class Config: # look for an environment variable, fallback to default value = os.environ.get(env_key.replace("-", "_")) if value is None: - if isinstance(default, str): - # if default is a string, wrap TOML value in quotes - return toml.loads(f'value = "{default}"')["value"] - # if default is not a string, leave TOML value as is - # if default is a bool, convert to lower case for TOML syntax - default = str(default).lower() if isinstance(default, bool) else default - return ( - toml.loads(f"value = {default}")["value"] - if default is not None - else None - ) + return self.__load_default_value(default) + return self.__load_value(value, coerce) + + def __load_value(self, value: str, coerce: bool) -> Any: return ( toml.loads(f"value = {value}")["value"] if coerce else toml.loads(f'value = "{value}"')["value"] ) + + def __load_default_value(self, default: Any) -> Any: + if isinstance(default, str): + return toml.loads(f'value = "{default}"')["value"] + # if default is bool convert to lower case toml syntax + default = str(default).lower() if isinstance(default, bool) else default + return ( + toml.loads(f"value = {default}")["value"] if default is not None else None + ) diff --git a/tests/test_panaetius.py b/tests/test_panaetius.py index ee27c64..954bc31 100644 --- a/tests/test_panaetius.py +++ b/tests/test_panaetius.py @@ -6,28 +6,33 @@ if __name__ == "__main__": os.environ["PANAETIUS_TEST_PATH"] = "/usr/local" os.environ["PANAETIUS_TEST_BOOL"] = "true" print(os.environ.get("PANAETIUS_TEST_PATH")) - os.environ[ - "PANAETIUS_TEST_TOML_POINTS" - ] = "[ { x = 1, y = 2, z = 3 }, { x = 7, y = 8, z = 9 }, { x = 2, y = 4, z = 8 }]" + # os.environ[ + # "PANAETIUS_TEST_TOML_POINTS" + # ] = "[ { x = 1, y = 2, z = 3 }, { x = 7, y = 8, z = 9 }, { x = 2, y = 4, z = 8 }]" + os.environ["PANAETIUS_TEST_NOC_PATH"] = "/usr/locals" + os.environ["PANAETIUS_TEST_NOC_FLOAT"] = "2.0" + os.environ["PANAETIUS_TEST_NOC_BOOL"] = "true" os.environ["PANAETIUS_TEST_NOC_EMBEDDED_PATH"] = "/usr/local" os.environ["PANAETIUS_TEST_NOC_EMBEDDED_FLOAT"] = "2.0" os.environ["PANAETIUS_TEST_NOC_EMBEDDED_BOOL"] = "true" - # c = Config("panaetius_test") c = Config("panaetius_test") + # c = Config("panaetius_test_noc") + set_config(c, key="toml.points", coerce=True) set_config(c, key="path", default="some path") set_config(c, key="top", default="some top") set_config(c, key="logging.path", default="some logging path") set_config(c, key="nonexistent.item", default="some nonexistent item") set_config(c, key="nonexistent.item") - set_config(c, key="toml.points", coerce=True) + # FIXME: this isn't working after the refactor... set_config(c, key="toml.points_config") set_config(c, key="float", default=2.0) set_config(c, key="float_str", default="2.0") set_config(c, key="bool", coerce=True) set_config(c, key="noexistbool", default=False) + set_config(c, key="middle.middle") # set_config(c, key="path") # set_config(c, key="float", coerce=True)