@@ -25,8 +25,8 @@ def __init__(self, revision, experiments_map, features_map, datafile=None,
2525 self .experiments_map = experiments_map
2626 self .features_map = features_map
2727 self ._datafile = datafile
28- self .sdk_key = sdk_key
29- self .environment_key = environment_key
28+ self .sdk_key = sdk_key or ''
29+ self .environment_key = environment_key or ''
3030 self .attributes = attributes or []
3131 self .events = events or []
3232 self .audiences = audiences or []
@@ -125,11 +125,9 @@ def __init__(self, project_config):
125125 Merging typed_audiences with audiences from project_config.
126126 The typed_audiences has higher precedence.
127127 '''
128-
129- typed_audiences = project_config .typed_audiences [:]
130128 optly_typed_audiences = []
131129 id_lookup_dict = {}
132- for typed_audience in typed_audiences :
130+ for typed_audience in project_config . typed_audiences :
133131 optly_audience = OptimizelyAudience (
134132 typed_audience .get ('id' ),
135133 typed_audience .get ('name' ),
@@ -269,6 +267,8 @@ def _create_lookup_maps(self):
269267 self .exp_id_to_feature_map = {}
270268 self .feature_key_variable_key_to_variable_map = {}
271269 self .feature_key_variable_id_to_variable_map = {}
270+ self .feature_id_variable_id_to_feature_variables_map = {}
271+ self .feature_id_variable_key_to_feature_variables_map = {}
272272
273273 for feature in self .feature_flags :
274274 for experiment_id in feature ['experimentIds' ]:
@@ -283,10 +283,12 @@ def _create_lookup_maps(self):
283283 variables_key_map [variable ['key' ]] = opt_variable
284284 variables_id_map [variable ['id' ]] = opt_variable
285285
286+ self .feature_id_variable_id_to_feature_variables_map [feature ['id' ]] = variables_id_map
287+ self .feature_id_variable_key_to_feature_variables_map [feature ['id' ]] = variables_key_map
286288 self .feature_key_variable_key_to_variable_map [feature ['key' ]] = variables_key_map
287289 self .feature_key_variable_id_to_variable_map [feature ['key' ]] = variables_id_map
288290
289- def _get_variables_map (self , experiment , variation ):
291+ def _get_variables_map (self , experiment , variation , feature_id = None ):
290292 """ Gets variables map for given experiment and variation.
291293
292294 Args:
@@ -296,23 +298,27 @@ def _get_variables_map(self, experiment, variation):
296298 Returns:
297299 dict - Map of variable key to OptimizelyVariable for the given variation.
298300 """
301+ variables_map = {}
302+
299303 feature_flag = self .exp_id_to_feature_map .get (experiment ['id' ], None )
300- if feature_flag is None :
304+ if feature_flag is None and feature_id is None :
301305 return {}
302306
303307 # set default variables for each variation
304- variables_map = {}
305- variables_map = copy .deepcopy (self .feature_key_variable_key_to_variable_map [feature_flag ['key' ]])
308+ if feature_id :
309+ variables_map = copy .deepcopy (self .feature_id_variable_key_to_feature_variables_map [feature_id ])
310+ else :
311+ variables_map = copy .deepcopy (self .feature_key_variable_key_to_variable_map [feature_flag ['key' ]])
306312
307- # set variation specific variable value if any
308- if variation .get ('featureEnabled' ):
309- for variable in variation .get ('variables' , []):
310- feature_variable = self .feature_key_variable_id_to_variable_map [feature_flag ['key' ]][variable ['id' ]]
311- variables_map [feature_variable .key ].value = variable ['value' ]
313+ # set variation specific variable value if any
314+ if variation .get ('featureEnabled' ):
315+ for variable in variation .get ('variables' , []):
316+ feature_variable = self .feature_key_variable_id_to_variable_map [feature_flag ['key' ]][variable ['id' ]]
317+ variables_map [feature_variable .key ].value = variable ['value' ]
312318
313319 return variables_map
314320
315- def _get_variations_map (self , experiment ):
321+ def _get_variations_map (self , experiment , feature_id = None ):
316322 """ Gets variation map for the given experiment.
317323
318324 Args:
@@ -324,7 +330,7 @@ def _get_variations_map(self, experiment):
324330 variations_map = {}
325331
326332 for variation in experiment .get ('variations' , []):
327- variables_map = self ._get_variables_map (experiment , variation )
333+ variables_map = self ._get_variables_map (experiment , variation , feature_id )
328334 feature_enabled = variation .get ('featureEnabled' , None )
329335
330336 optly_variation = OptimizelyVariation (
@@ -394,7 +400,7 @@ def _get_features_map(self, experiments_id_map):
394400
395401 for feature in self .feature_flags :
396402
397- delivery_rules = self ._get_delivery_rules (self .rollouts , feature .get ('rolloutId' ))
403+ delivery_rules = self ._get_delivery_rules (self .rollouts , feature .get ('rolloutId' ), feature [ 'id' ] )
398404 experiment_rules = []
399405
400406 exp_map = {}
@@ -415,7 +421,7 @@ def _get_features_map(self, experiments_id_map):
415421
416422 return features_map
417423
418- def _get_delivery_rules (self , rollouts , rollout_id ):
424+ def _get_delivery_rules (self , rollouts , rollout_id , feature_id ):
419425 """ Gets an array of rollouts for the project config
420426
421427 returns:
@@ -435,12 +441,12 @@ def _get_delivery_rules(self, rollouts, rollout_id):
435441 for optly_audience in self .audiences :
436442 audiences_map [optly_audience .id ] = optly_audience .name
437443
438- # Get the experiments_map for that rollout
439- experiments = rollout .get ('experiments_map ' )
444+ # Get the experiments for that rollout
445+ experiments = rollout .get ('experiments ' )
440446 if experiments :
441447 for experiment in experiments :
442448 optly_exp = OptimizelyExperiment (
443- experiment ['id' ], experiment ['key' ], self ._get_variations_map (experiment )
449+ experiment ['id' ], experiment ['key' ], self ._get_variations_map (experiment , feature_id )
444450 )
445451 audiences = self .replace_ids_with_names (experiment .get ('audienceConditions' , []), audiences_map )
446452 optly_exp .audiences = audiences
0 commit comments