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.
- checksums.yaml +4 -4
- data/lib/kameleoon/client.rb +105 -151
- data/lib/kameleoon/configuration/rule.rb +1 -1
- data/lib/kameleoon/data/browser.rb +39 -0
- data/lib/kameleoon/data/conversion.rb +33 -0
- data/lib/kameleoon/data/custom_data.rb +60 -0
- data/lib/kameleoon/data/data.rb +38 -0
- data/lib/kameleoon/data/device.rb +31 -0
- data/lib/kameleoon/data/page_view.rb +34 -0
- data/lib/kameleoon/data/user_agent.rb +14 -0
- data/lib/kameleoon/network/activity_event.rb +31 -0
- data/lib/kameleoon/network/content_type.rb +11 -0
- data/lib/kameleoon/network/experiment_event.rb +35 -0
- data/lib/kameleoon/network/method.rb +10 -0
- data/lib/kameleoon/network/net_provider.rb +91 -0
- data/lib/kameleoon/network/network_manager.rb +114 -0
- data/lib/kameleoon/network/request.rb +20 -0
- data/lib/kameleoon/network/response.rb +30 -0
- data/lib/kameleoon/network/uri_helper.rb +37 -0
- data/lib/kameleoon/network/url_provider.rb +71 -0
- data/lib/kameleoon/targeting/condition.rb +40 -11
- data/lib/kameleoon/targeting/condition_factory.rb +35 -12
- data/lib/kameleoon/targeting/conditions/browser_condition.rb +71 -0
- data/lib/kameleoon/targeting/conditions/conversion_condition.rb +21 -0
- data/lib/kameleoon/targeting/conditions/custom_datum.rb +60 -65
- data/lib/kameleoon/targeting/conditions/device_condition.rb +21 -0
- data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +0 -12
- data/lib/kameleoon/targeting/conditions/page_title_condition.rb +21 -0
- data/lib/kameleoon/targeting/conditions/page_url_condition.rb +21 -0
- data/lib/kameleoon/targeting/conditions/sdk_language_condition.rb +65 -0
- data/lib/kameleoon/targeting/conditions/string_value_condition.rb +40 -0
- data/lib/kameleoon/targeting/conditions/target_experiment.rb +4 -8
- data/lib/kameleoon/targeting/conditions/unknown_condition.rb +15 -0
- data/lib/kameleoon/targeting/conditions/visitor_code_condition.rb +16 -0
- data/lib/kameleoon/targeting/models.rb +0 -24
- data/lib/kameleoon/utils.rb +1 -1
- data/lib/kameleoon/version.rb +28 -1
- metadata +28 -4
- data/lib/kameleoon/data.rb +0 -175
- 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
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
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
|
-
|
36
|
+
def op_lower(values, value)
|
37
|
+
values.any? { |v| v.to_f < value.to_f }
|
38
|
+
end
|
61
39
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
40
|
+
def op_is_true(values, _value)
|
41
|
+
values.any? { |v| v.to_s == 'true' }
|
42
|
+
end
|
66
43
|
|
67
|
-
|
68
|
-
|
69
|
-
|
44
|
+
def op_is_false(values, _value)
|
45
|
+
values.any? { |v| v.to_s == 'false' }
|
46
|
+
end
|
70
47
|
|
71
|
-
|
72
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
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
|
80
|
-
|
81
|
-
end
|
66
|
+
def initialize(json_condition)
|
67
|
+
super(json_condition)
|
82
68
|
|
83
|
-
|
84
|
-
|
85
|
-
|
69
|
+
if json_condition['valueMatchType'].nil?
|
70
|
+
raise Exception::NotFound.new('valueMatchType'), 'valueMatchType missed'
|
71
|
+
end
|
86
72
|
|
87
|
-
|
88
|
-
|
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
|
92
|
-
|
93
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
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
|
31
|
+
when Operator::EXACT
|
36
32
|
is_targeted = variation_storage_exist && saved_variation == @variation
|
37
|
-
when Operator::ANY
|
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
|
data/lib/kameleoon/utils.rb
CHANGED
data/lib/kameleoon/version.rb
CHANGED
@@ -1,5 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Kameleoon
|
4
|
-
|
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.
|
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-
|
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
|