@@ -345,10 +345,8 @@ def _get_feature_variable_for_type(
345
345
source_info = {}
346
346
variable_value = variable .defaultValue
347
347
348
- user_context = self .create_user_context (user_id , attributes )
349
- # error is logged in create_user_context
350
- if user_context is None :
351
- return None
348
+ user_context = OptimizelyUserContext (self , self .logger , user_id , attributes , False )
349
+
352
350
decision , _ = self .decision_service .get_variation_for_feature (project_config , feature_flag , user_context )
353
351
354
352
if decision .variation :
@@ -434,10 +432,8 @@ def _get_all_feature_variables_for_type(
434
432
feature_enabled = False
435
433
source_info = {}
436
434
437
- user_context = self .create_user_context (user_id , attributes )
438
- # error is logged in create_user_context
439
- if user_context is None :
440
- return None
435
+ user_context = OptimizelyUserContext (self , self .logger , user_id , attributes , False )
436
+
441
437
decision , _ = self .decision_service .get_variation_for_feature (project_config , feature_flag , user_context )
442
438
443
439
if decision .variation :
@@ -643,10 +639,7 @@ def get_variation(
643
639
if not self ._validate_user_inputs (attributes ):
644
640
return None
645
641
646
- user_context = self .create_user_context (user_id , attributes )
647
- # error is logged in create_user_context
648
- if not user_context :
649
- return None
642
+ user_context = OptimizelyUserContext (self , self .logger , user_id , attributes , False )
650
643
651
644
variation , _ = self .decision_service .get_variation (project_config , experiment , user_context )
652
645
if variation :
@@ -705,10 +698,8 @@ def is_feature_enabled(self, feature_key: str, user_id: str, attributes: Optiona
705
698
706
699
feature_enabled = False
707
700
source_info = {}
708
- user_context = self .create_user_context (user_id , attributes )
709
- # error is logged in create_user_context
710
- if not user_context :
711
- return False
701
+
702
+ user_context = OptimizelyUserContext (self , self .logger , user_id , attributes , False )
712
703
713
704
decision , _ = self .decision_service .get_variation_for_feature (project_config , feature , user_context )
714
705
is_source_experiment = decision .source == enums .DecisionSources .FEATURE_TEST
@@ -1083,7 +1074,7 @@ def create_user_context(
1083
1074
self .logger .error (enums .Errors .INVALID_INPUT .format ('attributes' ))
1084
1075
return None
1085
1076
1086
- return OptimizelyUserContext (self , self .logger , user_id , attributes )
1077
+ return OptimizelyUserContext (self , self .logger , user_id , attributes , True )
1087
1078
1088
1079
def _decide (
1089
1080
self , user_context : Optional [OptimizelyUserContext ], key : str ,
@@ -1330,8 +1321,8 @@ def setup_odp(self) -> None:
1330
1321
1331
1322
if not self .sdk_settings .segments_cache :
1332
1323
self .sdk_settings .segments_cache = LRUCache (
1333
- self .sdk_settings .segments_cache_size or enums . OdpSegmentsCacheConfig . DEFAULT_CAPACITY ,
1334
- self .sdk_settings .segments_cache_timeout_in_secs or enums . OdpSegmentsCacheConfig . DEFAULT_TIMEOUT_SECS
1324
+ self .sdk_settings .segments_cache_size ,
1325
+ self .sdk_settings .segments_cache_timeout_in_secs
1335
1326
)
1336
1327
1337
1328
def _update_odp_config_on_datafile_update (self ) -> None :
@@ -1354,9 +1345,17 @@ def _update_odp_config_on_datafile_update(self) -> None:
1354
1345
)
1355
1346
1356
1347
def identify_user (self , user_id : str ) -> None :
1348
+ if not self .is_valid :
1349
+ self .logger .error (enums .Errors .INVALID_OPTIMIZELY .format ('identify_user' ))
1350
+ return
1351
+
1357
1352
self .odp_manager .identify_user (user_id )
1358
1353
1359
1354
def fetch_qualified_segments (self , user_id : str , options : Optional [list [str ]] = None ) -> Optional [list [str ]]:
1355
+ if not self .is_valid :
1356
+ self .logger .error (enums .Errors .INVALID_OPTIMIZELY .format ('fetch_qualified_segments' ))
1357
+ return None
1358
+
1360
1359
return self .odp_manager .fetch_qualified_segments (user_id , options or [])
1361
1360
1362
1361
def send_odp_event (
@@ -1376,11 +1375,16 @@ def send_odp_event(
1376
1375
data: An optional dictionary for associated data. The default event data will be added to this data
1377
1376
before sending to the ODP server.
1378
1377
"""
1378
+ if not self .is_valid :
1379
+ self .logger .error (enums .Errors .INVALID_OPTIMIZELY .format ('send_odp_event' ))
1380
+ return
1381
+
1379
1382
self .odp_manager .send_event (type , action , identifiers or {}, data or {})
1380
1383
1381
1384
def close (self ) -> None :
1382
1385
if callable (getattr (self .event_processor , 'stop' , None )):
1383
1386
self .event_processor .stop () # type: ignore[attr-defined]
1384
- self .odp_manager .close ()
1387
+ if self .is_valid :
1388
+ self .odp_manager .close ()
1385
1389
if callable (getattr (self .config_manager , 'stop' , None )):
1386
1390
self .config_manager .stop () # type: ignore[attr-defined]
0 commit comments