kameleoon-client-ruby 3.2.0 → 3.3.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 +4 -4
- data/lib/kameleoon/configuration/data_file.rb +3 -2
- data/lib/kameleoon/data/kcs_heat.rb +12 -0
- data/lib/kameleoon/data/manager/visitor.rb +8 -1
- data/lib/kameleoon/data/visitor_visits.rb +8 -1
- data/lib/kameleoon/kameleoon_client.rb +47 -0
- data/lib/kameleoon/managers/remote_data/remote_data_manager.rb +1 -3
- data/lib/kameleoon/managers/remote_data/remote_visitor_data.rb +42 -16
- data/lib/kameleoon/network/url_provider.rb +7 -6
- data/lib/kameleoon/targeting/condition.rb +2 -0
- data/lib/kameleoon/targeting/condition_factory.rb +3 -0
- data/lib/kameleoon/targeting/conditions/kcs_heat_range_condition.rb +37 -0
- data/lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb +7 -11
- data/lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb +1 -2
- data/lib/kameleoon/targeting/conditions/visit_number_today_condition.rb +4 -4
- data/lib/kameleoon/targeting/conditions/visit_number_total_condition.rb +5 -3
- data/lib/kameleoon/targeting/conditions/visitor_new_return_condition.rb +7 -6
- data/lib/kameleoon/targeting/targeting_manager.rb +2 -0
- data/lib/kameleoon/types/remote_visitor_data_filter.rb +8 -3
- data/lib/kameleoon/types/variable.rb +17 -0
- data/lib/kameleoon/types/variation.rb +18 -0
- data/lib/kameleoon/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '019ae7a1fe145f50f68beea1eb05bcae993d4061a2b1bdb2fe4324fc4215aa39'
|
4
|
+
data.tar.gz: fe9637047ba81b006c1b19a4c85e82fa5641a4d3f666fe14cb28ee243076b6ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5455718dd4a68c584c280e4004ff1c96e28b35d7bfcd9bd8299c68b9d0f3930bd064e16057ce71bbfc386911f106839f54a6398165e6966cad5ce5a4388ccbe9
|
7
|
+
data.tar.gz: 7a2e231a4625c642a56354615999543c26d7e882d8fc7a2c743f7f4f045d01bc88d5dafd227757fd88f308053610f22f21bfa6cbadd79eafe2b7f2bc3a5e03b7
|
@@ -7,7 +7,8 @@ require 'kameleoon/configuration/custom_data_info'
|
|
7
7
|
module Kameleoon
|
8
8
|
module Configuration
|
9
9
|
class DataFile
|
10
|
-
attr_reader :settings, :feature_flags, :has_any_targeted_delivery_rule, :feature_flag_by_id, :rule_by_segment_id,
|
10
|
+
attr_reader :settings, :feature_flags, :has_any_targeted_delivery_rule, :feature_flag_by_id, :rule_by_segment_id,
|
11
|
+
:variation_by_id, :custom_data_info
|
11
12
|
|
12
13
|
def initialize(environment, log_func = nil)
|
13
14
|
@settings = Settings.new
|
@@ -50,10 +51,10 @@ module Kameleoon
|
|
50
51
|
@variation_by_id = {}
|
51
52
|
|
52
53
|
@feature_flags.each_value do |feature_flag|
|
54
|
+
@feature_flag_by_id[feature_flag.id] = feature_flag
|
53
55
|
next if feature_flag.rules.nil?
|
54
56
|
|
55
57
|
feature_flag.rules.each do |rule|
|
56
|
-
@feature_flag_by_id[feature_flag.id] = feature_flag
|
57
58
|
@rule_by_segment_id[rule.segment_id] = rule
|
58
59
|
rule.variation_by_exposition.each do |variation|
|
59
60
|
@variation_by_id[variation.variation_id] = variation
|
@@ -18,7 +18,8 @@ module Kameleoon
|
|
18
18
|
# Visitor is a container of all data assigned to a visitor.
|
19
19
|
# It is thread-safe
|
20
20
|
class Visitor
|
21
|
-
attr_reader :last_activity_time, :user_agent, :device, :browser, :geolocation, :operating_system, :cookie,
|
21
|
+
attr_reader :last_activity_time, :user_agent, :device, :browser, :geolocation, :operating_system, :cookie,
|
22
|
+
:kcs_heat, :visitor_visits
|
22
23
|
attr_accessor :legal_consent, :mapping_identifier
|
23
24
|
|
24
25
|
def initialize
|
@@ -101,6 +102,8 @@ module Kameleoon
|
|
101
102
|
set_operating_system(data, overwrite)
|
102
103
|
when Kameleoon::Geolocation
|
103
104
|
set_geolocation(data, overwrite)
|
105
|
+
when Kameleoon::KcsHeat
|
106
|
+
set_kcs_heat(data)
|
104
107
|
when Kameleoon::VisitorVisits
|
105
108
|
set_visitor_visits(data)
|
106
109
|
else
|
@@ -184,6 +187,10 @@ module Kameleoon
|
|
184
187
|
@operating_system = operating_system if overwrite || @operating_system == nil
|
185
188
|
end
|
186
189
|
|
190
|
+
def set_kcs_heat(kcs_heat)
|
191
|
+
@kcs_heat = kcs_heat
|
192
|
+
end
|
193
|
+
|
187
194
|
def set_visitor_visits(visitor_visits)
|
188
195
|
@visitor_visits = visitor_visits
|
189
196
|
end
|
@@ -8,6 +8,13 @@ module Kameleoon
|
|
8
8
|
@previous_visit_timestamps = previous_visit_timestamps
|
9
9
|
@previous_visit_timestamps.freeze
|
10
10
|
end
|
11
|
+
|
12
|
+
def self.get_previous_visit_timestamps(visitor_visits)
|
13
|
+
visitor_visits.is_a?(VisitorVisits) ? visitor_visits.previous_visit_timestamps : []
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.visitor_visits?(obj)
|
17
|
+
obj.nil? || obj.is_a?(VisitorVisits)
|
18
|
+
end
|
11
19
|
end
|
12
20
|
end
|
13
|
-
|
@@ -353,7 +353,10 @@ module Kameleoon
|
|
353
353
|
# @raise [Kameleoon::Exception::VisitorCodeInvalid] If the visitor code is empty or longer than 255 chars
|
354
354
|
#
|
355
355
|
# @return [Array] array of active feature flag keys for a visitor
|
356
|
+
#
|
357
|
+
# DEPRECATED. Please use `get_active_features` instead.
|
356
358
|
def get_active_feature_list_for_visitor(visitor_code)
|
359
|
+
warn '[DEPRECATION] `get_active_feature_list_for_visitor` is deprecated. Please use `get_active_features` instead.'
|
357
360
|
Utils::VisitorCode.validate(visitor_code)
|
358
361
|
list_keys = []
|
359
362
|
@data_file.feature_flags.each do |feature_key, feature_flag|
|
@@ -366,6 +369,50 @@ module Kameleoon
|
|
366
369
|
list_keys
|
367
370
|
end
|
368
371
|
|
372
|
+
##
|
373
|
+
# Returns a Hash that contains the assigned variations of the active features using the keys
|
374
|
+
# of the corresponding active features.
|
375
|
+
#
|
376
|
+
# @param [String] visitor_code unique identifier of a visitor.
|
377
|
+
#
|
378
|
+
# @raise [Kameleoon::Exception::VisitorCodeInvalid] If the visitor code is empty or longer than 255 chars or is nil
|
379
|
+
#
|
380
|
+
# @return [Hash] Hash of active features for a visitor
|
381
|
+
def get_active_features(visitor_code)
|
382
|
+
Utils::VisitorCode.validate(visitor_code)
|
383
|
+
map_active_features = {}
|
384
|
+
|
385
|
+
@data_file.feature_flags.each_value do |feature_flag|
|
386
|
+
next unless feature_flag.environment_enabled
|
387
|
+
|
388
|
+
var_by_exp, rule = _calculate_variation_key_for_feature(visitor_code, feature_flag)
|
389
|
+
variation_key = _get_variation_key(var_by_exp, rule, feature_flag)
|
390
|
+
|
391
|
+
next if variation_key == Configuration::VariationType::VARIATION_OFF
|
392
|
+
|
393
|
+
variation = feature_flag.get_variation_key(variation_key)
|
394
|
+
variables = {}
|
395
|
+
|
396
|
+
variation&.variables&.each do |variable|
|
397
|
+
variables[variable.key] = Kameleoon::Types::Variable.new(
|
398
|
+
variable.key,
|
399
|
+
variable.type,
|
400
|
+
_parse_feature_variable(variable)
|
401
|
+
)
|
402
|
+
end
|
403
|
+
|
404
|
+
variables.freeze
|
405
|
+
map_active_features[feature_flag.feature_key] = Kameleoon::Types::Variation.new(
|
406
|
+
variation_key,
|
407
|
+
var_by_exp ? var_by_exp.variation_id : nil,
|
408
|
+
rule ? rule.experiment_id : nil,
|
409
|
+
variables
|
410
|
+
)
|
411
|
+
end
|
412
|
+
|
413
|
+
map_active_features.freeze
|
414
|
+
end
|
415
|
+
|
369
416
|
##
|
370
417
|
# The `on_update_configuration()` method allows you to handle the event when configuration
|
371
418
|
# has updated data. It takes one input parameter: callable **handler**. The handler
|
@@ -6,7 +6,6 @@ require 'kameleoon/types/remote_visitor_data_filter'
|
|
6
6
|
module Kameleoon
|
7
7
|
module Managers
|
8
8
|
module RemoteData
|
9
|
-
|
10
9
|
class RemoteDataManager
|
11
10
|
attr_reader :network_manager, :visitor_manger, :log_func
|
12
11
|
|
@@ -36,7 +35,6 @@ module Kameleoon
|
|
36
35
|
data_to_return
|
37
36
|
end
|
38
37
|
|
39
|
-
|
40
38
|
##
|
41
39
|
# helper method used by `get_remote_visitor_data`
|
42
40
|
def parse_custom_data_array(visitor_code, response)
|
@@ -54,4 +52,4 @@ module Kameleoon
|
|
54
52
|
end
|
55
53
|
end
|
56
54
|
end
|
57
|
-
end
|
55
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
3
|
require 'kameleoon/data/manager/page_view_visit'
|
4
4
|
require 'kameleoon/data/manager/assigned_variation'
|
5
5
|
require 'kameleoon/data/visitor_visits'
|
@@ -8,13 +8,15 @@ require 'kameleoon/data/device'
|
|
8
8
|
require 'kameleoon/data/conversion'
|
9
9
|
require 'kameleoon/data/custom_data'
|
10
10
|
require 'kameleoon/data/geolocation'
|
11
|
+
require 'kameleoon/data/kcs_heat'
|
11
12
|
require 'kameleoon/data/page_view'
|
12
13
|
|
13
14
|
module Kameleoon
|
14
15
|
module Managers
|
15
16
|
module RemoteData
|
16
17
|
class RemoteVisitorData
|
17
|
-
attr_reader :custom_data_dict, :page_view_visits, :conversions, :experiments, :device, :browser,
|
18
|
+
attr_reader :custom_data_dict, :page_view_visits, :conversions, :experiments, :device, :browser,
|
19
|
+
:operating_system, :geolocation, :previous_visitor_visits, :kcs_heat
|
18
20
|
|
19
21
|
def initialize(hash)
|
20
22
|
current_visit = hash['currentVisit']
|
@@ -30,12 +32,14 @@ module Kameleoon
|
|
30
32
|
end
|
31
33
|
@previous_visitor_visits = VisitorVisits.new(times_started)
|
32
34
|
end
|
35
|
+
@kcs_heat = parse_kcs_heat(hash['kcs'])
|
33
36
|
end
|
34
37
|
|
35
38
|
def collect_data_to_add
|
36
39
|
data_to_add = []
|
37
40
|
data_to_add.concat(@custom_data_dict.values) unless @custom_data_dict.nil?
|
38
41
|
data_to_add.push(@previous_visitor_visits) unless @previous_visitor_visits.nil?
|
42
|
+
data_to_add.push(@kcs_heat) unless @kcs_heat.nil?
|
39
43
|
data_to_add.concat(@page_view_visits.values) unless @page_view_visits.nil?
|
40
44
|
data_to_add.concat(@experiments.values) unless @experiments.nil?
|
41
45
|
data_to_add.concat(conversions_single_objects)
|
@@ -95,7 +99,7 @@ module Kameleoon
|
|
95
99
|
page_view_visit = @page_view_visits[href]
|
96
100
|
if page_view_visit.nil?
|
97
101
|
page_view = PageView.new(href, page_event['data']['title'])
|
98
|
-
@page_view_visits[href] =
|
102
|
+
@page_view_visits[href] = DataManager::PageViewVisit.new(page_view, 1, page_event['time'])
|
99
103
|
else
|
100
104
|
page_view_visit.increase_page_visits
|
101
105
|
end
|
@@ -108,7 +112,10 @@ module Kameleoon
|
|
108
112
|
id = experiment_event['data']['id']
|
109
113
|
variation = @experiments[id]
|
110
114
|
if variation.nil?
|
111
|
-
variation =
|
115
|
+
variation = DataManager::AssignedVariation.new(
|
116
|
+
id, experiment_event['data']['variationId'],
|
117
|
+
Configuration::RuleType::UNKNOWN, assignment_time: experiment_event['time']
|
118
|
+
)
|
112
119
|
@experiments[id] = variation
|
113
120
|
end
|
114
121
|
end
|
@@ -130,33 +137,52 @@ module Kameleoon
|
|
130
137
|
|
131
138
|
def parse_static_data(static_data_event)
|
132
139
|
return if @device != nil && @browser != nil && @operating_system != nil
|
140
|
+
|
133
141
|
data = static_data_event['data']
|
134
|
-
if @device
|
142
|
+
if @device.nil?
|
135
143
|
device_type = data['deviceType']
|
136
|
-
@device = Device.new(device_type)
|
144
|
+
@device = Device.new(device_type) unless device_type.nil?
|
137
145
|
end
|
138
|
-
if @browser
|
139
|
-
browser_type =
|
140
|
-
@browser = Browser.new(browser_type, data['browserVersion'])
|
146
|
+
if @browser.nil?
|
147
|
+
browser_type = BrowserType.from_name(data['browser'])
|
148
|
+
@browser = Browser.new(browser_type, data['browserVersion']) unless browser_type.nil?
|
141
149
|
end
|
142
|
-
if @operating_system
|
143
|
-
operating_system_type =
|
144
|
-
@operating_system = OperatingSystem.new(operating_system_type)
|
150
|
+
if @operating_system.nil?
|
151
|
+
operating_system_type = OperatingSystemType.from_name(data['os'])
|
152
|
+
@operating_system = OperatingSystem.new(operating_system_type) unless operating_system_type.nil?
|
145
153
|
end
|
146
154
|
end
|
147
155
|
|
148
156
|
def conversions_single_objects
|
149
157
|
objects = []
|
150
|
-
unless @conversions.nil?
|
151
|
-
objects += @conversions
|
152
|
-
end
|
158
|
+
objects += @conversions unless @conversions.nil?
|
153
159
|
objects.push(@device) unless @device.nil?
|
154
160
|
objects.push(@browser) unless @browser.nil?
|
155
161
|
objects.push(@operating_system) unless @operating_system.nil?
|
156
162
|
objects.push(@geolocation) unless @geolocation.nil?
|
157
163
|
objects
|
158
164
|
end
|
165
|
+
|
166
|
+
def parse_kcs_heat(kcs)
|
167
|
+
return nil if kcs.nil?
|
168
|
+
|
169
|
+
value_map = {}
|
170
|
+
kcs.each do |str_key_moment_id, goal_scores|
|
171
|
+
next unless str_key_moment_id.is_a?(String) && goal_scores.is_a?(Hash)
|
172
|
+
|
173
|
+
goal_score_map = {}
|
174
|
+
goal_scores.each do |str_goal_id, score|
|
175
|
+
next unless str_goal_id.is_a?(String) && (score.is_a?(Float) || score.is_a?(Integer))
|
176
|
+
|
177
|
+
goal_id = str_goal_id.to_i
|
178
|
+
goal_score_map[goal_id] = score
|
179
|
+
end
|
180
|
+
key_moment_id = str_key_moment_id.to_i
|
181
|
+
value_map[key_moment_id] = goal_score_map
|
182
|
+
end
|
183
|
+
KcsHeat.new(value_map)
|
184
|
+
end
|
159
185
|
end
|
160
186
|
end
|
161
187
|
end
|
162
|
-
end
|
188
|
+
end
|
@@ -52,12 +52,13 @@ module Kameleoon
|
|
52
52
|
params[is_unique_identifier ? :mappingValue : :visitorCode] = visitor_code
|
53
53
|
params[:maxNumberPreviousVisits] = filter.previous_visit_amount
|
54
54
|
params[:version] = 0
|
55
|
-
params[:
|
56
|
-
params[:
|
57
|
-
params[:
|
58
|
-
params[:
|
59
|
-
params[:
|
60
|
-
params[:
|
55
|
+
params[:kcs] = true if filter.kcs
|
56
|
+
params[:currentVisit] = true if filter.current_visit
|
57
|
+
params[:customData] = true if filter.custom_data
|
58
|
+
params[:conversion] = true if filter.conversions
|
59
|
+
params[:geolocation] = true if filter.geolocation
|
60
|
+
params[:experiment] = true if filter.experiments
|
61
|
+
params[:page] = true if filter.page_views
|
61
62
|
params[:staticData] = true if filter.device || filter.browser || filter.operating_system
|
62
63
|
"https://#{@data_api_domain}#{VISITOR_DATA_PATH}?#{UriHelper.encode_query(params)}"
|
63
64
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'kameleoon/exceptions'
|
3
4
|
|
4
5
|
module Kameleoon
|
@@ -26,6 +27,7 @@ module Kameleoon
|
|
26
27
|
VISITS = 'VISITS'
|
27
28
|
SAME_DAY_VISITS = 'SAME_DAY_VISITS'
|
28
29
|
NEW_VISITORS = 'NEW_VISITORS'
|
30
|
+
HEAT_SLICE = 'HEAT_SLICE'
|
29
31
|
end
|
30
32
|
|
31
33
|
module Operator
|
@@ -11,6 +11,7 @@ require_relative 'conditions/conversion_condition'
|
|
11
11
|
require_relative 'conditions/browser_condition'
|
12
12
|
require_relative 'conditions/sdk_language_condition'
|
13
13
|
require_relative 'conditions/geolocation_condition'
|
14
|
+
require_relative 'conditions/kcs_heat_range_condition'
|
14
15
|
require_relative 'conditions/operating_system_condition'
|
15
16
|
require_relative 'conditions/cookie_condition'
|
16
17
|
require_relative 'conditions/segment_condition'
|
@@ -67,6 +68,8 @@ module Kameleoon
|
|
67
68
|
VisitorNewReturnCondition.new(condition_json)
|
68
69
|
when ConditionType::FIRST_VISIT, ConditionType::LAST_VISIT
|
69
70
|
TimeElapsedSinceVisitCondition.new(condition_json)
|
71
|
+
when ConditionType::HEAT_SLICE
|
72
|
+
KcsHeatRangeCondition.new(condition_json)
|
70
73
|
else
|
71
74
|
UnknownCondition.new(condition_json)
|
72
75
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kameleoon/data/device'
|
4
|
+
|
5
|
+
module Kameleoon
|
6
|
+
# @api private
|
7
|
+
module Targeting
|
8
|
+
# KcsHeatRangeCondition is a condition for checking KCS heat
|
9
|
+
class KcsHeatRangeCondition < Condition
|
10
|
+
def initialize(json_condition)
|
11
|
+
super(json_condition)
|
12
|
+
@goal_id = json_condition['goalId'] || -1
|
13
|
+
@key_moment_id = json_condition['keyMomentId'] || -1
|
14
|
+
@lower_bound = json_condition['lowerBound'] || Float::MAX
|
15
|
+
@upper_bound = json_condition['upperBound'] || Float::MIN
|
16
|
+
end
|
17
|
+
|
18
|
+
def check(kcs_heat)
|
19
|
+
kcs_heat.is_a?(Kameleoon::KcsHeat) && check_targeting(kcs_heat)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def check_targeting(kcs_heat)
|
25
|
+
return false unless kcs_heat.values.is_a?(Hash)
|
26
|
+
|
27
|
+
goal_scores = kcs_heat.values[@key_moment_id]
|
28
|
+
return false unless goal_scores.is_a?(Hash)
|
29
|
+
|
30
|
+
score = goal_scores[@goal_id]
|
31
|
+
return false unless score.is_a?(Float) || score.is_a?(Integer)
|
32
|
+
|
33
|
+
(score >= @lower_bound) && (score <= @upper_bound)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -20,20 +20,19 @@ module Kameleoon
|
|
20
20
|
|
21
21
|
def check(data)
|
22
22
|
return false unless data.is_a?(Kameleoon::Targeting::TargetFeatureFlagInfo) && data.variations_storage.size != 0
|
23
|
-
|
23
|
+
|
24
|
+
get_rules(data).any? { |rule| check_rule(data, rule) }
|
24
25
|
end
|
25
26
|
|
26
27
|
private def check_rule(data, rule)
|
27
|
-
return false if !rule.is_a?(Kameleoon::Configuration::Rule) || rule.experiment_id
|
28
|
+
return false if !rule.is_a?(Kameleoon::Configuration::Rule) || rule.experiment_id.nil?
|
28
29
|
|
29
|
-
if @condition_rule_id !=
|
30
|
-
return false if @condition_rule_id != rule.id
|
31
|
-
end
|
30
|
+
return false if !@condition_rule_id.nil? && (@condition_rule_id != rule.id)
|
32
31
|
|
33
32
|
variation = data.variations_storage.get(rule.experiment_id)
|
34
|
-
return false if variation
|
33
|
+
return false if variation.nil?
|
35
34
|
|
36
|
-
return true if @condition_variation_key
|
35
|
+
return true if @condition_variation_key.nil?
|
37
36
|
|
38
37
|
variation = data.data_file.variation_by_id[variation.variation_id]
|
39
38
|
|
@@ -44,10 +43,7 @@ module Kameleoon
|
|
44
43
|
|
45
44
|
def get_rules(data)
|
46
45
|
feature_flag = data.data_file.feature_flag_by_id[@feature_flag_id]
|
47
|
-
|
48
|
-
return feature_flag.rules
|
49
|
-
end
|
50
|
-
[]
|
46
|
+
feature_flag&.rules || []
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
@@ -6,7 +6,6 @@ require 'kameleoon/data/visitor_visits'
|
|
6
6
|
module Kameleoon
|
7
7
|
# @api private
|
8
8
|
module Targeting
|
9
|
-
|
10
9
|
class TimeElapsedSinceVisitCondition < NumberCondition
|
11
10
|
def initialize(json_condition)
|
12
11
|
count_in_millis = json_condition['countInMillis']
|
@@ -15,7 +14,7 @@ module Kameleoon
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def check(data)
|
18
|
-
return false unless data.is_a?(Kameleoon::VisitorVisits) &&
|
17
|
+
return false unless data.is_a?(Kameleoon::VisitorVisits) && !@condition_value.nil?
|
19
18
|
|
20
19
|
previous_visits_count = data.previous_visit_timestamps.count
|
21
20
|
if previous_visits_count >= 1
|
@@ -6,7 +6,6 @@ require 'time'
|
|
6
6
|
module Kameleoon
|
7
7
|
# @api private
|
8
8
|
module Targeting
|
9
|
-
|
10
9
|
class VisitNumberTodayCondition < NumberCondition
|
11
10
|
def initialize(json_condition)
|
12
11
|
visit_count = json_condition['visitCount']
|
@@ -14,10 +13,11 @@ module Kameleoon
|
|
14
13
|
end
|
15
14
|
|
16
15
|
def check(data)
|
17
|
-
return false unless
|
16
|
+
return false unless VisitorVisits.visitor_visits?(data) && !@condition_value.nil?
|
17
|
+
|
18
18
|
number_of_visits_today = 0
|
19
|
-
start_of_day = (Time.new.to_date.to_time.to_f * 1000).to_i # ... * 1000
|
20
|
-
for timestamp in data
|
19
|
+
start_of_day = (Time.new.to_date.to_time.to_f * 1000).to_i # ... * 1000 to convert seconds to milliseconds
|
20
|
+
for timestamp in VisitorVisits.get_previous_visit_timestamps(data)
|
21
21
|
break if timestamp < start_of_day
|
22
22
|
number_of_visits_today += 1
|
23
23
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'kameleoon/data/visitor_visits'
|
3
4
|
require 'kameleoon/targeting/conditions/number_condition'
|
4
5
|
|
5
6
|
module Kameleoon
|
6
7
|
# @api private
|
7
8
|
module Targeting
|
8
|
-
|
9
9
|
class VisitNumberTotalCondition < NumberCondition
|
10
10
|
def initialize(json_condition)
|
11
11
|
visit_count = json_condition['visitCount']
|
@@ -13,8 +13,10 @@ module Kameleoon
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def check(data)
|
16
|
-
return false unless
|
17
|
-
|
16
|
+
return false unless VisitorVisits.visitor_visits?(data) && !@condition_value.nil?
|
17
|
+
|
18
|
+
previous_visit_timestamps = VisitorVisits.get_previous_visit_timestamps(data)
|
19
|
+
check_targeting(previous_visit_timestamps.size + 1) # +1 for current visit
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'kameleoon/data/
|
4
|
-
require 'kameleoon/version'
|
3
|
+
require 'kameleoon/data/visitor_visits'
|
5
4
|
|
6
5
|
module Kameleoon
|
7
6
|
# @api private
|
@@ -18,14 +17,16 @@ module Kameleoon
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def check(data)
|
21
|
-
return false unless
|
20
|
+
return false unless VisitorVisits.visitor_visits?(data)
|
21
|
+
|
22
|
+
previous_visit_timestamps = VisitorVisits.get_previous_visit_timestamps(data)
|
22
23
|
case @visitor_type
|
23
24
|
when VisitorType::NEW
|
24
|
-
|
25
|
+
previous_visit_timestamps.empty?
|
25
26
|
when VisitorType::RETURNING
|
26
|
-
|
27
|
+
!previous_visit_timestamps.empty?
|
27
28
|
else
|
28
|
-
|
29
|
+
false
|
29
30
|
end
|
30
31
|
end
|
31
32
|
end
|
@@ -58,6 +58,8 @@ module Kameleoon
|
|
58
58
|
condition_data = ExclusiveFeatureFlagInfo.new(campaign_id, visitor&.variations)
|
59
59
|
when ConditionType::FIRST_VISIT, ConditionType::LAST_VISIT, ConditionType::VISITS, ConditionType::SAME_DAY_VISITS, ConditionType::NEW_VISITORS
|
60
60
|
condition_data = visitor.visitor_visits unless visitor.nil?
|
61
|
+
when Kameleoon::Targeting::ConditionType::HEAT_SLICE
|
62
|
+
condition_data = visitor&.kcs_heat
|
61
63
|
end
|
62
64
|
condition_data
|
63
65
|
end
|
@@ -3,11 +3,15 @@
|
|
3
3
|
module Kameleoon
|
4
4
|
# Module which contains all internal data of SDK
|
5
5
|
module Types
|
6
|
-
|
7
6
|
class RemoteVisitorDataFilter
|
8
|
-
attr_reader :previous_visit_amount, :current_visit, :custom_data, :page_views, :geolocation, :device, :browser,
|
7
|
+
attr_reader :previous_visit_amount, :current_visit, :custom_data, :page_views, :geolocation, :device, :browser,
|
8
|
+
:operating_system, :conversions, :experiments, :kcs
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(
|
11
|
+
previous_visit_amount: 1, current_visit: true, custom_data: true, page_views: false,
|
12
|
+
geolocation: false, device: false, browser: false, operating_system: false, conversions: false,
|
13
|
+
experiments: false, kcs: false
|
14
|
+
)
|
11
15
|
@previous_visit_amount = previous_visit_amount
|
12
16
|
@current_visit = current_visit
|
13
17
|
@custom_data = custom_data
|
@@ -18,6 +22,7 @@ module Kameleoon
|
|
18
22
|
@operating_system = operating_system
|
19
23
|
@conversions = conversions
|
20
24
|
@experiments = experiments
|
25
|
+
@kcs = kcs
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kameleoon
|
4
|
+
# Module which contains all internal data of SDK
|
5
|
+
module Types
|
6
|
+
# Variable
|
7
|
+
class Variable
|
8
|
+
attr_reader :key, :type, :value
|
9
|
+
|
10
|
+
def initialize(key, type, value)
|
11
|
+
@key = key
|
12
|
+
@type = type
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kameleoon
|
4
|
+
# Module which contains all internal data of SDK
|
5
|
+
module Types
|
6
|
+
# Variation
|
7
|
+
class Variation
|
8
|
+
attr_reader :key, :id, :experiment_id, :variables
|
9
|
+
|
10
|
+
def initialize(key, id, experiment_id, variables)
|
11
|
+
@key = key
|
12
|
+
@id = id
|
13
|
+
@experiment_id = experiment_id
|
14
|
+
@variables = variables
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/kameleoon/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kameleoon-client-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kameleoon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|
@@ -91,6 +91,7 @@ files:
|
|
91
91
|
- lib/kameleoon/data/data.rb
|
92
92
|
- lib/kameleoon/data/device.rb
|
93
93
|
- lib/kameleoon/data/geolocation.rb
|
94
|
+
- lib/kameleoon/data/kcs_heat.rb
|
94
95
|
- lib/kameleoon/data/manager/assigned_variation.rb
|
95
96
|
- lib/kameleoon/data/manager/data_array_storage.rb
|
96
97
|
- lib/kameleoon/data/manager/data_map_storage.rb
|
@@ -136,6 +137,7 @@ files:
|
|
136
137
|
- lib/kameleoon/targeting/conditions/device_condition.rb
|
137
138
|
- lib/kameleoon/targeting/conditions/exclusive_feature_flag_condition.rb
|
138
139
|
- lib/kameleoon/targeting/conditions/geolocation_condition.rb
|
140
|
+
- lib/kameleoon/targeting/conditions/kcs_heat_range_condition.rb
|
139
141
|
- lib/kameleoon/targeting/conditions/number_condition.rb
|
140
142
|
- lib/kameleoon/targeting/conditions/operating_system_condition.rb
|
141
143
|
- lib/kameleoon/targeting/conditions/page_title_condition.rb
|
@@ -156,6 +158,8 @@ files:
|
|
156
158
|
- lib/kameleoon/targeting/targeting_manager.rb
|
157
159
|
- lib/kameleoon/targeting/tree_builder.rb
|
158
160
|
- lib/kameleoon/types/remote_visitor_data_filter.rb
|
161
|
+
- lib/kameleoon/types/variable.rb
|
162
|
+
- lib/kameleoon/types/variation.rb
|
159
163
|
- lib/kameleoon/utils.rb
|
160
164
|
- lib/kameleoon/version.rb
|
161
165
|
homepage: https://developers.kameleoon.com/ruby-sdk.html
|