vwo-sdk 1.23.1 → 1.25.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f36297d491673769eab11fc07c0c33388da361b564fc1888a078f251a53a695e
4
- data.tar.gz: e1ef625b6ed40c6223d90a019f35e276fc6c5252e91b004f68d1ffab5fd72d41
3
+ metadata.gz: 4871df5d5a50f01ed13a11692aa6b114f03242f4c9257eccb48bce2a65beaa7c
4
+ data.tar.gz: fdd46869b068d589e4a85402d10d8852c4bfc48084e75a18fe8631f3a99b07a9
5
5
  SHA512:
6
- metadata.gz: ec99893b52fad4cdfb156d8d46b69c3b2f526fb25f0bfda2c27205f938fe3918853edb969534256edb47d16100fc54cd1061924a5bd24097aea256b649c80431
7
- data.tar.gz: 73572a0f681bde9fd8f03b426097a4ee1bda9d8acda8048260f839559b3a20497f52f4c94dc6b28f41abde5a0fd91e4f31f2dc62031a423f7409970f1cfe8048
6
+ metadata.gz: 0c23fe3a4fbcb4c85ef1af73a7ef9bb37a0a79eb4f628bad726f66394291cd93d24cecc066a662799670d10b703265eb3afe72a689ce060a2756eb84d0bfce69
7
+ data.tar.gz: f60e3e5a8b96e2ab878929c857d4c8d5c3071e6439e811ac59e7bfa00b488f6c79583ebbfa4a8995a3adac5faf80b7c9293ebea3fa0da231224c684ed39adbb4
data/lib/vwo/constants.rb CHANGED
@@ -27,7 +27,7 @@ class VWO
27
27
  HTTP_PROTOCOL = 'http://'
28
28
  HTTPS_PROTOCOL = 'https://'
29
29
  URL_NAMESPACE = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'
30
- SDK_VERSION = '1.23.1'
30
+ SDK_VERSION = '1.25.0'
31
31
  SDK_NAME = 'ruby'
32
32
  VWO_DELIMITER = '_vwo_'
33
33
  MAX_EVENTS_PER_REQUEST = 5000
@@ -44,6 +44,7 @@ class VWO
44
44
  TRACK_GOAL = '/server-side/track-goal'
45
45
  PUSH = '/server-side/push'
46
46
  BATCH_EVENTS = '/server-side/batch-events'
47
+ EVENTS = '/events/t'
47
48
  end
48
49
 
49
50
  module EVENTS
@@ -113,5 +114,10 @@ class VWO
113
114
  FEATURE_TEST = 'FEATURE_TEST'
114
115
  FEATURE_ROLLOUT = 'FEATURE_ROLLOUT'
115
116
  end
117
+
118
+ module EventEnum
119
+ VWO_VARIATION_SHOWN = 'vwo_variationShown'
120
+ VWO_SYNC_VISITOR_PROP = 'vwo_syncVisitorProp'
121
+ end
116
122
  end
117
123
  end
@@ -95,6 +95,10 @@ class VWO
95
95
  :vwo_user_id => generator_for(user_id, @settings_file['accountId'])
96
96
  }
97
97
 
98
+ if campaign.has_key?("name")
99
+ decision[:campaign_name] = campaign['name']
100
+ end
101
+
98
102
  if is_campaign_part_of_group
99
103
  group_id = @settings_file["campaignGroups"][campaign["id"].to_s]
100
104
  decision[:group_id] = group_id
@@ -459,10 +463,19 @@ class VWO
459
463
  # @return[Hash]
460
464
 
461
465
  def evaluate_whitelisting(user_id, campaign, api_name, campaign_key, variation_targeting_variables = {}, disable_logs = false)
462
- if variation_targeting_variables.nil?
463
- variation_targeting_variables = { _vwo_user_id: user_id }
466
+ if campaign.key?('isUserListEnabled') && campaign["isUserListEnabled"]
467
+ vwo_user_id = generator_for(user_id, @settings_file['accountId'])
468
+ if variation_targeting_variables.nil?
469
+ variation_targeting_variables = { _vwo_user_id: vwo_user_id }
470
+ else
471
+ variation_targeting_variables[:_vwo_user_id] = vwo_user_id
472
+ end
464
473
  else
465
- variation_targeting_variables[:_vwo_user_id] = user_id
474
+ if variation_targeting_variables.nil?
475
+ variation_targeting_variables = { _vwo_user_id: user_id }
476
+ else
477
+ variation_targeting_variables[:_vwo_user_id] = user_id
478
+ end
466
479
  end
467
480
  targeted_variations = []
468
481
 
data/lib/vwo/enums.rb CHANGED
@@ -114,6 +114,9 @@ class VWO
114
114
  BEFORE_FLUSHING = '(%<file>s): Flushing events queue %<manually>s having %<length>s events %<timer>s queue summary: %<queue_metadata>s'
