kameleoon-client-ruby 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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