vwo-sdk 1.6.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88beb4ef415731a07ac86d4d3ce19b9e3ea077d79d00e3e35e84f2b669c802eb
4
- data.tar.gz: 2748de038b879ca5c27e237455bcbd6a62178101eae5c9fe1b2c87f64d5b25d7
3
+ metadata.gz: '084660e0c3fcb3c07826944ba8d83988711b59165ea54a54b1e47042a889bbf5'
4
+ data.tar.gz: 62c4ae889870a381d2973967412f0916baa0d25ce377604aa096c5f4dd0a8e79
5
5
  SHA512:
6
- metadata.gz: 38889e01c758f1336042deda0c39e2a678860eff7431bb465885bf72e9032f2277f0ef52ed5837593fd49b9b76ca1d74a673eb7774ee970422f9588b3698e0c6
7
- data.tar.gz: 481f64eb7ff87622f12ff3122dcb57618d56add48ebe99524a8557930dd4e2bea85ee7c875024a45134d4948be47fa5da54e8c6e64463dae4f11d732fd00e2dd
6
+ metadata.gz: 67fd788b416ac54e9d27999ca757662eb88a123a804ccf3c93538e58787a3fd1181686543a7abdbb94dbd7d66f5d1c63421ae21d1b3e794b93cff6951355fdd2
7
+ data.tar.gz: 7950a38da6e5993575ff46e1c1ba2f901d98fa4112e54070297c78846e2b29eacdae4042c51d03f1e9e8b05d55aa4e60b698fa70af43c7d1ae2167953aaaec6c
data/lib/vwo/constants.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 Wingify Software Pvt. Ltd.
1
+ # Copyright 2019-2021 Wingify Software Pvt. Ltd.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -26,20 +26,29 @@ class VWO
26
26
  HTTP_PROTOCOL = 'http://'
27
27
  HTTPS_PROTOCOL = 'https://'
28
28
  URL_NAMESPACE = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'
29
- SDK_VERSION = '1.6.0'
29
+ SDK_VERSION = '1.16.0'
30
30
  SDK_NAME = 'ruby'
31
+ VWO_DELIMITER = '_vwo_'
32
+ MAX_EVENTS_PER_REQUEST = 5000
33
+ MIN_EVENTS_PER_REQUEST = 1
34
+ DEFAULT_EVENTS_PER_REQUEST = 100
35
+ DEFAULT_REQUEST_TIME_INTERVAL = 600 # 10 * 60(secs) = 600 secs i.e. 10 minutes
36
+ MIN_REQUEST_TIME_INTERVAL = 2
31
37
 
32
38
  module ENDPOINTS
33
39
  BASE_URL = 'dev.visualwebsiteoptimizer.com'
34
- ACCOUNT_SETTINGS = '/server-side/settings'
40
+ SETTINGS_URL = '/server-side/settings'
41
+ WEBHOOK_SETTINGS_URL = '/server-side/pull'
35
42
  TRACK_USER = '/server-side/track-user'
36
43
  TRACK_GOAL = '/server-side/track-goal'
37
44
  PUSH = '/server-side/push'
45
+ BATCH_EVENTS = '/server-side/batch-events'
38
46
  end
39
47
 
40
48
  module EVENTS
41
49
  TRACK_USER = 'track-user'
42
50
  TRACK_GOAL = 'track-goal'
51
+ PUSH = 'push'
43
52
  end
44
53
 
45
54
  module DATATYPE
@@ -59,13 +68,27 @@ class VWO
59
68
  INTEGER = 'integer'
60
69
  DOUBLE = 'double'
61
70
  BOOLEAN = 'boolean'
71
+ JSON = 'json'
72
+ end
73
+
74
+ module Hooks
75
+ DECISION_TYPES = {
76
+ 'CAMPAIGN_DECISION' => 'CAMPAIGN_DECISION'
77
+ }
62
78
  end
63
79
 
64
80
  RUBY_VARIABLE_TYPES = {
65
81
  'string' => [String],
66
82
  'integer' => [Integer],
67
83
  'double' => [Float],
68
- 'boolean' => [TrueClass, FalseClass]
84
+ 'boolean' => [TrueClass, FalseClass],
85
+ 'json' => [Hash]
86
+ }
87
+
88
+ GOAL_TYPES = {
89
+ 'REVENUE' => 'REVENUE_TRACKING',
90
+ 'CUSTOM' => 'CUSTOM_GOAL',
91
+ 'ALL' => 'ALL'
69
92
  }
