kameleoon-client-ruby 3.1.1 → 3.2.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/custom_data_info.rb +43 -0
- data/lib/kameleoon/configuration/data_file.rb +30 -2
- data/lib/kameleoon/configuration/rule.rb +4 -1
- data/lib/kameleoon/configuration/variation_exposition.rb +1 -1
- data/lib/kameleoon/data/browser.rb +19 -0
- data/lib/kameleoon/data/cookie.rb +14 -0
- data/lib/kameleoon/data/custom_data.rb +2 -0
- data/lib/kameleoon/data/data.rb +2 -0
- data/lib/kameleoon/data/geolocation.rb +45 -0
- data/lib/kameleoon/data/manager/assigned_variation.rb +2 -1
- data/lib/kameleoon/data/manager/page_view_visit.rb +16 -2
- data/lib/kameleoon/data/manager/visitor.rb +64 -14
- data/lib/kameleoon/data/manager/visitor_manager.rb +23 -1
- data/lib/kameleoon/data/operating_system.rb +72 -0
- data/lib/kameleoon/data/page_view.rb +2 -2
- data/lib/kameleoon/data/visitor_visits.rb +13 -0
- data/lib/kameleoon/kameleoon_client.rb +75 -94
- data/lib/kameleoon/managers/remote_data/remote_data_manager.rb +57 -0
- data/lib/kameleoon/managers/remote_data/remote_visitor_data.rb +162 -0
- data/lib/kameleoon/managers/warehouse/warehouse_manager.rb +3 -1
- data/lib/kameleoon/network/access_token_source.rb +22 -5
- data/lib/kameleoon/network/network_manager.rb +10 -10
- data/lib/kameleoon/network/response.rb +1 -1
- data/lib/kameleoon/network/url_provider.rb +15 -12
- data/lib/kameleoon/targeting/condition.rb +22 -2
- data/lib/kameleoon/targeting/condition_factory.rb +36 -6
- data/lib/kameleoon/targeting/conditions/cookie_condition.rb +55 -0
- data/lib/kameleoon/targeting/conditions/exclusive_feature_flag_condition.rb +27 -0
- data/lib/kameleoon/targeting/conditions/geolocation_condition.rb +33 -0
- data/lib/kameleoon/targeting/conditions/number_condition.rb +38 -0
- data/lib/kameleoon/targeting/conditions/operating_system_condition.rb +27 -0
- data/lib/kameleoon/targeting/conditions/page_view_number_condition.rb +28 -0
- data/lib/kameleoon/targeting/conditions/previous_page_condition.rb +35 -0
- data/lib/kameleoon/targeting/conditions/segment_condition.rb +42 -0
- data/lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb +63 -0
- data/lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb +30 -0
- data/lib/kameleoon/targeting/conditions/visit_number_today_condition.rb +28 -0
- data/lib/kameleoon/targeting/conditions/visit_number_total_condition.rb +21 -0
- data/lib/kameleoon/targeting/conditions/visitor_new_return_condition.rb +33 -0
- data/lib/kameleoon/targeting/targeting_manager.rb +66 -0
- data/lib/kameleoon/types/remote_visitor_data_filter.rb +24 -0
- data/lib/kameleoon/utils.rb +1 -0
- data/lib/kameleoon/version.rb +1 -1
- metadata +24 -4
- data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +0 -18
- data/lib/kameleoon/targeting/conditions/target_experiment.rb +0 -45
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kameleoon/data/cookie'
|
4
|
+
require 'kameleoon/version'
|
5
|
+
|
6
|
+
module Kameleoon
|
7
|
+
# @api private
|
8
|
+
module Targeting
|
9
|
+
module VisitorType
|
10
|
+
NEW = 'NEW'
|
11
|
+
RETURNING = 'RETURNING'
|
12
|
+
end
|
13
|
+
|
14
|
+
class VisitorNewReturnCondition < Condition
|
15
|
+
def initialize(json_condition)
|
16
|
+
super(json_condition)
|
17
|
+
@visitor_type = json_condition['visitorType']
|
18
|
+
end
|
19
|
+
|
20
|
+
def check(data)
|
21
|
+
return false unless data.is_a?(Kameleoon::VisitorVisits)
|
22
|
+
case @visitor_type
|
23
|
+
when VisitorType::NEW
|
24
|
+
return data.previous_visit_timestamps.size == 0
|
25
|
+
when VisitorType::RETURNING
|
26
|
+
return data.previous_visit_timestamps.size > 0
|
27
|
+
else
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kameleoon/targeting/conditions/segment_condition'
|
4
|
+
|
5
|
+
module Kameleoon
|
6
|
+
# @api private
|
7
|
+
module Targeting
|
8
|
+
class TargetingManager
|
9
|
+
def initialize(visitor_manager, data_file)
|
10
|
+
@visitor_manager = visitor_manager
|
11
|
+
@data_file = data_file
|
12
|
+
end
|
13
|
+
|
14
|
+
def check_targeting(visitor_code, campaign_id, exp_ff_rule)
|
15
|
+
segment = exp_ff_rule.targeting_segment
|
16
|
+
return true if segment.nil?
|
17
|
+
|
18
|
+
visitor = @visitor_manager.get_visitor(visitor_code)
|
19
|
+
segment.check_tree(->(type) { get_condition_data(type, visitor, visitor_code, campaign_id) })
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_condition_data(type, visitor, visitor_code, campaign_id)
|
23
|
+
condition_data = nil
|
24
|
+
case type
|
25
|
+
when Kameleoon::Targeting::ConditionType::CUSTOM_DATUM
|
26
|
+
condition_data = visitor.custom_data unless visitor.nil?
|
27
|
+
when Kameleoon::Targeting::ConditionType::PAGE_VIEWS,
|
28
|
+
Kameleoon::Targeting::ConditionType::PREVIOUS_PAGE,
|
29
|
+
Kameleoon::Targeting::ConditionType::PAGE_TITLE,
|
30
|
+
Kameleoon::Targeting::ConditionType::PAGE_URL
|
31
|
+
condition_data = visitor.page_view_visits unless visitor.nil?
|
32
|
+
when Kameleoon::Targeting::ConditionType::DEVICE_TYPE
|
33
|
+
condition_data = visitor.device unless visitor.nil?
|
34
|
+
when Kameleoon::Targeting::ConditionType::BROWSER
|
35
|
+
condition_data = visitor.browser unless visitor.nil?
|
36
|
+
when Kameleoon::Targeting::ConditionType::COOKIE
|
37
|
+
condition_data = visitor.cookie unless visitor.nil?
|
38
|
+
when Kameleoon::Targeting::ConditionType::GEOLOCATION
|
39
|
+
condition_data = visitor.geolocation unless visitor.nil?
|
40
|
+
when Kameleoon::Targeting::ConditionType::OPERATING_SYSTEM
|
41
|
+
condition_data = visitor.operating_system unless visitor.nil?
|
42
|
+
when Kameleoon::Targeting::ConditionType::SEGMENT
|
43
|
+
condition_data = SegmentInfo.new(
|
44
|
+
@data_file,
|
45
|
+
lambda { |type|
|
46
|
+
get_condition_data(type, visitor, visitor_code, campaign_id)
|
47
|
+
}
|
48
|
+
)
|
49
|
+
when Kameleoon::Targeting::ConditionType::CONVERSIONS
|
50
|
+
condition_data = visitor.conversions unless visitor.nil?
|
51
|
+
when Kameleoon::Targeting::ConditionType::SDK_LANGUAGE
|
52
|
+
condition_data = Kameleoon::Targeting::SdkInfo.new(Kameleoon::SDK_NAME, Kameleoon::SDK_VERSION)
|
53
|
+
when Kameleoon::Targeting::ConditionType::VISITOR_CODE
|
54
|
+
condition_data = visitor_code
|
55
|
+
when Kameleoon::Targeting::ConditionType::TARGET_FEATURE_FLAG
|
56
|
+
condition_data = TargetFeatureFlagInfo.new(@data_file, visitor.variations) unless visitor.nil?
|
57
|
+
when Kameleoon::Targeting::ConditionType::EXCLUSIVE_FEATURE_FLAG
|
58
|
+
condition_data = ExclusiveFeatureFlagInfo.new(campaign_id, visitor&.variations)
|
59
|
+
when ConditionType::FIRST_VISIT, ConditionType::LAST_VISIT, ConditionType::VISITS, ConditionType::SAME_DAY_VISITS, ConditionType::NEW_VISITORS
|
60
|
+
condition_data = visitor.visitor_visits unless visitor.nil?
|
61
|
+
end
|
62
|
+
condition_data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kameleoon
|
4
|
+
# Module which contains all internal data of SDK
|
5
|
+
module Types
|
6
|
+
|
7
|
+
class RemoteVisitorDataFilter
|
8
|
+
attr_reader :previous_visit_amount, :current_visit, :custom_data, :page_views, :geolocation, :device, :browser, :operating_system, :conversions, :experiments
|
9
|
+
|
10
|
+
def initialize(previous_visit_amount: 1, current_visit: true, custom_data: true, page_views: false, geolocation: false, device: false, browser: false, operating_system: false, conversions: false, experiments: false)
|
11
|
+
@previous_visit_amount = previous_visit_amount
|
12
|
+
@current_visit = current_visit
|
13
|
+
@custom_data = custom_data
|
14
|
+
@page_views = page_views
|
15
|
+
@geolocation = geolocation
|
16
|
+
@device = device
|
17
|
+
@browser = browser
|
18
|
+
@operating_system = operating_system
|
19
|
+
@conversions = conversions
|
20
|
+
@experiments = experiments
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/kameleoon/utils.rb
CHANGED
@@ -19,6 +19,7 @@ module Kameleoon
|
|
19
19
|
VISITOR_CODE_LENGTH = 16
|
20
20
|
|
21
21
|
def self.validate(visitor_code)
|
22
|
+
raise Kameleoon::Exception::VisitorCodeInvalid, 'Visitor Code is nil or invalidate type' unless visitor_code.is_a?(String)
|
22
23
|
raise Kameleoon::Exception::VisitorCodeInvalid, 'Empty visitor Code' if visitor_code&.empty?
|
23
24
|
if visitor_code.size > VISITOR_CODE_MAX_LENGTH
|
24
25
|
raise Kameleoon::Exception::VisitorCodeInvalid, "Visitor Code is longer than #{VISITOR_CODE_MAX_LENGTH} chars"
|
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.2.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-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: em-http-request
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- README.md
|
77
77
|
- lib/kameleoon.rb
|
78
78
|
- lib/kameleoon/client_readiness.rb
|
79
|
+
- lib/kameleoon/configuration/custom_data_info.rb
|
79
80
|
- lib/kameleoon/configuration/data_file.rb
|
80
81
|
- lib/kameleoon/configuration/feature_flag.rb
|
81
82
|
- lib/kameleoon/configuration/rule.rb
|
@@ -85,22 +86,28 @@ files:
|
|
85
86
|
- lib/kameleoon/configuration/variation_exposition.rb
|
86
87
|
- lib/kameleoon/data/browser.rb
|
87
88
|
- lib/kameleoon/data/conversion.rb
|
89
|
+
- lib/kameleoon/data/cookie.rb
|
88
90
|
- lib/kameleoon/data/custom_data.rb
|
89
91
|
- lib/kameleoon/data/data.rb
|
90
92
|
- lib/kameleoon/data/device.rb
|
93
|
+
- lib/kameleoon/data/geolocation.rb
|
91
94
|
- lib/kameleoon/data/manager/assigned_variation.rb
|
92
95
|
- lib/kameleoon/data/manager/data_array_storage.rb
|
93
96
|
- lib/kameleoon/data/manager/data_map_storage.rb
|
94
97
|
- lib/kameleoon/data/manager/page_view_visit.rb
|
95
98
|
- lib/kameleoon/data/manager/visitor.rb
|
96
99
|
- lib/kameleoon/data/manager/visitor_manager.rb
|
100
|
+
- lib/kameleoon/data/operating_system.rb
|
97
101
|
- lib/kameleoon/data/page_view.rb
|
98
102
|
- lib/kameleoon/data/user_agent.rb
|
103
|
+
- lib/kameleoon/data/visitor_visits.rb
|
99
104
|
- lib/kameleoon/exceptions.rb
|
100
105
|
- lib/kameleoon/hybrid/manager.rb
|
101
106
|
- lib/kameleoon/kameleoon_client.rb
|
102
107
|
- lib/kameleoon/kameleoon_client_config.rb
|
103
108
|
- lib/kameleoon/kameleoon_client_factory.rb
|
109
|
+
- lib/kameleoon/managers/remote_data/remote_data_manager.rb
|
110
|
+
- lib/kameleoon/managers/remote_data/remote_visitor_data.rb
|
104
111
|
- lib/kameleoon/managers/warehouse/warehouse_manager.rb
|
105
112
|
- lib/kameleoon/network/access_token_source.rb
|
106
113
|
- lib/kameleoon/network/activity_event.rb
|
@@ -124,18 +131,31 @@ files:
|
|
124
131
|
- lib/kameleoon/targeting/condition_factory.rb
|
125
132
|
- lib/kameleoon/targeting/conditions/browser_condition.rb
|
126
133
|
- lib/kameleoon/targeting/conditions/conversion_condition.rb
|
134
|
+
- lib/kameleoon/targeting/conditions/cookie_condition.rb
|
127
135
|
- lib/kameleoon/targeting/conditions/custom_datum.rb
|
128
136
|
- lib/kameleoon/targeting/conditions/device_condition.rb
|
129
|
-
- lib/kameleoon/targeting/conditions/
|
137
|
+
- lib/kameleoon/targeting/conditions/exclusive_feature_flag_condition.rb
|
138
|
+
- lib/kameleoon/targeting/conditions/geolocation_condition.rb
|
139
|
+
- lib/kameleoon/targeting/conditions/number_condition.rb
|
140
|
+
- lib/kameleoon/targeting/conditions/operating_system_condition.rb
|
130
141
|
- lib/kameleoon/targeting/conditions/page_title_condition.rb
|
131
142
|
- lib/kameleoon/targeting/conditions/page_url_condition.rb
|
143
|
+
- lib/kameleoon/targeting/conditions/page_view_number_condition.rb
|
144
|
+
- lib/kameleoon/targeting/conditions/previous_page_condition.rb
|
132
145
|
- lib/kameleoon/targeting/conditions/sdk_language_condition.rb
|
146
|
+
- lib/kameleoon/targeting/conditions/segment_condition.rb
|
133
147
|
- lib/kameleoon/targeting/conditions/string_value_condition.rb
|
134
|
-
- lib/kameleoon/targeting/conditions/
|
148
|
+
- lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb
|
149
|
+
- lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb
|
135
150
|
- lib/kameleoon/targeting/conditions/unknown_condition.rb
|
151
|
+
- lib/kameleoon/targeting/conditions/visit_number_today_condition.rb
|
152
|
+
- lib/kameleoon/targeting/conditions/visit_number_total_condition.rb
|
136
153
|
- lib/kameleoon/targeting/conditions/visitor_code_condition.rb
|
154
|
+
- lib/kameleoon/targeting/conditions/visitor_new_return_condition.rb
|
137
155
|
- lib/kameleoon/targeting/models.rb
|
156
|
+
- lib/kameleoon/targeting/targeting_manager.rb
|
138
157
|
- lib/kameleoon/targeting/tree_builder.rb
|
158
|
+
- lib/kameleoon/types/remote_visitor_data_filter.rb
|
139
159
|
- lib/kameleoon/utils.rb
|
140
160
|
- lib/kameleoon/version.rb
|
141
161
|
homepage: https://developers.kameleoon.com/ruby-sdk.html
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'kameleoon/targeting/condition'
|
4
|
-
|
5
|
-
module Kameleoon
|
6
|
-
# @api private
|
7
|
-
module Targeting
|
8
|
-
# ExclusiveExperiment represents an instance of Exclusive Experiment condition in user account
|
9
|
-
class ExclusiveExperiment < Condition
|
10
|
-
def check(data)
|
11
|
-
experiment_id = data.experiment_id
|
12
|
-
storage = data.storage
|
13
|
-
storage.is_a?(Kameleoon::DataManager::DataMapStorage) &&
|
14
|
-
(storage.size.zero? || ((storage.size == 1) && !storage.get(experiment_id).nil?))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'kameleoon/targeting/condition'
|
4
|
-
require 'kameleoon/exceptions'
|
5
|
-
|
6
|
-
module Kameleoon
|
7
|
-
# @api private
|
8
|
-
module Targeting
|
9
|
-
# TargetExperiment represents an instance of Experiment condition in user account
|
10
|
-
class TargetExperiment < Condition
|
11
|
-
include Kameleoon::Exception
|
12
|
-
|
13
|
-
def initialize(json_condition)
|
14
|
-
super(json_condition)
|
15
|
-
|
16
|
-
raise Exception::NotFound.new('experiment'), 'experiment missed' if json_condition['experiment'].nil?
|
17
|
-
if json_condition['variationMatchType'].nil?
|
18
|
-
raise Exception::NotFound.new('variationMatchType'), 'variationMatchType missed'
|
19
|
-
end
|
20
|
-
|
21
|
-
@experiment = json_condition['experiment']
|
22
|
-
@operator = json_condition['variationMatchType']
|
23
|
-
@variation = json_condition['variation']
|
24
|
-
end
|
25
|
-
|
26
|
-
def check(variation_storage)
|
27
|
-
return false unless variation_storage.is_a?(Kameleoon::DataManager::DataMapStorage) &&
|
28
|
-
variation_storage.size.positive?
|
29
|
-
|
30
|
-
variation = variation_storage.get(@experiment)
|
31
|
-
return false unless variation.is_a?(Kameleoon::DataManager::AssignedVariation)
|
32
|
-
|
33
|
-
case @operator
|
34
|
-
when Operator::EXACT
|
35
|
-
variation = variation_storage.get(@experiment)
|
36
|
-
variation.variation_id == @variation
|
37
|
-
when Operator::ANY
|
38
|
-
true
|
39
|
-
else
|
40
|
-
false
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|