From ff61824ca86e22442b0175aadb2b46b83e13e1d6 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Mon, 5 Sep 2022 22:54:56 +0200 Subject: [PATCH] Make `resolve` and `resolve_failfast` return a dict with all the resolved values --- cfig/config.py | 20 ++++++++++++++++---- cfig/tests/test_config.py | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/cfig/config.py b/cfig/config.py index 0062f97..a695ebc 100644 --- a/cfig/config.py +++ b/cfig/config.py @@ -34,37 +34,49 @@ class Configuration: An extended :class:`dict` with methods to perform some actions on the contained proxies. """ - def resolve(self) -> None: + def resolve(self) -> dict[str, t.Any]: """ Resolve all values of the proxies inside this dictionary. :raises .errors.BatchResolutionFailure: If it was not possible to resolve at least one value. + :returns: A :class:`dict` containing all the resolved values. """ errors_dict = {} + result_dict = {} log.debug("Resolving and caching all proxied values...") for key, proxy in self.items(): log.debug(f"Resolving: {proxy!r}") try: - _ = proxy.__wrapped__ + value = proxy.__wrapped__ except Exception as e: errors_dict[key] = e + else: + result_dict[key] = value if errors_dict: raise errors.BatchResolutionFailure(errors=errors_dict) - def resolve_failfast(self) -> None: + return result_dict + + def resolve_failfast(self) -> dict[str, t.Any]: """ Resolve all values of the proxies inside this dictionary, failing immediately if an error occurs during a resolution, and raising the error itself. :raises Exception: The error occurred during the resolution. + :returns: A :class:`dict` containing all the resolved values. """ + result_dict = {} + log.debug("Resolving and caching all proxied values in failfast mode...") for key, proxy in self.items(): log.debug(f"Resolving: {proxy!r}") - _ = proxy.__wrapped__ + value = proxy.__wrapped__ + result_dict[key] = value + + return result_dict def unresolve(self) -> None: """ diff --git a/cfig/tests/test_config.py b/cfig/tests/test_config.py index c77040c..e1ed0d7 100644 --- a/cfig/tests/test_config.py +++ b/cfig/tests/test_config.py @@ -131,7 +131,7 @@ class TestConfig: assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve() + result_dict = numbers_config.proxies.resolve() assert first_number.__resolved__ assert first_number == 1 @@ -140,6 +140,10 @@ class TestConfig: assert second_number == None assert second_number is not None + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == None + assert result_dict["SECOND_NUMBER"] is None + def test_resolve_ff_required(self, numbers_config, monkeypatch): monkeypatch.setenv("FIRST_NUMBER", "1") monkeypatch.setenv("SECOND_NUMBER", "") @@ -153,7 +157,7 @@ class TestConfig: assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve_failfast() + result_dict = numbers_config.proxies.resolve_failfast() assert first_number.__resolved__ assert first_number == 1 @@ -162,6 +166,10 @@ class TestConfig: assert second_number == None assert second_number is not None + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == None + assert result_dict["SECOND_NUMBER"] is None + def test_resolve_optional(self, numbers_config, monkeypatch): monkeypatch.setenv("FIRST_NUMBER", "1") monkeypatch.setenv("SECOND_NUMBER", "2") @@ -175,7 +183,7 @@ class TestConfig: assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve() + result_dict = numbers_config.proxies.resolve() assert first_number.__resolved__ assert first_number == 1 @@ -183,6 +191,9 @@ class TestConfig: assert second_number.__resolved__ assert second_number == 2 + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == 2 + def test_resolve_ff_optional(self, numbers_config, monkeypatch): monkeypatch.setenv("FIRST_NUMBER", "1") monkeypatch.setenv("SECOND_NUMBER", "2") @@ -196,7 +207,7 @@ class TestConfig: assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve_failfast() + result_dict = numbers_config.proxies.resolve_failfast() assert first_number.__resolved__ assert first_number == 1 @@ -204,6 +215,9 @@ class TestConfig: assert second_number.__resolved__ assert second_number == 2 + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == 2 + def test_resolve_unresolve(self, numbers_config, monkeypatch): monkeypatch.setenv("FIRST_NUMBER", "1") monkeypatch.setenv("SECOND_NUMBER", "2") @@ -217,7 +231,7 @@ class TestConfig: assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve() + result_dict = numbers_config.proxies.resolve() assert first_number.__resolved__ assert first_number == 1 @@ -225,13 +239,16 @@ class TestConfig: assert second_number.__resolved__ assert second_number == 2 + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == 2 + monkeypatch.setenv("FIRST_NUMBER", "3") monkeypatch.setenv("SECOND_NUMBER", "4") assert os.environ.get("FIRST_NUMBER") == "3" assert os.environ.get("SECOND_NUMBER") == "4" - numbers_config.proxies.resolve() + result_dict = numbers_config.proxies.resolve() assert first_number.__resolved__ assert first_number == 1 @@ -239,12 +256,15 @@ class TestConfig: assert second_number.__resolved__ assert second_number == 2 + assert result_dict["FIRST_NUMBER"] == 1 + assert result_dict["SECOND_NUMBER"] == 2 + numbers_config.proxies.unresolve() assert not first_number.__resolved__ assert not second_number.__resolved__ - numbers_config.proxies.resolve() + result_dict = numbers_config.proxies.resolve() assert first_number.__resolved__ assert first_number == 3 @@ -252,6 +272,9 @@ class TestConfig: assert second_number.__resolved__ assert second_number == 4 + assert result_dict["FIRST_NUMBER"] == 3 + assert result_dict["SECOND_NUMBER"] == 4 + @pytest.fixture(scope="function") def click_runner(self): yield click.testing.CliRunner()