vwo-sdk 1.30.0 → 1.37.1

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.
@@ -14,9 +14,9 @@
14
14
 
15
15
  require 'json'
16
16
  require 'cgi'
17
- require_relative '../logger'
18
17
  require_relative '../enums'
19
18
  require_relative '../constants'
19
+ require_relative './log_message'
20
20
  require_relative 'function'
21
21
  require_relative 'uuid'
22
22
  require_relative 'utility'
@@ -57,7 +57,7 @@ class VWO
57
57
  combination: variation_id,
58
58
  random: get_random_number,
59
59
  sId: get_current_unix_timestamp,
60
- u: generator_for(user_id, account_id),
60
+ u: generator_for(user_id, account_id, true),
61
61
  env: sdk_key
62
62
  }
63
63
  # Version and SDK constants
@@ -67,30 +67,28 @@ class VWO
67
67
 
68
68
  impression = usage_stats.merge(impression)
69
69
 
70
- logger = VWO::Logger.get_instance
71
-
72
70
  if is_track_user_api
73
71
  impression['ed'] = JSON.generate(p: 'server')
74
72
  impression['url'] = HTTPS_PROTOCOL + get_url(ENDPOINTS::TRACK_USER)
75
- logger.log(
73
+ Logger.log(
76
74
  LogLevelEnum::DEBUG,
77
- format(
78
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_USER,
79
- file: FileNameEnum::ImpressionUtil,
80
- properties: remove_sensitive_properties(impression)
81
- )
75
+ 'IMPRESSION_FOR_TRACK_USER',
76
+ {
77
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
78
+ '{properties}' => remove_sensitive_properties(impression)
79
+ }
82
80
  )
83
81
  else
84
82
  impression['url'] = HTTPS_PROTOCOL + get_url(ENDPOINTS::TRACK_GOAL)
85
83
  impression['goal_id'] = goal_id
86
84
  impression['r'] = revenue if revenue
87
- logger.log(
85
+ Logger.log(
88
86
  LogLevelEnum::DEBUG,
89
- format(
90
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_GOAL,
91
- file: FileNameEnum::ImpressionUtil,
92
- properties: remove_sensitive_properties(impression)
93
- )
87
+ 'IMPRESSION_FOR_TRACK_GOAL',
88
+ {
89
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
90
+ '{properties}' => JSON.generate(impression)
91
+ }
94
92
  )
95
93
  end
96
94
  impression
@@ -110,7 +108,7 @@ class VWO
110
108
  'sdk-v' => SDK_VERSION,
111
109
  'ap' => PLATFORM,
112
110
  'sId' => get_current_unix_timestamp,
113
- 'u' => generator_for(user_id, account_id),
111
+ 'u' => generator_for(user_id, account_id, true),
114
112
  'account_id' => account_id
115
113
  }
116
114
  end
@@ -129,6 +127,7 @@ class VWO
129
127
  # Else Properties(dict)
130
128
  def create_bulk_event_impression(settings_file, campaign_id, variation_id, user_id, goal_id = nil, revenue = nil)
131
129
  return unless valid_number?(campaign_id) && valid_string?(user_id)
130
+
132
131
  is_track_user_api = true
133
132
  is_track_user_api = false unless goal_id.nil?
134
133
  account_id = settings_file['accountId']
@@ -136,29 +135,29 @@ class VWO
136
135
  eT: is_track_user_api ? 1 : 2,
137
136
  e: campaign_id,
138
137
  c: variation_id,
139
- u: generator_for(user_id, account_id),
138
+ u: generator_for(user_id, account_id, true),
140
139
  sId: get_current_unix_timestamp
141
140
  }
142
- logger = VWO::Logger.get_instance
141
+
143
142
  if is_track_user_api
