Skip to content

Commit 2d0cc98

Browse files
oakbanimikeproeng37
authored andcommitted
Add logger to Event tag util (#90)
1 parent 0c7f990 commit 2d0cc98

File tree

6 files changed

+190
-55
lines changed

6 files changed

+190
-55
lines changed

lib/optimizely.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def initialize(datafile, event_dispatcher = nil, logger = nil, error_handler = n
8585
end
8686

8787
@decision_service = DecisionService.new(@config, @user_profile_service)
88-
@event_builder = EventBuilder.new(@config)
88+
@event_builder = EventBuilder.new(@config, logger)
8989
@notification_center = NotificationCenter.new(@logger, @error_handler)
9090
end
9191

lib/optimizely/event_builder.rb

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

33
#
4-
# Copyright 2016-2017, Optimizely and contributors
4+
# Copyright 2016-2018, 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.
@@ -49,9 +49,11 @@ class BaseEventBuilder
4949
CUSTOM_ATTRIBUTE_FEATURE_TYPE = 'custom'
5050

5151
attr_reader :config
52+
attr_reader :logger
5253

53-
def initialize(config)
54+
def initialize(config, logger)
5455
@config = config
56+
@logger = logger
5557
end
5658

5759
private
@@ -215,10 +217,10 @@ def get_conversion_params(event_key, event_tags, experiment_variation_map)
215217
}
216218

217219
if event_tags
218-
revenue_value = Helpers::EventTagUtils.get_revenue_value(event_tags)
220+
revenue_value = Helpers::EventTagUtils.get_revenue_value(event_tags, @logger)
219221
event_object[:revenue] = revenue_value if revenue_value
220222

221-
numeric_value = Helpers::EventTagUtils.get_numeric_value(event_tags)
223+
numeric_value = Helpers::EventTagUtils.get_numeric_value(event_tags, @logger)
222224
event_object[:value] = numeric_value if numeric_value
223225

224226
event_object[:tags] = event_tags

lib/optimizely/helpers/event_tag_utils.rb

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

33
#
4-
# Copyright 2017, Optimizely and contributors
4+
# Copyright 2017-2018, 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.
@@ -26,50 +26,63 @@ module EventTagUtils
2626
REVENUE_EVENT_METRIC_NAME = 'revenue'
2727
NUMERIC_EVENT_METRIC_NAME = 'value'
2828

29-
def string_numeric?(str)
30-
!Float(str).nil?
31-
rescue
32-
false
33-
end
34-
35-
def get_revenue_value(event_tags)
29+
def get_revenue_value(event_tags, logger)
3630
# Grab the revenue value from the event tags. "revenue" is a reserved keyword.
37-
# The revenue value must be an integer.
38-
#
31+
# The value will be parsed to an integer if possible.
32+
# Example:
33+
# 4.0 or "4.0" will be parsed to int(4).
34+
# 4.1 will not be parsed and the method will return nil.
3935
# event_tags - Hash representing metadata associated with the event.
36+
# logger - Optional component which provides a log method to log messages.
37+
#
4038
# Returns revenue value as an integer number
4139
# Returns nil if revenue can't be retrieved from the event tags.
4240

43-
if event_tags.nil? || !Helpers::Validator.event_tags_valid?(event_tags)
41+
if event_tags.nil?
42+
logger.log(Logger::DEBUG, 'Event tags is undefined.')
4443
return nil
4544
end
4645

47-
return nil unless event_tags.key?(REVENUE_EVENT_METRIC_NAME)
46+
unless Helpers::Validator.event_tags_valid?(event_tags)
47+
logger.log(Logger::DEBUG, 'Event tags is not a hash.')
48+
return nil
49+
end
50+
51+
unless event_tags.key?(REVENUE_EVENT_METRIC_NAME)
52+
logger.log(Logger::DEBUG, 'The revenue key is not defined in the event tags.')
53+
return nil
54+
end
55+
56+
if event_tags[REVENUE_EVENT_METRIC_NAME].nil?
57+
logger.log(Logger::DEBUG, 'The revenue key is nil.')
58+
return nil
59+
end
4860

49-
logger = SimpleLogger.new
5061
raw_value = event_tags[REVENUE_EVENT_METRIC_NAME]
5162

52-
unless raw_value.is_a? Numeric
53-
logger.log(Logger::WARN, "Failed to parse revenue value #{raw_value} from event tags.")
63+
unless Helpers::Validator.string_numeric?(raw_value)
64+
logger.log(Logger::WARN, 'Revenue value is not an integer or float, or is not a numeric string.')
5465
return nil
5566
end
5667

57-
if raw_value.is_a? Float
68+
raw_value = raw_value.to_f if raw_value.is_a? String
69+
70+
unless raw_value == raw_value.to_i
5871
logger.log(Logger::WARN, "Failed to parse revenue value #{raw_value} from event tags.")
5972
return nil
6073
end
6174

62-
logger.log(Logger::INFO, "Parsed revenue value #{raw_value} from event tags.")
63-
raw_value
75+
logger.log(Logger::INFO, "Parsed revenue value #{raw_value.to_i} from event tags.")
76+
raw_value.to_i
6477
end
6578

66-
def get_numeric_value(event_tags, logger = nil)
79+
def get_numeric_value(event_tags, logger)
6780
# Grab the numeric event value from the event tags. "value" is a reserved keyword.
6881
# The value of 'value' can be a float or a numeric string
6982
#
7083
# event_tags - +Hash+ representing metadata associated with the event.
84+
# logger - Optional component which provides a log method to log messages.
7185
# Returns +Number+ | +nil+ if value can't be retrieved from the event tags.
72-
logger = SimpleLogger.new if logger.nil?
7386

7487
if event_tags.nil?
7588
logger.log(Logger::DEBUG, 'Event tags is undefined.')

spec/event_builder_spec.rb

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

33
#
4-
# Copyright 2016-2017, Optimizely and contributors
4+
# Copyright 2016-2018, 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.
@@ -32,7 +32,7 @@
3232

3333
before(:example) do
3434
config = Optimizely::ProjectConfig.new(@config_body_json, @logger, @error_handler)
35-
@event_builder = Optimizely::EventBuilder.new(config)
35+
@event_builder = Optimizely::EventBuilder.new(config, @logger)
3636

3737
time_now = Time.now
3838
allow(Time).to receive(:now).and_return(time_now)
@@ -193,11 +193,13 @@
193193
expect(conversion_event.http_verb).to eq(:post)
194194
end
195195

196-
it 'should create a valid Event when create_conversion_event is called with invalid revenue event tag' do
196+
it 'should create a valid Event when create_conversion_event is called with valid string revenue event tag' do
197197
event_tags = {'revenue' => '4200'}
198198

199199
@expected_conversion_params[:visitors][0][:attributes] = []
200-
@expected_conversion_params[:visitors][0][:snapshots][0][:events][0][:tags] = event_tags
200+
@expected_conversion_params[:visitors][0][:snapshots][0][:events][0].merge!(revenue: 4200,
201+
tags: event_tags)
202+
201203
conversion_event = @event_builder.create_conversion_event('test_event', 'test_user', nil, event_tags,
202204
'111127' => '111128')
203205
expect(conversion_event.params).to eq(@expected_conversion_params)

spec/event_tag_utils_spec.rb

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

33
#
4-
# Copyright 2017, Optimizely and contributors
4+
# Copyright 2017-2018, 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.
@@ -24,69 +24,187 @@
2424
let(:logger) { Optimizely::NoOpLogger.new }
2525

2626
describe '.get_revenue_value' do
27+
it 'should return nil if argument is undefined' do
28+
expect(logger).to receive(:log).with(Logger::DEBUG,
29+
'Event tags is undefined.').exactly(1).times
30+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(nil, logger)).to be_nil
31+
end
32+
2733
it 'should return nil if argument is not a Hash' do
28-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(nil)).to be_nil
29-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(0.5)).to be_nil
30-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(65_536)).to be_nil
31-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(9_223_372_036_854_775_807)).to be_nil
32-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value('65536')).to be_nil
33-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(false)).to be_nil
34-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(true)).to be_nil
35-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value([])).to be_nil
34+
expect(logger).to receive(:log).with(Logger::DEBUG,
35+
'Event tags is not a hash.').exactly(7).times
36+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(0.5, logger)).to be_nil
37+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(65_536, logger)).to be_nil
38+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(9_223_372_036_854_775_807, logger)).to be_nil
39+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value('65536', logger)).to be_nil
40+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(false, logger)).to be_nil
41+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(true, logger)).to be_nil
42+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value([], logger)).to be_nil
3643
end
37-
it 'should return nil if event tags does not contain the revenue' do
44+
45+
it 'should return nil if event tags does not contain the revenue key' do
3846
event_tags = {
3947
'non-revenue' => 5432
4048
}
41-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
49+
expect(logger).to receive(:log)
50+
.with(Logger::DEBUG, 'The revenue key is not defined in the event tags.').exactly(1).times
51+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
4252
end
43-
it 'should return nil if event tags contains the revenue with a string value' do
53+
54+
it 'should return nil if event tags contains the revenue key with nil value' do
4455
event_tags = {
45-
'revenue' => 'string'
56+
'revenue' => nil
4657
}
47-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
58+
expect(logger).to receive(:log).with(Logger::DEBUG,
59+
'The revenue key is nil.').exactly(1).times
60+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
4861
end
62+
4963
it 'should return nil if event tags contains the revenue with a string value' do
5064
event_tags = {
51-
'revenue' => '65536'
65+
'revenue' => 'string'
5266
}
53-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
67+
expect(logger).to receive(:log)
68+
.with(Logger::WARN, 'Revenue value is not an integer or float, or is not a numeric string.').exactly(1).times
69+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
5470
end
71+
5572
it 'should return nil if event tags contains the revenue with a boolean true value' do
5673
event_tags = {
5774
'revenue' => true
5875
}
59-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
76+
expect(logger).to receive(:log)
77+
.with(Logger::WARN, 'Revenue value is not an integer or float, or is not a numeric string.').exactly(1).times
78+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
6079
end
80+
6181
it 'should return nil if event tags contains the revenue with a boolean false value' do
6282
event_tags = {
6383
'revenue' => false
6484
}
65-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
85+
expect(logger).to receive(:log)
86+
.with(Logger::WARN, 'Revenue value is not an integer or float, or is not a numeric string.').exactly(1).times
87+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
6688
end
89+
6790
it 'should return nil if event tags contains the revenue with a list value' do
6891
event_tags = {
6992
'revenue' => []
7093
}
71-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
94+
expect(logger).to receive(:log)
95+
.with(Logger::WARN, 'Revenue value is not an integer or float, or is not a numeric string.').exactly(1).times
96+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
7297
end
73-
it 'should return nil if event tags contains the revenue with a float value' do
98+
99+
it 'should return nil if event tags contains the revenue with a invalid float value' do
100+
expect(logger).to receive(:log)
101+
.with(Logger::WARN, 'Failed to parse revenue value 0.5 from event tags.').exactly(1).times
102+
expect(logger).to receive(:log)
103+
.with(Logger::WARN, 'Failed to parse revenue value 2.5 from event tags.').exactly(1).times
74104
event_tags = {
75105
'revenue' => 0.5
76106
}
77-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to be_nil
107+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
108+
event_tags['revenue'] = 2.5
109+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
110+
end
111+
112+
it 'should return nil if event tags contains the revenue with a invalid string numeric' do
113+
expect(logger).to receive(:log)
114+
.with(Logger::WARN, 'Failed to parse revenue value 0.5 from event tags.').exactly(1).times
115+
expect(logger).to receive(:log)
116+
.with(Logger::WARN, 'Failed to parse revenue value 2.5 from event tags.').exactly(1).times
117+
event_tags = {
118+
'revenue' => '0.5'
119+
}
120+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
121+
event_tags['revenue'] = '2.5'
122+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to be_nil
123+
end
124+
125+
it 'should return correct value if event tags contains the revenue with a valid float value' do
126+
expect(logger).to receive(:log)
127+
.with(Logger::INFO, 'Parsed revenue value 65536 from event tags.').exactly(1).times
128+
event_tags = {
129+
'revenue' => 65_536.0
130+
}
131+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(65_536)
78132
end
133+
134+
it 'should return correct value if event tags contains the revenue with a valid float string' do
135+
expect(logger).to receive(:log)
136+
.with(Logger::INFO, 'Parsed revenue value 65536 from event tags.').exactly(1).times
137+
event_tags = {
138+
'revenue' => '65536.0'
139+
}
140+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(65_536)
141+
end
142+
143+
it 'should return correct value if event tags contains the revenue with a valid integer string' do
144+
event_tags = {
145+
'revenue' => '65536'
146+
}
147+
expect(logger).to receive(:log)
148+
.with(Logger::INFO, 'Parsed revenue value 65536 from event tags.').exactly(1).times
149+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(65_536)
150+
end
151+
79152
it 'should return correct value if event tags contains the revenue with an integer value' do
80153
event_tags = {
81154
'revenue' => 65_536
82155
}
83-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to eq(65_536)
156+
expect(logger).to receive(:log)
157+
.with(Logger::INFO, 'Parsed revenue value 65536 from event tags.').exactly(1).times
158+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(65_536)
159+
end
160+
161+
it 'should return correct value if event tags contains the revenue with an integer zero value' do
162+
event_tags = {
163+
'revenue' => 0
164+
}
165+
expect(logger).to receive(:log)
166+
.with(Logger::INFO, 'Parsed revenue value 0 from event tags.').exactly(1).times
167+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(0)
168+
end
169+
170+
it 'should return correct value if event tags contains the revenue with an float zero value' do
171+
event_tags = {
172+
'revenue' => 0.0
173+
}
174+
expect(logger).to receive(:log)
175+
.with(Logger::INFO, 'Parsed revenue value 0 from event tags.').exactly(1).times
176+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(0.0)
84177
end
85-
it 'should return correct value if event tags contains the revenue with a long value' do
178+
179+
it 'should return correct value if event tags contains the revenue with a long integer value' do
86180
event_tags = {
87181
'revenue' => 9_223_372_036_854_775_807
88182
}
89-
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags)).to eq(9_223_372_036_854_775_807)
183+
expect(logger).to receive(:log)
184+
.with(Logger::INFO, 'Parsed revenue value 9223372036854775807 from event tags.').exactly(1).times
185+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(9_223_372_036_854_775_807)
186+
end
187+
188+
it 'should return correct value if event tags contains the revenue with a long float value' do
189+
value = 9_223_372_036_854_775_807.to_f
190+
event_tags = {
191+
'revenue' => value
192+
}
193+
expect(logger).to receive(:log)
194+
.with(Logger::INFO, "Parsed revenue value #{value.to_i} from event tags.").exactly(1).times
195+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(value.to_i)
196+
end
197+
198+
it 'should return correct value if event tags contains the revenue with a long string value' do
199+
value = '9_223_372_036_854_775_807'
200+
event_tags = {
201+
'revenue' => value
202+
}
203+
# Float converts long number to E-notation i.e "9.223372036854776e+18"
204+
value = value.to_f
205+
expect(logger).to receive(:log)
206+
.with(Logger::INFO, "Parsed revenue value #{value.to_i} from event tags.").exactly(1).times
207+
expect(Optimizely::Helpers::EventTagUtils.get_revenue_value(event_tags, logger)).to eq(value.to_i)
90208
end
91209
end
92210

0 commit comments

Comments
 (0)