Skip to content

Commit

Permalink
feat: add FeatureProvider interface
Browse files Browse the repository at this point in the history
Signed-off-by: Federico Bond <[email protected]>
  • Loading branch information
federicobond committed Feb 2, 2024
1 parent 3b89760 commit c73fc49
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 11 deletions.
8 changes: 4 additions & 4 deletions openfeature/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
from openfeature.evaluation_context import EvaluationContext
from openfeature.exception import GeneralError
from openfeature.hook import Hook
from openfeature.provider import FeatureProvider
from openfeature.provider.metadata import Metadata
from openfeature.provider.no_op_provider import NoOpProvider
from openfeature.provider.provider import AbstractProvider

_provider: AbstractProvider = NoOpProvider()
_provider: FeatureProvider = NoOpProvider()

_evaluation_context = EvaluationContext()

Expand All @@ -21,7 +21,7 @@ def get_client(
return OpenFeatureClient(name=name, version=version, provider=_provider)


def set_provider(provider: AbstractProvider) -> None:
def set_provider(provider: FeatureProvider) -> None:
global _provider
if provider is None:
raise GeneralError(error_message="No provider")
Expand All @@ -31,7 +31,7 @@ def set_provider(provider: AbstractProvider) -> None:
provider.initialize(_evaluation_context)


def get_provider() -> typing.Optional[AbstractProvider]:
def get_provider() -> typing.Optional[FeatureProvider]:
global _provider
return _provider

Expand Down
4 changes: 2 additions & 2 deletions openfeature/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
before_hooks,
error_hooks,
)
from openfeature.provider import FeatureProvider
from openfeature.provider.no_op_provider import NoOpProvider
from openfeature.provider.provider import AbstractProvider

logger = logging.getLogger("openfeature")

Expand Down Expand Up @@ -69,7 +69,7 @@ def __init__(
self,
name: typing.Optional[str],
version: typing.Optional[str],
provider: AbstractProvider,
provider: FeatureProvider,
context: typing.Optional[EvaluationContext] = None,
hooks: typing.Optional[typing.List[Hook]] = None,
) -> None:
Expand Down
61 changes: 61 additions & 0 deletions openfeature/provider/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import typing

from openfeature.evaluation_context import EvaluationContext
from openfeature.flag_evaluation import FlagResolutionDetails
from openfeature.hook import Hook

from .metadata import Metadata


class FeatureProvider(typing.Protocol):
def initialize(self, evaluation_context: EvaluationContext) -> None:
...

Check warning on line 12 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L12

Added line #L12 was not covered by tests

def shutdown(self) -> None:
...

Check warning on line 15 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L15

Added line #L15 was not covered by tests

def get_metadata(self) -> Metadata:
...

Check warning on line 18 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L18

Added line #L18 was not covered by tests

def get_provider_hooks(self) -> typing.List[Hook]:
...

Check warning on line 21 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L21

Added line #L21 was not covered by tests

def resolve_boolean_details(
self,
flag_key: str,
default_value: bool,
evaluation_context: typing.Optional[EvaluationContext] = None,
) -> FlagResolutionDetails[bool]:
...

Check warning on line 29 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L29

Added line #L29 was not covered by tests

def resolve_string_details(
self,
flag_key: str,
default_value: str,
evaluation_context: typing.Optional[EvaluationContext] = None,
) -> FlagResolutionDetails[str]:
...

Check warning on line 37 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L37

Added line #L37 was not covered by tests

def resolve_integer_details(
self,
flag_key: str,
default_value: int,
evaluation_context: typing.Optional[EvaluationContext] = None,
) -> FlagResolutionDetails[int]:
...

Check warning on line 45 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L45

Added line #L45 was not covered by tests

def resolve_float_details(
self,
flag_key: str,
default_value: float,
evaluation_context: typing.Optional[EvaluationContext] = None,
) -> FlagResolutionDetails[float]:
...

Check warning on line 53 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L53

Added line #L53 was not covered by tests

def resolve_object_details(
self,
flag_key: str,
default_value: typing.Union[dict, list],
evaluation_context: typing.Optional[EvaluationContext] = None,
) -> FlagResolutionDetails[typing.Union[dict, list]]:
...

Check warning on line 61 in openfeature/provider/__init__.py

View check run for this annotation

Codecov / codecov/patch

openfeature/provider/__init__.py#L61

Added line #L61 was not covered by tests
1 change: 1 addition & 0 deletions openfeature/provider/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from openfeature.evaluation_context import EvaluationContext
from openfeature.flag_evaluation import FlagResolutionDetails
from openfeature.hook import Hook
from openfeature.provider import FeatureProvider
from openfeature.provider.metadata import Metadata


Expand Down
10 changes: 5 additions & 5 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from openfeature.hook import Hook
from openfeature.provider.metadata import Metadata
from openfeature.provider.no_op_provider import NoOpProvider
from openfeature.provider.provider import AbstractProvider
from openfeature.provider.provider import FeatureProvider


def test_should_not_raise_exception_with_noop_client():
Expand Down Expand Up @@ -61,7 +61,7 @@ def test_should_try_set_provider_and_fail_if_none_provided():
def test_should_invoke_provider_initialize_function_on_newly_registered_provider():
# Given
evaluation_context = EvaluationContext("targeting_key", {"attr1": "val1"})
provider = MagicMock(spec=AbstractProvider)
provider = MagicMock(spec=FeatureProvider)

# When
set_evaluation_context(evaluation_context)
Expand All @@ -73,8 +73,8 @@ def test_should_invoke_provider_initialize_function_on_newly_registered_provider

def test_should_invoke_provider_shutdown_function_once_provider_is_no_longer_in_use():
# Given
provider_1 = MagicMock(spec=AbstractProvider)
provider_2 = MagicMock(spec=AbstractProvider)
provider_1 = MagicMock(spec=FeatureProvider)
provider_2 = MagicMock(spec=FeatureProvider)

# When
set_provider(provider_1)
Expand Down Expand Up @@ -148,7 +148,7 @@ def test_should_add_hooks_to_api_hooks():

def test_should_call_provider_shutdown_on_api_shutdown():
# Given
provider = MagicMock(spec=AbstractProvider)
provider = MagicMock(spec=FeatureProvider)
set_provider(provider)

# When
Expand Down

0 comments on commit c73fc49

Please sign in to comment.