@@ -25,8 +25,8 @@ def __init__(self, revision, experiments_map, features_map, datafile=None,
25
25
self .experiments_map = experiments_map
26
26
self .features_map = features_map
27
27
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 ''
30
30
self .attributes = attributes or []
31
31
self .events = events or []
32
32
self .audiences = audiences or []
@@ -125,11 +125,9 @@ def __init__(self, project_config):
125
125
Merging typed_audiences with audiences from project_config.
126
126
The typed_audiences has higher precedence.
127
127
'''
128
-
129
- typed_audiences = project_config .typed_audiences [:]
130
128
optly_typed_audiences = []
131
129
id_lookup_dict = {}
132
- for typed_audience in typed_audiences :
130
+ for typed_audience in project_config . typed_audiences :
133
131
optly_audience = OptimizelyAudience (
134
132
typed_audience .get ('id' ),
135
133
typed_audience .get ('name' ),
@@ -269,6 +267,8 @@ def _create_lookup_maps(self):
269
267
self .exp_id_to_feature_map = {}
270
268
self .feature_key_variable_key_to_variable_map = {}
271
269
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 = {}
272
272
273
273
for feature in self .feature_flags :
274
274
for experiment_id in feature ['experimentIds' ]:
@@ -283,10 +283,12 @@ def _create_lookup_maps(self):
283
283
variables_key_map [variable ['key' ]] = opt_variable
284
284
variables_id_map [variable ['id' ]] = opt_variable
285
285
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
286
288
self .feature_key_variable_key_to_variable_map [feature ['key' ]] = variables_key_map
287
289
self .feature_key_variable_id_to_variable_map [feature ['key' ]] = variables_id_map
288
290
289
- def _get_variables_map (self , experiment , variation ):
291
+ def _get_variables_map (self , experiment , variation , feature_id = None ):
290
292
""" Gets variables map for given experiment and variation.
291
293
292
294
Args:
@@ -296,23 +298,27 @@ def _get_variables_map(self, experiment, variation):
296
298
Returns:
297
299
dict - Map of variable key to OptimizelyVariable for the given variation.
298
300
"""
301
+ variables_map = {}
302
+
299
303
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 :
301
305
return {}
302
306
303
307
# 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' ]])
306
312
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' ]
312
318
313
319
return variables_map
314
320
315
- def _get_variations_map (self , experiment ):
321
+ def _get_variations_map (self , experiment , feature_id = None ):
316
322
""" Gets variation map for the given experiment.
317
323
318
324
Args:
@@ -324,7 +330,7 @@ def _get_variations_map(self, experiment):
324
330
variations_map = {}
325
331
326
332
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 )
328
334
feature_enabled = variation .get ('featureEnabled' , None )
329
335
330
336
optly_variation = OptimizelyVariation (
@@ -394,7 +400,7 @@ def _get_features_map(self, experiments_id_map):
394
400
395
401
for feature in self .feature_flags :
396
402
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' ] )
398
404
experiment_rules = []
399
405
400
406
exp_map = {}
@@ -415,7 +421,7 @@ def _get_features_map(self, experiments_id_map):
415
421
416
422
return features_map
417
423
418
- def _get_delivery_rules (self , rollouts , rollout_id ):
424
+ def _get_delivery_rules (self , rollouts , rollout_id , feature_id ):
419
425
""" Gets an array of rollouts for the project config
420
426
421
427
returns:
@@ -435,12 +441,12 @@ def _get_delivery_rules(self, rollouts, rollout_id):
435
441
for optly_audience in self .audiences :
436
442
audiences_map [optly_audience .id ] = optly_audience .name
437
443
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 ' )
440
446
if experiments :
441
447
for experiment in experiments :
442
448
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 )
444
450
)
445
451
audiences = self .replace_ids_with_names (experiment .get ('audienceConditions' , []), audiences_map )
446
452
optly_exp .audiences = audiences
0 commit comments