115
115
  EVENT_BATCHING_INSUFFICIENT = '(%<file>s): %<key>s not provided, assigning default value'
116
116
  GOT_ELIGIBLE_CAMPAIGNS = "(%<file>s): Campaigns:%<eligible_campaigns_key>s are eligible, %<ineligible_campaigns_log_text>s are ineligible from the Group:%<group_name>s for the User ID:%<user_id>s"
117
+ IMPRESSION_FOR_EVENT_ARCH_TRACK_USER = "(%<file>s): impression built for vwo_variationShown event for account ID:%<a>s, user ID:%<u>s, and campaign ID:%<c>s"
118
+ IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL = "(%<file>s): impression built for %<goal_identifier>s event for account ID:%<a>s, user ID:%<u>s, and campaign ID:%<c>s"
119
+ IMPRESSION_FOR_EVENT_ARCH_PUSH = "(%<file>s): impression built for visitor property:%<property>s for account ID:%<a>s and user ID:%<u>s"
117
120
  end
118
121
 
119
122
  # Info Messages
@@ -128,9 +131,10 @@ class VWO
128
131
  AUDIENCE_CONDITION_NOT_MET = '(%<file>s): userId:%<user_id>s does not become part of campaign because of not meeting audience conditions'
129
132
  GOT_VARIATION_FOR_USER = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s'
130
133
  USER_GOT_NO_VARIATION = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s did not allot any variation'
131
- IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having main keys: sdkKey:%<sdk_key>s accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s'
132
- MAIN_KEYS_FOR_IMPRESSION = '(%<file>s): Having main keys: {sdkKey:%<sdk_key>s accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s}'
133
- MAIN_KEYS_FOR_PUSH_API = '(%<file>s): Having main keys: {sdkKey:%<sdk_key>s accountId:%<account_id>s u:%<u>s and tags:%<tags>s}'
134
+ IMPRESSION_SUCCESS_FOR_EVENT_ARCH = '(%<file>s): Impression for %<event>s - %<url>s was successfully received by VWO for account ID:%<a>s'
135
+ IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having main keys: accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s'
136
+ MAIN_KEYS_FOR_IMPRESSION = '(%<file>s): Having main keys: accountId:%<account_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s}'
137
+ MAIN_KEYS_FOR_PUSH_API = '(%<file>s): Having main keys: accountId:%<account_id>s u:%<u>s and tags:%<tags>s}'
134
138
  INVALID_VARIATION_KEY = '(%<file>s): Variation was not assigned to userId:%<user_id>s for campaign:%<campaign_key>s'
135
139
 
136
140
  USER_IN_FEATURE_ROLLOUT = '(%<file>s): User ID:%<user_id>s is in feature rollout:%<campaign_key>s'
@@ -201,7 +205,6 @@ class VWO
201
205
  TAG_KEY_LENGTH_EXCEEDED = '(%<file>s): In API: %<api_name>s, the length of tag_key:%<tag_key>s and userID: %<user_id>s can not be greater than 255'
202
206
  TRACK_API_MISSING_PARAMS = '(%<file>s): "track" API got bad parameters. It expects campaignKey(null/String/array) as first, userId(String/Number) as second and goalIdentifier (string) as third argument. options is revenueValue(Float/Number/String) and is required for revenue goal only.'
203
207
  NO_CAMPAIGN_FOUND = '(%<file>s): No campaign found for goal_identifier:%<goal_identifier>s. Please verify from VWO app.'
204
- INVALID_TRACK_RETURNING_USER_VALUE = '(%<file>s): should_track_returning_user should be boolean'
205
208
  INVALID_GOAL_TYPE = '(%<file>s): goal_type_to_track should be certain strings'
206
209
  EVENT_BATCHING_NOT_OBJECT = '(%<file>s): Batch events settings are not of type object.'
207
210
  EVENTS_PER_REQUEST_INVALID = '(%<file>s): events_per_request should be an integer'
@@ -26,6 +26,9 @@ class VWO
26
26
  accountId: {
27
27
  type: %w[number string]
28
28
  },
29
+ isEventArchEnabled: {
30
+ type: ['boolean']
31
+ },
29
32
  campaigns: {
30
33
  if: {
31
34
  type: 'array'
@@ -73,6 +76,9 @@ class VWO
73
76
  key: {
74
77
  type: ['string']
75
78
  },
79
+ name: {
80
+ type: ['string']
81
+ },
76
82
  status: {
77
83
  type: ['string']
78
84
  },
@@ -92,6 +98,7 @@ class VWO
92
98
  }
93
99
  },
94
100
  isBucketingSeedEnabled: ['boolean'],
101
+ isUserListEnabled: ['boolean'],
95
102
  minItems: 2
96
103
  }
97
104
  },
@@ -15,11 +15,13 @@
15
15
  require_relative '../logger'
16
16
  require_relative '../enums'
17
17
  require_relative '../utils/request'
18
+ require_relative '../constants'
18
19
 
