kameleoon-client-ruby 2.0.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kameleoon/client.rb +277 -260
  3. data/lib/kameleoon/configuration/feature_flag.rb +13 -24
  4. data/lib/kameleoon/configuration/rule.rb +17 -5
  5. data/lib/kameleoon/configuration/settings.rb +20 -0
  6. data/lib/kameleoon/cookie.rb +3 -3
  7. data/lib/kameleoon/data/browser.rb +33 -0
  8. data/lib/kameleoon/data/conversion.rb +26 -0
  9. data/lib/kameleoon/data/custom_data.rb +53 -0
  10. data/lib/kameleoon/data/data.rb +35 -0
  11. data/lib/kameleoon/data/device.rb +26 -0
  12. data/lib/kameleoon/data/page_view.rb +31 -0
  13. data/lib/kameleoon/data/user_agent.rb +14 -0
  14. data/lib/kameleoon/hybrid/manager.rb +60 -0
  15. data/lib/kameleoon/network/activity_event.rb +31 -0
  16. data/lib/kameleoon/network/experiment_event.rb +35 -0
  17. data/lib/kameleoon/network/uri_helper.rb +36 -0
  18. data/lib/kameleoon/network/url_provider.rb +71 -0
  19. data/lib/kameleoon/real_time/real_time_configuration_service.rb +98 -0
  20. data/lib/kameleoon/real_time/real_time_event.rb +22 -0
  21. data/lib/kameleoon/real_time/sse_client.rb +111 -0
  22. data/lib/kameleoon/real_time/sse_message.rb +23 -0
  23. data/lib/kameleoon/real_time/sse_request.rb +59 -0
  24. data/lib/kameleoon/request.rb +5 -19
  25. data/lib/kameleoon/storage/cache.rb +84 -0
  26. data/lib/kameleoon/storage/cache_factory.rb +23 -0
  27. data/lib/kameleoon/targeting/condition.rb +41 -12
  28. data/lib/kameleoon/targeting/condition_factory.rb +35 -12
  29. data/lib/kameleoon/targeting/conditions/browser_condition.rb +71 -0
  30. data/lib/kameleoon/targeting/conditions/conversion_condition.rb +21 -0
  31. data/lib/kameleoon/targeting/conditions/custom_datum.rb +64 -34
  32. data/lib/kameleoon/targeting/conditions/device_condition.rb +21 -0
  33. data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +0 -12
  34. data/lib/kameleoon/targeting/conditions/page_title_condition.rb +21 -0
  35. data/lib/kameleoon/targeting/conditions/page_url_condition.rb +21 -0
  36. data/lib/kameleoon/targeting/conditions/sdk_language_condition.rb +65 -0
  37. data/lib/kameleoon/targeting/conditions/string_value_condition.rb +40 -0
  38. data/lib/kameleoon/targeting/conditions/target_experiment.rb +5 -9
  39. data/lib/kameleoon/targeting/conditions/unknown_condition.rb +15 -0
  40. data/lib/kameleoon/targeting/conditions/visitor_code_condition.rb +16 -0
  41. data/lib/kameleoon/targeting/models.rb +0 -24
  42. data/lib/kameleoon/utils.rb +1 -1
  43. data/lib/kameleoon/version.rb +28 -1
  44. metadata +45 -4
  45. data/lib/kameleoon/configuration/feature_flag_v2.rb +0 -30
  46. data/lib/kameleoon/data.rb +0 -169
@@ -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
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'set'
4
+ require 'json'
3
5
  require 'kameleoon/targeting/condition'
4
6
  require 'kameleoon/exceptions'
5
7
 
@@ -9,55 +11,83 @@ module Kameleoon
9
11
  class CustomDatum < Condition
10
12
  include Kameleoon::Exception
11
13
 
12
- def initialize(json_condition)
13
- super(json_condition)
14
- @index = json_condition['customDataIndex']
14
+ class << self
15
+ def op_match(values, value)
16
+ re = Regexp.new(value.to_s)
17
+ values.any? { |v| re.match(v) }
18
+ end
15
19
 
