Skip to content

Commit

Permalink
refactor: bind providers explicitly to a registry with attach/detach (#…
Browse files Browse the repository at this point in the history
…324)

* test: make sure provider is registered in events test

Signed-off-by: Federico Bond <federicobond@gmail.com>

* refactor: bind providers explicitly to a registry with attach/detach

Signed-off-by: Federico Bond <federicobond@gmail.com>

---------

Signed-off-by: Federico Bond <federicobond@gmail.com>
  • Loading branch information
federicobond authored May 1, 2024
1 parent f352045 commit c3ad697
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
26 changes: 23 additions & 3 deletions openfeature/provider/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,15 @@ class ProviderStatus(Enum):


class FeatureProvider(typing.Protocol): # pragma: no cover
def attach(
self,
on_emit: typing.Callable[
[FeatureProvider, ProviderEvent, ProviderEventDetails], None
],
) -> None: ...

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

def initialize(self, evaluation_context: EvaluationContext) -> None: ...

def shutdown(self) -> None: ...
Expand Down Expand Up @@ -68,6 +77,18 @@ def resolve_object_details(


class AbstractProvider(FeatureProvider):
def attach(
self,
on_emit: typing.Callable[
[FeatureProvider, ProviderEvent, ProviderEventDetails], None
],
) -> None:
self._on_emit = on_emit

def detach(self) -> None:
if hasattr(self, "_on_emit"):
del self._on_emit

def initialize(self, evaluation_context: EvaluationContext) -> None:
pass

Expand Down Expand Up @@ -141,6 +162,5 @@ def emit_provider_stale(self, details: ProviderEventDetails) -> None:
self.emit(ProviderEvent.PROVIDER_STALE, details)

def emit(self, event: ProviderEvent, details: ProviderEventDetails) -> None:
from openfeature.provider._registry import provider_registry

provider_registry.dispatch_event(self, event, details)
if hasattr(self, "_on_emit"):
self._on_emit(self, event, details)
2 changes: 2 additions & 0 deletions openfeature/provider/_registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def _get_evaluation_context(self) -> EvaluationContext:
return get_evaluation_context()

def _initialize_provider(self, provider: FeatureProvider) -> None:
provider.attach(self.dispatch_event)
try:
if hasattr(provider, "initialize"):
provider.initialize(self._get_evaluation_context())
Expand Down Expand Up @@ -106,6 +107,7 @@ def _shutdown_provider(self, provider: FeatureProvider) -> None:
error_code=ErrorCode.PROVIDER_FATAL,
),
)
provider.detach()

def get_provider_status(self, provider: FeatureProvider) -> ProviderStatus:
return self._provider_status.get(provider, ProviderStatus.NOT_READY)
Expand Down
4 changes: 2 additions & 2 deletions tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,8 @@ def test_clear_providers_shutdowns_every_provider_and_resets_default_provider():
def test_provider_events():
# Given
spy = MagicMock()
provider = NoOpProvider()
set_provider(provider)

add_handler(ProviderEvent.PROVIDER_READY, spy.provider_ready)
add_handler(
Expand All @@ -243,8 +245,6 @@ def test_provider_events():
add_handler(ProviderEvent.PROVIDER_ERROR, spy.provider_error)
add_handler(ProviderEvent.PROVIDER_STALE, spy.provider_stale)

provider = NoOpProvider()

provider_details = ProviderEventDetails(message="message")
details = EventDetails.from_provider_event_details(
provider.get_metadata().name, provider_details
Expand Down

0 comments on commit c3ad697

Please sign in to comment.