19
20
  class VWO
20
21
  module Services
21
22
  class EventDispatcher
22
23
  include VWO::Enums
24
+ include VWO::CONSTANTS
23
25
 
24
26
  EXCLUDE_KEYS = ['url'].freeze
25
27
 
@@ -63,6 +65,38 @@ class VWO
63
65
  )
64
66
  false
65
67
  end
68
+
69
+ def dispatch_event_arch_post(params, post_data)
70
+ return true if @is_development_mode
71
+
72
+ url = HTTPS_PROTOCOL + ENDPOINTS::BASE_URL + ENDPOINTS::EVENTS
73
+ resp = VWO::Utils::Request.event_post(url, params, post_data, SDK_NAME)
74
+ if resp.code == '200'
75
+ @logger.log(
76
+ LogLevelEnum::INFO,
77
+ format(
78
+ LogMessageEnum::InfoMessages::IMPRESSION_SUCCESS_FOR_EVENT_ARCH,
79
+ file: FileNameEnum::EventDispatcher,
80
+ event: 'visitor property:' + JSON.generate(post_data[:d][:visitor][:props]),
81
+ url: url,
82
+ a: params[:a]
83
+ )
84
+ )
85
+ true
86
+ else
87
+ @logger.log(
88
+ LogLevelEnum::ERROR,
89
+ format(LogMessageEnum::ErrorMessages::IMPRESSION_FAILED, file: FileNameEnum::EventDispatcher, end_point: url)
90
+ )
91
+ false
92
+ end
93
+ rescue StandardError
94
+ @logger.log(
95
+ LogLevelEnum::ERROR,
96
+ format(LogMessageEnum::ErrorMessages::IMPRESSION_FAILED, file: FileNameEnum::EventDispatcher, end_point: url)
97
+ )
98
+ false
99
+ end
66
100
  end
67
101
  end
68
102
  end
@@ -78,7 +78,9 @@ class VWO
78
78
  i: @sdk_key,
79
79
  r: get_random_number,
80
80
  platform: 'server',
81
- 'api-version' => 1
81
+ 'api-version' => 1,
82
+ 'sdk-v' => VWO::CONSTANTS::SDK_VERSION,
83
+ 'sdk' => VWO::CONSTANTS::SDK_NAME
82
84
  }
83
85
  end
84
86
  end
@@ -17,6 +17,7 @@ require_relative '../logger'
17
17
  require_relative '../enums'
18
18
  require_relative '../constants'
19
19
  require_relative './impression'
20
+ require_relative './utility'
20
21
 
21
22
  # Utility module for helper math and random functions
22
23
  class VWO
@@ -25,6 +26,7 @@ class VWO
25
26
  include VWO::CONSTANTS
26
27
  include VWO::Enums
27
28
  include VWO::Utils::Impression
29
+ include VWO::Utils::Utility
28
30
 
29
31
  def get_url_params(settings_file, tag_key, tag_value, user_id, sdk_key)
30
32
  url = HTTPS_PROTOCOL + ENDPOINTS::BASE_URL + ENDPOINTS::PUSH
@@ -39,7 +41,7 @@ class VWO
39
41
  format(
40
42
  LogMessageEnum::DebugMessages::PARAMS_FOR_PUSH_CALL,
41
43
  file: FileNameEnum::CustomDimensionsUtil,
42
- properties: JSON.generate(params)
44
+ properties: remove_sensitive_properties(params)
43
45
  )
44
46
  )
45
47
  params
@@ -33,6 +33,11 @@ class VWO
33
33
  Time.now.to_i
34
34
  end
35
35
 
36
+ # @return[Integer]
37
+ def get_current_unix_timestamp_in_millis
38
+ (Time.now.to_f * 1000).to_i
39
+ end
40
+
36
41
  # @return[any, any]
37
42
  def get_key_value(obj)
38
43
  [obj.keys[0], obj.values[0]]
@@ -19,6 +19,7 @@ require_relative '../enums'
19
19
  require_relative '../constants'
20
20
  require_relative 'function'
21
21
  require_relative 'uuid'
22
+ require_relative 'utility'
22
23
 
23
24
  # Creates the impression from the arguments passed
24
25
  class VWO
@@ -28,6 +29,7 @@ class VWO
28
29
  include VWO::CONSTANTS
29
30
  include VWO::Utils::Function
30
31
  include UUID
32
+ include VWO::Utils::Utility
31
33
 
32
34
  # Creates the impression from the arguments passed
33
35
  #
@@ -76,7 +78,7 @@ class VWO
76
78
  format(
77
79
  LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_USER,
78
80
  file: FileNameEnum::ImpressionUtil,
79
- properties: JSON.generate(impression)
81
+ properties: remove_sensitive_properties(impression)
80
82
  )
81
83
  )
82
84
  else