16
- if json_condition['valueMatchType'].nil?
17
- raise Exception::NotFoundError.new('valueMatchType'), 'valueMatchType missed'
20
+ def op_contains(values, value)
21
+ values.any? { |v| v.to_s.include? value.to_s }
18
22
  end
19
23
 
20
- @operator = json_condition['valueMatchType']
24
+ def op_exact(values, value)
25
+ values.include? value.to_s
26
+ end
21
27
 
22
- @value = json_condition['value']
28
+ def op_equal(values, value)
29
+ values.any? { |v| v.to_f == value.to_f }
30
+ end
23
31
 
24
- @type = ConditionType::CUSTOM_DATUM
32
+ def op_greater(values, value)
33
+ values.any? { |v| v.to_f > value.to_f }
34
+ end
35
+
36
+ def op_lower(values, value)
37
+ values.any? { |v| v.to_f < value.to_f }
38
+ end
39
+
40
+ def op_is_true(values, _value)
41
+ values.any? { |v| v.to_s == 'true' }
42
+ end
25
43
 
26
- if json_condition['include'].nil? && json_condition['isInclude'].nil?
27
- raise Exception::NotFoundError.new('include / isInclude missed'), 'include / isInclude missed'
44
+ def op_is_false(values, _value)
45
+ values.any? { |v| v.to_s == 'false' }
28
46
  end
29
47
 
30
- @include = json_condition['include'] || json_condition['isInclude']
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
31
52
  end
32
53
 
33
- def check(datas)
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
+ }
65
+
66
+ def initialize(json_condition)
67
+ super(json_condition)
68
+
69
+ if json_condition['valueMatchType'].nil?
70
+ raise Exception::NotFound.new('valueMatchType'), 'valueMatchType missed'
71
+ end
72
+
73
+ @type = ConditionType::CUSTOM_DATUM
74
+ @index = json_condition['customDataIndex']
75
+ @operator = json_condition['valueMatchType']
76
+ @value = json_condition['value']
77
+ end
78
+
79
+ def check(list_data)
34
80
  is_targeted = false
35
- custom_data = datas.select { |data| data.instance == DataType::CUSTOM && data.id == @index }.last
81
+ custom_data = list_data.select { |data| data.instance == DataType::CUSTOM && data.id == @index }.last
36
82
  if custom_data.nil?
37
83
  is_targeted = (@operator == Operator::UNDEFINED.to_s)
38
- else
39
- case @operator
40
- when Operator::MATCH.to_s
41
- is_targeted = !Regexp.new(@value.to_s).match(custom_data.value.to_s).nil?
42
- when Operator::CONTAINS.to_s
43
- is_targeted = custom_data.value.to_s.include? @value
44
- when Operator::EXACT.to_s
45
- is_targeted = custom_data.value.to_s == @value.to_s
46
- when Operator::EQUAL.to_s
47
- is_targeted = custom_data.value.to_f == @value.to_f
48
- when Operator::GREATER.to_s
49
- is_targeted = custom_data.value.to_f > @value.to_f
50
- when Operator::LOWER.to_s
51
- is_targeted = custom_data.value.to_f < @value.to_f
52
- when Operator::IS_TRUE.to_s
53
- is_targeted = custom_data.value == 'true'
54
- when Operator::IS_FALSE.to_s
55
- is_targeted = custom_data.value == 'false'
56
- when Operator::AMONG_VALUES.to_s
57
- is_targeted = @value.scan(/"([^"]*)"/).flatten.include?(custom_data.value)
58
- else
84
+ elsif @operator != Operator::UNDEFINED.to_s
85
+ @operation = @@op[@operator]
86
+ unless @operation
59
87
  raise KameleoonError.new("Undefined operator #{@operator}"), "Undefined operator #{@operator}"
60
88
  end
89
+
90
+ is_targeted = @operation.call(custom_data.values, @value)
61
91
  end
62
92
  is_targeted
63
93
  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::NotFoundError.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::NotFoundError.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
- raise Exception::NotFoundError.new('variationMatchType'), 'variationMatchType missed'
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.0.0'
4
+ SDK_NAME = 'RUBY'
5
+ SDK_VERSION = '2.1.1'
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.0.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kameleoon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-02-02 00:00:00.000000000 Z
11
+ date: 2023-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-http-request
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rest-client
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.1'
55
69
  description: Kameleoon Client Ruby Software Development Kit
