From fa89e340dc4b5fbdd670fa6c54aa200be375f5f3 Mon Sep 17 00:00:00 2001 From: Andrew Helsby Date: Tue, 18 Oct 2022 11:23:53 +0400 Subject: [PATCH 1/3] provider-metadata: Add metadata to providers Signed-off-by: Andrew Helsby Signed-off-by: Andrew Helsby --- open_feature/provider/metadata.py | 6 ++++++ open_feature/provider/no_op_provider.py | 17 +++++++---------- open_feature/provider/provider.py | 3 ++- 3 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 open_feature/provider/metadata.py diff --git a/open_feature/provider/metadata.py b/open_feature/provider/metadata.py new file mode 100644 index 00000000..6f3e250d --- /dev/null +++ b/open_feature/provider/metadata.py @@ -0,0 +1,6 @@ +from dataclasses import dataclass + + +@dataclass +class Metadata: + name: str diff --git a/open_feature/provider/no_op_provider.py b/open_feature/provider/no_op_provider.py index d91395e7..1341e0e0 100644 --- a/open_feature/provider/no_op_provider.py +++ b/open_feature/provider/no_op_provider.py @@ -3,14 +3,15 @@ from open_feature.evaluation_context.evaluation_context import EvaluationContext from open_feature.flag_evaluation.flag_evaluation_details import FlagEvaluationDetails from open_feature.flag_evaluation.reason import Reason +from open_feature.provider.metadata import Metadata from open_feature.provider.provider import AbstractProvider PASSED_IN_DEFAULT = "Passed in default" class NoOpProvider(AbstractProvider): - def get_name(self) -> str: - return "No-op Provider" + def get_metadata(self) -> Metadata: + return Metadata(name="No-op Provider") def get_boolean_details( self, @@ -19,10 +20,9 @@ def get_boolean_details( evaluation_context: EvaluationContext = None, ): return FlagEvaluationDetails( - key=key, + flag_key=key, value=default_value, reason=Reason.DEFAULT, - variant=PASSED_IN_DEFAULT, ) def get_string_details( @@ -32,10 +32,9 @@ def get_string_details( evaluation_context: EvaluationContext = None, ): return FlagEvaluationDetails( - key=key, + flag_key=key, value=default_value, reason=Reason.DEFAULT, - variant=PASSED_IN_DEFAULT, ) def get_number_details( @@ -45,10 +44,9 @@ def get_number_details( evaluation_context: EvaluationContext = None, ): return FlagEvaluationDetails( - key=key, + flag_key=key, value=default_value, reason=Reason.DEFAULT, - variant=PASSED_IN_DEFAULT, ) def get_object_details( @@ -58,8 +56,7 @@ def get_object_details( evaluation_context: EvaluationContext = None, ): return FlagEvaluationDetails( - key=key, + flag_key=key, value=default_value, reason=Reason.DEFAULT, - variant=PASSED_IN_DEFAULT, ) diff --git a/open_feature/provider/provider.py b/open_feature/provider/provider.py index f3057039..4a79113e 100644 --- a/open_feature/provider/provider.py +++ b/open_feature/provider/provider.py @@ -2,11 +2,12 @@ from numbers import Number from open_feature.evaluation_context.evaluation_context import EvaluationContext +from open_feature.provider.metadata import Metadata class AbstractProvider: @abstractmethod - def get_name(self) -> str: + def get_metadata(self) -> Metadata: pass @abstractmethod From 041d4317aba8cd183645efeb42bec5d8c2cdf509 Mon Sep 17 00:00:00 2001 From: Andrew Helsby Date: Tue, 18 Oct 2022 15:34:13 +0400 Subject: [PATCH 2/3] feature/provider-metadata: Test extending metadata class Signed-off-by: Andrew Helsby Signed-off-by: Andrew Helsby --- open_feature/flag_evaluation/hooks.py | 0 open_feature/provider/no_op_metadata.py | 9 +++++++++ open_feature/provider/no_op_provider.py | 3 ++- tests/provider/test_no_op_provider.py | 10 ++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) delete mode 100644 open_feature/flag_evaluation/hooks.py create mode 100644 open_feature/provider/no_op_metadata.py diff --git a/open_feature/flag_evaluation/hooks.py b/open_feature/flag_evaluation/hooks.py deleted file mode 100644 index e69de29b..00000000 diff --git a/open_feature/provider/no_op_metadata.py b/open_feature/provider/no_op_metadata.py new file mode 100644 index 00000000..47cbd683 --- /dev/null +++ b/open_feature/provider/no_op_metadata.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass + +from open_feature.provider.metadata import Metadata + + +@dataclass +class NoOpMetadata(Metadata): + name: str = "No-op Provider" + is_test_class: bool = True diff --git a/open_feature/provider/no_op_provider.py b/open_feature/provider/no_op_provider.py index 5b46a6c0..8e80786a 100644 --- a/open_feature/provider/no_op_provider.py +++ b/open_feature/provider/no_op_provider.py @@ -4,6 +4,7 @@ from open_feature.flag_evaluation.flag_evaluation_details import FlagEvaluationDetails from open_feature.flag_evaluation.reason import Reason from open_feature.provider.metadata import Metadata +from open_feature.provider.no_op_metadata import NoOpMetadata from open_feature.provider.provider import AbstractProvider PASSED_IN_DEFAULT = "Passed in default" @@ -11,7 +12,7 @@ class NoOpProvider(AbstractProvider): def get_metadata(self) -> Metadata: - return Metadata(name="No-op Provider") + return NoOpMetadata() def get_boolean_details( self, diff --git a/tests/provider/test_no_op_provider.py b/tests/provider/test_no_op_provider.py index 7b237148..c379a26f 100644 --- a/tests/provider/test_no_op_provider.py +++ b/tests/provider/test_no_op_provider.py @@ -10,6 +10,16 @@ def setup(): assert isinstance(provider, NoOpProvider) +def test_should_return_no_op_provider_metadata(no_op_provider_client): + # Given + # When + metadata = NoOpProvider().get_metadata() + # Then + assert metadata is not None + assert metadata.name == "No-op Provider" + assert metadata.is_test_class + + def test_should_get_boolean_flag_from_no_op(no_op_provider_client): # Given # When From 9235c545007e2b66c5764ea67c3fd75dfe7d245a Mon Sep 17 00:00:00 2001 From: Andrew Helsby Date: Tue, 18 Oct 2022 16:25:32 +0400 Subject: [PATCH 3/3] feature/provider-metadata: Change no op metadata Signed-off-by: Andrew Helsby Signed-off-by: Andrew Helsby --- open_feature/provider/no_op_metadata.py | 2 +- tests/provider/test_no_op_provider.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/open_feature/provider/no_op_metadata.py b/open_feature/provider/no_op_metadata.py index 47cbd683..fe799488 100644 --- a/open_feature/provider/no_op_metadata.py +++ b/open_feature/provider/no_op_metadata.py @@ -6,4 +6,4 @@ @dataclass class NoOpMetadata(Metadata): name: str = "No-op Provider" - is_test_class: bool = True + is_default_provider: bool = True diff --git a/tests/provider/test_no_op_provider.py b/tests/provider/test_no_op_provider.py index c379a26f..aed960ae 100644 --- a/tests/provider/test_no_op_provider.py +++ b/tests/provider/test_no_op_provider.py @@ -17,7 +17,7 @@ def test_should_return_no_op_provider_metadata(no_op_provider_client): # Then assert metadata is not None assert metadata.name == "No-op Provider" - assert metadata.is_test_class + assert metadata.is_default_provider def test_should_get_boolean_flag_from_no_op(no_op_provider_client):