@@ -345,10 +345,8 @@ def _get_feature_variable_for_type(
345345 source_info = {}
346346 variable_value = variable .defaultValue
347347
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+
352350 decision , _ = self .decision_service .get_variation_for_feature (project_config , feature_flag , user_context )
353351
354352 if decision .variation :
@@ -434,10 +432,8 @@ def _get_all_feature_variables_for_type(
434432 feature_enabled = False
435433 source_info = {}
436434
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+
441437 decision , _ = self .decision_service .get_variation_for_feature (project_config , feature_flag , user_context )
442438
443439 if decision .variation :
@@ -643,10 +639,7 @@ def get_variation(
643639 if not self ._validate_user_inputs (attributes ):
644640 return None
645641
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 )
650643
651644 variation , _ = self .decision_service .get_variation (project_config , experiment , user_context )
652645 if variation :
@@ -705,10 +698,8 @@ def is_feature_enabled(self, feature_key: str, user_id: str, attributes: Optiona
705698
706699 feature_enabled = False
707700 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 )
712703
713704 decision , _ = self .decision_service .get_variation_for_feature (project_config , feature , user_context )
714705 is_source_experiment = decision .source == enums .DecisionSources .FEATURE_TEST
@@ -1083,7 +1074,7 @@ def create_user_context(
10831074 self .logger .error (enums .Errors .INVALID_INPUT .format ('attributes' ))
10841075 return None
10851076
1086- return OptimizelyUserContext (self , self .logger , user_id , attributes )
1077+ return OptimizelyUserContext (self , self .logger , user_id , attributes , True )
10871078
10881079 def _decide (
10891080 self , user_context : Optional [OptimizelyUserContext ], key : str ,
@@ -1330,8 +1321,8 @@ def setup_odp(self) -> None:
13301321
13311322 if not self .sdk_settings .segments_cache :
13321323 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
13351326 )
13361327
13371328 def _update_odp_config_on_datafile_update (self ) -> None :
@@ -1354,9 +1345,17 @@ def _update_odp_config_on_datafile_update(self) -> None:
13541345 )
13551346
13561347 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+
13571352 self .odp_manager .identify_user (user_id )
13581353
13591354 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+
13601359 return self .odp_manager .fetch_qualified_segments (user_id , options or [])
13611360
13621361 def send_odp_event (
@@ -1376,11 +1375,16 @@ def send_odp_event(
13761375 data: An optional dictionary for associated data. The default event data will be added to this data
13771376 before sending to the ODP server.
13781377 """
1378+ if not self .is_valid :
1379+ self .logger .error (enums .Errors .INVALID_OPTIMIZELY .format ('send_odp_event' ))
1380+ return
1381+
13791382 self .odp_manager .send_event (type , action , identifiers or {}, data or {})
13801383
13811384 def close (self ) -> None :
13821385 if callable (getattr (self .event_processor , 'stop' , None )):
13831386 self .event_processor .stop () # type: ignore[attr-defined]
1384- self .odp_manager .close ()
1387+ if self .is_valid :
1388+ self .odp_manager .close ()
13851389 if callable (getattr (self .config_manager , 'stop' , None )):
13861390 self .config_manager .stop () # type: ignore[attr-defined]
0 commit comments