kameleoon-client-ruby 2.1.0 → 2.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kameleoon/client.rb +105 -151
  3. data/lib/kameleoon/configuration/rule.rb +1 -1
  4. data/lib/kameleoon/data/browser.rb +39 -0
  5. data/lib/kameleoon/data/conversion.rb +33 -0
  6. data/lib/kameleoon/data/custom_data.rb +60 -0
  7. data/lib/kameleoon/data/data.rb +38 -0
  8. data/lib/kameleoon/data/device.rb +31 -0
  9. data/lib/kameleoon/data/page_view.rb +34 -0
  10. data/lib/kameleoon/data/user_agent.rb +14 -0
  11. data/lib/kameleoon/network/activity_event.rb +31 -0
  12. data/lib/kameleoon/network/content_type.rb +11 -0
  13. data/lib/kameleoon/network/experiment_event.rb +35 -0
  14. data/lib/kameleoon/network/method.rb +10 -0
  15. data/lib/kameleoon/network/net_provider.rb +91 -0
  16. data/lib/kameleoon/network/network_manager.rb +114 -0
  17. data/lib/kameleoon/network/request.rb +20 -0
  18. data/lib/kameleoon/network/response.rb +30 -0
  19. data/lib/kameleoon/network/uri_helper.rb +37 -0
  20. data/lib/kameleoon/network/url_provider.rb +71 -0
  21. data/lib/kameleoon/targeting/condition.rb +40 -11
  22. data/lib/kameleoon/targeting/condition_factory.rb +35 -12
  23. data/lib/kameleoon/targeting/conditions/browser_condition.rb +71 -0
  24. data/lib/kameleoon/targeting/conditions/conversion_condition.rb +21 -0
  25. data/lib/kameleoon/targeting/conditions/custom_datum.rb +60 -65
  26. data/lib/kameleoon/targeting/conditions/device_condition.rb +21 -0
  27. data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +0 -12
  28. data/lib/kameleoon/targeting/conditions/page_title_condition.rb +21 -0
  29. data/lib/kameleoon/targeting/conditions/page_url_condition.rb +21 -0
  30. data/lib/kameleoon/targeting/conditions/sdk_language_condition.rb +65 -0
  31. data/lib/kameleoon/targeting/conditions/string_value_condition.rb +40 -0
  32. data/lib/kameleoon/targeting/conditions/target_experiment.rb +4 -8
  33. data/lib/kameleoon/targeting/conditions/unknown_condition.rb +15 -0
  34. data/lib/kameleoon/targeting/conditions/visitor_code_condition.rb +16 -0
  35. data/lib/kameleoon/targeting/models.rb +0 -24
  36. data/lib/kameleoon/utils.rb +1 -1
  37. data/lib/kameleoon/version.rb +28 -1
  38. metadata +28 -4
  39. data/lib/kameleoon/data.rb +0 -175
  40. data/lib/kameleoon/request.rb +0 -90
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/browser'
4
+ require 'kameleoon/version'
5
+
6
+ module Kameleoon
7
+ # @api private
8
+ module Targeting
9
+
10
+ CHROME = 'CHROME'
11
+ INTERNET_EXPLORER = 'IE'
12
+ FIREFOX = 'FIREFOX'
13
+ SAFARI = 'SAFARI'
14
+ OPERA = 'OPERA'
15
+
16
+ # BrowserCondition is a condition for checking targeting with browser's type and version
17
+ class BrowserCondition < Condition
18
+ def initialize(json_condition)
19
+ super(json_condition)
20
+ @browser_type = browser_index_from_name(json_condition['browser'])
21
+ @version = json_condition['version']
22
+ @version_match_type = json_condition['versionMatchType']
23
+ end
24
+
25
+ def check(list_data)
26
+ browser = get_last_targeting_data(list_data, Kameleoon::DataType::BROWSER)
27
+ browser && check_targeting(browser)
28
+ end
29
+
30
+ private
31
+
32
+ def check_targeting(browser)
33
+ return false if @browser_type != browser.type
34
+
35
+ return true if @version.nil?
36
+
37
+ version_number = SdkVersion.get_float_version(@version)
38
+ return false if version_number.nan?
39
+
40
+ case @version_match_type
41
+ when Operator::EQUAL
42
+ browser.version == version_number
43
+ when Operator::GREATER
44
+ browser.version > version_number
45
+ when Operator::LOWER
46
+ browser.version < version_number
47
+ else
48
+ puts "Unexpected comparing operation for Browser condition: #{@version_match_type}"
49
+ false
50
+ end
51
+ end
52
+
53
+ def browser_index_from_name(name)
54
+ case name
55
+ when CHROME
56
+ BrowserType::CHROME
57
+ when INTERNET_EXPLORER
58
+ BrowserType::INTERNET_EXPLORER
59
+ when FIREFOX
60
+ BrowserType::FIREFOX
61
+ when SAFARI
62
+ BrowserType::SAFARI
63
+ when OPERA
64
+ BrowserType::OPERA
65
+ else
66
+ BrowserType::OTHER
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+
5
+ module Kameleoon
6
+ # @api private
7
+ module Targeting
8
+ # ConversionCondition is a condition for checking targeting of conversions of visitor
9
+ class ConversionCondition < Condition
10
+ def initialize(json_condition)
11
+ super(json_condition)
12
+ @goal_id = json_condition['goalId']
13
+ end
14
+
15
+ def check(list_data)
16
+ conversion = get_last_targeting_data(list_data, Kameleoon::DataType::CONVERSION)
17
+ conversion && (@goal_id.nil? || @goal_id == conversion.goal_id)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -11,90 +11,85 @@ module Kameleoon
11
11
  class CustomDatum < Condition
