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.
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