Skip to content

Commit c2ca556

Browse files
committed
Addressing comments
2 parents 999169a + cdc2599 commit c2ca556

File tree

6 files changed

+538
-44
lines changed

6 files changed

+538
-44
lines changed

.rubocop.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ Metrics/AbcSize:
1212
Metrics/BlockLength:
1313
Enabled: false
1414

15+
Metrics/BlockNesting:
16+
Enabled: false
17+
1518
Metrics/ClassLength:
1619
Enabled: false
1720

.travis.yml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@ jobs:
3030
merge_mode: replace
3131
env: SDK=ruby
3232
cache: false
33-
language: python
33+
language: minimal
3434
before_install: skip
35-
install:
36-
- "pip install awscli"
35+
install: skip
3736
before_script:
38-
- "aws s3 cp s3://optimizely-travisci-artifacts/ci/trigger_fullstack-sdk-compat.sh ci/ && chmod u+x ci/trigger_fullstack-sdk-compat.sh"
37+
- mkdir $HOME/travisci-tools && pushd $HOME/travisci-tools && git init && git pull https://[email protected]/optimizely/travisci-tools.git && popd
3938
script:
40-
- "ci/trigger_fullstack-sdk-compat.sh"
39+
- "$HOME/travisci-tools/fsc-trigger/trigger_fullstack-sdk-compat.sh"
4140
after_success: travis_terminate 0

lib/optimizely.rb

Lines changed: 75 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,17 @@ def get_variation(experiment_key, user_id, attributes = nil)
143143
end
144144

145145
variation_id = @decision_service.get_variation(experiment_key, user_id, attributes)
146+
variation = @config.get_variation_from_id(experiment_key, variation_id) unless variation_id.nil?
147+
variation_key = variation['key'] if variation
146148

147-
unless variation_id.nil?
148-
variation = @config.get_variation_from_id(experiment_key, variation_id)
149-
return variation['key'] if variation
150-
end
151-
nil
149+
@notification_center.send_notifications(
150+
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
151+
Helpers::Constants::DECISION_INFO_TYPES['EXPERIMENT'], user_id, (attributes || {}),
152+
experiment_key: experiment_key,
153+
variation_key: variation_key
154+
)
155+
156+
variation_key
152157
end
153158

154159
# Force a user into a variation for a given experiment.
@@ -257,30 +262,44 @@ def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
257262
end
258263

259264
decision = @decision_service.get_variation_for_feature(feature_flag, user_id, attributes)
260-
if decision.nil?
261-
@logger.log(Logger::INFO,
262-
"Feature '#{feature_flag_key}' is not enabled for user '#{user_id}'.")
263-
return false
264-
end
265265

266-
variation = decision['variation']
267-
if decision.source == Optimizely::DecisionService::DECISION_SOURCE_EXPERIMENT
268-
# Send event if Decision came from an experiment.
269-
send_impression(decision.experiment, variation['key'], user_id, attributes)
270-
else
271-
@logger.log(Logger::DEBUG,
272-
"The user '#{user_id}' is not being experimented on in feature '#{feature_flag_key}'.")
266+
feature_enabled = false
267+
source_string = Optimizely::DecisionService::DECISION_SOURCE_ROLLOUT
268+
if decision.is_a?(Optimizely::DecisionService::Decision)
269+
variation = decision['variation']
270+
feature_enabled = variation['featureEnabled']
271+
if decision.source == Optimizely::DecisionService::DECISION_SOURCE_EXPERIMENT
272+
source_string = Optimizely::DecisionService::DECISION_SOURCE_EXPERIMENT
273+
experiment_key = decision.experiment['key']
274+
variation_key = variation['key']
275+
# Send event if Decision came from an experiment.
276+
send_impression(decision.experiment, variation['key'], user_id, attributes)
277+
else
278+
@logger.log(Logger::DEBUG,
279+
"The user '#{user_id}' is not being experimented on in feature '#{feature_flag_key}'.")
280+
end
273281
end
274282

275-
if variation['featureEnabled'] == true
283+
@notification_center.send_notifications(
284+
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
285+
Helpers::Constants::DECISION_INFO_TYPES['FEATURE'],
286+
user_id, (attributes || {}),
287+
feature_key: feature_flag_key,
288+
feature_enabled: feature_enabled,
289+
source: source_string.upcase,
290+
source_experiment_key: experiment_key,
291+
source_variation_key: variation_key
292+
)
293+
294+
if feature_enabled == true
276295
@logger.log(Logger::INFO,
277296
"Feature '#{feature_flag_key}' is enabled for user '#{user_id}'.")
278297
return true
279-
else
280-
@logger.log(Logger::INFO,
281-
"Feature '#{feature_flag_key}' is not enabled for user '#{user_id}'.")
282-
return false
283298
end
299+
300+
@logger.log(Logger::INFO,
301+
"Feature '#{feature_flag_key}' is not enabled for user '#{user_id}'.")
302+
false
284303
end
285304

