Skip to content

Commit 425629c

Browse files
committed
refactor: replace EventSupport class with module-level functions
Signed-off-by: Federico Bond <[email protected]>
1 parent f43ed00 commit 425629c

File tree

5 files changed

+80
-102
lines changed

5 files changed

+80
-102
lines changed

openfeature/_event_support.py

+72-69
Original file line numberDiff line numberDiff line change
@@ -15,72 +15,75 @@
1515
from openfeature.client import OpenFeatureClient
1616

1717

18-
class EventSupport:
19-
_global_handlers: Dict[ProviderEvent, List[EventHandler]]
20-
_client_handlers: Dict[OpenFeatureClient, Dict[ProviderEvent, List[EventHandler]]]
21-
22-
def __init__(self) -> None:
23-
self._global_handlers = defaultdict(list)
24-
self._client_handlers = defaultdict(lambda: defaultdict(list))
25-
26-
def run_client_handlers(
27-
self, client: OpenFeatureClient, event: ProviderEvent, details: EventDetails
28-
) -> None:
29-
for handler in self._client_handlers[client][event]:
30-
handler(details)
31-
32-
def run_global_handlers(self, event: ProviderEvent, details: EventDetails) -> None:
33-
for handler in self._global_handlers[event]:
34-
handler(details)
35-
36-
def add_client_handler(
37-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
38-
) -> None:
39-
handlers = self._client_handlers[client][event]
40-
handlers.append(handler)
41-
42-
self._run_immediate_handler(client, event, handler)
43-
44-
def remove_client_handler(
45-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
46-
) -> None:
47-
handlers = self._client_handlers[client][event]
48-
handlers.remove(handler)
49-
50-
def add_global_handler(self, event: ProviderEvent, handler: EventHandler) -> None:
51-
self._global_handlers[event].append(handler)
52-
53-
from openfeature.api import get_client
54-
55-
self._run_immediate_handler(get_client(), event, handler)
56-
57-
def remove_global_handler(
58-
self, event: ProviderEvent, handler: EventHandler
59-
) -> None:
60-
self._global_handlers[event].remove(handler)
61-
62-
def run_handlers_for_provider(
63-
self,
64-
provider: FeatureProvider,
65-
event: ProviderEvent,
66-
provider_details: ProviderEventDetails,
67-
) -> None:
68-
details = EventDetails.from_provider_event_details(
69-
provider.get_metadata().name, provider_details
70-
)
71-
# run the global handlers
72-
self.run_global_handlers(event, details)
73-
# run the handlers for clients associated to this provider
74-
for client in self._client_handlers:
75-
if client.provider == provider:
76-
self.run_client_handlers(client, event, details)
77-
78-
def _run_immediate_handler(
79-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
80-
) -> None:
81-
if event == ProviderEvent.from_provider_status(client.get_provider_status()):
82-
handler(EventDetails(provider_name=client.provider.get_metadata().name))
83-
84-
def clear(self) -> None:
85-
self._global_handlers.clear()
86-
self._client_handlers.clear()
18+
_global_handlers: Dict[ProviderEvent, List[EventHandler]] = defaultdict(list)
19+
_client_handlers: Dict[
20+
OpenFeatureClient, Dict[ProviderEvent, List[EventHandler]]
21+
] = defaultdict(lambda: defaultdict(list))
22+
23+
24+
def run_client_handlers(
25+
client: OpenFeatureClient, event: ProviderEvent, details: EventDetails
26+
) -> None:
27+
for handler in _client_handlers[client][event]:
28+
handler(details)
29+
30+
31+
def run_global_handlers(event: ProviderEvent, details: EventDetails) -> None:
32+
for handler in _global_handlers[event]:
33+
handler(details)
34+
35+
36+
def add_client_handler(
37+
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
38+
) -> None:
39+
handlers = _client_handlers[client][event]
40+
handlers.append(handler)
41+
42+
_run_immediate_handler(client, event, handler)
43+
44+
45+
def remove_client_handler(
46+
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
47+
) -> None:
48+
handlers = _client_handlers[client][event]
49+
handlers.remove(handler)
50+
51+
52+
def add_global_handler(event: ProviderEvent, handler: EventHandler) -> None:
53+
_global_handlers[event].append(handler)
54+
55+
from openfeature.api import get_client
56+
57+
_run_immediate_handler(get_client(), event, handler)
58+
59+
60+
def remove_global_handler(event: ProviderEvent, handler: EventHandler) -> None:
61+
_global_handlers[event].remove(handler)
62+
63+
64+
def run_handlers_for_provider(
65+
provider: FeatureProvider,
66+
event: ProviderEvent,
67+
provider_details: ProviderEventDetails,
68+
) -> None:
69+
details = EventDetails.from_provider_event_details(
70+
provider.get_metadata().name, provider_details
71+
)
72+
# run the global handlers
73+
run_global_handlers(event, details)
74+
# run the handlers for clients associated to this provider
75+
for client in _client_handlers:
76+
if client.provider == provider:
77+
run_client_handlers(client, event, details)
78+
79+
80+
def _run_immediate_handler(
81+
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
82+
) -> None:
83+
if event == ProviderEvent.from_provider_status(client.get_provider_status()):
84+
handler(EventDetails(provider_name=client.provider.get_metadata().name))
85+
86+
87+
def clear() -> None:
88+
_global_handlers.clear()
89+
_client_handlers.clear()

