Skip to content

Commit b09b930

Browse files
committed
refactor!: move AbstractProvider to openfeature.provider
Signed-off-by: Federico Bond <[email protected]>
1 parent 34ac91c commit b09b930

File tree

7 files changed

+103
-109
lines changed

7 files changed

+103
-109
lines changed

README.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ from typing import List, Optional, Union
259259
from openfeature.evaluation_context import EvaluationContext
260260
from openfeature.flag_evaluation import FlagResolutionDetails
261261
from openfeature.hook import Hook
262-
from openfeature.provider.metadata import Metadata
263-
from openfeature.provider.provider import AbstractProvider
262+
from openfeature.provider import AbstractProvider, Metadata
264263

265264
class MyProvider(AbstractProvider):
266265
def get_metadata(self) -> Metadata:

openfeature/_event_support.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
ProviderEvent,
1010
ProviderEventDetails,
1111
)
12-
from openfeature.provider import FeatureProvider
12+
from openfeature.provider import FeatureProvider, ProviderStatus
1313

1414
if TYPE_CHECKING:
1515
from openfeature.client import OpenFeatureClient
@@ -80,7 +80,13 @@ def run_handlers_for_provider(
8080
def _run_immediate_handler(
8181
client: OpenFeatureClient, event: ProviderEvent, handler: EventHandler
8282
) -> None:
83-
if event == ProviderEvent.from_provider_status(client.get_provider_status()):
83+
status_to_event = {
84+
ProviderStatus.READY: ProviderEvent.PROVIDER_READY,
85+
ProviderStatus.ERROR: ProviderEvent.PROVIDER_ERROR,
86+
ProviderStatus.FATAL: ProviderEvent.PROVIDER_ERROR,
87+
ProviderStatus.STALE: ProviderEvent.PROVIDER_STALE,
88+
}
89+
if event == status_to_event.get(client.get_provider_status()):
8490
handler(EventDetails(provider_name=client.provider.get_metadata().name))
8591

8692

openfeature/event.py

+1-14
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
from dataclasses import dataclass, field
44
from enum import Enum
5-
from typing import Callable, ClassVar, Dict, List, Optional, Union
5+
from typing import Callable, Dict, List, Optional, Union
66

77
from openfeature.exception import ErrorCode
8-
from openfeature.provider import ProviderStatus
98

109
__all__ = ["ProviderEvent", "ProviderEventDetails", "EventDetails", "EventHandler"]
1110

@@ -16,18 +15,6 @@ class ProviderEvent(Enum):
1615
PROVIDER_ERROR = "PROVIDER_ERROR"
1716
PROVIDER_STALE = "PROVIDER_STALE"
1817

19-
__status__: ClassVar[Dict[ProviderStatus, str]] = {
20-
ProviderStatus.READY: PROVIDER_READY,
21-
ProviderStatus.ERROR: PROVIDER_ERROR,
22-
ProviderStatus.FATAL: PROVIDER_ERROR,
23-
ProviderStatus.STALE: PROVIDER_STALE,
24-
}
25-
26-
@classmethod
27-
def from_provider_status(cls, status: ProviderStatus) -> Optional[ProviderEvent]:
28-
value = ProviderEvent.__status__.get(status)
29-
return ProviderEvent[value] if value else None
30-
3118

3219
@dataclass
3320
class ProviderEventDetails:

openfeature/provider/__init__.py

+84-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
from __future__ import annotations
2+
13
import typing
4+
from abc import abstractmethod
25
from enum import Enum
36

47
from openfeature.evaluation_context import EvaluationContext
8+
from openfeature.event import ProviderEvent, ProviderEventDetails
59
from openfeature.flag_evaluation import FlagResolutionDetails
610
from openfeature.hook import Hook
711

812
from .metadata import Metadata
913

10-
__all__ = ["ProviderStatus", "FeatureProvider", "Metadata"]
14+
__all__ = ["AbstractProvider", "ProviderStatus", "FeatureProvider", "Metadata"]
1115

1216

1317
class ProviderStatus(Enum):
@@ -61,3 +65,82 @@ def resolve_object_details(
6165
default_value: typing.Union[dict, list],
6266
evaluation_context: typing.Optional[EvaluationContext] = None,
6367
) -> FlagResolutionDetails[typing.Union[dict, list]]: ...
68+
69+
70+
class AbstractProvider(FeatureProvider):
71+
def initialize(self, evaluation_context: EvaluationContext) -> None:
72+
pass
73+
74+
def shutdown(self) -> None:
75+
pass
76+
77+
@abstractmethod
78+
def get_metadata(self) -> Metadata:
79+
pass
80+
81+
def get_provider_hooks(self) -> typing.List[Hook]:
82+
return []
83+
84+
@abstractmethod
85+
def resolve_boolean_details(
86+
self,
87+
flag_key: str,
88+
default_value: bool,
89+
evaluation_context: typing.Optional[EvaluationContext] = None,
90+
) -> FlagResolutionDetails[bool]:
91+
pass
92+
93+
@abstractmethod
94+
def resolve_string_details(
95+
self,
96+
flag_key: str,
97+
default_value: str,
98+
evaluation_context: typing.Optional[EvaluationContext] = None,
99+
) -> FlagResolutionDetails[str]:
100+
pass
101+
102+
@abstractmethod
103+
def resolve_integer_details(
104+
self,
105+
flag_key: str,
106+
default_value: int,
107+
evaluation_context: typing.Optional[EvaluationContext] = None,
108+
) -> FlagResolutionDetails[int]:
109+
pass
110+
111+
@abstractmethod
112+
def resolve_float_details(
113+
self,
114+
flag_key: str,
115+
default_value: float,
116+
evaluation_context: typing.Optional[EvaluationContext] = None,
117+
) -> FlagResolutionDetails[float]:
118+
pass
119+
120+
@abstractmethod
121+
def resolve_object_details(
122+
self,
123+
flag_key: str,
124+
default_value: typing.Union[dict, list],
125+
evaluation_context: typing.Optional[EvaluationContext] = None,
126+
) -> FlagResolutionDetails[typing.Union[dict, list]]:
127+
pass
128+
129+
def emit_provider_ready(self, details: ProviderEventDetails) -> None:
130+
self.emit(ProviderEvent.PROVIDER_READY, details)
131+
132+
def emit_provider_configuration_changed(
133+
self, details: ProviderEventDetails
134+
) -> None:
135+
self.emit(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, details)
136+
137+
def emit_provider_error(self, details: ProviderEventDetails) -> None:
138+
self.emit(ProviderEvent.PROVIDER_ERROR, details)
139+
140+
def emit_provider_stale(self, details: ProviderEventDetails) -> None:
141+
self.emit(ProviderEvent.PROVIDER_STALE, details)
142+
143+
def emit(self, event: ProviderEvent, details: ProviderEventDetails) -> None:
144+
from openfeature.provider._registry import provider_registry
145+
146+
provider_registry.dispatch_event(self, event, details)

openfeature/provider/in_memory_provider.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
from openfeature.exception import FlagNotFoundError
77
from openfeature.flag_evaluation import FlagMetadata, FlagResolutionDetails, Reason
88
from openfeature.hook import Hook
9-
from openfeature.provider.metadata import Metadata
10-
from openfeature.provider.provider import AbstractProvider
9+
from openfeature.provider import AbstractProvider, Metadata
1110

1211
PASSED_IN_DEFAULT = "Passed in default"
1312

openfeature/provider/no_op_provider.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
from openfeature.evaluation_context import EvaluationContext
44
from openfeature.flag_evaluation import FlagResolutionDetails, Reason
55
from openfeature.hook import Hook
6-
from openfeature.provider.metadata import Metadata
6+
from openfeature.provider import AbstractProvider, Metadata
77
from openfeature.provider.no_op_metadata import NoOpMetadata
8-
from openfeature.provider.provider import AbstractProvider
98

109
PASSED_IN_DEFAULT = "Passed in default"
1110

openfeature/provider/provider.py

+7-86
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,11 @@
1-
import typing
2-
from abc import abstractmethod
1+
import warnings
32

4-
from openfeature.evaluation_context import EvaluationContext
5-
from openfeature.event import ProviderEvent, ProviderEventDetails
6-
from openfeature.flag_evaluation import FlagResolutionDetails
7-
from openfeature.hook import Hook
8-
from openfeature.provider import FeatureProvider
9-
from openfeature.provider.metadata import Metadata
3+
from openfeature.provider import AbstractProvider
104

115
__all__ = ["AbstractProvider"]
126

13-
14-
class AbstractProvider(FeatureProvider):
15-
def initialize(self, evaluation_context: EvaluationContext) -> None:
16-
pass
17-
18-
def shutdown(self) -> None:
19-
pass
20-
21-
@abstractmethod
22-
def get_metadata(self) -> Metadata:
23-
pass
24-
25-
def get_provider_hooks(self) -> typing.List[Hook]:
26-
return []
27-
28-
@abstractmethod
29-
def resolve_boolean_details(
30-
self,
31-
flag_key: str,
32-
default_value: bool,
33-
evaluation_context: typing.Optional[EvaluationContext] = None,
34-
) -> FlagResolutionDetails[bool]:
35-
pass
36-
37-
@abstractmethod
38-
def resolve_string_details(
39-
self,
40-
flag_key: str,
41-
default_value: str,
42-
evaluation_context: typing.Optional[EvaluationContext] = None,
43-
) -> FlagResolutionDetails[str]:
44-
pass
45-
46-
@abstractmethod
47-
def resolve_integer_details(
48-
self,
49-
flag_key: str,
50-
default_value: int,
51-
evaluation_context: typing.Optional[EvaluationContext] = None,
52-
) -> FlagResolutionDetails[int]:
53-
pass
54-
55-
@abstractmethod
56-
def resolve_float_details(
57-
self,
58-
flag_key: str,
59-
default_value: float,
60-
evaluation_context: typing.Optional[EvaluationContext] = None,
61-
) -> FlagResolutionDetails[float]:
62-
pass
63-
64-
@abstractmethod
65-
def resolve_object_details(
66-
self,
67-
flag_key: str,
68-
default_value: typing.Union[dict, list],
69-
evaluation_context: typing.Optional[EvaluationContext] = None,
70-
) -> FlagResolutionDetails[typing.Union[dict, list]]:
71-
pass
72-
73-
def emit_provider_ready(self, details: ProviderEventDetails) -> None:
74-
self.emit(ProviderEvent.PROVIDER_READY, details)
75-
76-
def emit_provider_configuration_changed(
77-
self, details: ProviderEventDetails
78-
) -> None:
79-
self.emit(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, details)
80-
81-
def emit_provider_error(self, details: ProviderEventDetails) -> None:
82-
self.emit(ProviderEvent.PROVIDER_ERROR, details)
83-
84-
def emit_provider_stale(self, details: ProviderEventDetails) -> None:
85-
self.emit(ProviderEvent.PROVIDER_STALE, details)
86-
87-
def emit(self, event: ProviderEvent, details: ProviderEventDetails) -> None:
88-
from openfeature.provider._registry import provider_registry
89-
90-
provider_registry.dispatch_event(self, event, details)
7+
warnings.warn(
8+
"openfeature.provider.provider is deprecated, use openfeature.provider instead",
9+
DeprecationWarning,
10+
stacklevel=1,
11+
)

0 commit comments

Comments
 (0)