70
93
 
71
94
  module ApiMethods
@@ -75,6 +98,8 @@ class VWO
75
98
  IS_FEATURE_ENABLED = 'is_feature_enabled'
76
99
  GET_FEATURE_VARIABLE_VALUE = 'get_feature_variable_value'
77
100
  PUSH = 'push'
101
+ GET_AND_UPDATE_SETTINGS_FILE = 'get_and_update_settings_file'
102
+ FLUSH_EVENTS = 'flush_events'
78
103
  end
79
104
 
80
105
  module PushApi
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 Wingify Software Pvt. Ltd.
1
+ # Copyright 2019-2021 Wingify Software Pvt. Ltd.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 Wingify Software Pvt. Ltd.
1
+ # Copyright 2019-2021 Wingify Software Pvt. Ltd.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -18,15 +18,20 @@ require_relative '../utils/campaign'
18
18
  require_relative '../services/segment_evaluator'
19
19
  require_relative '../utils/validations'
20
20
  require_relative 'bucketer'
21
+ require_relative '../constants'
22
+ require_relative '../services/hooks_manager'
23
+ require_relative '../utils/uuid'
21
24
 
22
25
  class VWO
23
26
  module Core
24
27
  class VariationDecider
25
- attr_reader :user_storage_service
28
+ attr_reader :user_storage_service, :has_stored_variation, :hooks_manager
26
29
 
27
30
  include VWO::Enums
28
31
  include VWO::Utils::Campaign
29
32
  include VWO::Utils::Validations
33
+ include VWO::CONSTANTS
34
+ include VWO::Utils::UUID
30
35
 
31
36
  FILE = FileNameEnum::VariationDecider
32
37
 
@@ -34,12 +39,13 @@ class VWO
34
39
  # @param[Hash] - Settings file
35
40
  # @param[Class] - Class instance having the capability of
36
41
  # get and save.
37
- def initialize(settings_file, user_storage_service = nil)
42
+ def initialize(settings_file, user_storage_service = nil, options = {})
38
43
  @logger = VWO::Logger.get_instance
39
44
  @user_storage_service = user_storage_service
40
45
  @bucketer = VWO::Core::Bucketer.new
41
46
  @settings_file = settings_file
42
47
  @segment_evaluator = VWO::Services::SegmentEvaluator.new
48
+ @hooks_manager = VWO::Services::HooksManager.new(options)
43
49
  end
44
50
 
45
51
  # Returns variation for the user for the passed campaign-key
@@ -51,14 +57,42 @@ class VWO
51
57
  # @param[String] :user_id The unique ID assigned to User
52
58
  # @param[Hash] :campaign Campaign hash itself
53
59
  # @param[String] :campaign_key The unique ID of the campaign passed
60
+ # @param[String] :goal_identifier The unique campaign's goal identifier
54
61
  # @return[String,String] ({variation_id, variation_name}|Nil): Tuple of
55
62
  # variation_id and variation_name if variation allotted, else nil
56
63
 
57
- def get_variation(user_id, campaign, api_name, campaign_key, custom_variables = {}, variation_targeting_variables = {})
64
+ def get_variation(user_id, campaign, api_name, campaign_key, custom_variables = {}, variation_targeting_variables = {}, goal_identifier = '')
58
65
  campaign_key ||= campaign['key']
59
66
 
60
67
  return unless campaign
61
68
 
69
+ @has_stored_variation = false
70
+ decision = {
71
+ :campaign_id => campaign['id'],
72
+ :campaign_key => campaign_key,
73
+ :campaign_type => campaign['type'],
74
+ # campaign segmentation conditions
75
+ :custom_variables => custom_variables,
76
+ # event name
77
+ :event => Hooks::DECISION_TYPES['CAMPAIGN_DECISION'],
78
+ # goal tracked in case of track API
79
+ :goal_identifier => goal_identifier,
80
+ # campaign whitelisting flag
81
+ :is_forced_variation_enabled => campaign['isForcedVariationEnabled'] ? campaign['isForcedVariationEnabled'] : false,
82
+ :sdk_version => SDK_VERSION,
83
+ # API name which triggered the event
84
+ :source => api_name,
85
+ # Passed in API
86
+ :user_id => user_id,
87
+ # Campaign Whitelisting conditions
88
+ :variation_targeting_variables => variation_targeting_variables,
89
+ :is_user_whitelisted => false,
90
+ :from_user_storage_service => false,
91
+ :is_feature_enabled => true,
92
+ # VWO generated UUID based on passed UserId and Account ID
93
+ :vwo_user_id => generator_for(user_id, @settings_file['accountId'])
94
+ }
95
+
62
96
  if campaign['isForcedVariationEnabled']