@@ -88,7 +90,7 @@ class VWO
88
90
  format(
89
91
  LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_GOAL,
90
92
  file: FileNameEnum::ImpressionUtil,
91
- properties: JSON.generate(impression)
93
+ properties: remove_sensitive_properties(impression)
92
94
  )
93
95
  )
94
96
  end
@@ -162,6 +164,186 @@ class VWO
162
164
  end
163
165
  impression
164
166
  end
167
+
168
+ # Builds generic properties for different tracking calls required by VWO servers.
169
+ #
170
+ # @param[Hash] :settings_file
171
+ # @param[String] :sdk_key
172
+ # @param[String] :event_name
173
+ # @param[Hash] :usage_stats
174
+ # @return[Hash] :properties
175
+ #
176
+ def get_events_base_properties(settings_file, event_name, usage_stats = {})
177
+ properties = {
178
+ en: event_name,
179
+ a: settings_file['accountId'],
180
+ env: settings_file['sdkKey'],
181
+ eTime: get_current_unix_timestamp_in_millis,
182
+ random: get_random_number,
183
+ p: "FS"
184
+ }
185
+
186
+ if event_name == EventEnum::VWO_VARIATION_SHOWN
187
+ properties = properties.merge(usage_stats)
188
+ end
189
+ properties
190
+ end
191
+
192
+ # Builds generic payload required by all the different tracking calls.
193
+ #
194
+ # @param[Hash] :settings_file
195
+ # @param[String] :user_id
196
+ # @param[String] :event_name
197
+ # @param[Hash] :usage_stats
198
+ # @return[Hash] :properties
199
+ #
200
+ def get_event_base_payload(settings_file, user_id, event_name, usage_stats = {})
201
+ uuid = generator_for(user_id, (settings_file['accountId']))
202
+ sdk_key = settings_file['sdkKey']
203
+
204
+ props = {
205
+ sdkName: SDK_NAME,
206
+ sdkVersion: SDK_VERSION,
207
+ '$visitor': {
208
+ props: {
209
+ vwo_fs_environment: sdk_key
210
+ }
211
+ }
212
+ }
213
+
214
+ # if usage_stats
215
+ # props = props.merge(usage_stats)
216
+ # end
217
+
218
+ properties = {
219
+ d: {
220
+ msgId: uuid + '_' + Time.now.to_i.to_s,
221
+ visId: uuid,
222
+ sessionId: Time.now.to_i,
223
+ event: {
224
+ props: props,
225
+ name: event_name,
226
+ time: get_current_unix_timestamp_in_millis
227
+ },
228
+ visitor: {
229
+ props: {
230
+ vwo_fs_environment: sdk_key
231
+ }
232
+ }
233
+ }
234
+ }
235
+
236
+ properties
237
+ end
238
+
239
+ # Builds payload to track the visitor.
240
+ #
241
+ # @param[Hash] :settings_file
242
+ # @param[String] :user_id
243
+ # @param[String] :event_name
244
+ # @param[Integer] :campaign_id
245
+ # @param[Integer] :variation_id
246
+ # @param[Hash] :usage_stats
247
+ # @return[Hash] :properties
248
+ #
249
+ def get_track_user_payload_data(settings_file, user_id, event_name, campaign_id, variation_id, usage_stats = {})
250
+ properties = get_event_base_payload(settings_file, user_id, event_name)
251
+ properties[:d][:event][:props][:id] = campaign_id
252
+ properties[:d][:event][:props][:variation] = variation_id
253
+
254
+ #this is currently required by data-layer team, we can make changes on DACDN and remove it from here
255
+ properties[:d][:event][:props][:isFirst] = 1
256
+
257
+ logger = VWO::Logger.get_instance
258
+ logger.log(
259
+ LogLevelEnum::DEBUG,
260
+ format(
261
+ LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_TRACK_USER,
262
+ file: FileNameEnum::ImpressionUtil,
263
+ a: settings_file['accountId'],
264
+ u: user_id,
265
+ c: campaign_id.to_s
266
+ )
267
+ )
268
+ properties
269
+ end
270
+
271
+ # Builds payload to track the Goal.
272
+ #
273
+ # @param[Hash] :settings_file
274
+ # @param[String] :user_id
275
+ # @param[String] :event_name
276
+ # @param[Integer] :revenue_value
277
+ # @param[Hash] :metric_map
278
+ # @param[Array] :revenue_props
279
+ #
280
+ # @return[Hash] :properties
281
+ #
282
+ def get_track_goal_payload_data(settings_file, user_id, event_name, revenue_value, metric_map, revenue_props = [])
283
+ properties = get_event_base_payload(settings_file, user_id, event_name)
284
+
285
+ logger = VWO::Logger.get_instance
286
+ metric = {}
287
+ metric_map.each do |campaign_id, goal_id|
288
+ metric[('id_' + campaign_id.to_s).to_sym] = ['g_' + goal_id.to_s]
289
+ logger.log(
290
+ LogLevelEnum::DEBUG,
291
+ format(
292
+ LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL,
293
+ file: FileNameEnum::ImpressionUtil,
294
+ goal_identifier: event_name,
295
+ a: settings_file['accountId'],
296
+ u: user_id,
297
+ c: campaign_id
298
+ )
299
+ )
300
+ end
301
+
302
+ properties[:d][:event][:props][:vwoMeta] = {
303
+ metric: metric
304
+ }
305
+
306
+ if revenue_props.length() != 0 && revenue_value
307
+ revenue_props.each do |revenue_prop|
308
+ properties[:d][:event][:props][:vwoMeta][revenue_prop.to_sym] = revenue_value
309
+ end
310
+ end
311
+
312
+ properties[:d][:event][:props][:isCustomEvent] = true
313
+ properties
314
+ end
315
+
316
+ # Builds payload to appply post segmentation on VWO campaign reports.
317
+ #
318
+ # @param[Hash] :settings_file
319
+ # @param[String] :user_id
320
+ # @param[String] :event_name
321
+ # @param[Hash] :custom_dimension_map
322
+ #
323
+ # @return[Hash] :properties
324
+ #
325
+ def get_push_payload_data(settings_file, user_id, event_name, custom_dimension_map = {})
326
+ properties = get_event_base_payload(settings_file, user_id, event_name)
327
+ properties[:d][:event][:props][:isCustomEvent] = true
328
+
329
+ custom_dimension_map.each do |tag_key, tag_value|
330
+ properties[:d][:event][:props][('$visitor'.to_sym)][:props][tag_key] = tag_value
331
+ properties[:d][:visitor][:props][tag_key] = tag_value
332
+ end
333
+
334
+ logger = VWO::Logger.get_instance
335
+ logger.log(
336
+ LogLevelEnum::DEBUG,
337
+ format(
338
+ LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_PUSH,
339
+ file: FileNameEnum::ImpressionUtil,
340
+ a: settings_file['accountId'],
341
+ u: user_id,
342
+ property: JSON.generate(custom_dimension_map)
343
+ )
344
+ )
345
+ properties
346
+ end
165
347
  end