12
12
  include Kameleoon::Exception
13
13
 
14
- def initialize(json_condition)
15
- super(json_condition)
16
- @index = json_condition['customDataIndex']
17
-
18
- if json_condition['valueMatchType'].nil?
19
- raise Exception::NotFound.new('valueMatchType'), 'valueMatchType missed'
14
+ class << self
15
+ def op_match(values, value)
16
+ re = Regexp.new(value.to_s)
17
+ values.any? { |v| re.match(v) }
20
18
  end
21
19
 
22
- @operator = json_condition['valueMatchType']
23
-
24
- @value = json_condition['value']
25
-
26
- @type = ConditionType::CUSTOM_DATUM
27
-
28
- if json_condition['include'].nil? && json_condition['isInclude'].nil?
29
- raise Exception::NotFound.new('include / isInclude missed'), 'include / isInclude missed'
20
+ def op_contains(values, value)
21
+ values.any? { |v| v.to_s.include? value.to_s }
30
22
  end
31
23
 
32
- @include = json_condition['include'] || json_condition['isInclude']
33
-
34
- @op = {
35
- Operator::MATCH.to_s => method(:op_match),
36
- Operator::CONTAINS.to_s => method(:op_contains),
37
- Operator::EXACT.to_s => method(:op_exact),
38
- Operator::EQUAL.to_s => method(:op_equal),
39
- Operator::GREATER.to_s => method(:op_greater),
40
- Operator::LOWER.to_s => method(:op_lower),
41
- Operator::IS_TRUE.to_s => method(:op_is_true),
42
- Operator::IS_FALSE.to_s => method(:op_is_false),
43
- Operator::AMONG_VALUES.to_s => method(:op_among_values),
44
- }[@operator]
45
- end
24
+ def op_exact(values, value)
25
+ values.include? value.to_s
26
+ end
46
27
 
47
- def check(datas)
48
- is_targeted = false
49
- custom_data = datas.select { |data| data.instance == DataType::CUSTOM && data.id == @index }.last
50
- if custom_data.nil?
51
- is_targeted = (@operator == Operator::UNDEFINED.to_s)
52
- elsif @operator != Operator::UNDEFINED.to_s
53
- raise KameleoonError.new("Undefined operator #{@operator}"), "Undefined operator #{@operator}" if @op.nil?
28
+ def op_equal(values, value)
29
+ values.any? { |v| v.to_f == value.to_f }
30
+ end
54
31
 
55
- is_targeted = @op.call(custom_data.values)
32
+ def op_greater(values, value)
33
+ values.any? { |v| v.to_f > value.to_f }
56
34
  end
57
- is_targeted
58
- end
59
35
 
60
- private
36
+ def op_lower(values, value)
37
+ values.any? { |v| v.to_f < value.to_f }
38
+ end
61
39
 