63
97
  variation = evaluate_whitelisting(
64
98
  user_id,
@@ -88,6 +122,19 @@ class VWO
88
122
  )
89
123
  )
90
124
 
125
+ if variation
126
+ if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
127
+ decision[:variation_name] = variation['name']
128
+ decision[:variation_id] = variation['id']
129
+ if campaign['type'] == CampaignTypes::FEATURE_TEST
130
+ decision[:is_feature_enabled] = variation['isFeatureEnabled']
131
+ elsif campaign['type'] == CampaignTypes::VISUAL_AB
132
+ decision[:is_user_whitelisted] = !!variation['name']
133
+ end
134
+ end
135
+ @hooks_manager.execute(decision)
136
+ end
137
+
91
138
  return variation if variation && variation['name']
92
139
  else
93
140
  @logger.log(
@@ -106,6 +153,14 @@ class VWO
106
153
  variation = get_stored_variation(user_id, campaign_key, user_campaign_map) if valid_hash?(user_campaign_map)
107
154
 
108
155
  if variation
156
+ variation = variation.dup # deep copy
157
+ end
158
+
159
+ if variation
160
+ if valid_string?(user_campaign_map['goal_identifier']) && api_name == ApiMethods::TRACK
161
+ variation['goal_identifier'] = user_campaign_map['goal_identifier']
162
+ end
163
+ @has_stored_variation = true
109
164
  @logger.log(
110
165
  LogLevelEnum::INFO,
111
166
  format(
@@ -116,7 +171,55 @@ class VWO
116
171
  variation_name: variation['name']
117
172
  )
118
173
  )
174
+ decision[:from_user_storage_service] = !!variation['name']
175
+ if variation
176
+ if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
177
+ decision[:variation_name] = variation['name']
178
+ decision[:variation_id] = variation['id']
179
+ if campaign['type'] == CampaignTypes::FEATURE_TEST
180
+ decision[:is_feature_enabled] = variation['isFeatureEnabled']
181
+ end
182
+ end
183
+ @hooks_manager.execute(decision)
184
+ end
119
185
  return variation
186
+ else
187
+ @logger.log(
188
+ LogLevelEnum::DEBUG,
189
+ format(
190
+ LogMessageEnum::DebugMessages::NO_STORED_VARIATION,
191
+ file: FILE,
192
+ campaign_key: campaign_key,
193
+ user_id: user_id
194
+ )
195
+ )
196
+
197
+ if ([ApiMethods::TRACK, ApiMethods::GET_VARIATION_NAME, ApiMethods::GET_FEATURE_VARIABLE_VALUE].include? api_name) &&
198
+ @user_storage_service && campaign['type'] != CampaignTypes::FEATURE_ROLLOUT
199
+ @logger.log(
200
+ LogLevelEnum::DEBUG,
201
+ format(
202
+ LogMessageEnum::DebugMessages::CAMPAIGN_NOT_ACTIVATED,
203
+ file: FILE,
204
+ campaign_key: campaign_key,
205
+ user_id: user_id,
206
+ api_name: api_name
207
+ )
208
+ )
209
+
210
+ @logger.log(
211
+ LogLevelEnum::INFO,
212
+ format(
213
+ LogMessageEnum::InfoMessages::CAMPAIGN_NOT_ACTIVATED,
214
+ file: FILE,
215
+ campaign_key: campaign_key,
216
+ user_id: user_id,
217
+ api_name: api_name,
218
+ reason: api_name == ApiMethods::TRACK ? 'track it' : 'get the decision/value'
219
+ )
220
+ )
221
+ return
222
+ end
120
223
  end
121
224
 
122
225
  # Pre-segmentation
@@ -178,7 +281,7 @@ class VWO
178
281
  variation = get_variation_allotted(user_id, campaign)
179
282
 
180
283
  if variation && variation['name']
181
- save_user_storage(user_id, campaign_key, variation['name']) if variation['name']
284
+ save_user_storage(user_id, campaign_key, variation['name'], goal_identifier) if variation['name']
182
285
 
183
286
  @logger.log(
184
287
  LogLevelEnum::INFO,
@@ -197,6 +300,17 @@ class VWO
197
300
  format(LogMessageEnum::InfoMessages::NO_VARIATION_ALLOCATED, file: FILE, campaign_key: campaign_key, user_id: user_id)
198
301
  )
199
302
  end
303
+
304
+ if variation
305
+ if campaign['type'] == CampaignTypes::VISUAL_AB || campaign['type'] == CampaignTypes::FEATURE_TEST
306
+ decision[:variation_name] = variation['name']
307
+ decision[:variation_id] = variation['id']
308
+ if campaign['type'] == CampaignTypes::FEATURE_TEST
309
+ decision[:is_feature_enabled] = variation['isFeatureEnabled']
310
+ end
311
+ end
312
+ @hooks_manager.execute(decision)
313
+ end
200
314
  variation
201
315
  end
202
316
 
@@ -293,6 +407,45 @@ class VWO
293
407
  nil
294
408
  end
295
409
 
410
+ # If UserStorageService is provided, save the assigned variation
411
+ #
412
+ # @param[String] :user_id Unique user identifier
413
+ # @param[String] :campaign_key Unique campaign identifier
414
+ # @param[String] :variation_name Variation identifier
415
+ # @param[String] :goal_identifier The unique campaign's goal identifier
416
+ # @return[Boolean] true if found otherwise false
417
+
418
+ def save_user_storage(user_id, campaign_key, variation_name, goal_identifier)
419
+ unless @user_storage_service
420
+ @logger.log(
421
+ LogLevelEnum::DEBUG,
422
+ format(LogMessageEnum::DebugMessages::NO_USER_STORAGE_SERVICE_SAVE, file: FILE)
423
+ )
424
+ return false
425
+ end
426
+ new_campaign_user_mapping = {}
427
+ new_campaign_user_mapping['campaign_key'] = campaign_key
428
+ new_campaign_user_mapping['user_id'] = user_id
429
+ new_campaign_user_mapping['variation_name'] = variation_name
430
+ if !goal_identifier.empty?
431
+ new_campaign_user_mapping['goal_identifier'] = goal_identifier
432
+ end
433
+
434
+ @user_storage_service.set(new_campaign_user_mapping)
435
+
436
+ @logger.log(
437
+ LogLevelEnum::INFO,
438
+ format(LogMessageEnum::InfoMessages::SAVING_DATA_USER_STORAGE_SERVICE, file: FILE, user_id: user_id)
439
+ )
440
+ true
441
+ rescue StandardError
442
+ @logger.log(
443
+ LogLevelEnum::ERROR,
444
+ format(LogMessageEnum::ErrorMessages::SAVE_USER_STORAGE_SERVICE_FAILED, file: FILE, user_id: user_id)
445
+ )
446
+ false
447
+ end
448
+
296
449
  private
297
450
 
298
451
  # Evaluate all the variations in the campaign to find
@@ -464,41 +617,6 @@ class VWO
464
617
  variation_name
465
618
  )