openfeature/api.py

+1-24
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import typing
22

3-
from openfeature._event_support import EventSupport
3+
from openfeature import _event_support
44
from openfeature.client import OpenFeatureClient
55
from openfeature.evaluation_context import EvaluationContext
66
from openfeature.event import (
77
EventHandler,
88
ProviderEvent,
9-
ProviderEventDetails,
109
)
1110
from openfeature.exception import GeneralError
1211
from openfeature.hook import Hook
@@ -20,8 +19,6 @@
2019

2120
_provider_registry: ProviderRegistry = ProviderRegistry()
2221

23-
_event_support: EventSupport = EventSupport()
24-
2522

2623
def get_client(
2724
domain: typing.Optional[str] = None, version: typing.Optional[str] = None
@@ -84,23 +81,3 @@ def add_handler(event: ProviderEvent, handler: EventHandler) -> None:
8481

8582
def remove_handler(event: ProviderEvent, handler: EventHandler) -> None:
8683
_event_support.remove_global_handler(event, handler)
87-
88-
89-
def _add_client_handler(
90-
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
91-
) -> None:
92-
_event_support.add_client_handler(client, event, handler)
93-
94-
95-
def _remove_client_handler(
96-
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
97-
) -> None:
98-
_event_support.remove_client_handler(client, event, handler)
99-
100-
101-
def _run_handlers_for_provider(
102-
provider: FeatureProvider,
103-
event: ProviderEvent,
104-
provider_details: ProviderEventDetails,
105-
) -> None:
106-
_event_support.run_handlers_for_provider(provider, event, provider_details)

openfeature/client.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import typing
33
from dataclasses import dataclass
44

5-
from openfeature import api
5+
from openfeature import _event_support, api
66
from openfeature.evaluation_context import EvaluationContext
77
from openfeature.event import EventHandler, ProviderEvent
88
from openfeature.exception import (
@@ -441,10 +441,10 @@ def _create_provider_evaluation(
441441
)
442442

443443
def add_handler(self, event: ProviderEvent, handler: EventHandler) -> None:
444-
api._add_client_handler(self, event, handler)
444+
_event_support.add_client_handler(self, event, handler)
445445

446446
def remove_handler(self, event: ProviderEvent, handler: EventHandler) -> None:
447-
api._remove_client_handler(self, event, handler)
447+
_event_support.remove_client_handler(self, event, handler)
448448

449449

450450
def _typecheck_flag_value(value: typing.Any, flag_type: FlagType) -> None:

openfeature/provider/provider.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22
from abc import abstractmethod
33

4+
from openfeature._event_support import run_handlers_for_provider
45
from openfeature.evaluation_context import EvaluationContext
56
from openfeature.event import ProviderEvent, ProviderEventDetails
67
from openfeature.flag_evaluation import FlagResolutionDetails
@@ -83,6 +84,4 @@ def emit_provider_stale(self, details: ProviderEventDetails) -> None:
8384
self.emit(ProviderEvent.PROVIDER_STALE, details)
8485

8586
def emit(self, event: ProviderEvent, details: ProviderEventDetails) -> None:
86-
from openfeature.api import _run_handlers_for_provider
87-
88-
_run_handlers_for_provider(self, event, details)
87+
run_handlers_for_provider(self, event, details)

openfeature/provider/registry.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import typing
22

3+
from openfeature._event_support import run_handlers_for_provider
34
from openfeature.evaluation_context import EvaluationContext
45
from openfeature.event import (
56
ProviderEvent,
@@ -100,6 +101,4 @@ def _set_provider_status(
100101
self._provider_status[provider] = status
101102

102103
if event := ProviderEvent.from_provider_status(status):
103-
from openfeature.api import _run_handlers_for_provider
104-
105-
_run_handlers_for_provider(provider, event, ProviderEventDetails())
104+
run_handlers_for_provider(provider, event, ProviderEventDetails())

0 commit comments

Comments
 (0)