Skip to content

Commit a71f50e

Browse files
committed
address PR comments
1 parent e061abc commit a71f50e

File tree

5 files changed

+101
-142
lines changed

5 files changed

+101
-142
lines changed

optimizely/decision_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def get_variation_for_rollout(self, project_config, feature, user, options):
357357
decide_reasons.append(message)
358358
return Decision(None, None, enums.DecisionSources.ROLLOUT), decide_reasons
359359

360-
rollout_rules = project_config.get_rollout_experiments_map(rollout)
360+
rollout_rules = project_config.get_rollout_experiments(rollout)
361361

362362
if not rollout_rules:
363363
message = 'Rollout {} has no experiments.'.format(rollout.id)

optimizely/optimizely.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -444,20 +444,20 @@ def activate(self, experiment_key, user_id, attributes=None):
444444
self.logger.error(enums.Errors.INVALID_PROJECT_CONFIG.format('activate'))
445445
return None
446446

447-
variation_key = self.get_variation(experiment_key, user_id, attributes)
447+
variation = self.get_variation(experiment_key, user_id, attributes)
448448

449-
# check for case where variation_key can be None when attributes are invalid
450-
if not variation_key:
449+
if not variation:
451450
self.logger.info('Not activating user "%s".' % user_id)
452451
return None
453452

454-
# variation_key is normally a tuple object
455-
if not variation_key[0]:
453+
variation_key, reasons = variation
454+
455+
if not variation_key:
456456
self.logger.info('Not activating user "%s".' % user_id)
457457
return None
458458

459459
experiment = project_config.get_experiment_from_key(experiment_key)
460-
variation = project_config.get_variation_from_key(experiment_key, variation_key)
460+
variation = project_config.get_variation_from_key(experiment_key, variation_key.key)
461461

462462
# Create and dispatch impression event
463463
self.logger.info('Activating user "%s" in experiment "%s".' % (user_id, experiment.key))
@@ -1040,8 +1040,8 @@ def _decide(self, user_context, key, decide_options=None):
10401040
forced_decision_response = user_context.find_validated_forced_decision(optimizely_decision_context,
10411041
options=decide_options)
10421042

1043-
variation, received_response = forced_decision_response
1044-
reasons += received_response
1043+
variation, decision_reasons = forced_decision_response
1044+
reasons += decision_reasons
10451045

10461046
if variation:
10471047
decision = Decision(None, variation, enums.DecisionSources.FEATURE_TEST)
@@ -1203,12 +1203,10 @@ def get_flag_variation_by_key(self, flag_key, variation_key):
12031203
if not config:
12041204
return None
12051205

1206-
# this will take care of force decision objects which contain variation_key inside them
1207-
if isinstance(variation_key, OptimizelyUserContext.OptimizelyForcedDecision):
1208-
variation_key = variation_key.variation_key
1209-
12101206
variations = config.flag_variations_map[flag_key]
12111207

12121208
for variation in variations:
12131209
if variation.key == variation_key:
12141210
return variation
1211+
1212+
return None

optimizely/optimizely_user_context.py

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ def __init__(self, optimizely_client, user_id, user_attributes=None):
4646

4747
self._user_attributes = user_attributes.copy() if user_attributes else {}
4848
self.lock = threading.Lock()
49-
with self.lock:
50-
self.forced_decisions = {}
49+
self.forced_decisions = {}
5150
self.log = logger.SimpleLogger(min_level=enums.LogLevels.INFO)
5251

5352
# decision context
@@ -149,70 +148,61 @@ def as_json(self):
149148
'attributes': self.get_user_attributes(),
150149
}
151150

152-
def set_forced_decision(self, OptimizelyDecisionContext, OptimizelyForcedDecision):
151+
def set_forced_decision(self, decision_context, decision):
153152
"""
154153
Sets the forced decision for a given decision context.
155154
156155
Args:
157-
OptimizelyDecisionContext: a decision context.
158-
OptimizelyForcedDecision: a forced decision.
156+
decision_context: a decision context.
157+
decision: a forced decision.
159158
160159
Returns:
161160
True if the forced decision has been set successfully.
162161
"""
163-
config = self.client.get_optimizely_config()
164-
165-
if self.client is None or config is None:
162+
if not self.client.config_manager.get_config():
166163
self.log.logger.error(OptimizelyDecisionMessage.SDK_NOT_READY)
167164
return False
168165

169-
context = OptimizelyDecisionContext
170-
decision = OptimizelyForcedDecision
171-
172166
with self.lock:
173-
self.forced_decisions[context] = decision
167+
self.forced_decisions[decision_context] = decision
174168

175169
return True
176170

177-
def get_forced_decision(self, OptimizelyDecisionContext):
171+
def get_forced_decision(self, decision_context):
178172
"""
179173
Gets the forced decision (variation key) for a given decision context.
180174
181175
Args:
182-
OptimizelyDecisionContext: a decision context.
176+
decision_context: a decision context.
183177
184178
Returns:
185179
A variation key or None if forced decisions are not set for the parameters.
186180
"""
187-
config = self.client.get_optimizely_config()
188-
189-
if self.client is None or config is None:
181+
if not self.client.config_manager.get_config():
190182
self.log.logger.error(OptimizelyDecisionMessage.SDK_NOT_READY)
191183
return None
192184

193-
forced_decision_key = self.find_forced_decision(OptimizelyDecisionContext)
185+
forced_decision_key = self.find_forced_decision(decision_context)
194186

195187
return forced_decision_key if forced_decision_key else None
196188

