vwo-sdk 1.36.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.
- checksums.yaml +4 -4
- data/lib/vwo/constants.rb +2 -2
- data/lib/vwo/core/bucketer.rb +18 -26
- data/lib/vwo/core/variation_decider.rb +216 -220
- data/lib/vwo/enums.rb +16 -19
- data/lib/vwo/logger.rb +2 -3
- data/lib/vwo/schemas/settings_file.rb +6 -6
- data/lib/vwo/services/batch_events_dispatcher.rb +19 -21
- data/lib/vwo/services/batch_events_queue.rb +27 -43
- data/lib/vwo/services/event_dispatcher.rb +31 -21
- data/lib/vwo/services/hooks_manager.rb +8 -12
- data/lib/vwo/services/segment_evaluator.rb +7 -6
- data/lib/vwo/services/settings_file_manager.rb +5 -5
- data/lib/vwo/services/settings_file_processor.rb +1 -1
- data/lib/vwo/services/usage_stats.rb +5 -4
- data/lib/vwo/utils/campaign.rb +37 -39
- data/lib/vwo/utils/custom_dimensions.rb +2 -2
- data/lib/vwo/utils/data_location_manager.rb +2 -9
- data/lib/vwo/utils/feature.rb +2 -2
- data/lib/vwo/utils/impression.rb +29 -37
- data/lib/vwo/utils/log_message.rb +23 -30
- data/lib/vwo/utils/request.rb +7 -9
- data/lib/vwo/utils/utility.rb +44 -34
- data/lib/vwo/utils/validations.rb +72 -5
- data/lib/vwo.rb +197 -344
- metadata +8 -8
data/lib/vwo/enums.rb
CHANGED
@@ -12,8 +12,6 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
# rubocop:disable Metrics/LineLength
|
16
|
-
|
17
15
|
require 'logger'
|
18
16
|
|
19
17
|
class VWO
|
@@ -64,23 +62,23 @@ class VWO
|
|
64
62
|
VWO_PATH = 'vwo'
|
65
63
|
UTIL_PATH = 'vwo/utils'
|
66
64
|
|
67
|
-
VWO = VWO_PATH
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
65
|
+
VWO = "#{VWO_PATH}/vwo"
|
66
|
+
BUCKETER = "#{VWO_PATH}/core/bucketer"
|
67
|
+
VARIATION_DECIDER = "#{VWO_PATH}/core/variation_decider"
|
68
|
+
EVENT_DISPATCHER = "#{VWO_PATH}/services/event_dispatcher"
|
69
|
+
SEGMENT_EVALUATOR = "#{VWO_PATH}/services/segment_evaluator"
|
70
|
+
LOGGER = "#{VWO_PATH}/logger"
|
71
|
+
SETTINGS_FILE_PROCESSOR = "#{VWO_PATH}/services/settings_file_processor"
|
72
|
+
BATCH_EVENTS_QUEUE = "#{VWO_PATH}/services/batch_events_queue"
|
73
|
+
BATCH_EVENTS_DISPATCHER = "#{VWO_PATH}/services/batch_events_dispatcher"
|
76
74
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
75
|
+
CAMPAIGN_UTIL = "#{UTIL_PATH}/campaign"
|
76
|
+
FUNCTION_UTIL = "#{UTIL_PATH}/function"
|
77
|
+
FEATURE_UTIL = "#{UTIL_PATH}/feature"
|
78
|
+
IMPRESSION_UTIL = "#{UTIL_PATH}/impression"
|
79
|
+
UUID_UTIL = "#{UTIL_PATH}/uuid"
|
80
|
+
VALIDATE_UTIL = "#{UTIL_PATH}/validations"
|
81
|
+
CUSTOM_DIMENSTIONS_UTIL = "#{UTIL_PATH}/custom_dimensions_util"
|
84
82
|
end
|
85
83
|
|
86
84
|
module LogLevelEnum
|
@@ -91,4 +89,3 @@ class VWO
|
|
91
89
|
end
|
92
90
|
end
|
93
91
|
end
|
94
|
-
# rubocop:enable Metrics/LineLength
|
data/lib/vwo/logger.rb
CHANGED
@@ -16,7 +16,6 @@ require 'logger'
|
|
16
16
|
|
17
17
|
class VWO
|
18
18
|
class Logger
|
19
|
-
|
20
19
|
DEBUG = ::Logger::DEBUG
|
21
20
|
INFO = ::Logger::INFO
|
22
21
|
ERROR = ::Logger::ERROR
|
@@ -30,12 +29,12 @@ class VWO
|
|
30
29
|
end
|
31
30
|
|
32
31
|
def initialize(logger_instance)
|
33
|
-
@@logger_instance = logger_instance || ::Logger.new(
|
32
|
+
@@logger_instance = logger_instance || ::Logger.new($stdout)
|
34
33
|
end
|
35
34
|
|
36
35
|
# Override this method to handle logs in a custom manner
|
37
36
|
def log(level, message)
|
38
|
-
|
37
|
+
@@logger_instance.log(level, message)
|
39
38
|
end
|
40
39
|
|
41
40
|
def instance
|
@@ -61,12 +61,12 @@ class VWO
|
|
61
61
|
weight: {
|
62
62
|
type: %w[number string]
|
63
63
|
},
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
variables: {
|
65
|
+
type: 'array',
|
66
|
+
items: {
|
67
|
+
'$ref' => '#/definitions/variables_schema'
|
68
|
+
}
|
69
|
+
}
|
70
70
|
},
|
71
71
|
required: %w[id name weight]
|
72
72
|
},
|
@@ -42,25 +42,26 @@ class VWO
|
|
42
42
|
url = CONSTANTS::HTTPS_PROTOCOL + get_url(CONSTANTS::ENDPOINTS::BATCH_EVENTS)
|
43
43
|
account_id = query_params[:a]
|
44
44
|
resp = VWO::Utils::Request.post(url, query_params, impression)
|
45
|
-
|
45
|
+
case resp.code
|
46
|
+
when '200'
|
46
47
|
@logger.log(
|
47
48
|
LogLevelEnum::INFO,
|
48
49
|
'IMPRESSION_BATCH_SUCCESS',
|
49
50
|
{
|
50
51
|
'{file}' => FILE,
|
51
52
|
'{endPoint}' => url,
|
52
|
-
'{accountId}' => account_id
|
53
|
+
'{accountId}' => account_id
|
53
54
|
}
|
54
55
|
)
|
55
56
|
message = nil
|
56
|
-
|
57
|
+
when '413'
|
57
58
|
@logger.log(
|
58
59
|
LogLevelEnum::DEBUG,
|
59
60
|
'CONFIG_BATCH_EVENT_LIMIT_EXCEEDED',
|
60
61
|
{
|
61
|
-
'{file}' => FileNameEnum::
|
62
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
62
63
|
'{endPoint}' => url,
|
63
|
-
'{eventsPerRequest}' => impression.length
|
64
|
+
'{eventsPerRequest}' => impression.length,
|
64
65
|
'{accountId}' => impression[:a]
|
65
66
|
}
|
66
67
|
)
|
@@ -69,7 +70,7 @@ class VWO
|
|
69
70
|
LogLevelEnum::ERROR,
|
70
71
|
'IMPRESSION_FAILED',
|
71
72
|
{
|
72
|
-
'{file}' => FileNameEnum::
|
73
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
73
74
|
'{err}' => resp.message,
|
74
75
|
'{endPoint}' => url
|
75
76
|
}
|
@@ -79,43 +80,40 @@ class VWO
|
|
79
80
|
@logger.log(
|
80
81
|
LogLevelEnum::INFO,
|
81
82
|
'IMPRESSION_BATCH_FAILED',
|
82
|
-
{'{file}' => FileNameEnum::
|
83
|
+
{ '{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER }
|
83
84
|
)
|
84
85
|
|
85
86
|
@logger.log(
|
86
87
|
LogLevelEnum::ERROR,
|
87
88
|
'IMPRESSION_FAILED',
|
88
89
|
{
|
89
|
-
'{file}' => FileNameEnum::
|
90
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
90
91
|
'{err}' => resp.message,
|
91
92
|
'{endPoint}' => url
|
92
93
|
}
|
93
94
|
)
|
94
95
|
message = resp.message
|
95
96
|
end
|
96
|
-
|
97
|
-
callback.call(message, impression)
|
98
|
-
end
|
97
|
+
callback&.call(message, impression)
|
99
98
|
true
|
100
99
|
rescue StandardError => e
|
101
100
|
@logger.log(
|
102
101
|
LogLevelEnum::DEBUG,
|
103
102
|
'IMPRESSION_BATCH_FAILED',
|
104
|
-
|
103
|
+
{ '{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER }
|
105
104
|
)
|
106
105
|
|
107
106
|
@logger.log(
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
107
|
+
LogLevelEnum::ERROR,
|
108
|
+
'IMPRESSION_FAILED',
|
109
|
+
{
|
110
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
111
|
+
'{err}' => e.message,
|
112
|
+
'{endPoint}' => url
|
113
|
+
}
|
114
|
+
)
|
116
115
|
false
|
117
116
|
end
|
118
|
-
|
119
117
|
end
|
120
118
|
end
|
121
119
|
end
|
@@ -36,9 +36,9 @@ class VWO
|
|
36
36
|
LogLevelEnum::INFO,
|
37
37
|
'EVENT_BATCH_DEFAULTS',
|
38
38
|
{
|
39
|
-
'{file}' => FileNameEnum::
|
39
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
40
40
|
'{parameter}' => 'request_time_interval',
|
41
|
-
'{defaultValue}' => @request_time_interval
|
41
|
+
'{defaultValue}' => "#{@request_time_interval} ms"
|
42
42
|
}
|
43
43
|
)
|
44
44
|
end
|
@@ -51,7 +51,7 @@ class VWO
|
|
51
51
|
LogLevelEnum::INFO,
|
52
52
|
'EVENT_BATCH_DEFAULTS',
|
53
53
|
{
|
54
|
-
'{file}' => FileNameEnum::
|
54
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
55
55
|
'{parameter}' => 'events_per_request',
|
56
56
|
'{defaultValue}' => @events_per_request.to_s
|
57
57
|
}
|
@@ -59,9 +59,7 @@ class VWO
|
|
59
59
|
end
|
60
60
|
|
61
61
|
@flush_callback = nil
|
62
|
-
if batch_config.key?(:flushCallback) && batch_config[:flushCallback].is_a?(Method)
|
63
|
-
@flush_callback = batch_config[:flushCallback]
|
64
|
-
end
|
62
|
+
@flush_callback = batch_config[:flushCallback] if batch_config.key?(:flushCallback) && batch_config[:flushCallback].is_a?(Method)
|
65
63
|
|
66
64
|
@dispatcher = batch_config[:dispatcher]
|
67
65
|
end
|
@@ -72,35 +70,34 @@ class VWO
|
|
72
70
|
|
73
71
|
def enqueue(event)
|
74
72
|
return true if @is_development_mode
|
73
|
+
|
75
74
|
@queue.push(event)
|
76
75
|
update_queue_metadata(event)
|
77
76
|
unless @timer
|
78
77
|
create_new_batch_timer
|
79
|
-
@thread = Thread.new{flush_when_request_times_up}
|
80
|
-
end
|
81
|
-
if @events_per_request === @queue.length()
|
82
|
-
flush
|
83
|
-
kill_old_thread
|
78
|
+
@thread = Thread.new { flush_when_request_times_up }
|
84
79
|
end
|
80
|
+
return unless @events_per_request == @queue.length
|
81
|
+
|
82
|
+
flush
|
83
|
+
kill_old_thread
|
85
84
|
end
|
86
85
|
|
87
86
|
def flush_when_request_times_up
|
88
|
-
while @timer > Time.now
|
89
|
-
sleep(1)
|
90
|
-
end
|
87
|
+
sleep(1) while @timer > Time.now
|
91
88
|
flush
|
92
89
|
kill_old_thread
|
93
90
|
end
|
94
91
|
|
95
92
|
def flush(manual = false)
|
96
|
-
if @queue.length
|
93
|
+
if @queue.length > 0
|
97
94
|
@logger.log(
|
98
95
|
LogLevelEnum::DEBUG,
|
99
96
|
'EVENT_BATCH_BEFORE_FLUSHING',
|
100
97
|
{
|
101
|
-
'{file}' => FileNameEnum::
|
98
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
102
99
|
'{manually}' => manual ? 'manually' : '',
|
103
|
-
'{length}' => @queue.length
|
100
|
+
'{length}' => @queue.length,
|
104
101
|
'{timer}' => manual ? 'Timer will be cleared and registered again,' : '',
|
105
102
|
'{accountId}' => @batch_config[:account_id]
|
106
103
|
}
|
@@ -112,9 +109,9 @@ class VWO
|
|
112
109
|
LogLevelEnum::INFO,
|
113
110
|
'EVENT_BATCH_After_FLUSHING',
|
114
111
|
{
|
115
|
-
'{file}' => FileNameEnum::
|
112
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_QUEUE,
|
116
113
|
'{manually}' => manual ? 'manually,' : '',
|
117
|
-
'{length}' => @queue.length
|
114
|
+
'{length}' => @queue.length
|
118
115
|
}
|
119
116
|
)
|
120
117
|
@queue_metadata = {}
|
@@ -123,16 +120,12 @@ class VWO
|
|
123
120
|
@logger.log(
|
124
121
|
LogLevelEnum::INFO,
|
125
122
|
'Batch queue is empty. Nothing to flush.',
|
126
|
-
{'{file}' => FILE}
|
123
|
+
{ '{file}' => FILE }
|
127
124
|
)
|
128
125
|
end
|
129
126
|
|
130
127
|
clear_request_timer
|
131
|
-
|
132
|
-
if @thread
|
133
|
-
@old_thread = @thread
|
134
|
-
end
|
135
|
-
end
|
128
|
+
@old_thread = @thread if !manual && @thread
|
136
129
|
true
|
137
130
|
end
|
138
131
|
|
@@ -141,32 +134,23 @@ class VWO
|
|
141
134
|
end
|
142
135
|
|
143
136
|
def kill_thread
|
144
|
-
|
145
|
-
@thread.kill
|
146
|
-
end
|
137
|
+
@thread&.kill
|
147
138
|
end
|
148
139
|
|
149
140
|
def kill_old_thread
|
150
|
-
|
151
|
-
@old_thread.kill
|
152
|
-
end
|
141
|
+
@old_thread&.kill
|
153
142
|
end
|
154
143
|
|
155
144
|
def update_queue_metadata(event)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
end
|
145
|
+
case event[:eT]
|
146
|
+
when 1
|
147
|
+
@queue_metadata[VWO::EVENTS::TRACK_USER] = 0 unless @queue_metadata.key?(VWO::EVENTS::TRACK_USER)
|
160
148
|
@queue_metadata[VWO::EVENTS::TRACK_USER] = @queue_metadata[VWO::EVENTS::TRACK_USER] + 1
|
161
|
-
|
162
|
-
unless @queue_metadata.key?(VWO::EVENTS::TRACK_GOAL)
|
163
|
-
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = 0
|
164
|
-
end
|
149
|
+
when 2
|
150
|
+
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = 0 unless @queue_metadata.key?(VWO::EVENTS::TRACK_GOAL)
|
165
151
|
@queue_metadata[VWO::EVENTS::TRACK_GOAL] = @queue_metadata[VWO::EVENTS::TRACK_GOAL] + 1
|
166
|
-
|
167
|
-
unless @queue_metadata.key?(VWO::EVENTS::PUSH)
|
168
|
-
@queue_metadata[VWO::EVENTS::PUSH] = 0
|
169
|
-
end
|
152
|
+
when 3
|
153
|
+
@queue_metadata[VWO::EVENTS::PUSH] = 0 unless @queue_metadata.key?(VWO::EVENTS::PUSH)
|
170
154
|
@queue_metadata[VWO::EVENTS::PUSH] = @queue_metadata[VWO::EVENTS::PUSH] + 1
|
171
155
|
end
|
172
156
|
end
|
@@ -43,7 +43,7 @@ class VWO
|
|
43
43
|
# the request to be dispatched to the VWO server
|
44
44
|
# @return[Boolean]
|
45
45
|
#
|
46
|
-
def dispatch(impression)
|
46
|
+
def dispatch(impression, main_keys, end_point)
|
47
47
|
return true if @is_development_mode
|
48
48
|
|
49
49
|
modified_event = impression.reject do |key, _value|
|
@@ -52,13 +52,23 @@ class VWO
|
|
52
52
|
|
53
53
|
resp = VWO::Utils::Request.get(impression['url'], modified_event)
|
54
54
|
if resp.code == '200'
|
55
|
+
@logger.log(
|
56
|
+
LogLevelEnum::INFO,
|
57
|
+
'IMPRESSION_SUCCESS',
|
58
|
+
{
|
59
|
+
'{file}' => FILE,
|
60
|
+
'{endPoint}' => end_point,
|
61
|
+
'{accountId}' => impression['account_id'] || impression[:account_id],
|
62
|
+
'{mainKeys}' => JSON.generate(main_keys)
|
63
|
+
}
|
64
|
+
)
|
55
65
|
true
|
56
66
|
else
|
57
67
|
@logger.log(
|
58
68
|
LogLevelEnum::ERROR,
|
59
69
|
'IMPRESSION_FAILED',
|
60
70
|
{
|
61
|
-
'{file}' => FileNameEnum::
|
71
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
62
72
|
'{err}' => resp.message,
|
63
73
|
'{endPoint}' => impression['url']
|
64
74
|
}
|
@@ -67,14 +77,14 @@ class VWO
|
|
67
77
|
end
|
68
78
|
rescue StandardError => e
|
69
79
|
@logger.log(
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
80
|
+
LogLevelEnum::ERROR,
|
81
|
+
'IMPRESSION_FAILED',
|
82
|
+
{
|
83
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
84
|
+
'{err}' => e.message,
|
85
|
+
'{endPoint}' => impression['url']
|
86
|
+
}
|
87
|
+
)
|
78
88
|
false
|
79
89
|
end
|
80
90
|
|
@@ -88,8 +98,8 @@ class VWO
|
|
88
98
|
LogLevelEnum::INFO,
|
89
99
|
'IMPRESSION_SUCCESS_FOR_EVENT_ARCH',
|
90
100
|
{
|
91
|
-
'{file}' => FileNameEnum::
|
92
|
-
'{event}' =>
|
101
|
+
'{file}' => FileNameEnum::BATCH_EVENTS_DISPATCHER,
|
102
|
+
'{event}' => "visitor property:#{JSON.generate(post_data[:d][:visitor][:props])}",
|
93
103
|
'{endPoint}' => url,
|
94
104
|
'{accountId}' => params[:a]
|
95
105
|
}
|
@@ -100,7 +110,7 @@ class VWO
|
|
100
110
|
LogLevelEnum::ERROR,
|
101
111
|
'IMPRESSION_FAILED',
|
102
112
|
{
|
103
|
-
'{file}' => FileNameEnum::
|
113
|
+
'{file}' => FileNameEnum::EVENT_DISPATCHER,
|
104
114
|
'{err}' => resp.message,
|
105
115
|
'{endPoint}' => url
|
106
116
|
}
|
@@ -109,14 +119,14 @@ class VWO
|
|
109
119
|
end
|
110
120
|
rescue StandardError => e
|
111
121
|
@logger.log(
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
122
|
+
LogLevelEnum::ERROR,
|
123
|
+
'IMPRESSION_FAILED',
|
124
|
+
{
|
125
|
+
'{file}' => FileNameEnum::EVENT_DISPATCHER,
|
126
|
+
'{err}' => e.message,
|
127
|
+
'{endPoint}' => url
|
128
|
+
}
|
129
|
+
)
|
120
130
|
false
|
121
131
|
end
|
122
132
|
end
|
@@ -15,22 +15,18 @@
|
|
15
15
|
class VWO
|
16
16
|
module Services
|
17
17
|
class HooksManager
|
18
|
-
|
19
|
-
|
18
|
+
# Hooks Manager is responsible for triggering callbacks useful to the end-user based on certain lifecycle events.
|
19
|
+
# Possible use with integrations when the user intends to send an event when a visitor is part of the experiment.
|
20
20
|
def initialize(config)
|
21
21
|
@logger = VWO::Logger.get_instance
|
22
|
-
if config.key?(:integrations) && config[:integrations].key?(:callback) && config[:integrations][:callback].is_a?(Method)
|
23
|
-
@callback = config[:integrations][:callback]
|
24
|
-
end
|
22
|
+
@callback = config[:integrations][:callback] if config.key?(:integrations) && config[:integrations].key?(:callback) && config[:integrations][:callback].is_a?(Method)
|
25
23
|
end
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
33
|
-
end
|
25
|
+
# Executes the callback
|
26
|
+
# @param[Hash] properties Properties from the callback
|
27
|
+
def execute(properties)
|
28
|
+
@callback&.call(properties)
|
29
|
+
end
|
34
30
|
end
|
35
31
|
end
|
36
32
|
end
|
@@ -43,15 +43,16 @@ class VWO
|
|
43
43
|
#
|
44
44
|
def evaluate_util(dsl, custom_variables)
|
45
45
|
operator, sub_dsl = get_key_value(dsl)
|
46
|
-
|
46
|
+
case operator
|
47
|
+
when OperatorTypes::NOT
|
47
48
|
!evaluate_util(sub_dsl, custom_variables)
|
48
|
-
|
49
|
+
when OperatorTypes::AND
|
49
50
|
sub_dsl.all? { |y| evaluate_util(y, custom_variables) }
|
50
|
-
|
51
|
+
when OperatorTypes::OR
|
51
52
|
sub_dsl.any? { |y| evaluate_util(y, custom_variables) }
|
52
|
-
|
53
|
+
when OperandTypes::CUSTOM_VARIABLE
|
53
54
|
@operand_evaluator.evaluate_custom_variable?(sub_dsl, custom_variables)
|
54
|
-
|
55
|
+
when OperandTypes::USER
|
55
56
|
@operand_evaluator.evaluate_user?(sub_dsl, custom_variables)
|
56
57
|
end
|
57
58
|
end
|
@@ -75,7 +76,7 @@ class VWO
|
|
75
76
|
LogLevelEnum::ERROR,
|
76
77
|
'SEGMENTATION_ERROR',
|
77
78
|
{
|
78
|
-
'{file}' => FileNameEnum::
|
79
|
+
'{file}' => FileNameEnum::SEGMENT_EVALUATOR,
|
79
80
|
'{userId}' => user_id,
|
80
81
|
'{campaignKey}' => campaign_key,
|
81
82
|
'{variation}' => '',
|
@@ -47,11 +47,11 @@ class VWO
|
|
47
47
|
return '{}'
|
48
48
|
end
|
49
49
|
|
50
|
-
if is_via_webhook
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
path = if is_via_webhook
|
51
|
+
::VWO::CONSTANTS::ENDPOINTS::WEBHOOK_SETTINGS_URL
|
52
|
+
else
|
53
|
+
::VWO::CONSTANTS::ENDPOINTS::SETTINGS_URL
|
54
|
+
end
|
55
55
|
vwo_server_url = "#{PROTOCOL}://#{HOSTNAME}#{path}"
|
56
56
|
|
57
57
|
settings_file_response = ::VWO::Utils::Request.get(vwo_server_url, params)
|
@@ -16,13 +16,14 @@ class VWO
|
|
16
16
|
module Services
|
17
17
|
class UsageStats
|
18
18
|
attr_reader :usage_stats
|
19
|
+
|
19
20
|
# Initialize the UsageStats
|
20
21
|
def initialize(stats, is_development_mode = false)
|
21
22
|
@usage_stats = {}
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
return if is_development_mode
|
24
|
+
|
25
|
+
@usage_stats = stats
|
26
|
+
@usage_stats[:_l] = 1 if @usage_stats.length > 0
|
26
27
|
end
|
27
28
|
end
|
28
29
|
end
|