optimizely-sdk 1.0.2 → 1.1.0
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 +20 -3
- data/lib/optimizely/event_builder.rb +42 -16
- data/lib/optimizely/exceptions.rb +8 -0
- data/lib/optimizely/helpers/event_tag_utils.rb +57 -0
- data/lib/optimizely/helpers/validator.rb +10 -0
- data/lib/optimizely/version.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b62ea44bca6fdbbd5c1086e88505cc27968fdff
|
4
|
+
data.tar.gz: 95a11cfbea360da196f6ba1eb9f243a5d8edfbd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 615a93c3c0c3993d4f719bf97f967b3ac6af4e1cc75e3beb6ab968be6f30d3cbe5844aaaea31b71a78ee3b096564194af6a782d8a671510c965ecc4558caba52
|
7
|
+
data.tar.gz: 5df1b06c97e9454e149764ff30db4e78a59c5f9265062ffa337af26da7405fa534f33ae5c8777b4f45536e6ad27045129ce1ac9ac6fb7e055005087e76624dc1
|
data/lib/optimizely.rb
CHANGED
@@ -162,13 +162,13 @@ module Optimizely
|
|
162
162
|
@config.get_variation_key_from_id(experiment_key, variation_id)
|
163
163
|
end
|
164
164
|
|
165
|
-
def track(event_key, user_id, attributes = nil,
|
165
|
+
def track(event_key, user_id, attributes = nil, event_tags = nil)
|
166
166
|
# Send conversion event to Optimizely.
|
167
167
|
#
|
168
168
|
# event_key - Goal key representing the event which needs to be recorded.
|
169
169
|
# user_id - String ID for user.
|
170
170
|
# attributes - Hash representing visitor attributes and values which need to be recorded.
|
171
|
-
#
|
171
|
+
# event_tags - Hash representing metadata associated with the event.
|
172
172
|
|
173
173
|
unless @is_valid
|
174
174
|
logger = SimpleLogger.new
|
@@ -176,7 +176,15 @@ module Optimizely
|
|
176
176
|
return nil
|
177
177
|
end
|
178
178
|
|
179
|
+
if event_tags and event_tags.is_a? Numeric
|
180
|
+
event_tags = {
|
181
|
+
'revenue' => event_tags
|
182
|
+
}
|
183
|
+
@logger.log(Logger::WARN, 'Event value is deprecated in track call. Use event tags to pass in revenue value instead.')
|
184
|
+
end
|
185
|
+
|
179
186
|
return nil if attributes && !attributes_valid?(attributes)
|
187
|
+
return nil if event_tags && !event_tags_valid?(event_tags)
|
180
188
|
|
181
189
|
experiment_ids = @config.get_experiment_ids_for_goal(event_key)
|
182
190
|
if experiment_ids.empty?
|
@@ -202,7 +210,7 @@ module Optimizely
|
|
202
210
|
end
|
203
211
|
|
204
212
|
conversion_event = @event_builder.create_conversion_event(event_key, user_id, attributes,
|
205
|
-
|
213
|
+
event_tags, valid_experiment_keys)
|
206
214
|
@logger.log(Logger::INFO,
|
207
215
|
'Dispatching conversion event to URL %s with params %s.' % [conversion_event.url,
|
208
216
|
conversion_event.params])
|
@@ -251,6 +259,15 @@ module Optimizely
|
|
251
259
|
true
|
252
260
|
end
|
253
261
|
|
262
|
+
def event_tags_valid?(event_tags)
|
263
|
+
unless Helpers::Validator.event_tags_valid?(event_tags)
|
264
|
+
@logger.log(Logger::ERROR, 'Provided event tags are in an invalid format.')
|
265
|
+
@error_handler.handle_error(InvalidEventTagFormatError)
|
266
|
+
return false
|
267
|
+
end
|
268
|
+
true
|
269
|
+
end
|
270
|
+
|
254
271
|
def validate_inputs(datafile, skip_json_validation)
|
255
272
|
unless skip_json_validation
|
256
273
|
raise InvalidInputError.new('datafile') unless Helpers::Validator.datafile_valid?(datafile)
|
@@ -16,6 +16,7 @@
|
|
16
16
|
require_relative './audience'
|
17
17
|
require_relative './params'
|
18
18
|
require_relative './version'
|
19
|
+
require_relative '../optimizely/helpers/event_tag_utils'
|
19
20
|
|
20
21
|
module Optimizely
|
21
22
|
class Event
|
@@ -89,20 +90,21 @@ module Optimizely
|
|
89
90
|
Event.new(:post, IMPRESSION_EVENT_ENDPOINT, @params, POST_HEADERS)
|
90
91
|
end
|
91
92
|
|
92
|
-
def create_conversion_event(event_key, user_id, attributes,
|
93
|
+
def create_conversion_event(event_key, user_id, attributes, event_tags, experiment_keys)
|
93
94
|
# Create conversion Event to be sent to the logging endpoint.
|
94
95
|
#
|
95
96
|
# event_key - Event key representing the event which needs to be recorded.
|
96
97
|
# user_id - ID for user.
|
97
98
|
# attributes - Hash representing user attributes and values which need to be recorded.
|
98
|
-
#
|
99
|
+
# event_tags - Hash representing metadata associated with the event.
|
99
100
|
# experiment_keys - Array of valid experiment keys for the event
|
100
101
|
#
|
101
102
|
# Returns event hash encapsulating the conversion event.
|
102
103
|
|
103
104
|
@params = {}
|
104
105
|
add_common_params(user_id, attributes)
|
105
|
-
add_conversion_event(event_key
|
106
|
+
add_conversion_event(event_key)
|
107
|
+
add_event_tags(event_tags)
|
106
108
|
add_layer_states(user_id, experiment_keys)
|
107
109
|
Event.new(:post, CONVERSION_EVENT_ENDPOINT, @params, POST_HEADERS)
|
108
110
|
end
|
@@ -161,26 +163,47 @@ module Optimizely
|
|
161
163
|
}
|
162
164
|
end
|
163
165
|
|
164
|
-
def
|
166
|
+
def add_event_tags(event_tags)
|
167
|
+
@params['eventFeatures'] ||= []
|
168
|
+
@params['eventMetrics'] ||= []
|
169
|
+
|
170
|
+
return if event_tags.nil?
|
171
|
+
|
172
|
+
event_tags.each_pair do |event_tag_key, event_tag_value|
|
173
|
+
next if event_tag_value.nil?
|
174
|
+
|
175
|
+
event_feature = {
|
176
|
+
'id' => event_tag_key,
|
177
|
+
'type' => 'custom',
|
178
|
+
'value' => event_tag_value,
|
179
|
+
'shouldIndex' => false,
|
180
|
+
}
|
181
|
+
@params['eventFeatures'].push(event_feature)
|
182
|
+
|
183
|
+
end
|
184
|
+
|
185
|
+
event_value = Helpers::EventTagUtils.get_revenue_value(event_tags)
|
186
|
+
|
187
|
+
if event_value
|
188
|
+
event_metric = {
|
189
|
+
'name' => 'revenue',
|
190
|
+
'value' => event_value
|
191
|
+
}
|
192
|
+
@params['eventMetrics'].push(event_metric)
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
def add_conversion_event(event_key)
|
165
198
|
# Add conversion event information to the event.
|
166
199
|
#
|
167
200
|
# event_key - Event key representing the event which needs to be recorded.
|
168
|
-
# event_value - Value associated with the event. Can be used to represent revenue in cents.
|
169
201
|
|
170
202
|
event_id = @config.event_key_map[event_key]['id']
|
171
203
|
event_name = @config.event_key_map[event_key]['key']
|
172
204
|
|
173
205
|
@params['eventEntityId'] = event_id
|
174
|
-
@params['eventFeatures'] = []
|
175
206
|
@params['eventName'] = event_name
|
176
|
-
@params['eventMetrics'] = []
|
177
|
-
|
178
|
-
if event_value
|
179
|
-
@params['eventMetrics'].push({
|
180
|
-
'name' => 'revenue',
|
181
|
-
'value' => event_value,
|
182
|
-
})
|
183
|
-
end
|
184
207
|
end
|
185
208
|
|
186
209
|
def add_layer_states(user_id, experiment_keys)
|
@@ -241,18 +264,21 @@ module Optimizely
|
|
241
264
|
Event.new(:get, sprintf(OFFLINE_API_PATH, project_id: @params[Params::PROJECT_ID]), @params, {})
|
242
265
|
end
|
243
266
|
|
244
|
-
def create_conversion_event(event_key, user_id, attributes,
|
267
|
+
def create_conversion_event(event_key, user_id, attributes, event_tags, experiment_keys)
|
245
268
|
# Create conversion Event to be sent to the logging endpoint.
|
246
269
|
#
|
247
270
|
# event_key - Goal key representing the event which needs to be recorded.
|
248
271
|
# user_id - ID for user.
|
249
272
|
# attributes - Hash representing user attributes and values which need to be recorded.
|
250
|
-
#
|
273
|
+
# event_tags - Hash representing metadata associated with the event.
|
251
274
|
# experiment_keys - Array of valid experiment keys for the goal
|
252
275
|
#
|
253
276
|
# Returns event hash encapsulating the conversion event.
|
254
277
|
|
255
278
|
@params = {}
|
279
|
+
|
280
|
+
event_value = Helpers::EventTagUtils.get_revenue_value(event_tags)
|
281
|
+
|
256
282
|
add_common_params(user_id, attributes)
|
257
283
|
add_conversion_goal(event_key, event_value)
|
258
284
|
add_experiment_variation_params(user_id, experiment_keys)
|
@@ -40,6 +40,14 @@ module Optimizely
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
class InvalidEventTagFormatError < Error
|
44
|
+
# Raised when attributes are provided in an invalid format (e.g. not a Hash)
|
45
|
+
|
46
|
+
def initialize(msg = 'Event tags provided are in an invalid format.')
|
47
|
+
super
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
43
51
|
class InvalidExperimentError < Error
|
44
52
|
# Raised when an invalid experiment key is provided
|
45
53
|
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#
|
2
|
+
# Copyright 2017, Optimizely and contributors
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
#
|
16
|
+
require 'optimizely/logger'
|
17
|
+
require 'optimizely/helpers/validator'
|
18
|
+
|
19
|
+
module Optimizely
|
20
|
+
module Helpers
|
21
|
+
module EventTagUtils
|
22
|
+
module_function
|
23
|
+
|
24
|
+
def get_revenue_value(event_tags)
|
25
|
+
# Grab the revenue value from the event tags. "revenue" is a reserved keyword.
|
26
|
+
#
|
27
|
+
# event_tags - Hash representing metadata associated with the event.
|
28
|
+
# Returns revenue value as an integer number
|
29
|
+
# Returns nil if revenue can't be retrieved from the event tags.
|
30
|
+
|
31
|
+
if event_tags.nil? or !Helpers::Validator.attributes_valid?(event_tags)
|
32
|
+
return nil
|
33
|
+
end
|
34
|
+
|
35
|
+
unless event_tags.has_key?('revenue')
|
36
|
+
return nil
|
37
|
+
end
|
38
|
+
|
39
|
+
logger = SimpleLogger.new
|
40
|
+
raw_value = event_tags['revenue']
|
41
|
+
|
42
|
+
unless raw_value.is_a? Numeric
|
43
|
+
logger.log(Logger::WARN, "Failed to parse revenue value #{raw_value} from event tags.")
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
|
47
|
+
if raw_value.is_a? Float
|
48
|
+
logger.log(Logger::WARN, "Failed to parse revenue value #{raw_value} from event tags.")
|
49
|
+
return nil
|
50
|
+
end
|
51
|
+
|
52
|
+
logger.log(Logger::INFO, "Parsed revenue value #{raw_value} from event tags.")
|
53
|
+
raw_value
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -32,6 +32,16 @@ module Optimizely
|
|
32
32
|
attributes.is_a?(Hash)
|
33
33
|
end
|
34
34
|
|
35
|
+
def event_tags_valid?(event_tags)
|
36
|
+
# Determines if provided event tags are valid.
|
37
|
+
#
|
38
|
+
# event_tags - Event tags to be validated.
|
39
|
+
#
|
40
|
+
# Returns boolean depending on validity of event tags.
|
41
|
+
|
42
|
+
event_tags.is_a?(Hash)
|
43
|
+
end
|
44
|
+
|
35
45
|
def datafile_valid?(datafile)
|
36
46
|
# Determines if a given datafile is valid.
|
37
47
|
#
|
data/lib/optimizely/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#
|
2
|
-
# Copyright 2016, Optimizely and contributors
|
2
|
+
# Copyright 2016-2017, Optimizely and contributors
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -14,5 +14,5 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
module Optimizely
|
17
|
-
VERSION = '1.0
|
17
|
+
VERSION = '1.1.0'.freeze
|
18
18
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optimizely-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Delikat
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-
|
13
|
+
date: 2017-03-16 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/optimizely/event_dispatcher.rb
|
127
127
|
- lib/optimizely/exceptions.rb
|
128
128
|
- lib/optimizely/helpers/constants.rb
|
129
|
+
- lib/optimizely/helpers/event_tag_utils.rb
|
129
130
|
- lib/optimizely/helpers/group.rb
|
130
131
|
- lib/optimizely/helpers/validator.rb
|
131
132
|
- lib/optimizely/logger.rb
|
@@ -152,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
153
|
version: '0'
|
153
154
|
requirements: []
|
154
155
|
rubyforge_project:
|
155
|
-
rubygems_version: 2.
|
156
|
+
rubygems_version: 2.5.2
|
156
157
|
signing_key:
|
157
158
|
specification_version: 4
|
158
159
|
summary: Ruby SDK for Optimizely's testing framework
|