optimizely-sdk 2.1.0 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|