Skip to content

Commit 9c62d29

Browse files
committed
refactor!: move AbstractProvider to openfeature.provider
1 parent 34ac91c commit 9c62d29

File tree

5 files changed

+109
-105
lines changed

5 files changed

+109
-105
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

+2-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,7 @@ 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+
if ProviderStatus.from_provider_event(event) == client.get_provider_status():
8484
handler(EventDetails(provider_name=client.provider.get_metadata().name))
8585

8686

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

+98-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):
@@ -17,6 +21,20 @@ class ProviderStatus(Enum):
1721
STALE = "STALE"
1822
FATAL = "FATAL"
1923

24+
__events__: typing.ClassVar[typing.Dict[ProviderEvent, str]] = {
25+
ProviderEvent.PROVIDER_READY: READY,
26+
ProviderEvent.PROVIDER_ERROR: ERROR,
27+
ProviderEvent.PROVIDER_ERROR: FATAL,
28+
ProviderEvent.PROVIDER_STALE: STALE,
29+
}
30+
31+
@classmethod
32+
def from_provider_event(
33+
cls, event: ProviderEvent
34+
) -> typing.Optional[ProviderStatus]:
35+
value = ProviderStatus.__events__.get(event)
36+
return ProviderStatus[value] if value else None
37+
2038

2139
class FeatureProvider(typing.Protocol): # pragma: no cover
2240
def initialize(self, evaluation_context: EvaluationContext) -> None: ...
@@ -61,3 +79,82 @@ def resolve_object_details(
6179
default_value: typing.Union[dict, list],
6280
evaluation_context: typing.Optional[EvaluationContext] = None,
6381
) -> FlagResolutionDetails[typing.Union[dict, list]]: ...
82+
83+
84+
class AbstractProvider(FeatureProvider):
85+
def initialize(self, evaluation_context: EvaluationContext) -> None:
86+
pass
87+
88+
def shutdown(self) -> None:
89+
pass
90+
91+
@abstractmethod
92+
def get_metadata(self) -> Metadata:
93+
pass
94+
95+
def get_provider_hooks(self) -> typing.List[Hook]:
96+
return []
97+
98+
@abstractmethod
99+
def resolve_boolean_details(
100+
self,
101+
flag_key: str,
102+
default_value: bool,
103+
evaluation_context: typing.Optional[EvaluationContext] = None,
104+
) -> FlagResolutionDetails[bool]:
105+
pass
106+
107+
@abstractmethod
108+
def resolve_string_details(
109+
self,
110+
flag_key: str,
111+
default_value: str,
112+
evaluation_context: typing.Optional[EvaluationContext] = None,
113+
) -> FlagResolutionDetails[str]:
114+
pass
115+
116+
@abstractmethod
117+
def resolve_integer_details(
118+
self,
119+
flag_key: str,
120+
default_value: int,
121+
evaluation_context: typing.Optional[EvaluationContext] = None,
122+
) -> FlagResolutionDetails[int]:
123+
pass
124+
125+
@abstractmethod
126+
def resolve_float_details(
127+
self,
128+
flag_key: str,
129+
default_value: float,
130+
evaluation_context: typing.Optional[EvaluationContext] = None,
131+
) -> FlagResolutionDetails[float]:
132+
pass
133+
134+
@abstractmethod
135+
def resolve_object_details(
136+
self,
137+
flag_key: str,
138+
default_value: typing.Union[dict, list],
139+
evaluation_context: typing.Optional[EvaluationContext] = None,
140+
) -> FlagResolutionDetails[typing.Union[dict, list]]:
141+
pass
142+
143+
def emit_provider_ready(self, details: ProviderEventDetails) -> None:
144+
self.emit(ProviderEvent.PROVIDER_READY, details)
145+
146+
def emit_provider_configuration_changed(
147+
self, details: ProviderEventDetails
148+
) -> None:
149+
self.emit(ProviderEvent.PROVIDER_CONFIGURATION_CHANGED, details)
150+
151+
def emit_provider_error(self, details: ProviderEventDetails) -> None:
152+
self.emit(ProviderEvent.PROVIDER_ERROR, details)
153+
154+
def emit_provider_stale(self, details: ProviderEventDetails) -> None:
155+
self.emit(ProviderEvent.PROVIDER_STALE, details)
156+
157+
def emit(self, event: ProviderEvent, details: ProviderEventDetails) -> None:
158+
from openfeature.provider._registry import provider_registry
159+
160+
provider_registry.dispatch_event(self, event, details)

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)