|
1 | | -from openfeature._event_support import run_handlers_for_provider |
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +import typing |
| 4 | +from collections.abc import Callable |
| 5 | + |
2 | 6 | from openfeature.evaluation_context import EvaluationContext, get_evaluation_context |
3 | 7 | from openfeature.event import ( |
4 | 8 | ProviderEvent, |
|
8 | 12 | from openfeature.provider import FeatureProvider, ProviderStatus |
9 | 13 | from openfeature.provider.no_op_provider import NoOpProvider |
10 | 14 |
|
| 15 | +if typing.TYPE_CHECKING: |
| 16 | + from openfeature._event_support import EventSupport |
| 17 | + |
11 | 18 |
|
12 | 19 | class ProviderRegistry: |
13 | 20 | _default_provider: FeatureProvider |
14 | 21 | _providers: dict[str, FeatureProvider] |
15 | 22 | _provider_status: dict[FeatureProvider, ProviderStatus] |
16 | 23 |
|
17 | | - def __init__(self) -> None: |
| 24 | + def __init__( |
| 25 | + self, |
| 26 | + event_support: EventSupport | None = None, |
| 27 | + evaluation_context_getter: Callable[[], EvaluationContext] | None = None, |
| 28 | + ) -> None: |
18 | 29 | self._default_provider = NoOpProvider() |
19 | 30 | self._providers = {} |
20 | 31 | self._provider_status = { |
21 | 32 | self._default_provider: ProviderStatus.READY, |
22 | 33 | } |
| 34 | + self._event_support = event_support |
| 35 | + self._evaluation_context_getter = ( |
| 36 | + evaluation_context_getter or get_evaluation_context |
| 37 | + ) |
23 | 38 |
|
24 | 39 | def set_provider(self, domain: str, provider: FeatureProvider) -> None: |
25 | 40 | if provider is None: |
@@ -73,7 +88,7 @@ def shutdown(self) -> None: |
73 | 88 | self._shutdown_provider(provider) |
74 | 89 |
|
75 | 90 | def _get_evaluation_context(self) -> EvaluationContext: |
76 | | - return get_evaluation_context() |
| 91 | + return self._evaluation_context_getter() |
77 | 92 |
|
78 | 93 | def _initialize_provider(self, provider: FeatureProvider) -> None: |
79 | 94 | provider.attach(self.dispatch_event) |
@@ -124,7 +139,8 @@ def dispatch_event( |
124 | 139 | details: ProviderEventDetails, |
125 | 140 | ) -> None: |
126 | 141 | self._update_provider_status(provider, event, details) |
127 | | - run_handlers_for_provider(provider, event, details) |
| 142 | + if self._event_support is not None: |
| 143 | + self._event_support.run_handlers_for_provider(provider, event, details) |
128 | 144 |
|
129 | 145 | def _update_provider_status( |
130 | 146 | self, |
|
0 commit comments