166
348
  end
167
349
  end
@@ -38,6 +38,20 @@ class VWO
38
38
  response = http.post(uri, post_data.to_json, headers)
39
39
  response
40
40
  end
41
+
42
+ def self.event_post(url, params, post_data, user_agent_value)
43
+ uri = URI.parse(url)
44
+ http = Net::HTTP.new(uri.host, uri.port)
45
+ http.use_ssl = true
46
+ uri.query = URI.encode_www_form(params)
47
+ headers = {
48
+ 'User-Agent' => user_agent_value,
49
+ 'Content-Type' =>'application/json',
50
+ 'Accept'=>'application/json'
51
+ }
52
+ response = http.post(uri, post_data.to_json, headers)
53
+ response
54
+ end
41
55
  end
42
56
  end
43
57
  end
@@ -35,6 +35,12 @@ class VWO
35
35
  end
36
36
  convertedHash
37
37
  end
38
+
39
+ def remove_sensitive_properties(properties)
40
+ properties.delete("env")
41
+ properties.delete("env".to_sym)
42
+ JSON.generate(properties)
43
+ end
38
44
  end
39
45
  end
40
46
  end
data/lib/vwo.rb CHANGED
@@ -89,25 +89,6 @@ class VWO
89
89
  return
90
90
  end
91
91
 
92
- if options.key?(:should_track_returning_user)
93
- if [true, false].include? options[:should_track_returning_user]
94
- @should_track_returning_user = options[:should_track_returning_user]
95
- usage_stats[:tr] = 1 if @should_track_returning_user
96
- else
97
- @logger.log(
98
- LogLevelEnum::ERROR,
99
- format(
100
- LogMessageEnum::ErrorMessages::INVALID_TRACK_RETURNING_USER_VALUE,
101
- file: FILE
102
- )
103
- )
104
- @is_instance_valid = false
105
- return
106
- end
107
- else
108
- @should_track_returning_user = false
109
- end
110
-
111
92
  if options.key?(:goal_type_to_track)
112
93
  if GOAL_TYPES.key? options[:goal_type_to_track]
113
94
  @goal_type_to_track = options[:goal_type_to_track]
@@ -303,10 +284,9 @@ class VWO
303
284
  custom_variables = options[:custom_variables]
304
285
  variation_targeting_variables = options[:variation_targeting_variables]
305
286
 
306
- should_track_returning_user = get_should_track_returning_user(options)
307
287
  # Validate input parameters
308
288
  unless valid_string?(campaign_key) && valid_string?(user_id) && (custom_variables.nil? || valid_hash?(custom_variables)) &&