466
619
  end
467
-
468
- # If UserStorageService is provided, save the assigned variation
469
- #
470
- # @param[String] :user_id Unique user identifier
471
- # @param[String] :campaign_key Unique campaign identifier
472
- # @param[String] :variation_name Variation identifier
473
- # @return[Boolean] true if found otherwise false
474
-
475
- def save_user_storage(user_id, campaign_key, variation_name)
476
- unless @user_storage_service
477
- @logger.log(
478
- LogLevelEnum::DEBUG,
479
- format(LogMessageEnum::DebugMessages::NO_USER_STORAGE_SERVICE_SAVE, file: FILE)
480
- )
481
- return false
482
- end
483
- new_campaign_user_mapping = {}
484
- new_campaign_user_mapping['campaign_key'] = campaign_key
485
- new_campaign_user_mapping['user_id'] = user_id
486
- new_campaign_user_mapping['variation_name'] = variation_name
487
-
488
- @user_storage_service.set(new_campaign_user_mapping)
489
-
490
- @logger.log(
491
- LogLevelEnum::INFO,
492
- format(LogMessageEnum::InfoMessages::SAVING_DATA_USER_STORAGE_SERVICE, file: FILE, user_id: user_id)
493
- )
494
- true
495
- rescue StandardError
496
- @logger.log(
497
- LogLevelEnum::ERROR,
498
- format(LogMessageEnum::ErrorMessages::SAVE_USER_STORAGE_SERVICE_FAILED, file: FILE, user_id: user_id)
499
- )
500
- false
501
- end
502
620
  end
