optimizely-sdk 3.8.0 → 3.8.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 62e8da2296d75e8f0cad746e8eca25c2670bde6bac084a840c46266322dc378f
4
- data.tar.gz: 67d25b1695a294616b6dc62c7fa1d822c5262f273626d8c3c5a701e78b8e118f
3
+ metadata.gz: 5751701cecb265d27a62c72b268fcb01bb5a37f8696f97a6f56ad29776b226cc
4
+ data.tar.gz: 32533f70bdd2861e2250b3c1b8e274d61f04395dd4ff5cf7ff0776d5f49c2a90
5
5
  SHA512:
6
- metadata.gz: 8891366e7765049a20b552eff7bd070c51eacf635664096235de97c9858f039410f23a5a3e6a902aee2269008cc50c1a45b22026c831843962c3ca04aa9f35af
7
- data.tar.gz: 358139de2ecbbe9c6b2f4473bee6e56b784d22ef0e4067fc20a7f0e85a8d7cf293a6fe3cf7b9f4f1dbcf17c463392f8cedad62a7ad651f2fb70ecaee59fd5391
6
+ metadata.gz: f7258d91de18c854b91f1d938c4624bf227307a2f01aec82aa23d1f2978ca8510209171f4dc62a3d2dcc606784a741dd9f6572d7c6a81475e2b791e70b7e45be
7
+ data.tar.gz: 1471cf812fbebc51fe2207e599f44b60597c3e6e15209af400d4ecabe0333bcd285269b3b421ad80f043c33012aecc54d3d41e59c53dffe64b09b93039b36254
data/lib/optimizely.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #
4
- # Copyright 2016-2020, Optimizely and contributors
4
+ # Copyright 2016-2021, Optimizely and contributors
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -877,12 +877,14 @@ module Optimizely
877
877
  experiment = config.get_experiment_from_key(experiment_key)
878
878
  return nil if experiment.nil?
879
879
 
880
+ experiment_id = experiment['id']
881
+
880
882
  return nil unless user_inputs_valid?(attributes)
881
883
 
882
- variation_id, = @decision_service.get_variation(config, experiment_key, user_id, attributes)
884
+ variation_id, = @decision_service.get_variation(config, experiment_id, user_id, attributes)
883
885
  variation = config.get_variation_from_id(experiment_key, variation_id) unless variation_id.nil?
884
886
  variation_key = variation['key'] if variation
885
- decision_notification_type = if config.feature_experiment?(experiment['id'])
887
+ decision_notification_type = if config.feature_experiment?(experiment_id)
886
888
  Helpers::Constants::DECISION_NOTIFICATION_TYPES['FEATURE_TEST']
887
889
  else
888
890
  Helpers::Constants::DECISION_NOTIFICATION_TYPES['AB_TEST']
@@ -1078,10 +1080,11 @@ module Optimizely
1078
1080
  }
1079
1081
  end
1080
1082
 
1083
+ experiment_id = experiment['id']
1081
1084
  experiment_key = experiment['key']
1082
1085
 
1083
1086
  variation_id = ''
1084
- variation_id = config.get_variation_id_from_key(experiment_key, variation_key) if experiment_key != ''
1087
+ variation_id = config.get_variation_id_from_key_by_experiment_id(experiment_id, variation_key) if experiment_id != ''
1085
1088
 
