vwo-sdk 1.30.0 → 1.37.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vwo/constants.rb +3 -2
- data/lib/vwo/core/bucketer.rb +50 -48
- data/lib/vwo/core/variation_decider.rb +427 -428
- data/lib/vwo/enums.rb +17 -154
- data/lib/vwo/logger.rb +8 -5
- data/lib/vwo/schemas/settings_file.rb +7 -6
- data/lib/vwo/services/batch_events_dispatcher.rb +45 -38
- data/lib/vwo/services/batch_events_queue.rb +52 -68
- data/lib/vwo/services/event_dispatcher.rb +46 -16
- data/lib/vwo/services/hooks_manager.rb +8 -12
- data/lib/vwo/services/segment_evaluator.rb +17 -15
- data/lib/vwo/services/settings_file_manager.rb +5 -5
- data/lib/vwo/services/settings_file_processor.rb +7 -4
- data/lib/vwo/services/usage_stats.rb +5 -4
- data/lib/vwo/utils/campaign.rb +61 -64
- data/lib/vwo/utils/custom_dimensions.rb +14 -14
- data/lib/vwo/utils/data_location_manager.rb +2 -9
- data/lib/vwo/utils/feature.rb +7 -10
- data/lib/vwo/utils/impression.rb +80 -79
- data/lib/vwo/utils/log_message.rb +69 -0
- data/lib/vwo/utils/request.rb +7 -9
- data/lib/vwo/utils/utility.rb +45 -28
- data/lib/vwo/utils/uuid.rb +12 -10
- data/lib/vwo/utils/validations.rb +124 -49
- data/lib/vwo.rb +472 -620
- metadata +11 -10
@@ -15,13 +15,15 @@
|
|
15
15
|
require 'json'
|
16
16
|
require 'json-schema'
|
17
17
|
require_relative '../schemas/settings_file'
|
18
|
-
require_relative '../logger'
|
19
18
|
require_relative '../enums'
|
20
19
|
require_relative '../constants'
|
20
|
+
require_relative './log_message'
|
21
21
|
|
22
22
|
class VWO
|
23
23
|
module Utils
|
24
24
|
module Validations
|
25
|
+
include Enums
|
26
|
+
include CONSTANTS
|
25
27
|
# Validates the settings_file
|
26
28
|
# @param [Hash]: JSON object received from VWO server
|
27
29
|
# must be JSON.
|
@@ -66,83 +68,156 @@ class VWO
|
|
66
68
|
# Validates if the value passed batch_events has correct data type and values or not.
|
67
69
|
#
|
68
70
|
# Args: batch_events [Hash]: value to be tested
|
71
|
+
# api_name [String]: current api name
|
69
72
|
#
|
70
73
|
# @return: [Boolean]: True if all conditions are passed else False
|
71
|
-
def
|
72
|
-
logger = VWO::Logger.get_instance
|
74
|
+
def valid_batch_event_settings(batch_events, api_name)
|
73
75
|
events_per_request = batch_events[:events_per_request]
|
74
76
|
request_time_interval = batch_events[:request_time_interval]
|
75
77
|
|
76
78
|
unless events_per_request || request_time_interval
|
77
|
-
|
78
|
-
VWO::LogLevelEnum::ERROR,
|
79
|
-
format(
|
80
|
-
VWO::LogMessageEnum::ErrorMessages::EVENT_BATCHING_INSUFFICIENT,
|
81
|
-
file: VWO::FileNameEnum::ValidateUtil
|
82
|
-
)
|
83
|
-
)
|
79
|
+
invalid_config_log('batch_events', 'object', api_name)
|
84
80
|
return false
|
85
81
|
end
|
86
82
|
|
87
|
-
if
|
88
|
-
|
89
|
-
VWO::LogLevelEnum::ERROR,
|
90
|
-
format(
|
91
|
-
VWO::LogMessageEnum::ErrorMessages::REQUEST_TIME_INTERVAL_INVALID,
|
92
|
-
file: VWO::FileNameEnum::ValidateUtil
|
93
|
-
)
|
94
|
-
)
|
83
|
+
if request_time_interval && !valid_number?(request_time_interval)
|
84
|
+
invalid_config_log('batch_events', 'object', api_name)
|
95
85
|
return false
|
96
86
|
end
|
97
87
|
|
98
|
-
if
|
99
|
-
|
100
|
-
VWO::LogLevelEnum::ERROR,
|
101
|
-
format(
|
102
|
-
VWO::LogMessageEnum::ErrorMessages::EVENTS_PER_REQUEST_INVALID,
|
103
|
-
file: VWO::FileNameEnum::ValidateUtil
|
104
|
-
)
|
105
|
-
)
|
88
|
+
if events_per_request && !valid_number?(events_per_request)
|
89
|
+
invalid_config_log('batch_events', 'object', api_name)
|
106
90
|
return false
|
107
91
|
end
|
108
92
|
|
109
93
|
if events_per_request && (events_per_request < VWO::MIN_EVENTS_PER_REQUEST || events_per_request > VWO::MAX_EVENTS_PER_REQUEST)
|
110
|
-
|
111
|
-
VWO::LogLevelEnum::ERROR,
|
112
|
-
format(
|
113
|
-
VWO::LogMessageEnum::ErrorMessages::EVENTS_PER_REQUEST_OUT_OF_BOUNDS,
|
114
|
-
file: VWO::FileNameEnum::ValidateUtil,
|
115
|
-
min_value: VWO::MIN_EVENTS_PER_REQUEST,
|
116
|
-
max_value: VWO::MAX_EVENTS_PER_REQUEST
|
117
|
-
)
|
118
|
-
)
|
94
|
+
invalid_config_log('batch_events', 'object', api_name)
|
119
95
|
return false
|
120
96
|
end
|
121
97
|
|
122
98
|
if request_time_interval && request_time_interval < VWO::MIN_REQUEST_TIME_INTERVAL
|
123
|
-
|
124
|
-
VWO::LogLevelEnum::ERROR,
|
125
|
-
format(
|
126
|
-
VWO::LogMessageEnum::ErrorMessages::REQUEST_TIME_INTERVAL_OUT_OF_BOUNDS,
|
127
|
-
file: VWO::FileNameEnum::ValidateUtil,
|
128
|
-
min_value: VWO::MIN_REQUEST_TIME_INTERVAL
|
129
|
-
)
|
130
|
-
)
|
99
|
+
invalid_config_log('batch_events', 'object', api_name)
|
131
100
|
return false
|
132
101
|
end
|
133
102
|
|
134
103
|
if batch_events.key?(:flushCallback) && !batch_events[:flushCallback].is_a?(Method)
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
104
|
+
invalid_config_log('batch_events', 'object', api_name)
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
true
|
108
|
+
end
|
109
|
+
|
110
|
+
def validate_sdk_config?(user_storage, is_development_mode, api_name)
|
111
|
+
if is_development_mode
|
112
|
+
if [true, false].include? is_development_mode
|
113
|
+
valid_config_log('isDevelopmentMode', 'boolean')
|
114
|
+
else
|
115
|
+
invalid_config_log('isDevelopmentMode', 'boolean', api_name)
|
116
|
+
return false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
if user_storage
|
121
|
+
if user_storage.is_a?(UserStorage)
|
122
|
+
valid_config_log('UserStorageService', 'object')
|
123
|
+
else
|
124
|
+
invalid_config_log('UserStorageService', 'object', api_name)
|
125
|
+
return false
|
126
|
+
end
|
127
|
+
end
|
128
|
+
true
|
129
|
+
end
|
130
|
+
|
131
|
+
def valid_config_log(parameter, type)
|
132
|
+
Logger.log(
|
133
|
+
LogLevelEnum::INFO,
|
134
|
+
'CONFIG_PARAMETER_USED',
|
135
|
+
{
|
136
|
+
'{file}' => VWO::FileNameEnum::VALIDATE_UTIL,
|
137
|
+
'{parameter}' => parameter,
|
138
|
+
'{type}' => type
|
139
|
+
}
|
140
|
+
)
|
141
|
+
end
|
142
|
+
|
143
|
+
def invalid_config_log(parameter, type, api_name)
|
144
|
+
Logger.log(
|
145
|
+
LogLevelEnum::ERROR,
|
146
|
+
'CONFIG_PARAMETER_INVALID',
|
147
|
+
{
|
148
|
+
'{file}' => VWO::FileNameEnum::VALIDATE_UTIL,
|
149
|
+
'{parameter}' => parameter,
|
150
|
+
'{type}' => type,
|
151
|
+
'{api}' => api_name
|
152
|
+
}
|
153
|
+
)
|
154
|
+
end
|
155
|
+
|
156
|
+
def valid_goal?(goal, campaign, user_id, goal_identifier, revenue_value)
|
157
|
+
if goal.nil? || !goal['id']
|
158
|
+
Logger.log(
|
159
|
+
LogLevelEnum::ERROR,
|
160
|
+
'TRACK_API_GOAL_NOT_FOUND',
|
161
|
+
{
|
162
|
+
'{file}' => FILE,
|
163
|
+
'{goalIdentifier}' => goal_identifier,
|
164
|
+
'{userId}' => user_id,
|
165
|
+
'{campaignKey}' => campaign['key']
|
166
|
+
}
|
167
|
+
)
|
168
|
+
return false
|
169
|
+
elsif goal['type'] == GoalTypes::REVENUE && !valid_value?(revenue_value)
|
170
|
+
Logger.log(
|
171
|
+
LogLevelEnum::ERROR,
|
172
|
+
'TRACK_API_REVENUE_NOT_PASSED_FOR_REVENUE_GOAL',
|
173
|
+
{
|
174
|
+
'{file}' => FILE,
|
175
|
+
'{userId}' => user_id,
|
176
|
+
'{goalIdentifier}' => goal_identifier,
|
177
|
+
'{campaignKey}' => campaign['key']
|
178
|
+
}
|
141
179
|
)
|
142
180
|
return false
|
143
181
|
end
|
144
182
|
true
|
145
183
|
end
|
146
184
|
end
|
185
|
+
|
186
|
+
def valid_campaign_for_track_api?(user_id, campaign_key, campaign_type)
|
187
|
+
if campaign_type == CONSTANTS::CampaignTypes::FEATURE_ROLLOUT
|
188
|
+
Logger.log(
|
189
|
+
LogLevelEnum::ERROR,
|
190
|
+
'API_NOT_APPLICABLE',
|
191
|
+
{
|
192
|
+
'{file}' => FILE,
|
193
|
+
'{api}' => ApiMethods::TRACK,
|
194
|
+
'{userId}' => user_id,
|
195
|
+
'{campaignKey}' => campaign_key,
|
196
|
+
'{campaignType}' => campaign_type
|
197
|
+
}
|
198
|
+
)
|
199
|
+
return false
|
200
|
+
end
|
201
|
+
true
|
202
|
+
end
|
203
|
+
|
204
|
+
def valid_track_api_params?(user_id, campaign_key, custom_variables, variation_targeting_variables, goal_type_to_track, goal_identifier)
|
205
|
+
unless (valid_string?(campaign_key) || campaign_key.is_a?(Array) || campaign_key.nil?) &&
|
206
|
+
valid_string?(user_id) && valid_string?(goal_identifier) &&
|
207
|
+
(custom_variables.nil? || valid_hash?(custom_variables)) &&
|
208
|
+
(variation_targeting_variables.nil? || valid_hash?(variation_targeting_variables)) && CONSTANTS::GOAL_TYPES.key?(goal_type_to_track)
|
209
|
+
# log invalid params
|
210
|
+
Logger.log(
|
211
|
+
LogLevelEnum::ERROR,
|
212
|
+
'API_BAD_PARAMETERS',
|
213
|
+
{
|
214
|
+
'{file}' => FILE,
|
215
|
+
'{api}' => ApiMethods::TRACK
|
216
|
+
}
|
217
|
+
)
|
218
|
+
return false
|
219
|
+
end
|
220
|
+
true
|
221
|
+
end
|
147
222
|
end
|
148
223
|
end
|