503
621
  end
504
622
  end
data/lib/vwo/enums.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright 2019-2020 Wingify Software Pvt. Ltd.
1
+ # Copyright 2019-2021 Wingify Software Pvt. Ltd.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -71,6 +71,8 @@ class VWO
71
71
  SegmentEvaluator = VWO_PATH + '/services/segment_evaluator'
72
72
  Logger = VWO_PATH + '/logger'
73
73
  SettingsFileProcessor = VWO_PATH + '/services/settings_file_processor'
74
+ BatchEventsQueue = VWO_PATH + '/services/batch_events_queue'
75
+ BatchEventsDispatcher = VWO_PATH + '/services/batch_events_dispatcher'
74
76
 
75
77
  CampaignUtil = UTIL_PATH + '/campaign'
76
78
  FunctionUtil = UTIL_PATH + '/function'
@@ -106,6 +108,11 @@ class VWO
106
108
  GOT_VARIATION_FOR_USER = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s'
107
109
  SEGMENTATION_STATUS = '(%<file>s): In API: %<api_name>s, for UserId:%<user_id>s of campaign:%<campaign_key>s with variables:%<custom_variables>s %<status>s %<segmentation_type>s for %<variation_name>s'
108
110
  PARAMS_FOR_PUSH_CALL = '(%<file>s): Params for push call - %<properties>s'
111
+ CAMPAIGN_NOT_ACTIVATED = '(%<file>s): Campaign:%<campaign_key>s for User ID:%<user_id>s is not yet activated for API:%<api_name>s. Use activate API to activate A/B test or isFeatureEnabled API to activate Feature Test.'
112
+ BATCH_EVENT_LIMIT_EXCEEDED = '(%<file>s): Impression event - %<end_point>s failed due to exceeding payload size. Parameter eventsPerRequest in batchEvents config in launch API has value:%<eventsPerRequest>s for accountId:%<accountId>s. Please read the official documentation for knowing the size limits.'
113
+ BULK_NOT_PROCESSED = "(%<file>s): Batch events couldn't be received by VWO. Calling Flush Callback with error and data."
114
+ BEFORE_FLUSHING = '(%<file>s): Flushing events queue %<manually>s having %<length>s events %<timer>s queue summary: %<queue_metadata>s'
115
+ EVENT_BATCHING_INSUFFICIENT = '(%<file>s): %<key>s not provided, assigning default value'
109
116
  end
110
117
 
111
118
  # Info Messages
@@ -120,9 +127,9 @@ class VWO
120
127
  AUDIENCE_CONDITION_NOT_MET = '(%<file>s): userId:%<user_id>s does not become part of campaign because of not meeting audience conditions'
121
128
  GOT_VARIATION_FOR_USER = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s got variationName:%<variation_name>s'
122
129
  USER_GOT_NO_VARIATION = '(%<file>s): userId:%<user_id>s for campaign:%<campaign_key>s did not allot any variation'
123
- IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having main keys: accountId:%<account_id>s userId:%<user_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s'
124
- MAIN_KEYS_FOR_IMPRESSION = '(%<file>s): Having main keys: accountId:%<account_id>s} userId:%<user_id>s campaignId:%<campaign_id>s and variationId:%<variation_id>s'
125
- MAIN_KEYS_FOR_PUSH_API = '(%<file>s): Having main keys: accountId:%<account_id>s} userId:%<user_id>s u:%<u>s and tags:%<tags>s}'
130
+ 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'
131
+ 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}'
132
+ 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}'
126
133
  INVALID_VARIATION_KEY = '(%<file>s): Variation was not assigned to userId:%<user_id>s for campaign:%<campaign_key>s'
127
134
 
128
135
  USER_IN_FEATURE_ROLLOUT = '(%<file>s): User ID:%<user_id>s is in feature rollout:%<campaign_key>s'
@@ -140,6 +147,14 @@ class VWO
140
147
 
141
148
  SEGMENTATION_STATUS = '(%<file>s): In API: %<api_name>s, for UserId:%<user_id>s of campaign:%<campaign_key>s with variables:%<custom_variables>s %<status>s %<segmentation_type>s %<variation_name>s'
142
149
  WHITELISTING_SKIPPED = '(%<file>s): In API: %<api_name>s, Skipping whitelisting for UserId:%<user_id>s of campaign:%<campaign_key>s'