62
- def op_match(values)
63
- re = Regexp.new(@value.to_s)
64
- values.any? { |v| re.match(v) }
65
- end
40
+ def op_is_true(values, _value)
41
+ values.any? { |v| v.to_s == 'true' }
42
+ end
66
43
 
67
- def op_contains(values)
68
- values.any? { |v| v.to_s.include? @value.to_s }
69
- end
44
+ def op_is_false(values, _value)
45
+ values.any? { |v| v.to_s == 'false' }
46
+ end
70
47
 
71
- def op_exact(values)
72
- values.include? @value.to_s
48
+ def op_among_values(values, value)
49
+ all_matches = JSON.parse(value.to_s).map(&:to_s).to_set
50
+ values.any? { |v| all_matches.include?(v) }
51
+ end
73
52
  end
74
53
 
75
- def op_equal(values)
76
- values.any? { |v| v.to_f == @value.to_f }
77
- end
54
+ @@op = {
55
+ Operator::REGULAR_EXPRESSION => method(:op_match),
56
+ Operator::CONTAINS => method(:op_contains),
57
+ Operator::EXACT => method(:op_exact),
58
+ Operator::EQUAL => method(:op_equal),
59
+ Operator::GREATER => method(:op_greater),
60
+ Operator::LOWER => method(:op_lower),
61
+ Operator::IS_TRUE => method(:op_is_true),
62
+ Operator::IS_FALSE => method(:op_is_false),
63
+ Operator::AMONG_VALUES => method(:op_among_values)
64
+ }
78
65
 
79
- def op_greater(values)
80
- values.any? { |v| v.to_f > @value.to_f }
81
- end
66
+ def initialize(json_condition)
67
+ super(json_condition)
82
68
 
83
- def op_lower(values)
84
- values.any? { |v| v.to_f < @value.to_f }
85
- end
69
+ if json_condition['valueMatchType'].nil?
70
+ raise Exception::NotFound.new('valueMatchType'), 'valueMatchType missed'
71
+ end
86
72
 
87
- def op_is_true(values)
88
- values.any? { |v| v.to_s == 'true' }
73
+ @type = ConditionType::CUSTOM_DATUM
74
+ @index = json_condition['customDataIndex']
75
+ @operator = json_condition['valueMatchType']
76
+ @value = json_condition['value']
89
77
  end
90
78
 
91
- def op_is_false(values)
92
- values.any? { |v| v.to_s == 'false' }
93
- end
79
+ def check(list_data)
80
+ is_targeted = false
81
+ custom_data = list_data.select { |data| data.instance == DataType::CUSTOM && data.id == @index }.last
82
+ if custom_data.nil?
83
+ is_targeted = (@operator == Operator::UNDEFINED.to_s)
84
+ elsif @operator != Operator::UNDEFINED.to_s
85
+ @operation = @@op[@operator]
86
+ unless @operation
87
+ raise KameleoonError.new("Undefined operator #{@operator}"), "Undefined operator #{@operator}"
88
+ end
94
89
 
95
- def op_among_values(values)
96
- all_matches = JSON.parse(@value.to_s).map(&:to_s).to_set
97
- values.any? { |v| all_matches.include?(v) }
90
+ is_targeted = @operation.call(custom_data.values, @value)
91
+ end
92
+ is_targeted
98
93
  end
99
94
  end
100
95
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+
5
+ module Kameleoon
6
+ # @api private
7
+ module Targeting
8
+ # DeviceCondition is a condition for checking device type
9
+ class DeviceCondition < Condition
10
+ def initialize(json_condition)
11
+ super(json_condition)
12
+ @device_type = json_condition['device']
13
+ end
14
+
15
+ def check(list_data)
16
+ device = get_last_targeting_data(list_data, Kameleoon::DataType::DEVICE)
17
+ device && @device_type == device.device_type
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,24 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'kameleoon/targeting/condition'
4
- require 'kameleoon/exceptions'
5
4
 
6
5
  module Kameleoon
7
6
  # @api private
8
7
  module Targeting
9
8
  # ExclusiveExperiment represents an instance of Exclusive Experiment condition in user account
10
9
  class ExclusiveExperiment < Condition
11
- include Kameleoon::Exception
12
-
13
- def initialize(json_condition)
14
- if json_condition['targetingType'].nil?
15
- raise Exception::NotFound.new('targetingType'), 'targetingType missed'
16
- end
17
-
18
- @type = json_condition['targetingType']
19
- @include = true
20
- end
21
-
22
10
  def check(data)