309
- (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables)) && [true, false].include?(should_track_returning_user)
289
+ (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables))
310
290
  @logger.log(
311
291
  LogLevelEnum::ERROR,
312
292
  format(
@@ -381,7 +361,7 @@ class VWO
381
361
  return
382
362
  end
383
363
 
384
- if is_eligible_to_send_impression(should_track_returning_user)
364
+ if is_eligible_to_send_impression()
385
365
  if defined?(@batch_events)
386
366
  impression = create_bulk_event_impression(
387
367
  @settings_file,
@@ -390,6 +370,10 @@ class VWO
390
370
  user_id
391
371
  )
392
372
  @batch_events_queue.enqueue(impression)
373
+ elsif is_event_arch_enabled
374
+ properties = get_events_base_properties(@settings_file, EventEnum::VWO_VARIATION_SHOWN, @usage_stats.usage_stats)
375
+ payload = get_track_user_payload_data(@settings_file, user_id, EventEnum::VWO_VARIATION_SHOWN, campaign['id'], variation['id'])
376
+ @event_dispatcher.dispatch_event_arch_post(properties, payload)
393
377
  else
394
378
  # Variation found, dispatch it to server
395
379
  impression = create_impression(
@@ -408,7 +392,6 @@ class VWO
408
392
  format(
409
393
  LogMessageEnum::InfoMessages::IMPRESSION_SUCCESS,
410
394
  file: FILE,
411
- sdk_key: @sdk_key,
412
395
  account_id: @account_id,
413
396
  campaign_id: campaign['id'],
414
397
  variation_id: variation['id'],
@@ -588,12 +571,11 @@ class VWO
588
571
  revenue_value = options[:revenue_value]
589
572
  custom_variables = options[:custom_variables]
590
573
  variation_targeting_variables = options[:variation_targeting_variables]
591
- should_track_returning_user = get_should_track_returning_user(options)
592
574
  goal_type_to_track = get_goal_type_to_track(options)
593
575
 
594
576
  # Check for valid args
595
577
  unless (valid_string?(campaign_key) || campaign_key.is_a?(Array) || campaign_key.nil?) && valid_string?(user_id) && valid_string?(goal_identifier) && (custom_variables.nil? || valid_hash?(custom_variables)) &&
596
- (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables)) && [true, false].include?(should_track_returning_user) && (GOAL_TYPES.key? (goal_type_to_track))
578
+ (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables)) && (GOAL_TYPES.key? (goal_type_to_track))
597
579
  # log invalid params
598
580
  @logger.log(
599
581
  LogLevelEnum::ERROR,
@@ -614,6 +596,8 @@ class VWO
614
596
  return nil
615
597
  end
616
598
 
599
+ metric_map = {}
600
+ revenue_props = []
617
601
  result = {}
618
602
  campaigns.each do |campaign|
619
603
  begin
@@ -683,7 +667,7 @@ class VWO
683
667
  updated_goal_identifier += VWO_DELIMITER + goal_identifier
684
668
  @variation_decider.save_user_storage(user_id, campaign['key'], campaign['name'], variation['name'], updated_goal_identifier) if variation['name']
685
669
  # set variation at user storage
686
- elsif !should_track_returning_user
670
+ else
687
671
  @logger.log(
688
672
  LogLevelEnum::INFO,
689
673
  format(
@@ -709,6 +693,11 @@ class VWO
709
693
  revenue_value
710
694
  )
711
695
  @batch_events_queue.enqueue(impression)
696
+ elsif is_event_arch_enabled
697
+ metric_map[campaign['id']] = goal['id']
698
+ if goal['type'] == GoalTypes::REVENUE && !(revenue_props.include? goal['revenueProp'])
699
+ revenue_props << goal['revenueProp']
700
+ end
712
701
  else
713
702
  impression = create_impression(
714
703
  @settings_file,
@@ -725,7 +714,6 @@ class VWO
725
714
  format(
726
715
  LogMessageEnum::InfoMessages::IMPRESSION_SUCCESS,
727
716
  file: FILE,
728
- sdk_key: @sdk_key,
729
717
  account_id: @account_id,
730
718
  campaign_id: campaign['id'],
731
719
  variation_id: variation['id'],
@@ -737,7 +725,6 @@ class VWO
737
725
  format(
738
726
  LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
739
727
  file: FILE,
740
- sdk_key: @sdk_key,
741
728
  campaign_id: impression[:experiment_id],
742
729
  account_id: impression[:account_id],
743
730
  variation_id: impression[:combination]
@@ -761,6 +748,12 @@ class VWO
761
748
  end
762
749
  end
763
750
 
751
+ if is_event_arch_enabled
752
+ properties = get_events_base_properties(@settings_file, goal_identifier)
753
+ payload = get_track_goal_payload_data(@settings_file, user_id, goal_identifier, revenue_value, metric_map, revenue_props)
754
+ @event_dispatcher.dispatch_event_arch_post(properties, payload)
755
+ end
756
+
764
757
  if result.length() == 0
765
758
  return nil
766
759
  end
@@ -809,7 +802,6 @@ class VWO
809
802
  # Retrieve custom variables
810
803
  custom_variables = options[:custom_variables]
811
804
  variation_targeting_variables = options[:variation_targeting_variables]
812
- should_track_returning_user = get_should_track_returning_user(options)
813
805
  @logger.log(
814
806
  LogLevelEnum::INFO,
815
807
  format(
@@ -821,7 +813,7 @@ class VWO
821
813
  )
822
814
  # Validate input parameters
823
815
  unless valid_string?(campaign_key) && valid_string?(user_id) && (custom_variables.nil? || valid_hash?(custom_variables)) &&
824
- (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables)) && [true, false].include?(should_track_returning_user)
816
+ (variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables))
825
817
  @logger.log(
826
818
  LogLevelEnum::ERROR,
827
819
  format(
@@ -877,7 +869,7 @@ class VWO
877
869
 
878
870
  # if campaign type is feature_test Send track call to server
879
871
 
880
- if is_eligible_to_send_impression(should_track_returning_user)
872
+ if is_eligible_to_send_impression()
881
873
  if defined?(@batch_events)
882
874
  impression = create_bulk_event_impression(
883
875
  @settings_file,
@@ -886,6 +878,10 @@ class VWO
886
878
  user_id
887
879
  )
888
880
  @batch_events_queue.enqueue(impression)
881
+ elsif is_event_arch_enabled
882
+ properties = get_events_base_properties(@settings_file, EventEnum::VWO_VARIATION_SHOWN, @usage_stats.usage_stats)
883
+ payload = get_track_user_payload_data(@settings_file, user_id, EventEnum::VWO_VARIATION_SHOWN, campaign['id'], variation['id'])
884
+ @event_dispatcher.dispatch_event_arch_post(properties, payload)
889
885
  else
890
886
  impression = create_impression(
891
887
  @settings_file,
@@ -905,7 +901,6 @@ class VWO
905
901
  LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_IMPRESSION,
906
902
  file: FILE,
907
903
  campaign_id: impression[:experiment_id],
908
- sdk_key: @sdk_key,
909
904
  account_id: impression[:account_id],
910
905
  variation_id: impression[:combination]
911
906
  )
@@ -1136,12 +1131,12 @@ class VWO
1136
1131
  # This API method: Makes a call to our server to store the tag_values
1137
1132
  # 1. Validates the arguments being passed
1138
1133
  # 2. Send a call to our server
1139
- # @param[String] :tag_key key name of the tag
1140
- # @param[String] :tag_value Value of the tag
1134
+ # @param[String|Hash] :tag_key key name of the tag OR tagKey/tagValue pair(custom dimension map)
1135
+ # @param[String] :tag_value Value of the tag OR userId if TagKey is hash
1141
1136
  # @param[String] :user_id ID of the user for which value should be stored
1142
1137
  # @return true if call is made successfully, else false
1143
1138
 
1144
- def push(tag_key, tag_value, user_id)
1139
+ def push(tag_key, tag_value, user_id = nil)
1145
1140
  unless @is_instance_valid
1146
1141
  @logger.log(
1147
1142
  LogLevelEnum::ERROR,
@@ -1154,7 +1149,16 @@ class VWO
1154
1149
  return
1155
1150
  end
1156
1151
 
1157
- unless valid_string?(tag_key) && valid_string?(tag_value) && valid_string?(user_id)
1152
+ # Argument reshuffling.
1153
+ custom_dimension_map = {}
1154
+ if user_id.nil? || tag_key.is_a?(Hash)
1155
+ custom_dimension_map = convert_to_symbol_hash(tag_key)
1156
+ user_id = tag_value
1157
+ else
1158
+ custom_dimension_map[tag_key.to_sym] = tag_value
1159
+ end
1160
+
1161
+ unless (valid_string?(tag_key) || valid_hash?(tag_key)) && valid_string?(tag_value) && valid_string?(user_id)
1158
1162
  @logger.log(
1159
1163
  LogLevelEnum::ERROR,
1160
1164
  format(
@@ -1166,52 +1170,61 @@ class VWO
1166
1170
  return false
1167
1171
  end
1168
1172
 
1169
- if tag_key.length > PushApi::TAG_KEY_LENGTH
1170
- @logger.log(
1171
- LogLevelEnum::ERROR,
1172
- format(
1173
- LogMessageEnum::ErrorMessages::TAG_KEY_LENGTH_EXCEEDED,
1174
- file: FILE,
1175
- user_id: user_id,
1176
- tag_key: tag_key,
1177
- api_name: ApiMethods::PUSH
1173
+ custom_dimension_map.each do |tag_key, tag_value|
1174
+ if tag_key.length > PushApi::TAG_KEY_LENGTH
1175
+ @logger.log(
1176
+ LogLevelEnum::ERROR,
1177
+ format(
1178
+ LogMessageEnum::ErrorMessages::TAG_KEY_LENGTH_EXCEEDED,
1179
+ file: FILE,
1180
+ user_id: user_id,
1181
+ tag_key: tag_key,
1182
+ api_name: ApiMethods::PUSH
1183
+ )
1178
1184
  )
1179
- )
1180
- return false
1181
- end
1185
+ return false
1186
+ end
1182
1187
 
1183
- if tag_value.length > PushApi::TAG_VALUE_LENGTH
1184
- @logger.log(
1185
- LogLevelEnum::ERROR,
1186
- format(
1187
- LogMessageEnum::ErrorMessages::TAG_VALUE_LENGTH_EXCEEDED,
1188
- file: FILE,
1189
- user_id: user_id,
1190
- tag_value: tag_value,
1191
- api_name: ApiMethods::PUSH
1188
+ if tag_value.length > PushApi::TAG_VALUE_LENGTH
1189
+ @logger.log(
1190
+ LogLevelEnum::ERROR,
1191
+ format(
1192
+ LogMessageEnum::ErrorMessages::TAG_VALUE_LENGTH_EXCEEDED,
1193
+ file: FILE,
1194
+ user_id: user_id,
1195
+ tag_value: tag_value,
1196
+ api_name: ApiMethods::PUSH
1197
+ )
1192
1198
  )
1193
- )
1194
- return false
1199
+ return false
1200
+ end
1195
1201
  end
1196
1202
 
1197
1203
  if defined?(@batch_events)
1198
- impression = get_batch_event_url_params(@settings_file, tag_key, tag_value, user_id)
1199
- @batch_events_queue.enqueue(impression)
1204
+ custom_dimension_map.each do |tag_key, tag_value|
1205
+ impression = get_batch_event_url_params(@settings_file, tag_key, tag_value, user_id)
1206
+ @batch_events_queue.enqueue(impression)
1207
+ end
1208
+ elsif is_event_arch_enabled
1209
+ properties = get_events_base_properties(@settings_file, EventEnum::VWO_SYNC_VISITOR_PROP)
1210
+ payload = get_push_payload_data(@settings_file, user_id, EventEnum::VWO_SYNC_VISITOR_PROP, custom_dimension_map)
1211
+ @event_dispatcher.dispatch_event_arch_post(properties, payload)
1200
1212
  else
1201
- impression = get_url_params(@settings_file, tag_key, tag_value, user_id, @sdk_key)
1202
- @event_dispatcher.dispatch(impression)
1213
+ custom_dimension_map.each do |tag_key, tag_value|
1214
+ impression = get_url_params(@settings_file, tag_key, tag_value, user_id, @sdk_key)
1215
+ @event_dispatcher.dispatch(impression)
1203
1216
 
1204
- @logger.log(
1205
- LogLevelEnum::INFO,
1206
- format(
1207
- LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_PUSH_API,
1208
- file: FILE,
1209
- sdk_key: @sdk_key,
1210
- u: impression['u'],
1211
- account_id: impression['account_id'],
1212
- tags: impression['tags']
1217
+ @logger.log(
1218
+ LogLevelEnum::INFO,
1219
+ format(
1220
+ LogMessageEnum::InfoMessages::MAIN_KEYS_FOR_PUSH_API,
1221
+ file: FILE,
1222
+ u: impression['u'],
1223
+ account_id: impression['account_id'],
1224
+ tags: impression['tags']
1225
+ )
1213
1226
  )
1214
- )
1227
+ end
1215
1228
  end
1216
1229
  true
1217
1230
  rescue StandardError => e
@@ -1227,23 +1240,8 @@ class VWO
1227
1240
  false
1228
1241
  end
1229
1242
 
1230
- def get_should_track_returning_user(options)
1231
- if !options.key?(:should_track_returning_user)
1232
- options[:should_track_returning_user] = @should_track_returning_user
1233
- elsif ![true, false].include?(options[:should_track_returning_user])
1234
- @logger.log(
1235
- LogLevelEnum::ERROR,
1236
- format(
1237
- LogMessageEnum::ErrorMessages::INVALID_TRACK_RETURNING_USER_VALUE,
1238
- file: FILE
1239
- )
1240
- )
1241
- end
1242
- options[:should_track_returning_user]
1243
- end
1244
-
1245
- def is_eligible_to_send_impression(should_track_returning_user = false)
1246
- !@user_storage || !@variation_decider.has_stored_variation || should_track_returning_user
1243
+ def is_eligible_to_send_impression()
1244
+ !@user_storage || !@variation_decider.has_stored_variation
1247
1245
  end
1248
1246
 
1249
1247
  def flush_events
@@ -1295,4 +1293,8 @@ class VWO
1295
1293
  end
1296
1294
  goal_type_to_track
1297
1295
  end
1296
+
1297
+ def is_event_arch_enabled
1298
+ return @settings_file.key?('isEventArchEnabled') && @settings_file['isEventArchEnabled']
1299
+ end
1298
1300
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vwo-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.23.1
4
+ version: 1.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - VWO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-21 00:00:00.000000000 Z
11
+ date: 2021-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: codecov