optimizely-sdk 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/optimizely.rb +117 -128
- data/lib/optimizely/event_builder.rb +25 -30
- data/lib/optimizely/event_dispatcher.rb +4 -4
- data/lib/optimizely/exceptions.rb +3 -4
- data/lib/optimizely/helpers/constants.rb +6 -0
- data/lib/optimizely/notification_center.rb +22 -24
- data/lib/optimizely/project_config.rb +1 -16
- data/lib/optimizely/user_profile_service.rb +9 -12
- data/lib/optimizely/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fde3ad17097c2d63569bade1f3e4095bd8b8d36
|
4
|
+
data.tar.gz: ac971b0cff7db95a591b742a19cc9e9b82e6016d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6cfdff4bef0344791fea78458ef57d7aa81e7de2fdaf3eb843e8ae6196f72766f0257bdef37a00feeae802390fd6016e8db96e2b90d5484fbd0d2317a94bdb4
|
7
|
+
data.tar.gz: f721214b5c3e6a71fb1ef21609d5180e232720ad201fca0c31b2baf62c925a76aea13c4c75ea9bdb312f2bb1ec555f93b6067e31fe931df4843b95db230c6655
|
data/lib/optimizely.rb
CHANGED
@@ -31,28 +31,22 @@ require_relative 'optimizely/project_config'
|
|
31
31
|
|
32
32
|
module Optimizely
|
33
33
|
class Project
|
34
|
-
# Boolean representing if the instance represents a usable Optimizely Project
|
35
|
-
attr_reader :is_valid
|
36
|
-
|
37
|
-
attr_reader :config
|
38
|
-
attr_reader :decision_service
|
39
|
-
attr_reader :error_handler
|
40
|
-
attr_reader :event_builder
|
41
|
-
attr_reader :event_dispatcher
|
42
|
-
attr_reader :logger
|
43
34
|
attr_reader :notification_center
|
35
|
+
# @api no-doc
|
36
|
+
attr_reader :is_valid, :config, :decision_service, :error_handler,
|
37
|
+
:event_builder, :event_dispatcher, :logger
|
38
|
+
|
39
|
+
# Constructor for Projects.
|
40
|
+
#
|
41
|
+
# @param datafile - JSON string representing the project.
|
42
|
+
# @param event_dispatcher - Provides a dispatch_event method which if given a URL and params sends a request to it.
|
43
|
+
# @param logger - Optional component which provides a log method to log messages. By default nothing would be logged.
|
44
|
+
# @param error_handler - Optional component which provides a handle_error method to handle exceptions.
|
45
|
+
# By default all exceptions will be suppressed.
|
46
|
+
# @param user_profile_service - Optional component which provides methods to store and retreive user profiles.
|
47
|
+
# @param skip_json_validation - Optional boolean param to skip JSON schema validation of the provided datafile.
|
44
48
|
|
45
49
|
def initialize(datafile, event_dispatcher = nil, logger = nil, error_handler = nil, skip_json_validation = false, user_profile_service = nil)
|
46
|
-
# Constructor for Projects.
|
47
|
-
#
|
48
|
-
# datafile - JSON string representing the project.
|
49
|
-
# event_dispatcher - Provides a dispatch_event method which if given a URL and params sends a request to it.
|
50
|
-
# logger - Optional component which provides a log method to log messages. By default nothing would be logged.
|
51
|
-
# error_handler - Optional component which provides a handle_error method to handle exceptions.
|
52
|
-
# By default all exceptions will be suppressed.
|
53
|
-
# user_profile_service - Optional component which provides methods to store and retreive user profiles.
|
54
|
-
# skip_json_validation - Optional boolean param to skip JSON schema validation of the provided datafile.
|
55
|
-
|
56
50
|
@is_valid = true
|
57
51
|
@logger = logger || NoOpLogger.new
|
58
52
|
@error_handler = error_handler || NoOpErrorHandler.new
|
@@ -70,35 +64,31 @@ module Optimizely
|
|
70
64
|
|
71
65
|
begin
|
72
66
|
@config = ProjectConfig.new(datafile, @logger, @error_handler)
|
73
|
-
rescue
|
67
|
+
rescue StandardError => e
|
74
68
|
@is_valid = false
|
75
69
|
@logger = SimpleLogger.new
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
unless @config.parsing_succeeded?
|
81
|
-
@is_valid = false
|
82
|
-
@logger = SimpleLogger.new
|
83
|
-
@logger.log(Logger::ERROR, InvalidDatafileVersionError.new.message)
|
70
|
+
error_msg = e.class == InvalidDatafileVersionError ? e.message : InvalidInputError.new('datafile').message
|
71
|
+
error_to_handle = e.class == InvalidDatafileVersionError ? InvalidDatafileVersionError : InvalidInputError
|
72
|
+
@logger.log(Logger::ERROR, error_msg)
|
73
|
+
@error_handler.handle_error error_to_handle
|
84
74
|
return
|
85
75
|
end
|
86
76
|
|
87
77
|
@decision_service = DecisionService.new(@config, @user_profile_service)
|
88
|
-
@event_builder = EventBuilder.new(@config, logger)
|
78
|
+
@event_builder = EventBuilder.new(@config, @logger)
|
89
79
|
@notification_center = NotificationCenter.new(@logger, @error_handler)
|
90
80
|
end
|
91
81
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
# Returns nil if experiment is not Running, if user is not in experiment, or if datafile is invalid.
|
82
|
+
# Buckets visitor and sends impression event to Optimizely.
|
83
|
+
#
|
84
|
+
# @param experiment_key - Experiment which needs to be activated.
|
85
|
+
# @param user_id - String ID for user.
|
86
|
+
# @param attributes - Hash representing user attributes and values to be recorded.
|
87
|
+
#
|
88
|
+
# @return [Variation Key] representing the variation the user will be bucketed in.
|
89
|
+
# @return [nil] if experiment is not Running, if user is not in experiment, or if datafile is invalid.
|
101
90
|
|
91
|
+
def activate(experiment_key, user_id, attributes = nil)
|
102
92
|
unless @is_valid
|
103
93
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('activate').message)
|
104
94
|
return nil
|
@@ -125,16 +115,16 @@ module Optimizely
|
|
125
115
|
variation_key
|
126
116
|
end
|
127
117
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
# Returns nil if experiment is not Running, if user is not in experiment, or if datafile is invalid.
|
118
|
+
# Gets variation where visitor will be bucketed.
|
119
|
+
#
|
120
|
+
# @param experiment_key - Experiment for which visitor variation needs to be determined.
|
121
|
+
# @param user_id - String ID for user.
|
122
|
+
# @param attributes - Hash representing user attributes.
|
123
|
+
#
|
124
|
+
# @return [variation key] where visitor will be bucketed.
|
125
|
+
# @return [nil] if experiment is not Running, if user is not in experiment, or if datafile is invalid.
|
137
126
|
|
127
|
+
def get_variation(experiment_key, user_id, attributes = nil)
|
138
128
|
unless @is_valid
|
139
129
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('get_variation').message)
|
140
130
|
return nil
|
@@ -161,27 +151,27 @@ module Optimizely
|
|
161
151
|
nil
|
162
152
|
end
|
163
153
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
# Returns - Boolean - indicates if the set completed successfully.
|
154
|
+
# Force a user into a variation for a given experiment.
|
155
|
+
#
|
156
|
+
# @param experiment_key - String - key identifying the experiment.
|
157
|
+
# @param user_id - String - The user ID to be used for bucketing.
|
158
|
+
# @param variation_key - The variation key specifies the variation which the user will
|
159
|
+
# be forced into. If nil, then clear the existing experiment-to-variation mapping.
|
160
|
+
#
|
161
|
+
# @return [Boolean] indicates if the set completed successfully.
|
173
162
|
|
163
|
+
def set_forced_variation(experiment_key, user_id, variation_key)
|
174
164
|
@config.set_forced_variation(experiment_key, user_id, variation_key)
|
175
165
|
end
|
176
166
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
# Returns String|nil The forced variation key.
|
167
|
+
# Gets the forced variation for a given user and experiment.
|
168
|
+
#
|
169
|
+
# @param experiment_key - String - Key identifying the experiment.
|
170
|
+
# @param user_id - String - The user ID to be used for bucketing.
|
171
|
+
#
|
172
|
+
# @return [String] The forced variation key.
|
184
173
|
|
174
|
+
def get_forced_variation(experiment_key, user_id)
|
185
175
|
forced_variation_key = nil
|
186
176
|
forced_variation = @config.get_forced_variation(experiment_key, user_id)
|
187
177
|
forced_variation_key = forced_variation['key'] if forced_variation
|
@@ -189,14 +179,14 @@ module Optimizely
|
|
189
179
|
forced_variation_key
|
190
180
|
end
|
191
181
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
# event_tags - Hash representing metadata associated with the event.
|
182
|
+
# Send conversion event to Optimizely.
|
183
|
+
#
|
184
|
+
# @param event_key - Event key representing the event which needs to be recorded.
|
185
|
+
# @param user_id - String ID for user.
|
186
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
187
|
+
# @param event_tags - Hash representing metadata associated with the event.
|
199
188
|
|
189
|
+
def track(event_key, user_id, attributes = nil, event_tags = nil)
|
200
190
|
unless @is_valid
|
201
191
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('track').message)
|
202
192
|
return nil
|
@@ -244,17 +234,18 @@ module Optimizely
|
|
244
234
|
nil
|
245
235
|
end
|
246
236
|
|
237
|
+
# Determine whether a feature is enabled.
|
238
|
+
# Sends an impression event if the user is bucketed into an experiment using the feature.
|
239
|
+
#
|
240
|
+
# @param feature_flag_key - String unique key of the feature.
|
241
|
+
# @param user_id - String ID of the user.
|
242
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
243
|
+
#
|
244
|
+
# @return [True] if the feature is enabled.
|
245
|
+
# @return [False] if the feature is disabled.
|
246
|
+
# @return [False] if the feature is not found.
|
247
|
+
|
247
248
|
def is_feature_enabled(feature_flag_key, user_id, attributes = nil)
|
248
|
-
# Determine whether a feature is enabled.
|
249
|
-
# Sends an impression event if the user is bucketed into an experiment using the feature.
|
250
|
-
#
|
251
|
-
# feature_flag_key - String unique key of the feature.
|
252
|
-
# userId - String ID of the user.
|
253
|
-
# attributes - Hash representing visitor attributes and values which need to be recorded.
|
254
|
-
#
|
255
|
-
# Returns True if the feature is enabled.
|
256
|
-
# False if the feature is disabled.
|
257
|
-
# False if the feature is not found.
|
258
249
|
unless @is_valid
|
259
250
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('is_feature_enabled').message)
|
260
251
|
return false
|
@@ -300,14 +291,13 @@ module Optimizely
|
|
300
291
|
end
|
301
292
|
end
|
302
293
|
|
294
|
+
# Gets keys of all feature flags which are enabled for the user.
|
295
|
+
#
|
296
|
+
# @param user_id - ID for user.
|
297
|
+
# @param attributes - Dict representing user attributes.
|
298
|
+
# @return [feature flag keys] A List of feature flag keys that are enabled for the user.
|
299
|
+
|
303
300
|
def get_enabled_features(user_id, attributes = nil)
|
304
|
-
# Gets keys of all feature flags which are enabled for the user.
|
305
|
-
# Args:
|
306
|
-
# user_id: ID for user.
|
307
|
-
# attributes: Dict representing user attributes.
|
308
|
-
# Returns:
|
309
|
-
# A List of feature flag keys that are enabled for the user.
|
310
|
-
#
|
311
301
|
enabled_features = []
|
312
302
|
|
313
303
|
unless @is_valid
|
@@ -327,17 +317,17 @@ module Optimizely
|
|
327
317
|
enabled_features
|
328
318
|
end
|
329
319
|
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
# Returns nil if the feature flag or variable are not found.
|
320
|
+
# Get the String value of the specified variable in the feature flag.
|
321
|
+
#
|
322
|
+
# @param feature_flag_key - String key of feature flag the variable belongs to
|
323
|
+
# @param variable_key - String key of variable for which we are getting the string value
|
324
|
+
# @param user_id - String user ID
|
325
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
326
|
+
#
|
327
|
+
# @return [String] the string variable value.
|
328
|
+
# @return [nil] if the feature flag or variable are not found.
|
340
329
|
|
330
|
+
def get_feature_variable_string(feature_flag_key, variable_key, user_id, attributes = nil)
|
341
331
|
unless @is_valid
|
342
332
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('get_feature_variable_string').message)
|
343
333
|
return nil
|
@@ -354,17 +344,17 @@ module Optimizely
|
|
354
344
|
variable_value
|
355
345
|
end
|
356
346
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
# Returns nil if the feature flag or variable are not found.
|
347
|
+
# Get the Boolean value of the specified variable in the feature flag.
|
348
|
+
#
|
349
|
+
# @param feature_flag_key - String key of feature flag the variable belongs to
|
350
|
+
# @param variable_key - String key of variable for which we are getting the string value
|
351
|
+
# @param user_id - String user ID
|
352
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
353
|
+
#
|
354
|
+
# @return [Boolean] the boolean variable value.
|
355
|
+
# @return [nil] if the feature flag or variable are not found.
|
367
356
|
|
357
|
+
def get_feature_variable_boolean(feature_flag_key, variable_key, user_id, attributes = nil)
|
368
358
|
unless @is_valid
|
369
359
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('get_feature_variable_boolean').message)
|
370
360
|
return nil
|
@@ -381,17 +371,17 @@ module Optimizely
|
|
381
371
|
variable_value
|
382
372
|
end
|
383
373
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
# Returns nil if the feature flag or variable are not found.
|
374
|
+
# Get the Double value of the specified variable in the feature flag.
|
375
|
+
#
|
376
|
+
# @param feature_flag_key - String key of feature flag the variable belongs to
|
377
|
+
# @param variable_key - String key of variable for which we are getting the string value
|
378
|
+
# @param user_id - String user ID
|
379
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
380
|
+
#
|
381
|
+
# @return [Boolean] the double variable value.
|
382
|
+
# @return [nil] if the feature flag or variable are not found.
|
394
383
|
|
384
|
+
def get_feature_variable_double(feature_flag_key, variable_key, user_id, attributes = nil)
|
395
385
|
unless @is_valid
|
396
386
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('get_feature_variable_double').message)
|
397
387
|
return nil
|
@@ -408,22 +398,21 @@ module Optimizely
|
|
408
398
|
variable_value
|
409
399
|
end
|
410
400
|
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
# Returns nil if the feature flag or variable are not found.
|
401
|
+
# Get the Integer value of the specified variable in the feature flag.
|
402
|
+
#
|
403
|
+
# @param feature_flag_key - String key of feature flag the variable belongs to
|
404
|
+
# @param variable_key - String key of variable for which we are getting the string value
|
405
|
+
# @param user_id - String user ID
|
406
|
+
# @param attributes - Hash representing visitor attributes and values which need to be recorded.
|
407
|
+
#
|
408
|
+
# @return [Integer] variable value.
|
409
|
+
# @return [nil] if the feature flag or variable are not found.
|
421
410
|
|
411
|
+
def get_feature_variable_integer(feature_flag_key, variable_key, user_id, attributes = nil)
|
422
412
|
unless @is_valid
|
423
413
|
@logger.log(Logger::ERROR, InvalidDatafileError.new('get_feature_variable_integer').message)
|
424
414
|
return nil
|
425
415
|
end
|
426
|
-
|
427
416
|
variable_value = get_feature_variable_for_type(
|
428
417
|
feature_flag_key,
|
429
418
|
variable_key,
|
@@ -153,7 +153,7 @@ module Optimizely
|
|
153
153
|
|
154
154
|
event_params = get_common_params(user_id, attributes)
|
155
155
|
conversion_params = get_conversion_params(event_key, event_tags, experiment_variation_map)
|
156
|
-
event_params[:visitors][0][:snapshots] = conversion_params
|
156
|
+
event_params[:visitors][0][:snapshots] = [conversion_params]
|
157
157
|
|
158
158
|
Event.new(:post, ENDPOINT, event_params, POST_HEADERS)
|
159
159
|
end
|
@@ -195,43 +195,38 @@ module Optimizely
|
|
195
195
|
# event_tags - +Hash+ Values associated with the event.
|
196
196
|
# experiment_variation_map - +Hash+ Map of experiment IDs to bucketed variation IDs
|
197
197
|
#
|
198
|
-
# Returns +Hash+
|
199
|
-
|
200
|
-
conversion_event_params = []
|
198
|
+
# Returns +Hash+ Conversion event params
|
201
199
|
|
200
|
+
single_snapshot = {}
|
201
|
+
single_snapshot[:decisions] = []
|
202
202
|
experiment_variation_map.each do |experiment_id, variation_id|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
}
|
211
|
-
|
212
|
-
event_object = {
|
213
|
-
entity_id: @config.event_key_map[event_key]['id'],
|
214
|
-
timestamp: create_timestamp,
|
215
|
-
uuid: create_uuid,
|
216
|
-
key: event_key
|
217
|
-
}
|
218
|
-
|
219
|
-
if event_tags
|
220
|
-
revenue_value = Helpers::EventTagUtils.get_revenue_value(event_tags, @logger)
|
221
|
-
event_object[:revenue] = revenue_value if revenue_value
|
203
|
+
next unless variation_id
|
204
|
+
single_snapshot[:decisions].push(
|
205
|
+
campaign_id: @config.experiment_id_map[experiment_id]['layerId'],
|
206
|
+
experiment_id: experiment_id,
|
207
|
+
variation_id: variation_id
|
208
|
+
)
|
209
|
+
end
|
222
210
|
|
223
|
-
|
224
|
-
|
211
|
+
event_object = {
|
212
|
+
entity_id: @config.event_key_map[event_key]['id'],
|
213
|
+
timestamp: create_timestamp,
|
214
|
+
uuid: create_uuid,
|
215
|
+
key: event_key
|
216
|
+
}
|
225
217
|
|
226
|
-
|
227
|
-
|
218
|
+
if event_tags
|
219
|
+
revenue_value = Helpers::EventTagUtils.get_revenue_value(event_tags, @logger)
|
220
|
+
event_object[:revenue] = revenue_value if revenue_value
|
228
221
|
|
229
|
-
|
222
|
+
numeric_value = Helpers::EventTagUtils.get_numeric_value(event_tags, @logger)
|
223
|
+
event_object[:value] = numeric_value if numeric_value
|
230
224
|
|
231
|
-
|
225
|
+
event_object[:tags] = event_tags unless event_tags.empty?
|
232
226
|
end
|
233
227
|
|
234
|
-
|
228
|
+
single_snapshot[:events] = [event_object]
|
229
|
+
single_snapshot
|
235
230
|
end
|
236
231
|
|
237
232
|
def create_timestamp
|
@@ -25,13 +25,13 @@ module Optimizely
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class EventDispatcher
|
28
|
+
# @api constants
|
28
29
|
REQUEST_TIMEOUT = 10
|
29
30
|
|
31
|
+
# Dispatch the event being represented by the Event object.
|
32
|
+
#
|
33
|
+
# @param event - Event object
|
30
34
|
def dispatch_event(event)
|
31
|
-
# Dispatch the event being represented by the Event object.
|
32
|
-
#
|
33
|
-
# event - Event object
|
34
|
-
|
35
35
|
if event.http_verb == :get
|
36
36
|
begin
|
37
37
|
HTTParty.get(event.url, headers: event.headers, query: event.params, timeout: REQUEST_TIMEOUT)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
#
|
4
|
-
# Copyright 2016-
|
4
|
+
# Copyright 2016-2018, 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.
|
@@ -85,9 +85,8 @@ module Optimizely
|
|
85
85
|
class InvalidDatafileVersionError < Error
|
86
86
|
# Raised when a datafile with an unsupported version is provided
|
87
87
|
|
88
|
-
def initialize(
|
89
|
-
|
90
|
-
super
|
88
|
+
def initialize(version)
|
89
|
+
super("This version of the Ruby SDK does not support the given datafile version: #{version}.")
|
91
90
|
end
|
92
91
|
end
|
93
92
|
|
@@ -17,8 +17,8 @@
|
|
17
17
|
#
|
18
18
|
module Optimizely
|
19
19
|
class NotificationCenter
|
20
|
-
|
21
|
-
attr_reader :notification_id
|
20
|
+
# @api no-doc
|
21
|
+
attr_reader :notifications, :notification_id
|
22
22
|
|
23
23
|
NOTIFICATION_TYPES = {
|
24
24
|
ACTIVATE: 'ACTIVATE: experiment, user_id, attributes, variation, event',
|
@@ -33,18 +33,15 @@ module Optimizely
|
|
33
33
|
@error_handler = error_handler
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
# Returns:
|
44
|
-
# notification ID used to remove the notification
|
36
|
+
# Adds notification callback to the notification center
|
37
|
+
#
|
38
|
+
# @param notification_type - One of the constants in NOTIFICATION_TYPES
|
39
|
+
# @param notification_callback - Function to call when the event is sent
|
40
|
+
#
|
41
|
+
# @return [notification ID] Used to remove the notification
|
45
42
|
|
43
|
+
def add_notification_listener(notification_type, notification_callback)
|
46
44
|
return nil unless notification_type_valid?(notification_type)
|
47
|
-
|
48
45
|
unless notification_callback
|
49
46
|
@logger.log Logger::ERROR, 'Callback can not be empty.'
|
50
47
|
return nil
|
@@ -64,13 +61,13 @@ module Optimizely
|
|
64
61
|
notification_id
|
65
62
|
end
|
66
63
|
|
67
|
-
|
68
|
-
|
64
|
+
# Removes previously added notification callback
|
65
|
+
#
|
66
|
+
# @param notification_id
|
67
|
+
#
|
68
|
+
# @return [Boolean] The function returns true if found and removed, false otherwise
|
69
69
|
|
70
|
-
|
71
|
-
# notification_id:
|
72
|
-
# Returns:
|
73
|
-
# The function returns true if found and removed, false otherwise
|
70
|
+
def remove_notification_listener(notification_id)
|
74
71
|
unless notification_id
|
75
72
|
@logger.log Logger::ERROR, 'Notification ID can not be empty.'
|
76
73
|
return nil
|
@@ -114,13 +111,14 @@ module Optimizely
|
|
114
111
|
@notifications.each_key { |key| @notifications[key] = [] }
|
115
112
|
end
|
116
113
|
|
114
|
+
# Sends off the notification for the specific event. Uses var args to pass in a
|
115
|
+
# arbitrary list of parameters according to which notification type was sent
|
116
|
+
#
|
117
|
+
# @param notification_type - one of the constants in NOTIFICATION_TYPES
|
118
|
+
# @param args - list of arguments to the callback
|
119
|
+
#
|
120
|
+
# @api no-doc
|
117
121
|
def send_notifications(notification_type, *args)
|
118
|
-
# Sends off the notification for the specific event. Uses var args to pass in a
|
119
|
-
# arbitrary list of parameters according to which notification type was sent
|
120
|
-
|
121
|
-
# Args:
|
122
|
-
# notification_type: one of the constants in NOTIFICATION_TYPES
|
123
|
-
# args: list of arguments to the callback
|
124
122
|
return nil unless notification_type_valid?(notification_type)
|
125
123
|
|
126
124
|
@notifications[notification_type].each do |notification|
|
@@ -19,10 +19,6 @@ require_relative 'helpers/constants'
|
|
19
19
|
require_relative 'helpers/validator'
|
20
20
|
|
21
21
|
module Optimizely
|
22
|
-
V1_CONFIG_VERSION = '1'
|
23
|
-
|
24
|
-
UNSUPPORTED_VERSIONS = [V1_CONFIG_VERSION].freeze
|
25
|
-
|
26
22
|
class ProjectConfig
|
27
23
|
# Representation of the Optimizely project config.
|
28
24
|
RUNNING_EXPERIMENT_STATUS = ['Running'].freeze
|
@@ -39,7 +35,6 @@ module Optimizely
|
|
39
35
|
attr_reader :experiments
|
40
36
|
attr_reader :feature_flags
|
41
37
|
attr_reader :groups
|
42
|
-
attr_reader :parsing_succeeded
|
43
38
|
attr_reader :project_id
|
44
39
|
# Boolean - denotes if Optimizely should remove the last block of visitors' IP address before storing event data
|
45
40
|
attr_reader :anonymize_ip
|
@@ -75,12 +70,11 @@ module Optimizely
|
|
75
70
|
|
76
71
|
config = JSON.parse(datafile)
|
77
72
|
|
78
|
-
@parsing_succeeded = false
|
79
73
|
@error_handler = error_handler
|
80
74
|
@logger = logger
|
81
75
|
@version = config['version']
|
82
76
|
|
83
|
-
|
77
|
+
raise InvalidDatafileVersionError, @version unless Helpers::Constants::SUPPORTED_VERSIONS.value?(@version)
|
84
78
|
|
85
79
|
@account_id = config['accountId']
|
86
80
|
@attributes = config.fetch('attributes', [])
|
@@ -147,7 +141,6 @@ module Optimizely
|
|
147
141
|
@feature_flag_key_map.each do |key, feature_flag|
|
148
142
|
@feature_variable_key_map[key] = generate_key_map(feature_flag['variables'], 'key')
|
149
143
|
end
|
150
|
-
@parsing_succeeded = true
|
151
144
|
end
|
152
145
|
|
153
146
|
def experiment_running?(experiment)
|
@@ -389,14 +382,6 @@ module Optimizely
|
|
389
382
|
nil
|
390
383
|
end
|
391
384
|
|
392
|
-
def parsing_succeeded?
|
393
|
-
# Helper method to determine if parsing the datafile was successful.
|
394
|
-
#
|
395
|
-
# Returns Boolean depending on whether parsing the datafile succeeded or not.
|
396
|
-
|
397
|
-
@parsing_succeeded
|
398
|
-
end
|
399
|
-
|
400
385
|
def variation_id_exists?(experiment_id, variation_id)
|
401
386
|
# Determines if a given experiment ID / variation ID pair exists in the datafile
|
402
387
|
#
|
@@ -21,18 +21,15 @@ module Optimizely
|
|
21
21
|
# Class encapsulating user profile service functionality.
|
22
22
|
# Override with your own implementation for storing and retrieving user profiles.
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
# Returns Hash user profile.
|
30
|
-
end
|
24
|
+
# Retrieve the Hash user profile associated with a given user ID.
|
25
|
+
#
|
26
|
+
# @param user_id - String user ID
|
27
|
+
# @return [Hash] user profile.
|
28
|
+
def lookup(user_id); end
|
31
29
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
30
|
+
# Saves a given user profile.
|
31
|
+
#
|
32
|
+
# @param user_profile - Hash user profile.
|
33
|
+
def save(user_profile); end
|
37
34
|
end
|
38
35
|
end
|
data/lib/optimizely/version.rb
CHANGED
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: 2.1.
|
4
|
+
version: 2.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Optimizely
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,42 +30,42 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '12.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.
|
47
|
+
version: 3.8.0
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.
|
54
|
+
version: 3.8.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.58.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.58.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: httparty
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|