23
11
  experiment_id = data.experiment_id
24
12
  storage = data.storage
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+ require_relative 'string_value_condition'
5
+
6
+ module Kameleoon
7
+ # @api private
8
+ module Targeting
9
+ # PageTitleCondition is a condition for checking title of a page
10
+ class PageTitleCondition < StringValueCondition
11
+ def initialize(json_condition)
12
+ super(json_condition, json_condition['title'])
13
+ end
14
+
15
+ def check(list_data)
16
+ page_view = get_last_targeting_data(list_data, Kameleoon::DataType::PAGE_VIEW)
17
+ page_view && check_targeting(page_view.title)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+ require_relative 'string_value_condition'
5
+
6
+ module Kameleoon
7
+ # @api private
8
+ module Targeting
9
+ # PageUrlCondition is a condition for checking url of a page
10
+ class PageUrlCondition < StringValueCondition
11
+ def initialize(json_condition)
12
+ super(json_condition, json_condition['url'])
13
+ end
14
+
15
+ def check(list_data)
16
+ page_view = get_last_targeting_data(list_data, Kameleoon::DataType::PAGE_VIEW)
17
+ page_view && check_targeting(page_view.url)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+ require 'kameleoon/version'
5
+
6
+ module Kameleoon
7
+ # @api private
8
+ module Targeting
9
+ # Helper class for containing sdk information
10
+ class SdkInfo
11
+ attr_reader :language, :version
12
+
13
+ def initialize(language, version)
14
+ @language = language
15
+ @version = version
16
+ end
17
+ end
18
+
19
+ # SdkLanguageCondition is a condition for checking targeting sdk type and version
20
+ class SdkLanguageCondition < Condition
21
+ def initialize(json_condition)
22
+ super(json_condition)
23
+ @sdk_language = json_condition['sdkLanguage']
24
+ @version = json_condition['version']
25
+ @operator = json_condition['versionMatchType']
26
+ end
27
+
28
+ def check(data)
29
+ data.is_a?(SdkInfo) && check_targeting(data)
30
+ end
31
+
32
+ private
33
+
34
+ def check_targeting(sdk_info)
35
+ return false if @sdk_language != sdk_info.language
36
+
37
+ return true if @version.nil?
38
+
39
+ version_components_condition = SdkVersion.get_version_components(@version)
40
+ version_components_sdk_info = SdkVersion.get_version_components(sdk_info.version)
41
+
42
+ return false if version_components_condition.nil? || version_components_sdk_info.nil?
43
+
44
+ major_condition, minor_condition, patch_condition = version_components_condition
45
+ major_sdk, minor_sdk, patch_sdk = version_components_sdk_info
46
+
47
+ case @operator
48
+ when Operator::EQUAL
49
+ major_sdk == major_condition && minor_sdk == minor_condition && patch_sdk == patch_condition
50
+ when Operator::GREATER
51
+ major_sdk > major_condition ||
52
+ (major_sdk == major_condition && minor_sdk > minor_condition) ||
53
+ (major_sdk == major_condition && minor_sdk == minor_condition && patch_sdk > patch_condition)
54
+ when Operator::LOWER
55
+ major_sdk < major_condition ||
56
+ (major_sdk == major_condition && minor_sdk < minor_condition) ||
57
+ (major_sdk == major_condition && minor_sdk == minor_condition && patch_sdk < patch_condition)
58
+ else
59
+ puts "Unexpected comparing operation for SdkLanguage condition: #{@operator}"
60
+ false
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/targeting/condition'
4
+
5
+ module Kameleoon
6
+ # @api private
7
+ module Targeting
8
+ # StringValueCondition is a base class for all conditions where string comparison happens
9
+ class StringValueCondition < Condition
10
+ def initialize(json_condition, value)
11
+ super(json_condition)
12
+ @condition_value = value
13
+ @operator = json_condition['matchType']
14
+ end
15
+
16
+ def check(data)
17
+ data.is_a?(String) && check_targeting(data)
18
+ end
19
+
20
+ protected
21
+
22
+ def check_targeting(value)
23
+ return false if value.nil?
24
+
25
+ case @operator
26
+ when Operator::EXACT
27
+ value == @condition_value
28
+ when Operator::CONTAINS
29
+ value.include?(@condition_value)
30
+ when Operator::REGULAR_EXPRESSION
31
+ pattern = Regexp.new(@condition_value)
32
+ pattern.match?(value)
33
+ else
34
+ puts "Unexpected comparing operation for #{@type} condition: #{@operator}"
35
+ false
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -13,16 +13,12 @@ module Kameleoon
13
13
  def initialize(json_condition)