197-
def remove_forced_decision(self, OptimizelyDecisionContext):
189+
def remove_forced_decision(self, decision_context):
198190
"""
199191
Removes the forced decision for a given flag and an optional rule.
200192
201193
Args:
202-
OptimizelyDecisionContext: a decision context.
194+
decision_context: a decision context.
203195
204196
Returns:
205197
Returns: true if the forced decision has been removed successfully.
206198
"""
207-
config = self.client.get_optimizely_config()
208-
209-
if self.client is None or config is None:
199+
if not self.client.config_manager.get_config():
210200
self.log.logger.error(OptimizelyDecisionMessage.SDK_NOT_READY)
211201
return False
212202

213203
with self.lock:
214-
if OptimizelyDecisionContext in self.forced_decisions.keys():
215-
del self.forced_decisions[OptimizelyDecisionContext]
204+
if decision_context in self.forced_decisions.keys():
205+
del self.forced_decisions[decision_context]
216206
return True
217207

218208
return False
@@ -224,9 +214,7 @@ def remove_all_forced_decisions(self):
224214
Returns:
225215
True if forced decisions have been removed successfully.
226216
"""
227-
config = self.client.get_optimizely_config()
228-
229-
if self.client is None or config is None:
217+
if not self.client.config_manager.get_config():
230218
self.log.logger.error(OptimizelyDecisionMessage.SDK_NOT_READY)
231219
return False
232220

@@ -235,23 +223,23 @@ def remove_all_forced_decisions(self):
235223

236224
return True
237225

238-
def find_forced_decision(self, OptimizelyDecisionContext):
226+
def find_forced_decision(self, decision_context):
239227

240228
with self.lock:
241229
if not self.forced_decisions:
242230
return None
243231

244232
# must allow None to be returned for the Flags only case
245-
return self.forced_decisions.get(OptimizelyDecisionContext)
233+
return self.forced_decisions.get(decision_context)
246234

247-
def find_validated_forced_decision(self, OptimizelyDecisionContext, options):
235+
def find_validated_forced_decision(self, decision_context, options):
248236

249237
reasons = []
250238

251-
forced_decision_response = self.find_forced_decision(OptimizelyDecisionContext)
239+
forced_decision_response = self.find_forced_decision(decision_context)
252240

253-
flag_key = OptimizelyDecisionContext.flag_key
254-
rule_key = OptimizelyDecisionContext.rule_key
241+
flag_key = decision_context.flag_key
242+
rule_key = decision_context.rule_key
255243

256244
if forced_decision_response:
257245
variation = self.client.get_flag_variation_by_key(flag_key, forced_decision_response.variation_key)

optimizely/project_config.py

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def __init__(self, datafile, logger, error_handler):
150150
if not flag['rolloutId'] == '':
151151
rollout = self.rollout_id_map[flag['rolloutId']]
152152

153-
rollout_experiments = self.get_rollout_experiments_map(rollout)
153+
rollout_experiments = self.get_rollout_experiments(rollout)
154154

155155
if rollout and rollout.experiments:
156156
experiments.extend(rollout_experiments)
@@ -213,7 +213,7 @@ def _deserialize_audience(audience_map):
213213

214214
return audience_map
215215

216-
def get_rollout_experiments_map(self, rollout):
216+
def get_rollout_experiments(self, rollout):
217217
""" Helper method to get rollout experiments as a map.
218218
219219
Args:
@@ -387,8 +387,8 @@ def get_audience(self, audience_id):
387387
self.logger.error('Audience ID "%s" is not in datafile.' % audience_id)
388388
self.error_handler.handle_error(exceptions.InvalidAudienceException((enums.Errors.INVALID_AUDIENCE)))
389389

390-
def get_variation_from_key(self, experiment_key, variation):
391-
""" Get variation given experiment and variation.
390+
def get_variation_from_key(self, experiment_key, variation_key):
391+
""" Get variation given experiment and variation key.
392392
393393
Args:
394394
experiment: Key representing parent experiment of variation.
@@ -399,28 +399,20 @@ def get_variation_from_key(self, experiment_key, variation):
399399
Object representing the variation.
400400
"""
401401

402-
variation_key = None
402+
variation_map = self.variation_key_map.get(experiment_key)
403403

404-
if isinstance(variation, tuple):
405-
if isinstance(variation[0], entities.Variation):
406-
variation_key, received_reasons = variation
407-
else:
408-
variation_map = self.variation_key_map.get(experiment_key)
409-
410-
if variation_map:
411-
variation_key = variation_map.get(variation)
404+
if variation_map:
405+
variation = variation_map.get(variation_key)
406+
if variation:
407+
return variation
412408
else:
413-
self.logger.error('Experiment key "%s" is not in datafile.' % experiment_key)
414-
self.error_handler.handle_error(
415-
exceptions.InvalidExperimentException(enums.Errors.INVALID_EXPERIMENT_KEY))
409+
self.logger.error('Variation key "%s" is not in datafile.' % variation_key)
410+
self.error_handler.handle_error(exceptions.InvalidVariationException(enums.Errors.INVALID_VARIATION))
416411
return None
417412

418-
if variation_key:
419-
return variation_key
420-
else:
421-
self.logger.error('Variation key "%s" is not in datafile.' % variation)
422-
self.error_handler.handle_error(exceptions.InvalidVariationException(enums.Errors.INVALID_VARIATION))
423-
return None
413+
self.logger.error('Experiment key "%s" is not in datafile.' % experiment_key)
414+
self.error_handler.handle_error(exceptions.InvalidExperimentException(enums.Errors.INVALID_EXPERIMENT_KEY))
415+
return None
424416

425417
def get_variation_from_id(self, experiment_key, variation_id):
426418
""" Get variation given experiment and variation ID.

0 commit comments

Comments
 (0)