Skip to content

Commit f43ed00

Browse files
committed
refactor: move EventSupport class to an internal module
Signed-off-by: Federico Bond <[email protected]>
1 parent c77a091 commit f43ed00

File tree

3 files changed

+89
-78
lines changed

3 files changed

+89
-78
lines changed

openfeature/_event_support.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from __future__ import annotations
2+
3+
from collections import defaultdict
4+
from typing import TYPE_CHECKING, Dict, List
5+
6+
from openfeature.event import (
7+
EventDetails,
8+
EventHandler,
9+
ProviderEvent,
10+
ProviderEventDetails,
11+
)
12+
from openfeature.provider import FeatureProvider
13+
14+
if TYPE_CHECKING:
15+
from openfeature.client import OpenFeatureClient
16+
17+
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()

openfeature/api.py

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

3+
from openfeature._event_support import EventSupport
34
from openfeature.client import OpenFeatureClient
45
from openfeature.evaluation_context import EvaluationContext
56
from openfeature.event import (
67
EventHandler,
7-
EventSupport,
88
ProviderEvent,
99
ProviderEventDetails,
1010
)

openfeature/event.py

+2-77
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
from __future__ import annotations
22

3-
from collections import defaultdict
43
from dataclasses import dataclass, field
54
from enum import Enum
6-
from typing import TYPE_CHECKING, Callable, ClassVar, Dict, List, Optional, Union
5+
from typing import Callable, ClassVar, Dict, List, Optional, Union
76

87
from openfeature.exception import ErrorCode
9-
from openfeature.provider import FeatureProvider, ProviderStatus
10-
11-
if TYPE_CHECKING:
12-
from openfeature.client import OpenFeatureClient
8+
from openfeature.provider import ProviderStatus
139

1410

1511
class ProviderEvent(Enum):
@@ -62,74 +58,3 @@ def from_provider_event_details(
6258

6359

6460
EventHandler = Callable[[EventDetails], None]
65-
66-
67-
class EventSupport:
68-
_global_handlers: Dict[ProviderEvent, List[EventHandler]]
69-
_client_handlers: Dict[OpenFeatureClient, Dict[ProviderEvent, List[EventHandler]]]
70-
71-
def __init__(self) -> None:
72-
self._global_handlers = defaultdict(list)
73-
self._client_handlers = defaultdict(lambda: defaultdict(list))
74-
75-
def run_client_handlers(
76-
self, client: OpenFeatureClient, event: ProviderEvent, details: EventDetails
77-
) -> None:
78-
for handler in self._client_handlers[client][event]:
79-
handler(details)
80-
81-
def run_global_handlers(self, event: ProviderEvent, details: EventDetails) -> None:
82-
for handler in self._global_handlers[event]:
83-
handler(details)
84-
85-
def add_client_handler(
86-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
87-
) -> None:
88-
handlers = self._client_handlers[client][event]
89-
handlers.append(handler)
90-
91-
self._run_immediate_handler(client, event, handler)
92-
93-
def remove_client_handler(
94-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
95-
) -> None:
96-
handlers = self._client_handlers[client][event]
97-
handlers.remove(handler)
98-
99-
def add_global_handler(self, event: ProviderEvent, handler: EventHandler) -> None:
100-
self._global_handlers[event].append(handler)
101-
102-
from openfeature.api import get_client
103-
104-
self._run_immediate_handler(get_client(), event, handler)
105-
106-
def remove_global_handler(
107-
self, event: ProviderEvent, handler: EventHandler
108-
) -> None:
109-
self._global_handlers[event].remove(handler)
110-
111-
def run_handlers_for_provider(
112-
self,
113-
provider: FeatureProvider,
114-
event: ProviderEvent,
115-
provider_details: ProviderEventDetails,
116-
) -> None:
117-
details = EventDetails.from_provider_event_details(
118-
provider.get_metadata().name, provider_details
119-
)
120-
# run the global handlers
121-
self.run_global_handlers(event, details)
122-
# run the handlers for clients associated to this provider
123-
for client in self._client_handlers:
124-
if client.provider == provider:
125-
self.run_client_handlers(client, event, details)
126-
127-
def _run_immediate_handler(
128-
self, client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
129-
) -> None:
130-
if event == ProviderEvent.from_provider_status(client.get_provider_status()):
131-
handler(EventDetails(provider_name=client.provider.get_metadata().name))
132-
133-
def clear(self) -> None:
134-
self._global_handlers.clear()
135-
self._client_handlers.clear()

0 commit comments

Comments
 (0)