66from jwt import decode
77
88from featureflags .analytics import AnalyticsService
9+ from featureflags .evaluations .evaluator import Evaluator
10+ from featureflags .repository import Repository
911
1012from .api .client import AuthenticatedClient , Client
1113from .api .default .authenticate import AuthenticationRequest
1214from .api .default .authenticate import sync as authenticate
1315from .config import Config , default_config
14- from .evaluations .feature import FeatureConfig
15- from .evaluations .segment import Segments
16- from .evaluations .target import Target
16+ from .evaluations .auth_target import Target
1717from .polling import PollingProcessor
1818from .streaming import StreamProcessor
1919from .util import log
@@ -39,6 +39,12 @@ def __init__(
3939 if callable (option ):
4040 option (self ._config )
4141
42+ if self ._config .cache is None :
43+ raise Exception ("cache cannot be none" )
44+
45+ self ._repository = Repository (self ._config .cache )
46+ self ._evaluator = Evaluator (self ._repository )
47+
4248 log .debug ("CfClient initialized" )
4349 self .run ()
4450
@@ -53,20 +59,21 @@ def run(self):
5359 config = self ._config ,
5460 environment_id = self ._environment_id ,
5561 ready = polling_event ,
56- stream_ready = streaming_event
62+ stream_ready = streaming_event ,
63+ repository = self ._repository
5764 )
5865 self ._polling_processor .start ()
5966
6067 if self ._config .enable_stream :
6168 self ._stream = StreamProcessor (
62- cache = self ._config . cache ,
69+ repository = self ._repository ,
6370 client = self ._client ,
6471 environment_id = self ._environment_id ,
6572 api_key = self ._sdk_key ,
6673 token = self ._auth_token ,
6774 config = self ._config ,
6875 ready = streaming_event ,
69- cluster = self ._cluster
76+ cluster = self ._cluster ,
7077 )
7178 self ._stream .start ()
7279
@@ -105,58 +112,37 @@ def authenticate(self):
105112 )
106113 self ._client .with_headers ({"User-Agent" : "PythonSDK/" + VERSION })
107114
108- def map_segments_from_cache (self , fc : FeatureConfig ) -> None :
109- if self ._config .cache :
110- segments = fc .get_segment_identifiers ()
111- for identifier in segments :
112- try :
113- segment = self ._config .cache .get (f'segments/{ identifier } ' )
114- if fc .segments is None :
115- fc .segments = Segments ({})
116- fc .segments [identifier ] = segment
117- except KeyError :
118- log .warning ("segment %s not found in cache" , identifier )
119-
120- def _variation (self , fn : str , identifier : str , target : Target ,
121- default : Any ) -> Any :
122- if self ._config .cache :
123- try :
124- fc = self ._config .cache .get (f'flags/{ identifier } ' )
125- if fc :
126- self .map_segments_from_cache (fc )
127- method = getattr (fc , f'{ fn } _variation' , None )
128- if method :
129- variation = method (target )
130- if variation is None :
131- log .debug ('No variation found' )
132- return default
133- self ._analytics .enqueue (target , fc , variation )
134- return getattr (variation , fn )(default )
135- else :
136- log .error ("Wrong method name %s" , fn )
137- except KeyError :
138- log .warning ("flag %s not found in cache" , identifier )
139- return default
140-
141115 def bool_variation (self , identifier : str , target : Target ,
142116 default : bool ) -> bool :
143- return self ._variation ('bool' , identifier , target , default )
117+ variation = self ._evaluator .evaluate (identifier , target )
118+ self ._analytics .enqueue (target , identifier , variation )
119+ return variation .bool (default )
144120
145121 def int_variation (self , identifier : str , target : Target ,
146122 default : int ) -> int :
147- return self ._variation ('int' , identifier , target , default )
123+ variation = self ._evaluator .evaluate (identifier , target )
124+ self ._analytics .enqueue (target , identifier , variation )
125+ return variation .int (default )
148126
149127 def number_variation (self , identifier : str , target : Target ,
150128 default : float ) -> float :
151- return self ._variation ('number' , identifier , target , default )
129+ variation = self ._evaluator .evaluate (
130+ identifier , target )
131+ self ._analytics .enqueue (target , identifier , variation )
132+ return variation .number (default )
152133
153134 def string_variation (self , identifier : str , target : Target ,
154135 default : str ) -> str :
155- return self ._variation ('string' , identifier , target , default )
136+ variation = self ._evaluator .evaluate (
137+ identifier , target )
138+ self ._analytics .enqueue (target , identifier , variation )
139+ return variation .string (default )
156140
157141 def json_variation (self , identifier : str , target : Target ,
158142 default : Dict [str , Any ]) -> Dict [str , Any ]:
159- return self ._variation ('json' , identifier , target , default )
143+ variation = self ._evaluator .evaluate (identifier , target )
144+ self ._analytics .enqueue (target , identifier , variation )
145+ return variation .json (default )
160146
161147 def close (self ):
162148 log .info ('closing sdk client' )
0 commit comments