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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kameleoon/configuration/custom_data_info.rb +43 -0
  3. data/lib/kameleoon/configuration/data_file.rb +30 -2
  4. data/lib/kameleoon/configuration/rule.rb +4 -1
  5. data/lib/kameleoon/configuration/variation_exposition.rb +1 -1
  6. data/lib/kameleoon/data/browser.rb +19 -0
  7. data/lib/kameleoon/data/cookie.rb +14 -0
  8. data/lib/kameleoon/data/custom_data.rb +2 -0
  9. data/lib/kameleoon/data/data.rb +2 -0
  10. data/lib/kameleoon/data/geolocation.rb +45 -0
  11. data/lib/kameleoon/data/manager/assigned_variation.rb +2 -1
  12. data/lib/kameleoon/data/manager/page_view_visit.rb +16 -2
  13. data/lib/kameleoon/data/manager/visitor.rb +64 -14
  14. data/lib/kameleoon/data/manager/visitor_manager.rb +23 -1
  15. data/lib/kameleoon/data/operating_system.rb +72 -0
  16. data/lib/kameleoon/data/page_view.rb +2 -2
  17. data/lib/kameleoon/data/visitor_visits.rb +13 -0
  18. data/lib/kameleoon/kameleoon_client.rb +75 -94
  19. data/lib/kameleoon/managers/remote_data/remote_data_manager.rb +57 -0
  20. data/lib/kameleoon/managers/remote_data/remote_visitor_data.rb +162 -0
  21. data/lib/kameleoon/managers/warehouse/warehouse_manager.rb +3 -1
  22. data/lib/kameleoon/network/access_token_source.rb +22 -5
  23. data/lib/kameleoon/network/network_manager.rb +10 -10
  24. data/lib/kameleoon/network/response.rb +1 -1
  25. data/lib/kameleoon/network/url_provider.rb +15 -12
  26. data/lib/kameleoon/targeting/condition.rb +22 -2
  27. data/lib/kameleoon/targeting/condition_factory.rb +36 -6
  28. data/lib/kameleoon/targeting/conditions/cookie_condition.rb +55 -0
  29. data/lib/kameleoon/targeting/conditions/exclusive_feature_flag_condition.rb +27 -0
  30. data/lib/kameleoon/targeting/conditions/geolocation_condition.rb +33 -0
  31. data/lib/kameleoon/targeting/conditions/number_condition.rb +38 -0
  32. data/lib/kameleoon/targeting/conditions/operating_system_condition.rb +27 -0
  33. data/lib/kameleoon/targeting/conditions/page_view_number_condition.rb +28 -0
  34. data/lib/kameleoon/targeting/conditions/previous_page_condition.rb +35 -0
  35. data/lib/kameleoon/targeting/conditions/segment_condition.rb +42 -0
  36. data/lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb +63 -0
  37. data/lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb +30 -0
  38. data/lib/kameleoon/targeting/conditions/visit_number_today_condition.rb +28 -0
  39. data/lib/kameleoon/targeting/conditions/visit_number_total_condition.rb +21 -0
  40. data/lib/kameleoon/targeting/conditions/visitor_new_return_condition.rb +33 -0
  41. data/lib/kameleoon/targeting/targeting_manager.rb +66 -0
  42. data/lib/kameleoon/types/remote_visitor_data_filter.rb +24 -0
  43. data/lib/kameleoon/utils.rb +1 -0
  44. data/lib/kameleoon/version.rb +1 -1
  45. metadata +24 -4
  46. data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +0 -18
  47. 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
@@ -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"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kameleoon
4
4
  SDK_NAME = 'RUBY'
5
- SDK_VERSION = '3.1.1'
5
+ SDK_VERSION = '3.2.0'
6
6
 
7
7
  # SdkManager is a helper method for fetching / obtaining version of SDK from string
8
8
  class SdkVersion
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.1.1
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-02-27 00:00:00.000000000 Z
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/exclusive_experiment.rb
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/target_experiment.rb
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