Skip to content

Commit 78f6cf1

Browse files
author
Mike Ng
committed
Merge branch 'master' into mng/pr-122
2 parents aeea680 + e91cd75 commit 78f6cf1

15 files changed

+116
-117
lines changed

.rubocop.yml

+13-13
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ inherit_from: .rubocop_todo.yml
33
AllCops:
44
TargetRubyVersion: 2.3
55

6-
Metrics/AbcSize:
7-
Enabled: false
6+
Layout/SpaceInsideHashLiteralBraces:
7+
EnforcedStyle: no_space
88

9-
Metrics/CyclomaticComplexity:
9+
Metrics/AbcSize:
1010
Enabled: false
1111

12-
Metrics/PerceivedComplexity:
12+
Metrics/BlockLength:
1313
Enabled: false
1414

1515
Metrics/ClassLength:
1616
Enabled: false
1717

18-
Metrics/BlockLength:
18+
Metrics/CyclomaticComplexity:
1919
Enabled: false
2020

2121
Metrics/LineLength:
@@ -27,17 +27,17 @@ Metrics/MethodLength:
2727
Metrics/ModuleLength:
2828
Enabled: false
2929

30-
Style/Documentation:
30+
Metrics/PerceivedComplexity:
3131
Enabled: false
3232

33-
Style/SignalException:
34-
EnforcedStyle: only_raise
35-
36-
Layout/SpaceInsideHashLiteralBraces:
37-
EnforcedStyle: no_space
38-
3933
Naming/VariableNumber:
4034
Enabled: false
4135

42-
Lint/RescueWithoutErrorClass:
36+
Style/Documentation:
37+
Enabled: false
38+
39+
Style/RescueStandardError:
4340
Enabled: false
41+
42+
Style/SignalException:
43+
Enabled: false

lib/optimizely.rb

+5-9
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,13 @@ def initialize(datafile, event_dispatcher = nil, logger = nil, error_handler = n
6464

6565
begin
6666
@config = ProjectConfig.new(datafile, @logger, @error_handler)
67-
rescue
67+
rescue StandardError => e
6868
@is_valid = false
6969
@logger = SimpleLogger.new
70-
@logger.log(Logger::ERROR, InvalidInputError.new('datafile').message)
71-
return
72-
end
73-
74-
unless @config.parsing_succeeded?
75-
@is_valid = false
76-
@logger = SimpleLogger.new
77-
@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
7874
return
7975
end
8076

lib/optimizely/event_builder.rb

+25-30
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def create_conversion_event(event_key, user_id, attributes, event_tags, experime
153153

154154
event_params = get_common_params(user_id, attributes)
155155
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]
157157

158158
Event.new(:post, ENDPOINT, event_params, POST_HEADERS)
159159
end
@@ -195,43 +195,38 @@ def get_conversion_params(event_key, event_tags, experiment_variation_map)
195195
# event_tags - +Hash+ Values associated with the event.
196196
# experiment_variation_map - +Hash+ Map of experiment IDs to bucketed variation IDs
197197
#
198-
# Returns +Hash+ Impression event params
199-
200-
conversion_event_params = []
198+
# Returns +Hash+ Conversion event params
201199

200+
single_snapshot = {}
201+
single_snapshot[:decisions] = []
202202
experiment_variation_map.each do |experiment_id, variation_id|
203-
single_snapshot = {
204-
decisions: [{
205-
campaign_id: @config.experiment_id_map[experiment_id]['layerId'],
206-
experiment_id: experiment_id,
207-
variation_id: variation_id
208-
}],
209-
events: []
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
222210

223-
numeric_value = Helpers::EventTagUtils.get_numeric_value(event_tags, @logger)
224-
event_object[:value] = numeric_value if numeric_value
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+
}
225217

226-
event_object[:tags] = event_tags
227-
end
218+
if event_tags
219+
revenue_value = Helpers::EventTagUtils.get_revenue_value(event_tags, @logger)
220+
event_object[:revenue] = revenue_value if revenue_value
228221

229-
single_snapshot[:events] = [event_object]
222+
numeric_value = Helpers::EventTagUtils.get_numeric_value(event_tags, @logger)
223+
event_object[:value] = numeric_value if numeric_value
230224

231-
conversion_event_params.push(single_snapshot)
225+
event_object[:tags] = event_tags unless event_tags.empty?
232226
end
233227

234-
conversion_event_params
228+
single_snapshot[:events] = [event_object]
229+
single_snapshot
235230
end
236231

237232
def create_timestamp

lib/optimizely/exceptions.rb

+3-4
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.
@@ -85,9 +85,8 @@ def initialize(aborted_method)
8585
class InvalidDatafileVersionError < Error
8686
# Raised when a datafile with an unsupported version is provided
8787

88-
def initialize(msg = 'Provided datafile is an unsupported version. Please use SDK version 1.1.2 or earlier '\
89-
'for datafile version 1.')
90-
super
88+
def initialize(version)
89+
super("This version of the Ruby SDK does not support the given datafile version: #{version}.")
9190
end
9291
end
9392

lib/optimizely/helpers/constants.rb

+6
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,12 @@ module Constants
321321
'BUCKETING_ID' => '$opt_bucketing_id',
322322
'USER_AGENT' => '$opt_user_agent'
323323
}.freeze
324+
325+
SUPPORTED_VERSIONS = {
326+
'v2' => '2',
327+
'v3' => '3',
328+
'v4' => '4'
329+
}.freeze
324330
end
325331
end
326332
end