14
14
  super(json_condition)
15
15
 
16
- if json_condition['experiment'].nil?
17
- raise Exception::NotFound.new('experiment'), 'experiment missed'
18
- end
19
-
20
- @experiment = json_condition['experiment']
21
-
16
+ raise Exception::NotFound.new('experiment'), 'experiment missed' if json_condition['experiment'].nil?
22
17
  if json_condition['variationMatchType'].nil?
23
18
  raise Exception::NotFound.new('variationMatchType'), 'variationMatchType missed'
24
19
  end
25
20
 
21
+ @experiment = json_condition['experiment']
26
22
  @operator = json_condition['variationMatchType']
27
23
  @variation = json_condition['variation']
28
24
  end
@@ -32,9 +28,9 @@ module Kameleoon
32
28
  variation_storage_exist = !variation_storage.nil? && !variation_storage.empty?
33
29
  saved_variation = variation_storage[@experiment] unless variation_storage.nil?
34
30
  case @operator
35
- when Operator::EXACT.to_s
31
+ when Operator::EXACT
36
32
  is_targeted = variation_storage_exist && saved_variation == @variation
37
- when Operator::ANY.to_s
33
+ when Operator::ANY
38
34
  is_targeted = variation_storage_exist
39
35
  end
40
36
  is_targeted
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/targeting/condition'
4
+
5
+ module Kameleoon
6
+ # @api private
7
+ module Targeting
8
+ # UnknownCondition represents not defined condition, always returns that visitor is targeted (true)
9
+ class UnknownCondition < Condition
10
+ def check(_data)
11
+ true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kameleoon/data/data'
4
+ require_relative 'string_value_condition'
5
+
6
+ module Kameleoon
7
+ # @api private
8
+ module Targeting
9
+ # VisitorCodeCondition is a condition for checking of targeting by visitor code
10
+ class VisitorCodeCondition < StringValueCondition
11
+ def initialize(json_condition)
12
+ super(json_condition, json_condition['visitorCode'])
13
+ end
14
+ end
15
+ end
16
+ end
@@ -133,29 +133,5 @@ module Kameleoon
133
133
  Marshal.load(Marshal.dump(is_targeted)) # Deep copy
134
134
  end
135
135
  end
136
-
137
- module DataType
138
- CUSTOM = 'CUSTOM'
139
- end
140
-
141
- module ConditionType
142
- CUSTOM_DATUM = 'CUSTOM_DATUM'
143
- TARGET_EXPERIMENT = 'TARGET_EXPERIMENT'
144
- EXCLUSIVE_EXPERIMENT = 'EXCLUSIVE_EXPERIMENT'
145
- end
146
-
147
- module Operator
148
- UNDEFINED = 'UNDEFINED'
149
- CONTAINS = 'CONTAINS'
150
- EXACT = 'EXACT'
151
- MATCH = 'REGULAR_EXPRESSION'
152
- LOWER = 'LOWER'
153
- EQUAL = 'EQUAL'
154
- GREATER = 'GREATER'
155
- IS_TRUE = 'TRUE'
156
- IS_FALSE = 'FALSE'
157
- AMONG_VALUES = 'AMONG_VALUES'
158
- ANY = 'ANY'
159
- end
160
136
  end
161
137
  end
@@ -3,7 +3,7 @@
3
3
  module Kameleoon
4
4
  # Utils is a helper module for project
5
5
  module Utils
6
- ALPHA_NUMERIC_CHARS = 'abcdef0123456789'
6
+ ALPHA_NUMERIC_CHARS = 'ABCDEF0123456789'
7
7
 
8
8
  def self.in_seconds(days)
9
9
  days * 60 * 60 * 24
