From 8dfae288324cadbebd290f3b7407e7ab675981d3 Mon Sep 17 00:00:00 2001 From: Daniel Tomlinson Date: Sat, 16 Oct 2021 05:24:56 +0100 Subject: [PATCH] adding latest working --- panaetius/config.py | 107 ++++++++++++++++++++++------------------ tests/test_panaetius.py | 42 ++++++++++++---- 2 files changed, 91 insertions(+), 58 deletions(-) diff --git a/panaetius/config.py b/panaetius/config.py index cb03d92..3a0bc30 100644 --- a/panaetius/config.py +++ b/panaetius/config.py @@ -34,62 +34,73 @@ class Config: ) -> Any: env_key = f"{self.header_variable.upper()}_{key.upper().replace('.', '_')}" - # look in the config file if not self._missing_config: - try: - # look under top header - if len(key.split(".")) == 1: - if mask: - # TODO: write mask logic here - pass - else: - name = key.lower() - value = self.config[self.header_variable][name] - elif len(key.split(".")) == 2: - if mask: - # TODO: write mask logic here - pass - else: - section, name = key.lower().split(".") - value = self.config[self.header_variable][section][name] - return value + # look in the config file + return self._get_config_value(env_key, key, default, mask, coerce) + # no config file, look for env vars + return self._get_env_value(env_key, default, coerce) - except (KeyError, TypeError): - 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 - return ( - toml.loads(f"value = {default}")["value"] - if default is not None - else None - ) - # if env var, coerce value if flag is set, else return a TOML string - 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: + if mask: + # TODO: write mask logic here + pass + else: + name = key.lower() + value = self.config[self.header_variable][name] + elif len(key.split(".")) == 2: + if mask: + # TODO: write mask logic here + pass + else: + section, name = key.lower().split(".") + value = self.config[self.header_variable][section][name] + return value - else: - # look for an environment variable, fallback to default + except (KeyError, TypeError): 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"] + toml.loads(f"value = {default}")["value"] if default is not None else None ) - return toml.loads(f'value = "{value}"')["value"] + # if env var, coerce value if flag is set, else return a TOML string + return ( + toml.loads(f"value = {value}")["value"] + if coerce + else toml.loads(f'value = "{value}"')["value"] + ) - def _get_config_value( - self, key: str, default: Any, mask: bool, coerce: bool = False + def _get_env_value( # noqa + self, env_key: str, default: Any, coerce: bool = False ) -> Any: - pass - - def _get_env_value( - self, key: str, default: Any, mask: bool, coerce: bool = False - ) -> Any: - pass + # 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 ( + toml.loads(f"value = {value}")["value"] + if coerce + else toml.loads(f'value = "{value}"')["value"] + ) diff --git a/tests/test_panaetius.py b/tests/test_panaetius.py index 8979659..5d66052 100644 --- a/tests/test_panaetius.py +++ b/tests/test_panaetius.py @@ -8,17 +8,39 @@ if __name__ == "__main__": os.environ[ "PANAETIUS_TEST_TOML_POINTS" ] = "[ { x = 1, y = 2, z = 3 }, { x = 7, y = 8, z = 9 }, { x = 2, y = 4, z = 8 }]" - c = Config("panaetius_test") - 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) - set_config(c, key="toml.points_config") - set_config(c, key="float", default=2.0) - set_config(c, key="float_str", default="2.0") + 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_noc") + + # 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) + # 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="path") + # set_config(c, key="float", coerce=True) + # set_config(c, key="bool", coerce=True) + # set_config(c, key="noexiststr", default="2.0") + # set_config(c, key="noexistfloat", default=2.0) + # set_config(c, key="noexistbool", default=False) + + set_config(c, key="embedded.path") + set_config(c, key="embedded.float", coerce=True) + set_config(c, key="embedded.bool", coerce=True) + set_config(c, key="embedded.noexiststr", default="2.0") + set_config(c, key="embedded.noexistfloat", default=2.0) + set_config(c, key="embedded.noexistbool", default=False) print(c) pass