lib/optimizely/notification_center.rb

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def initialize(logger, error_handler)
4242

4343
def add_notification_listener(notification_type, notification_callback)
4444
return nil unless notification_type_valid?(notification_type)
45-
4645
unless notification_callback
4746
@logger.log Logger::ERROR, 'Callback can not be empty.'
4847
return nil

lib/optimizely/project_config.rb

+1-16
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@
1919
require_relative 'helpers/validator'
2020

2121
module Optimizely
22-
V1_CONFIG_VERSION = '1'
23-
24-
UNSUPPORTED_VERSIONS = [V1_CONFIG_VERSION].freeze
25-
2622
class ProjectConfig
2723
# Representation of the Optimizely project config.
2824
RUNNING_EXPERIMENT_STATUS = ['Running'].freeze
@@ -39,7 +35,6 @@ class ProjectConfig
3935
attr_reader :experiments
4036
attr_reader :feature_flags
4137
attr_reader :groups
42-
attr_reader :parsing_succeeded
4338
attr_reader :project_id
4439
# Boolean - denotes if Optimizely should remove the last block of visitors' IP address before storing event data
4540
attr_reader :anonymize_ip
@@ -75,12 +70,11 @@ def initialize(datafile, logger, error_handler)
7570

7671
config = JSON.parse(datafile)
7772

78-
@parsing_succeeded = false
7973
@error_handler = error_handler
8074
@logger = logger
8175
@version = config['version']
8276

83-
return if UNSUPPORTED_VERSIONS.include?(@version)
77+
raise InvalidDatafileVersionError, @version unless Helpers::Constants::SUPPORTED_VERSIONS.value?(@version)
8478

8579
@account_id = config['accountId']
8680
@attributes = config.fetch('attributes', [])
@@ -147,7 +141,6 @@ def initialize(datafile, logger, error_handler)
147141
@feature_flag_key_map.each do |key, feature_flag|
148142
@feature_variable_key_map[key] = generate_key_map(feature_flag['variables'], 'key')
149143
end
150-
@parsing_succeeded = true
151144
end
152145

153146
def experiment_running?(experiment)
@@ -389,14 +382,6 @@ def get_attribute_id(attribute_key)
389382
nil
390383
end
391384

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-
400385
def variation_id_exists?(experiment_id, variation_id)
401386
# Determines if a given experiment ID / variation ID pair exists in the datafile
402387
#

optimizely-sdk.gemspec

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# frozen_string_literal: true
32

43
require_relative 'lib/optimizely/version'
@@ -18,9 +17,9 @@ Gem::Specification.new do |spec|
1817
spec.require_paths = ['lib']
1918

2019
spec.add_development_dependency 'bundler', '~> 1.10'
21-
spec.add_development_dependency 'rake', '~> 10.0'
22-
spec.add_development_dependency 'rspec', '~> 3.4.0'
23-
spec.add_development_dependency 'rubocop', '~> 0.51.0'
20+
spec.add_development_dependency 'rake', '~> 12.0'
21+
spec.add_development_dependency 'rspec', '~> 3.8.0'
22+
spec.add_development_dependency 'rubocop', '~> 0.58.0'
2423

2524
spec.add_runtime_dependency 'httparty', '~> 0.11'
2625
spec.add_runtime_dependency 'json-schema', '~> 2.6'

spec/bucketing_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def get_bucketing_key(bucketing_id, entity_id = nil)
5757
expect(bucketer.send(:generate_bucket_value, get_bucketing_key(
5858
'a very very very very very very very very very very very very '\
5959
'very very very long ppd string'
60-
))).to eq(6128)
60+
))).to eq(6128)
6161
end
6262

6363
it 'should return the proper variation for a user in a mutually exclusive grouped experiment' do

spec/event_builder_spec.rb

+19
Original file line numberDiff line numberDiff line change
@@ -525,4 +525,23 @@
525525
expect(conversion_event.url).to eq(@expected_endpoint)
526526
expect(conversion_event.http_verb).to eq(:post)
527527
end
528+
529+
describe 'multiple_experiments_event' do
530+
it 'should create_conversion_event when Event is used in multiple experiments' do
531+
@expected_conversion_params[:visitors][0][:snapshots][0][:decisions] = [{
532+
campaign_id: '1',
533+
experiment_id: '111127',
534+
variation_id: '111128'
535+
}, {
536+
campaign_id: '4',
537+
experiment_id: '122230',
538+
variation_id: '122231'
539+
}]
540+
541+
conversion_event = @event_builder.create_conversion_event('test_event', 'test_user', nil, nil, '111127' => '111128', '122230' => '122231')
542+
expect(conversion_event.params).to eq(@expected_conversion_params)
543+
expect(conversion_event.url).to eq(@expected_endpoint)
544+
expect(conversion_event.http_verb).to eq(:post)
545+
end
546+
end
528547
end

0 commit comments

Comments
 (0)