56
70
  email:
57
71
  - sdk@kameleoon.com
@@ -64,23 +78,50 @@ files:
64
78
  - lib/kameleoon/client.rb
65
79
  - lib/kameleoon/configuration/experiment.rb
66
80
  - lib/kameleoon/configuration/feature_flag.rb
67
- - lib/kameleoon/configuration/feature_flag_v2.rb
68
81
  - lib/kameleoon/configuration/rule.rb
82
+ - lib/kameleoon/configuration/settings.rb
69
83
  - lib/kameleoon/configuration/variable.rb
70
84
  - lib/kameleoon/configuration/variation.rb
71
85
  - lib/kameleoon/configuration/variation_exposition.rb
72
86
  - lib/kameleoon/cookie.rb
73
- - 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
74
94
  - lib/kameleoon/exceptions.rb
75
95
  - lib/kameleoon/factory.rb
96
+ - lib/kameleoon/hybrid/manager.rb
97
+ - lib/kameleoon/network/activity_event.rb
98
+ - lib/kameleoon/network/experiment_event.rb
99
+ - lib/kameleoon/network/uri_helper.rb
100
+ - lib/kameleoon/network/url_provider.rb
101
+ - lib/kameleoon/real_time/real_time_configuration_service.rb
102
+ - lib/kameleoon/real_time/real_time_event.rb
103
+ - lib/kameleoon/real_time/sse_client.rb
104
+ - lib/kameleoon/real_time/sse_message.rb
105
+ - lib/kameleoon/real_time/sse_request.rb
76
106
  - lib/kameleoon/request.rb
107
+ - lib/kameleoon/storage/cache.rb
108
+ - lib/kameleoon/storage/cache_factory.rb
77
109
  - lib/kameleoon/storage/variation_storage.rb
78
110
  - lib/kameleoon/storage/visitor_variation.rb
79
111
  - lib/kameleoon/targeting/condition.rb
80
112
  - lib/kameleoon/targeting/condition_factory.rb
113
+ - lib/kameleoon/targeting/conditions/browser_condition.rb
114
+ - lib/kameleoon/targeting/conditions/conversion_condition.rb
81
115
  - lib/kameleoon/targeting/conditions/custom_datum.rb
116
+ - lib/kameleoon/targeting/conditions/device_condition.rb
82
117
  - lib/kameleoon/targeting/conditions/exclusive_experiment.rb
118
+ - lib/kameleoon/targeting/conditions/page_title_condition.rb
119
+ - lib/kameleoon/targeting/conditions/page_url_condition.rb
120
+ - lib/kameleoon/targeting/conditions/sdk_language_condition.rb
121
+ - lib/kameleoon/targeting/conditions/string_value_condition.rb
83
122
  - lib/kameleoon/targeting/conditions/target_experiment.rb
123
+ - lib/kameleoon/targeting/conditions/unknown_condition.rb
124
+ - lib/kameleoon/targeting/conditions/visitor_code_condition.rb
84
125
  - lib/kameleoon/targeting/models.rb
85
126
  - lib/kameleoon/targeting/tree_builder.rb
86
127
  - lib/kameleoon/utils.rb
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'rule'
4
- require_relative 'variation'
5
-
6
- module Kameleoon
7
- # Module which contains all internal data of SDK
8
- module Configuration
9
- # Class for manage all feature flags v2 with rules
10
- class FeatureFlagV2
11
- attr_accessor :id, :feature_key, :variations, :default_variation_key, :rules
12
-
13
- def self.create_from_array(array)
14
- array&.map { |it| FeatureFlagV2.new(it) }
15
- end
16
-
17
- def initialize(hash)
18
- @id = hash['id']
19
- @feature_key = hash['featureKey']
20
- @default_variation_key = hash['defaultVariationKey']
21
- @variations = Variation.create_from_array(hash['variations'])
22
- @rules = Rule.create_from_array(hash['rules'])
23
- end
24
-
25
- def get_variation_key(key)
26
- variations.select { |v| v.key == key }.first
27
- end
28
- end
29
- end
30
- end