144
- logger.log(
143
+ Logger.log(
145
144
  LogLevelEnum::DEBUG,
146
- format(
147
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_USER,
148
- file: FileNameEnum::ImpressionUtil,
149
- properties: JSON.generate(impression)
150
- )
145
+ 'IMPRESSION_FOR_TRACK_USER',
146
+ {
147
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
148
+ '{properties}' => remove_sensitive_properties(impression)
149
+ }
151
150
  )
152
151
  else
153
152
  impression['g'] = goal_id
154
153
  impression['r'] = revenue if revenue
155
- logger.log(
154
+ Logger.log(
156
155
  LogLevelEnum::DEBUG,
157
- format(
158
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_TRACK_GOAL,
159
- file: FileNameEnum::ImpressionUtil,
160
- properties: JSON.generate(impression)
161
- )
156
+ 'IMPRESSION_FOR_TRACK_GOAL',
157
+ {
158
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
159
+ '{properties}' => JSON.generate(impression)
160
+ }
162
161
  )
163
162
  end
164
163
  impression
@@ -171,7 +170,7 @@ class VWO
171
170
  # @param[String] :event_name
172
171
  # @param[Hash] :usage_stats
173
172
  # @return[Hash] :properties
174
- #
173
+ #
175
174
  def get_events_base_properties(settings_file, event_name, usage_stats = {})
176
175
  properties = {
177
176
  en: event_name,
@@ -179,12 +178,10 @@ class VWO
179
178
  env: settings_file['sdkKey'],
180
179
  eTime: get_current_unix_timestamp_in_millis,
181
180
  random: get_random_number,
182
- p: "FS"
181
+ p: 'FS'
183
182
  }
184
183
 
185
- if event_name == EventEnum::VWO_VARIATION_SHOWN
186
- properties = properties.merge(usage_stats)
187
- end
184
+ properties = properties.merge(usage_stats) if event_name == EventEnum::VWO_VARIATION_SHOWN
188
185
  properties
189
186
  end
190
187
 
@@ -193,11 +190,11 @@ class VWO
193
190
  # @param[Hash] :settings_file
194
191
  # @param[String] :user_id
195
192
  # @param[String] :event_name
196
- # @param[Hash] :usage_stats
193
+ # @param[Hash] :_usage_stats
197
194
  # @return[Hash] :properties
198
- #
199
- def get_event_base_payload(settings_file, user_id, event_name, usage_stats = {})
200
- uuid = generator_for(user_id, (settings_file['accountId']))
195
+ #
196
+ def get_event_base_payload(settings_file, user_id, event_name, _usage_stats = {})
197
+ uuid = generator_for(user_id, (settings_file['accountId']), true)
201
198
  sdk_key = settings_file['sdkKey']
202
199
 
203
200
  props = {
@@ -211,12 +208,12 @@ class VWO
211
208
  }
212
209
 
213
210
  # if usage_stats
214
- # props = props.merge(usage_stats)
211
+ # props = props.merge(_usage_stats)
215
212
  # end
216
213
 
217
- properties = {
214
+ {
218
215
  d: {
219
- msgId: uuid + '_' + Time.now.to_i.to_s,
216
+ msgId: "#{uuid} + '_' + #{Time.now.to_i}",
220
217
  visId: uuid,
221
218
  sessionId: Time.now.to_i,
222
219
  event: {
@@ -231,8 +228,6 @@ class VWO
231
228
  }
232
229
  }
233
230
  }
234
-
235
- properties
236
231
  end
237
232
 
238
233
  # Builds payload to track the visitor.
@@ -242,27 +237,26 @@ class VWO
242
237
  # @param[String] :event_name
243
238
  # @param[Integer] :campaign_id
244
239
  # @param[Integer] :variation_id
245
- # @param[Hash] :usage_stats
240
+ # @param[Hash] :_usage_stats
246
241
  # @return[Hash] :properties
247
242
  #
248
- def get_track_user_payload_data(settings_file, user_id, event_name, campaign_id, variation_id, usage_stats = {})
243
+ def get_track_user_payload_data(settings_file, user_id, event_name, campaign_id, variation_id, _usage_stats = {})
249
244
  properties = get_event_base_payload(settings_file, user_id, event_name)
250
245
  properties[:d][:event][:props][:id] = campaign_id
251
246
  properties[:d][:event][:props][:variation] = variation_id
252
247
 
253
- #this is currently required by data-layer team, we can make changes on DACDN and remove it from here
248
+ # this is currently required by data-layer team, we can make changes on DACDN and remove it from here
254
249
  properties[:d][:event][:props][:isFirst] = 1
255
250
 
256
- logger = VWO::Logger.get_instance
257
- logger.log(
258
- LogLevelEnum::DEBUG,
259
- format(
260
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_TRACK_USER,
261
- file: FileNameEnum::ImpressionUtil,
262
- a: settings_file['accountId'],
263
- u: user_id,
264
- c: campaign_id.to_s
265
- )
251
+ Logger.log(
252
+ LogLevelEnum::DEBUG,
253
+ 'IMPRESSION_FOR_EVENT_ARCH_TRACK_USER',
254
+ {
255
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
256
+ '{accountId}' => settings_file['accountId'],
257
+ '{userId}' => user_id,
258
+ '{campaignId}' => campaign_id.to_s
259
+ }
266
260
  )
267
261
  properties
268
262
  end
@@ -281,20 +275,19 @@ class VWO
281
275
  def get_track_goal_payload_data(settings_file, user_id, event_name, revenue_value, metric_map, revenue_props = [])
282
276
  properties = get_event_base_payload(settings_file, user_id, event_name)
283
277
 
284
- logger = VWO::Logger.get_instance
285
278
  metric = {}
286
279
  metric_map.each do |campaign_id, goal_id|
287
- metric[('id_' + campaign_id.to_s).to_sym] = ['g_' + goal_id.to_s]
288
- logger.log(
280
+ metric["id_#{campaign_id}".to_sym] = ["g_#{goal_id}"]
281
+ Logger.log(
289
282
  LogLevelEnum::DEBUG,
290
- format(
291
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL,
292
- file: FileNameEnum::ImpressionUtil,
293
- goal_identifier: event_name,
294
- a: settings_file['accountId'],
295
- u: user_id,
296
- c: campaign_id
297
- )
283
+ 'IMPRESSION_FOR_EVENT_ARCH_TRACK_GOAL',
284
+ {
285
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
286
+ '{accountId}' => settings_file['accountId'],
287
+ '{goalName}' => event_name,
288
+ '{userId}' => user_id,
289
+ '{campaignId}' => campaign_id.to_s
290
+ }
298
291
  )
299
292
  end
300
293
 
@@ -302,7 +295,7 @@ class VWO
302
295
  metric: metric
303
296
  }
304
297
 
305
- if revenue_props.length() != 0 && revenue_value
298
+ if revenue_props.length != 0 && revenue_value
306
299
  revenue_props.each do |revenue_prop|
307
300
  properties[:d][:event][:props][:vwoMeta][revenue_prop.to_sym] = revenue_value
308
301
  end
@@ -330,19 +323,27 @@ class VWO
330
323
  properties[:d][:visitor][:props][tag_key] = tag_value
331
324
  end
332
325
 
333
- logger = VWO::Logger.get_instance
334
- logger.log(
326
+ Logger.log(
335
327
  LogLevelEnum::DEBUG,
336
- format(
337
- LogMessageEnum::DebugMessages::IMPRESSION_FOR_EVENT_ARCH_PUSH,
338
- file: FileNameEnum::ImpressionUtil,
339
- a: settings_file['accountId'],
340
- u: user_id,
341
- property: JSON.generate(custom_dimension_map)
342
- )
328
+ 'IMPRESSION_FOR_EVENT_ARCH_PUSH',
329
+ {
330
+ '{file}' => FileNameEnum::IMPRESSION_UTIL,
331
+ '{accountId}' => settings_file['accountId'],
332
+ '{userId}' => user_id,
333
+ '{property}' => JSON.generate(custom_dimension_map)
334
+ }
343
335
  )
344
336
  properties
345
337
  end
338
+
339
+ def get_batch_event_query_params(account_id, sdk_key, usage_stats = {})
340
+ {
341
+ a: account_id,
342
+ sd: SDK_NAME,
343
+ sv: SDK_VERSION,
344
+ env: sdk_key
345
+ }.merge(usage_stats)
346
+ end
346
347
  end
347
348
  end
348
349
  end
@@ -0,0 +1,69 @@
1
+ # Copyright 2019-2022 Wingify Software Pvt. Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'vwo_log_messages'
16
+
17
+ require_relative '../logger'
18
+
19
+ class VWO
20
+ module Utils
21
+ class Logger
22
+ DEBUG = ::Logger::DEBUG
23
+ INFO = ::Logger::INFO
24
+ ERROR = ::Logger::ERROR
25
+ WARN = ::Logger::WARN
26
+
27
+ @@logs = nil
28
+ @@api_name = 'api_name'
29
+
30
+ def self.set_api_name(api_name)
31
+ @@api_name = api_name
32
+ end
33
+
34
+ def self.get_log_message(logs_type, message_type)
35
+ @@logs = VwoLogMessages.getMessage if @@logs.nil?
36
+
37
+ return message_type unless @@logs[logs_type].key?(message_type)
38
+
39
+ @@logs[logs_type][message_type]
40
+ end
41
+
42
+ def self.log(level, message_type, params, disable_logs = false)
43
+ return if disable_logs
44
+
45
+ message = case level
46
+ when DEBUG
47
+ get_log_message('debug_logs', message_type)
48
+ when INFO
49
+ get_log_message('info_logs', message_type)
50
+ when ERROR
51
+ get_log_message('error_logs', message_type)
52
+ when WARN
53
+ get_log_message('warning_logs', message_type)
54
+ else
55
+ ''
56
+ end
57
+ message = message.dup
58
+
59
+ if message && !message.empty?
60
+ params.each do |key, value|
61
+ message[key.to_s] = value.to_s if message.include? key
62
+ end
63
+ end
64
+ message = "[#{@@api_name}] #{message}"
65
+ VWO::Logger.get_instance.log(level, message)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -31,12 +31,11 @@ class VWO
31
31
  http.use_ssl = true
32
32
  uri.query = URI.encode_www_form(params)
33
33
  headers = {
34
- 'Authorization'=>params[:env],
35
- 'Content-Type' =>'application/json',
36
- 'Accept'=>'application/json'
34
+ 'Authorization' => params[:env],
35
+ 'Content-Type' => 'application/json',
36
+ 'Accept' => 'application/json'
37
37
  }
38
- response = http.post(uri, post_data.to_json, headers)
39
- response
38
+ http.post(uri, post_data.to_json, headers)
40
39
  end
41
40
 
42
41
  def self.event_post(url, params, post_data, user_agent_value)
@@ -46,11 +45,10 @@ class VWO
46
45
  uri.query = URI.encode_www_form(params)
47
46
  headers = {
48
47
  'User-Agent' => user_agent_value,
49
- 'Content-Type' =>'application/json',
50
- 'Accept'=>'application/json'
48
+ 'Content-Type' => 'application/json',
49
+ 'Accept' => 'application/json'
51
50
  }
52
- response = http.post(uri, post_data.to_json, headers)
53
- response
51
+ http.post(uri, post_data.to_json, headers)
54
52
  end
55
53
  end
56
54
  end
@@ -19,37 +19,54 @@ require_relative '../constants'
19
19
 
20
20
  # Generic utility module
21
21
  class VWO
22
- module Utils
23
- module Utility
24
- include Validations
25
- include VWO::Utils
26
- include VWO::CONSTANTS
22
+ module Utils
23
+ module Utility
24
+ include Validations
25
+ include VWO::Utils
26
+ include VWO::CONSTANTS
27
27
 
28
- # converting hash with keys as strings into hash with keys as strings
29
- # @param[Hash]
30
- # @return[Hash]
31
- def convert_to_symbol_hash(hashObject)
32
- hashObject ||= {}
33
- convertedHash = {}
34
- hashObject.each do |key, value|
35
- if valid_hash?(value)
36
- convertedHash[key.to_sym] = convert_to_symbol_hash(value)
37
- else
38
- convertedHash[key.to_sym] = value
39
- end
40
- end
41
- convertedHash
42
- end
28
+ # converting hash with keys as strings into hash with keys as strings
29
+ # @param[Hash]
30
+ # @return[Hash]
31
+ def convert_to_symbol_hash(hash_object)
32
+ hash_object ||= {}
33
+ converted_hash = {}
34
+ hash_object.each do |key, value|
35
+ converted_hash[key.to_sym] = if valid_hash?(value)
36
+ convert_to_symbol_hash(value)
37
+ else
38
+ value
39
+ end
40
+ end
41
+ converted_hash
42
+ end
43
+
44
+ def remove_sensitive_properties(properties)
45
+ properties.delete('env')
46
+ properties.delete('env'.to_sym)
47
+ JSON.generate(properties)
48
+ end
43
49
 
44
- def remove_sensitive_properties(properties)
45
- properties.delete("env")
46
- properties.delete("env".to_sym)
47
- JSON.generate(properties)
48
- end
50
+ def get_url(endpoint)
51
+ DataLocationManager.get_instance.get_data_location + endpoint
52
+ end
53
+
54
+ def prepare_push_response(custom_dimension_map, resp, result)
55
+ custom_dimension_map.each do |tag_key, _tag_value|
56
+ result[tag_key] = resp
57
+ end
58
+ result
59
+ end
49
60
 
50
- def get_url(endpoint)
51
- return DataLocationManager.get_instance().get_data_location + endpoint
52
- end
61
+ def get_variation_identifiers(variation)
62
+ if variation['goal_identifier']
63
+ identifiers = variation['goal_identifier'].split(VWO_DELIMITER)
64
+ else
65
+ variation['goal_identifier'] = ''
66
+ identifiers = []
53
67
  end
68
+ identifiers
69
+ end
54
70
  end
71
+ end
55
72
  end
@@ -13,9 +13,9 @@
13
13
  # limitations under the License.
14
14
 
15
15
  require 'digest'
16
- require_relative '../logger'
17
16
  require_relative '../enums'
18
17
  require_relative '../constants'
18
+ require_relative './log_message'
19
19
 
20
20
  # Utility module for generating uuid
21
21
  class VWO
@@ -53,10 +53,11 @@ class VWO
53
53
  #
54
54
  # @param[Integer|String] :user_id User identifier
55
55
  # @param[Integer|String] :account_id Account identifier
56
+ # @param[Boolean] :disable_logs if true, do not log log-message
56
57
  #
57
58
  # @return[Integer] Desired UUID
58
59
  #
59
- def generator_for(user_id, account_id)
60
+ def generator_for(user_id, account_id, disable_logs = false)
60
61
  user_id = user_id.to_s
61
62
  account_id = account_id.to_s
62
63
  user_id_namespace = generate(VWO_NAMESPACE, account_id)
@@ -64,15 +65,16 @@ class VWO
64
65
 
65
66
  desired_uuid = uuid_for_account_user_id.delete('-').upcase
66
67
 
67
- VWO::Logger.get_instance.log(
68
+ Logger.log(
68
69
  LogLevelEnum::DEBUG,
69
- format(
70
- LogMessageEnum::DebugMessages::UUID_FOR_USER,
71
- file: FileNameEnum::UuidUtil,
72
- user_id: user_id,
73
- account_id: account_id,
74
- desired_uuid: desired_uuid
75
- )
70
+ 'USER_UUID',
71
+ {
72
+ '{file}' => FILE,
73
+ '{userId}' => user_id,
74
+ '{accountId}' => account_id,
75
+ '{uuid}' => desired_uuid
76
+ },
77
+ disable_logs
76
78
  )
77
79
  desired_uuid
78
80
  end