1086
1089
  metadata = {
1087
1090
  flag_key: flag_key,
@@ -1097,9 +1100,9 @@ module Optimizely
1097
1100
 
1098
1101
  @logger.log(Logger::INFO, "Activating user '#{user_id}' in experiment '#{experiment_key}'.")
1099
1102
 
1100
- experiment = nil if experiment_key == ''
1103
+ experiment = nil if experiment_id == ''
1101
1104
  variation = nil
1102
- variation = config.get_variation_from_id(experiment_key, variation_id) unless experiment.nil?
1105
+ variation = config.get_variation_from_id_by_experiment_id(experiment_id, variation_id) unless experiment.nil?
1103
1106
  log_event = EventFactory.create_log_event(user_event, @logger)
1104
1107
  @notification_center.send_notifications(
1105
1108
  NotificationCenter::NOTIFICATION_TYPES[:ACTIVATE],
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #
4
- # Copyright 2016-2017, 2019-2020 Optimizely and contributors
4
+ # Copyright 2016-2017, 2019-2021 Optimizely and contributors
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ module Optimizely
88
88
  decide_reasons.push(*find_bucket_reasons)
89
89
 
90
90
  if variation_id && variation_id != ''
91
- variation = project_config.get_variation_from_id(experiment_key, variation_id)
91
+ variation = project_config.get_variation_from_id_by_experiment_id(experiment_id, variation_id)
92
92
  return variation, decide_reasons
93
93
  end
94
94
 
@@ -52,10 +52,12 @@ module Optimizely
52
52
  attr_reader :feature_variable_key_map
53
53
  attr_reader :group_id_map
54
54
  attr_reader :rollout_id_map
55
- attr_reader :rollout_experiment_key_map
55
+ attr_reader :rollout_experiment_id_map
56
56
  attr_reader :variation_id_map
57
57
  attr_reader :variation_id_to_variable_usage_map
58
58
  attr_reader :variation_key_map
59
+ attr_reader :variation_id_map_by_experiment_id
60
+ attr_reader :variation_key_map_by_experiment_id
59
61
 
60
62
  def initialize(datafile, logger, error_handler)
61
63
  # ProjectConfig init method to fetch and set project config data
@@ -113,9 +115,11 @@ module Optimizely
113
115
  @audience_id_map = @audience_id_map.merge(generate_key_map(@typed_audiences, 'id')) unless @typed_audiences.empty?
114
116
  @variation_id_map = {}
115
117
  @variation_key_map = {}
118
+ @variation_id_map_by_experiment_id = {}
119
+ @variation_key_map_by_experiment_id = {}
116
120
  @variation_id_to_variable_usage_map = {}
117
121
  @variation_id_to_experiment_map = {}
118
- @experiment_key_map.each_value do |exp|
122
+ @experiment_id_map.each_value do |exp|
119
123
  # Excludes experiments from rollouts
120
124
  variations = exp.fetch('variations')
121
125
  variations.each do |variation|
@@ -125,13 +129,13 @@ module Optimizely
125
129
  end
126
130
  @rollout_id_map = generate_key_map(@rollouts, 'id')
127
131
  # split out the experiment key map for rollouts
128
- @rollout_experiment_key_map = {}
132
+ @rollout_experiment_id_map = {}
129
133
  @rollout_id_map.each_value do |rollout|
130
134
  exps = rollout.fetch('experiments')
131
- @rollout_experiment_key_map = @rollout_experiment_key_map.merge(generate_key_map(exps, 'key'))
135
+ @rollout_experiment_id_map = @rollout_experiment_id_map.merge(generate_key_map(exps, 'id'))
132
136
  end
133
- @all_experiments = @experiment_key_map.merge(@rollout_experiment_key_map)
134
- @all_experiments.each do |key, exp|
137
+ @all_experiments = @experiment_id_map.merge(@rollout_experiment_id_map)
138
+ @all_experiments.each do |id, exp|
135
139
  variations = exp.fetch('variations')
136
140
  variations.each do |variation|
137
141
  variation_id = variation['id']
@@ -141,8 +145,10 @@ module Optimizely
141
145
 
142
146
  @variation_id_to_variable_usage_map[variation_id] = generate_key_map(variation_variables, 'id')
143
147
  end
144
- @variation_id_map[key] = generate_key_map(variations, 'id')
145
- @variation_key_map[key] = generate_key_map(variations, 'key')
148
+ @variation_id_map[exp['key']] = generate_key_map(variations, 'id')
149
+ @variation_key_map[exp['key']] = generate_key_map(variations, 'key')
150
+ @variation_id_map_by_experiment_id[id] = generate_key_map(variations, 'id')
151
+ @variation_key_map_by_experiment_id[id] = generate_key_map(variations, 'key')
146
152
  end
147
153
  @feature_flag_key_map = generate_key_map(@feature_flags, 'key')
148
154
  @experiment_feature_map = {}
@@ -209,6 +215,21 @@ module Optimizely
209
215
  nil
210
216
  end
211
217
 
218
+ def get_experiment_from_id(experiment_id)
219
+ # Retrieves experiment ID for a given key
220
+ #
221
+ # experiment_id - String id representing the experiment
222
+ #
223
+ # Returns Experiment or nil if not found
224
+
225
+ experiment = @experiment_id_map[experiment_id]
226
+ return experiment if experiment
227
+
228
+ @logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
229
+ @error_handler.handle_error InvalidExperimentError
230
+ nil
231
+ end
232
+
212
233
  def get_experiment_key(experiment_id)
213
234
  # Retrieves experiment key for a given ID.
214
235
  #
@@ -277,6 +298,52 @@ module Optimizely
277
298
  nil
278
299
  end
279
300
 
301
+ def get_variation_from_id_by_experiment_id(experiment_id, variation_id)
302
+ # Get variation given experiment ID and variation ID
303
+ #
304
+ # experiment_id - ID representing parent experiment of variation
305
+ # variation_id - ID of the variation
306
+ #
307
+ # Returns the variation or nil if not found
308
+
309
+ variation_id_map_by_experiment_id = @variation_id_map_by_experiment_id[experiment_id]
310
+ if variation_id_map_by_experiment_id
311
+ variation = variation_id_map_by_experiment_id[variation_id]
312
+ return variation if variation
313
+
314
+ @logger.log Logger::ERROR, "Variation id '#{variation_id}' is not in datafile."
315
+ @error_handler.handle_error InvalidVariationError
316
+ return nil
317
+ end
318
+
319
+ @logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
320
+ @error_handler.handle_error InvalidExperimentError
321
+ nil
322
+ end
323
+
324
+ def get_variation_id_from_key_by_experiment_id(experiment_id, variation_key)
325
+ # Get variation given experiment ID and variation key
326
+ #
327
+ # experiment_id - ID representing parent experiment of variation
328
+ # variation_key - Key of the variation
329
+ #
330
+ # Returns the variation or nil if not found
331
+
332
+ variation_key_map = @variation_key_map_by_experiment_id[experiment_id]
333
+ if variation_key_map
334
+ variation = variation_key_map[variation_key]
335
+ return variation['id'] if variation
336
+
337
+ @logger.log Logger::ERROR, "Variation key '#{variation_key}' is not in datafile."
338
+ @error_handler.handle_error InvalidVariationError
339
+ return nil
340
+ end
341
+
342
+ @logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
343
+ @error_handler.handle_error InvalidExperimentError
344
+ nil
345
+ end
346
+
280
347
  def get_variation_id_from_key(experiment_key, variation_key)
281
348
  # Get variation ID given experiment key and variation key
282
349
  #
@@ -300,17 +367,17 @@ module Optimizely
300
367
  nil
301
368
  end
302
369
 
303
- def get_whitelisted_variations(experiment_key)
304
- # Retrieves whitelisted variations for a given experiment Key
370
+ def get_whitelisted_variations(experiment_id)
371
+ # Retrieves whitelisted variations for a given experiment id
305
372
  #
306
- # experiment_key - String Key representing the experiment
373
+ # experiment_id - String id representing the experiment
307
374
  #
308
375
  # Returns whitelisted variations for the experiment or nil
309
376
 
310
- experiment = @experiment_key_map[experiment_key]
377
+ experiment = @experiment_id_map[experiment_id]
311
378
  return experiment['forcedVariations'] if experiment
312
379
 
313
- @logger.log Logger::ERROR, "Experiment key '#{experiment_key}' is not in datafile."
380
+ @logger.log Logger::ERROR, "Experiment ID '#{experiment_id}' is not in datafile."
314
381
  @error_handler.handle_error InvalidExperimentError
315
382
  end
316
383
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  #
4
- # Copyright 2017-2020, Optimizely and contributors
4
+ # Copyright 2017-2021, Optimizely and contributors
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -52,11 +52,11 @@ module Optimizely
52
52
  @forced_variation_map = {}
53
53
  end
54
54
 
55
- def get_variation(project_config, experiment_key, user_id, attributes = nil, decide_options = [])
55
+ def get_variation(project_config, experiment_id, user_id, attributes = nil, decide_options = [])
56
56
  # Determines variation into which user will be bucketed.
57
57
  #
58
58
  # project_config - project_config - Instance of ProjectConfig
59
- # experiment_key - Experiment for which visitor variation needs to be determined
59
+ # experiment_id - Experiment for which visitor variation needs to be determined
60
60
  # user_id - String ID for user
61
61
  # attributes - Hash representing user attributes
62
62
  #
@@ -68,10 +68,10 @@ module Optimizely
68
68
  bucketing_id, bucketing_id_reasons = get_bucketing_id(user_id, attributes)
69
69
  decide_reasons.push(*bucketing_id_reasons)
70
70
  # Check to make sure experiment is active
71
- experiment = project_config.get_experiment_from_key(experiment_key)
71
+ experiment = project_config.get_experiment_from_id(experiment_id)
72
72
  return nil, decide_reasons if experiment.nil?
73
73
 
74
- experiment_id = experiment['id']
74
+ experiment_key = experiment['key']
75
75
  unless project_config.experiment_running?(experiment)
76
76
  message = "Experiment '#{experiment_key}' is not running."
77
77
  @logger.log(Logger::INFO, message)
@@ -80,12 +80,12 @@ module Optimizely
80
80
  end
81
81
 
82
82
  # Check if a forced variation is set for the user
83
- forced_variation, reasons_received = get_forced_variation(project_config, experiment_key, user_id)
83
+ forced_variation, reasons_received = get_forced_variation(project_config, experiment['key'], user_id)
84
84
  decide_reasons.push(*reasons_received)
85
85
  return forced_variation['id'], decide_reasons if forced_variation
86
86
 
87
87
  # Check if user is in a white-listed variation
88
- whitelisted_variation_id, reasons_received = get_whitelisted_variation_id(project_config, experiment_key, user_id)
88
+ whitelisted_variation_id, reasons_received = get_whitelisted_variation_id(project_config, experiment_id, user_id)
89
89
  decide_reasons.push(*reasons_received)
90
90
  return whitelisted_variation_id, decide_reasons if whitelisted_variation_id
91
91
 
@@ -122,7 +122,7 @@ module Optimizely
122
122
  message = ''
123
123
  if variation_id
124
124
  variation_key = variation['key']
125
- message = "User '#{user_id}' is in variation '#{variation_key}' of experiment '#{experiment_key}'."
125
+ message = "User '#{user_id}' is in variation '#{variation_key}' of experiment '#{experiment_id}'."
126
126
  else
127
127
  message = "User '#{user_id}' is in no variation."
128
128
  end
@@ -186,13 +186,13 @@ module Optimizely
186
186
  return nil, decide_reasons
187
187
  end
188
188
 
189
- experiment_key = experiment['key']
190
- variation_id, reasons_received = get_variation(project_config, experiment_key, user_id, attributes, decide_options)
189
+ experiment_id = experiment['id']
190
+ variation_id, reasons_received = get_variation(project_config, experiment_id, user_id, attributes, decide_options)
191
191
  decide_reasons.push(*reasons_received)
192
192
 
193
193
  next unless variation_id
194
194
 
195
- variation = project_config.variation_id_map[experiment_key][variation_id]
195
+ variation = project_config.get_variation_from_id_by_experiment_id(experiment_id, variation_id)
196
196
 
197
197
  return Decision.new(experiment, variation, DECISION_SOURCES['FEATURE_TEST']), decide_reasons
198
198
  end
@@ -315,7 +315,7 @@ module Optimizely
315
315
  return true
316
316
  end
317
317
 
318
- variation_id = project_config.get_variation_id_from_key(experiment_key, variation_key)
318
+ variation_id = project_config.get_variation_id_from_key_by_experiment_id(experiment_id, variation_key)
319
319
 
320
320
  # check if the variation exists in the datafile
321
321
  unless variation_id
@@ -334,7 +334,7 @@ module Optimizely
334
334
  # Gets the forced variation for the given user and experiment.
335
335
  #
336
336
  # project_config - Instance of ProjectConfig
337
- # experiment_key - String Key for experiment
337
+ # experiment_key - String key for experiment
338
338
  # user_id - String ID for user
339
339
  #
340
340
  # Returns Variation The variation which the given user and experiment should be forced into
@@ -354,7 +354,7 @@ module Optimizely
354
354
  return nil, decide_reasons if experiment_id.nil? || experiment_id.empty?
355
355
 
356
356
  unless experiment_to_variation_map.key? experiment_id
357
- message = "No experiment '#{experiment_key}' mapped to user '#{user_id}' in the forced variation map."
357
+ message = "No experiment '#{experiment_id}' mapped to user '#{user_id}' in the forced variation map."
358
358
  @logger.log(Logger::DEBUG, message)
359
359
  decide_reasons.push(message)
360
360
  return nil, decide_reasons
@@ -362,14 +362,14 @@ module Optimizely
362
362
 
363
363
  variation_id = experiment_to_variation_map[experiment_id]
364
364
  variation_key = ''
365
- variation = project_config.get_variation_from_id(experiment_key, variation_id)
365
+ variation = project_config.get_variation_from_id_by_experiment_id(experiment_id, variation_id)
366
366
  variation_key = variation['key'] if variation
367
367
 
368
368
  # check if the variation exists in the datafile
369
369
  # this case is logged in get_variation_from_id
370
370
  return nil, decide_reasons if variation_key.empty?
371
371
 
372
- message = "Variation '#{variation_key}' is mapped to experiment '#{experiment_key}' and user '#{user_id}' in the forced variation map"
372
+ message = "Variation '#{variation_key}' is mapped to experiment '#{experiment_id}' and user '#{user_id}' in the forced variation map"
373
373
  @logger.log(Logger::DEBUG, message)
374
374
  decide_reasons.push(message)
375
375
 
@@ -378,7 +378,7 @@ module Optimizely
378
378
 
379
379
  private
380
380
 
381
- def get_whitelisted_variation_id(project_config, experiment_key, user_id)
381
+ def get_whitelisted_variation_id(project_config, experiment_id, user_id)
382
382
  # Determine if a user is whitelisted into a variation for the given experiment and return the ID of that variation
383
383
  #
384
384
  # project_config - project_config - Instance of ProjectConfig
@@ -387,7 +387,7 @@ module Optimizely
387
387
  #
388
388
  # Returns variation ID into which user_id is whitelisted (nil if no variation)
389
389
 
390
- whitelisted_variations = project_config.get_whitelisted_variations(experiment_key)
390
+ whitelisted_variations = project_config.get_whitelisted_variations(experiment_id)
391
391
 
392
392
  return nil, nil unless whitelisted_variations
393
393
 
@@ -395,7 +395,7 @@ module Optimizely
395
395
 
396
396
  return nil, nil unless whitelisted_variation_key
397
397
 
398
- whitelisted_variation_id = project_config.get_variation_id_from_key(experiment_key, whitelisted_variation_key)
398
+ whitelisted_variation_id = project_config.get_variation_id_from_key_by_experiment_id(experiment_id, whitelisted_variation_key)
399
399
 
400
400
  unless whitelisted_variation_id
401
401
  message = "User '#{user_id}' is whitelisted into variation '#{whitelisted_variation_key}', which is not in the datafile."
@@ -403,7 +403,7 @@ module Optimizely
403
403
  return nil, message
404
404
  end
405
405
 
406
- message = "User '#{user_id}' is whitelisted into variation '#{whitelisted_variation_key}' of experiment '#{experiment_key}'."
406
+ message = "User '#{user_id}' is whitelisted into variation '#{whitelisted_variation_key}' of experiment '#{experiment_id}'."
407
407
  @logger.log(Logger::INFO, message)
408
408
 
409
409
  [whitelisted_variation_id, message]
@@ -54,6 +54,8 @@ module Optimizely
54
54
 
55
55
  def get_experiment_from_key(experiment_key); end
56
56
 
57
+ def get_experiment_from_id(experiment_id); end
58
+
57
59
  def get_experiment_key(experiment_id); end
58
60
 
59
61
  def get_event_from_key(event_key); end
@@ -62,9 +64,13 @@ module Optimizely
62
64
 
63
65
  def get_variation_from_id(experiment_key, variation_id); end
64
66
 
67
+ def get_variation_from_id_by_experiment_id(experiment_id, variation_id); end
68
+
69
+ def get_variation_id_from_key_by_experiment_id(experiment_id, variation_key); end
70
+
65
71
  def get_variation_id_from_key(experiment_key, variation_key); end
66
72
 
67
- def get_whitelisted_variations(experiment_key); end
73
+ def get_whitelisted_variations(experiment_id); end
68
74
 
69
75
  def get_attribute_id(attribute_key); end
70
76
 
@@ -17,5 +17,5 @@
17
17
  #
18
18
  module Optimizely
19
19
  CLIENT_ENGINE = 'ruby-sdk'
20
- VERSION = '3.8.0'
20
+ VERSION = '3.8.1'
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optimizely-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.0
4
+ version: 3.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Optimizely
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-16 00:00:00.000000000 Z
11
+ date: 2021-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -200,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
200
  - !ruby/object:Gem::Version
201
201
  version: '0'
202
202
  requirements: []
203
- rubygems_version: 3.0.3
203
+ rubygems_version: 3.0.1
204
204
  signing_key:
205
205
  specification_version: 4
206
206
  summary: Ruby SDK for Optimizely's testing framework