150
+ SETTINGS_NOT_UPDATED = '(%<file>s): Settings-file fetched are same as earlier fetched settings'
151
+ SETTINGS_FILE_UPDATED = '(%<file>s): %<api_name>s vwo_sdk_instance is updated with the latest settings_file'
152
+ CAMPAIGN_NOT_ACTIVATED = '(%<file>s): Activate the campaign:%<campaign_key>s for User ID:%<user_id>s to %<reason>s.'
153
+ GOAL_ALREADY_TRACKED = '(%<file>s): Goal:%<goal_identifier>s of Campaign:%<campaign_key>s for User ID:%<user_id>s has already been tracked earlier. Skipping now'
154
+ USER_ALREADY_TRACKED = '(%<file>s): User ID:%<user_id>s for Campaign:%<campaign_key>s has already been tracked earlier for "%<api_name>s" API. Skipping now'
155
+ API_CALLED = '(%<file>s): API: {api_name} called for UserId:%<user_id>s'
156
+ BULK_IMPRESSION_SUCCESS = '(%<file>s): Impression event - %<end_point>s was successfully received by VWO having accountId:%<a>s'
157
+ AFTER_FLUSHING = '(%<file>s): Events queue having %<length>s events has been flushed %<manually>s queue summary: %<queue_metadata>s'
143
158
  end
144
159
 
145
160
  # Warning Messages
@@ -152,7 +167,7 @@ class VWO
152
167
  API_CONFIG_CORRUPTED = '(%<file>s): %<api_name>s API has corrupted configuration'
153
168
  GET_VARIATION_NAME_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(String) as first and userId(String) as second argument, customVariables(Hash) can be passed via options for pre-segmentation'
154
169
  GET_VARIATION_API_CONFIG_CORRUPTED = '(%<file>s): "getVariation" API has corrupted configuration'
155
- TRACK_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(String) as first userId(String) as second and goalIdentifier(String/Number) as third argument. Fourth is revenueValue(Float/Number/String) and is required for revenue goal only. customVariables(Hash) can be passed via options for pre-segmentation'
170
+ TRACK_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects campaignTestKey(Nil/String/Array) as first userId(String) as second and goalIdentifier(String/Number) as third argument. Fourth is revenueValue(Float/Number/String) and is required for revenue goal only. customVariables(Hash) can be passed via options for pre-segmentation'
156
171
  TRACK_API_CONFIG_CORRUPTED = '(%<file>s): "track" API has corrupted configuration'
157
172
  TRACK_API_GOAL_NOT_FOUND = '(%<file>s): Goal:%<goal_identifier>s not found for campaign:%<campaign_key>s and userId:%<user_id>s'
158
173
  TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL = '(%<file>s): Revenue value should be passed for revenue goal:%<goal_identifier>s for campaign:%<campaign_key>s and userId:%<user_id>s'
@@ -179,6 +194,16 @@ class VWO
179
194
  PUSH_API_INVALID_PARAMS = '(%<file>s): %<api_name>s API got bad parameters. It expects tag_key(String) as first and tag_value(String) as second argument and user_id(String) as third argument'
180
195
  TAG_VALUE_LENGTH_EXCEEDED = '(%<file>s): In API: %<api_name>s, the length of tag_value:%<tag_value>s and userID: %<user_id>s can not be greater than 255'
181
196
  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'
197
+ 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.'
198
+ NO_CAMPAIGN_FOUND = '(%<file>s): No campaign found for goal_identifier:%<goal_identifier>s. Please verify from VWO app.'
199
+ INVALID_TRACK_RETURNING_USER_VALUE = '(%<file>s): should_track_returning_user should be boolean'
200
+ INVALID_GOAL_TYPE = '(%<file>s): goal_type_to_track should be certain strings'
201
+ EVENT_BATCHING_NOT_OBJECT = '(%<file>s): Batch events settings are not of type object.'
202
+ EVENTS_PER_REQUEST_INVALID = '(%<file>s): events_per_request should be an integer'
203
+ REQUEST_TIME_INTERVAL_INVALID = '(%<file>s): request_time_interval should be a number'
204
+ EVENTS_PER_REQUEST_OUT_OF_BOUNDS = '(%<file>s): events_per_request should be >= %<min_value>s and <= %<max_value>s'
205
+ REQUEST_TIME_INTERVAL_OUT_OF_BOUNDS = '(%<file>s): request_time_interval should be >= %<min_value>s'
206
+ FLUSH_CALLBACK_INVALID = '(%<file>s): flush_callback is not callable'
182
207
  end
183
208
  end
184
209