1
+ from __future__ import annotations
2
+
1
3
import typing
4
+ from abc import abstractmethod
2
5
from enum import Enum
3
6
4
7
from openfeature .evaluation_context import EvaluationContext
8
+ from openfeature .event import ProviderEvent , ProviderEventDetails
5
9
from openfeature .flag_evaluation import FlagResolutionDetails
6
10
from openfeature .hook import Hook
7
11
8
12
from .metadata import Metadata
9
13
10
- __all__ = ["ProviderStatus" , "FeatureProvider" , "Metadata" ]
14
+ __all__ = ["AbstractProvider" , " ProviderStatus" , "FeatureProvider" , "Metadata" ]
11
15
12
16
13
17
class ProviderStatus (Enum ):
@@ -17,6 +21,20 @@ class ProviderStatus(Enum):
17
21
STALE = "STALE"
18
22
FATAL = "FATAL"
19
23
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
+
20
38
21
39
class FeatureProvider (typing .Protocol ): # pragma: no cover
22
40
def initialize (self , evaluation_context : EvaluationContext ) -> None : ...
@@ -61,3 +79,82 @@ def resolve_object_details(
61
79
default_value : typing .Union [dict , list ],
62
80
evaluation_context : typing .Optional [EvaluationContext ] = None ,
63
81
) -> 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 )
0 commit comments