@@ -1,5 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kameleoon
4
- VERSION = '2.1.0'
4
+ SDK_NAME = 'RUBY'
5
+ SDK_VERSION = '2.2.0'
6
+
7
+ # SdkManager is a helper method for fetching / obtaining version of SDK from string
8
+ class SdkVersion
9
+ def self.get_version_components(version_string)
10
+ versions = [0, 0, 0]
11
+
12
+ version_parts = version_string.split('.')
13
+ version_parts.each_with_index do |part, i|
14
+ versions[i] = Integer(part)
15
+ rescue ArgumentError
16
+ puts "Invalid version component, index: #{i}, value: #{part}"
17
+ return nil
18
+ end
19
+ versions
20
+ end
21
+
22
+ def self.get_float_version(version_string)
23
+ version_components = get_version_components(version_string)
24
+
25
+ return Float::NAN if version_components.nil?
26
+
27
+ major = version_components[0]
28
+ minor = version_components[1]
29
+ "#{major}.#{minor}".to_f
30
+ end
31
+ end
5
32
  end
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: 2.1.0
4
+ version: 2.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: 2023-04-20 00:00:00.000000000 Z
11
+ date: 2023-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-http-request
@@ -84,25 +84,49 @@ files:
84
84
  - lib/kameleoon/configuration/variation.rb
85
85
  - lib/kameleoon/configuration/variation_exposition.rb
86
86
  - lib/kameleoon/cookie.rb
87
- - lib/kameleoon/data.rb
87
+ - lib/kameleoon/data/browser.rb
88
+ - lib/kameleoon/data/conversion.rb
89
+ - lib/kameleoon/data/custom_data.rb
90
+ - lib/kameleoon/data/data.rb
91
+ - lib/kameleoon/data/device.rb
92
+ - lib/kameleoon/data/page_view.rb
93
+ - lib/kameleoon/data/user_agent.rb
88
94
  - lib/kameleoon/exceptions.rb
89
95
  - lib/kameleoon/factory.rb
90
96
  - lib/kameleoon/hybrid/manager.rb
97
+ - lib/kameleoon/network/activity_event.rb
98
+ - lib/kameleoon/network/content_type.rb
99
+ - lib/kameleoon/network/experiment_event.rb
100
+ - lib/kameleoon/network/method.rb
101
+ - lib/kameleoon/network/net_provider.rb
102
+ - lib/kameleoon/network/network_manager.rb
103
+ - lib/kameleoon/network/request.rb
104
+ - lib/kameleoon/network/response.rb
105
+ - lib/kameleoon/network/uri_helper.rb
106
+ - lib/kameleoon/network/url_provider.rb
91
107
  - lib/kameleoon/real_time/real_time_configuration_service.rb
92
108
  - lib/kameleoon/real_time/real_time_event.rb
93
109
  - lib/kameleoon/real_time/sse_client.rb
94
110
  - lib/kameleoon/real_time/sse_message.rb
95
111
  - lib/kameleoon/real_time/sse_request.rb
96
- - lib/kameleoon/request.rb
97
112
  - lib/kameleoon/storage/cache.rb
98
113
  - lib/kameleoon/storage/cache_factory.rb
99
114
  - lib/kameleoon/storage/variation_storage.rb
100
115
  - lib/kameleoon/storage/visitor_variation.rb
101
116
  - lib/kameleoon/targeting/condition.rb
102
117
  - lib/kameleoon/targeting/condition_factory.rb
118
+ - lib/kameleoon/targeting/conditions/browser_condition.rb
119
+ - lib/kameleoon/targeting/conditions/conversion_condition.rb
103
120
  - lib/kameleoon/targeting/conditions/custom_datum.rb
121
+ - lib/kameleoon/targeting/conditions/device_condition.rb
104
122
  - lib/kameleoon/targeting/conditions/exclusive_experiment.rb
123
+ - lib/kameleoon/targeting/conditions/page_title_condition.rb
124
+ - lib/kameleoon/targeting/conditions/page_url_condition.rb
125
+ - lib/kameleoon/targeting/conditions/sdk_language_condition.rb
126
+ - lib/kameleoon/targeting/conditions/string_value_condition.rb
105
127
  - lib/kameleoon/targeting/conditions/target_experiment.rb
128
+ - lib/kameleoon/targeting/conditions/unknown_condition.rb
129
+ - lib/kameleoon/targeting/conditions/visitor_code_condition.rb
106
130
  - lib/kameleoon/targeting/models.rb
107
131
  - lib/kameleoon/targeting/tree_builder.rb
108
132
  - lib/kameleoon/utils.rb