kameleoon-client-ruby 3.1.1 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|