286305
# Gets keys of all feature flags which are enabled for the user.
@@ -461,25 +480,39 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
461480
# Error message logged in ProjectConfig- get_feature_flag_from_key
462481
return nil if variable.nil?
463482

483+
feature_enabled = false
484+
464485
# Returns nil if type differs
465486
if variable['type'] != variable_type
466487
@logger.log(Logger::WARN,
467488
"Requested variable as type '#{variable_type}' but variable '#{variable_key}' is of type '#{variable['type']}'.")
468489
return nil
469490
else
491+
source_string = Optimizely::DecisionService::DECISION_SOURCE_ROLLOUT
470492
decision = @decision_service.get_variation_for_feature(feature_flag, user_id, attributes)
471493
variable_value = variable['defaultValue']
472494
if decision
473495
variation = decision['variation']
474-
variation_variable_usages = @config.variation_id_to_variable_usage_map[variation['id']]
475-
variable_id = variable['id']
476-
if variation['featureEnabled'] && variation_variable_usages&.key?(variable_id)
477-
variable_value = variation_variable_usages[variable_id]['value']
478-
@logger.log(Logger::INFO,
479-
"Got variable value '#{variable_value}' for variable '#{variable_key}' of feature flag '#{feature_flag_key}'.")
496+
if decision['source'] == Optimizely::DecisionService::DECISION_SOURCE_EXPERIMENT
497+
experiment_key = decision.experiment['key']
498+
variation_key = variation['key']
499+
source_string = Optimizely::DecisionService::DECISION_SOURCE_EXPERIMENT
500+
end
501+
feature_enabled = variation['featureEnabled']
502+
if feature_enabled == true
503+
variation_variable_usages = @config.variation_id_to_variable_usage_map[variation['id']]
504+
variable_id = variable['id']
505+
if variation_variable_usages&.key?(variable_id)
506+
variable_value = variation_variable_usages[variable_id]['value']
507+
@logger.log(Logger::INFO,
508+
"Got variable value '#{variable_value}' for variable '#{variable_key}' of feature flag '#{feature_flag_key}'.")
509+
else
510+
@logger.log(Logger::DEBUG,
511+
"Variable '#{variable_key}' is not used in variation '#{variation['key']}'. Returning the default variable value '#{variable_value}'.")
512+
end
480513
else
481514
@logger.log(Logger::DEBUG,
482-
"Variable '#{variable_key}' is not used in variation '#{variation['key']}'. Returning the default variable value '#{variable_value}'.")
515+
"Feature '#{feature_flag_key}' for variation '#{variation['key']}' is not enabled. Returning the default variable value '#{variable_value}'.")
483516
end
484517
else
485518
@logger.log(Logger::INFO,
@@ -489,6 +522,19 @@ def get_feature_variable_for_type(feature_flag_key, variable_key, variable_type,
489522

490523
variable_value = Helpers::VariableType.cast_value_to_type(variable_value, variable_type, @logger)
491524

525+
@notification_center.send_notifications(
526+
NotificationCenter::NOTIFICATION_TYPES[:DECISION],
527+
Helpers::Constants::DECISION_INFO_TYPES['FEATURE_VARIABLE'], user_id, (attributes || {}),
528+
feature_key: feature_flag_key,
529+
feature_enabled: feature_enabled,
530+
variable_key: variable_key,
531+
variable_type: variable_type,
532+
variable_value: variable_value,
533+
source: source_string.upcase,
534+
source_experiment_key: experiment_key,
535+
source_variation_key: variation_key
536+
)
537+
492538
variable_value
493539
end
494540

lib/optimizely/helpers/constants.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,12 @@ module Constants
352352
'UNKNOWN_MATCH_TYPE' => 'Audience condition %s uses an unknown match type. You may need ' \
353353
'to upgrade to a newer release of the Optimizely SDK.'
354354
}.freeze
355+
356+
DECISION_INFO_TYPES = {
357+
'EXPERIMENT' => 'experiment',
358+
'FEATURE' => 'feature',
359+
'FEATURE_VARIABLE' => 'feature_variable'
360+
}.freeze
355361
end
356362
end
357363
end

lib/optimizely/notification_center.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22

33
#
4-
# Copyright 2017-2018, Optimizely and contributors
4+
# Copyright 2017-2019, Optimizely and contributors
55
#
66
# Licensed under the Apache License, Version 2.0 (the "License");
77
# you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ class NotificationCenter
2222

2323
NOTIFICATION_TYPES = {
2424
ACTIVATE: 'ACTIVATE: experiment, user_id, attributes, variation, event',
25+
DECISION: 'DECISION: type, user_id, attributes, decision_info',
2526
TRACK: 'TRACK: event_key, user_id, attributes, event_tags, event'
2627
}.freeze
2728

0 commit comments

Comments
 (0)