kameleoon-client-ruby 2.3.0 → 3.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kameleoon/client_readiness.rb +40 -0
  3. data/lib/kameleoon/configuration/data_file.rb +41 -0
  4. data/lib/kameleoon/configuration/feature_flag.rb +3 -2
  5. data/lib/kameleoon/configuration/rule.rb +18 -3
  6. data/lib/kameleoon/configuration/settings.rb +5 -0
  7. data/lib/kameleoon/configuration/variable.rb +0 -2
  8. data/lib/kameleoon/configuration/variation_exposition.rb +0 -2
  9. data/lib/kameleoon/data/browser.rb +1 -1
  10. data/lib/kameleoon/data/conversion.rb +1 -1
  11. data/lib/kameleoon/data/custom_data.rb +10 -14
  12. data/lib/kameleoon/data/data.rb +22 -3
  13. data/lib/kameleoon/data/device.rb +2 -1
  14. data/lib/kameleoon/data/manager/assigned_variation.rb +38 -0
  15. data/lib/kameleoon/data/manager/data_array_storage.rb +43 -0
  16. data/lib/kameleoon/data/manager/data_map_storage.rb +43 -0
  17. data/lib/kameleoon/data/manager/page_view_visit.rb +19 -0
  18. data/lib/kameleoon/data/manager/visitor.rb +142 -0
  19. data/lib/kameleoon/data/manager/visitor_manager.rb +71 -0
  20. data/lib/kameleoon/data/page_view.rb +2 -1
  21. data/lib/kameleoon/exceptions.rb +30 -35
  22. data/lib/kameleoon/hybrid/manager.rb +13 -31
  23. data/lib/kameleoon/{client.rb → kameleoon_client.rb} +194 -334
  24. data/lib/kameleoon/kameleoon_client_config.rb +91 -0
  25. data/lib/kameleoon/kameleoon_client_factory.rb +42 -0
  26. data/lib/kameleoon/managers/warehouse/warehouse_manager.rb +33 -0
  27. data/lib/kameleoon/network/access_token_source.rb +109 -0
  28. data/lib/kameleoon/network/activity_event.rb +6 -3
  29. data/lib/kameleoon/network/cookie/cookie_manager.rb +84 -0
  30. data/lib/kameleoon/network/net_provider.rb +25 -58
  31. data/lib/kameleoon/network/network_manager.rb +65 -43
  32. data/lib/kameleoon/network/request.rb +7 -2
  33. data/lib/kameleoon/network/response.rb +0 -8
  34. data/lib/kameleoon/network/url_provider.rb +30 -12
  35. data/lib/kameleoon/real_time/sse_client.rb +2 -0
  36. data/lib/kameleoon/targeting/conditions/browser_condition.rb +2 -3
  37. data/lib/kameleoon/targeting/conditions/conversion_condition.rb +12 -4
  38. data/lib/kameleoon/targeting/conditions/custom_datum.rb +19 -13
  39. data/lib/kameleoon/targeting/conditions/device_condition.rb +3 -4
  40. data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +2 -1
  41. data/lib/kameleoon/targeting/conditions/page_title_condition.rb +11 -4
  42. data/lib/kameleoon/targeting/conditions/page_url_condition.rb +18 -4
  43. data/lib/kameleoon/targeting/conditions/string_value_condition.rb +2 -0
  44. data/lib/kameleoon/targeting/conditions/target_experiment.rb +11 -6
  45. data/lib/kameleoon/utils.rb +41 -4
  46. data/lib/kameleoon/version.rb +1 -1
  47. data/lib/kameleoon.rb +4 -2
  48. metadata +16 -10
  49. data/lib/kameleoon/client_config.rb +0 -44
  50. data/lib/kameleoon/configuration/experiment.rb +0 -42
  51. data/lib/kameleoon/cookie.rb +0 -88
  52. data/lib/kameleoon/factory.rb +0 -43
  53. data/lib/kameleoon/network/experiment_event.rb +0 -35
  54. data/lib/kameleoon/storage/variation_storage.rb +0 -42
  55. data/lib/kameleoon/storage/visitor_variation.rb +0 -20
@@ -5,16 +5,21 @@ module Kameleoon
5
5
  ##
6
6
  # Request represents HTTP request.
7
7
  class Request
8
- attr_reader :method, :url, :content_type, :timeout, :user_agent, :data
8
+ attr_reader :method, :url, :content_type, :timeout, :user_agent, :extra_headers, :data, :access_token
9
9
 
10
- def initialize(method, url, content_type, timeout, user_agent = nil, data = nil)
10
+ def initialize(method, url, content_type, timeout, user_agent: nil, extra_headers: nil, data: nil)
11
11
  @method = method
12
12
  @url = url
13
13
  @content_type = content_type
14
14
  @timeout = timeout
15
15
  @user_agent = user_agent
16
+ @extra_headers = extra_headers
16
17
  @data = !data.nil? && data.is_a?(String) ? data.encode('UTF-8') : data
17
18
  end
19
+
20
+ def authorize(access_token)
21
+ @access_token = access_token
22
+ end
18
23
  end
19
24
  end
20
25
  end
@@ -18,13 +18,5 @@ module Kameleoon
18
18
  @error.nil? && (@code / 100 == 2)
19
19
  end
20
20
  end
21
-
22
- class DeferrableResponse < EventMachine::DefaultDeferrable
23
- attr_writer :response
24
-
25
- def callback(&blk)
26
- blk.call(@response)
27
- end
28
- end
29
21
  end
30
22
  end
@@ -12,17 +12,29 @@ module Kameleoon
12
12
  VISITOR_DATA_PATH = '/visit/visitor'
13
13
  GET_DATA_PATH = '/map/map'
14
14
  POST_DATA_PATH = '/map/maps'
15
- CONFIGURATION_API_URL = 'https://client-config.kameleoon.com/mobile'
16
- RT_CONFIGURATION_URL = 'https://events.kameleoon.com:8110/sse'
15
+ ACCESS_TOKEN_PATH = '/oauth/token'
17
16
 
18
- DEFAULT_DATA_API_URL = 'https://data.kameleoon.io'
19
- TEST_DATA_API_URL = 'https://data.kameleoon.net'
17
+ CONFIGURATION_API_URL_FORMAT = 'https://sdk-config.kameleoon.eu/%s'
18
+ RT_CONFIGURATION_URL = 'https://events.kameleoon.com:8110/sse'
19
+ DEFAULT_DATA_API_DOMAIN = 'data.kameleoon.io'
20
+ TEST_DATA_API_DOMAIN = 'data.kameleoon.net'
21
+ DEFAULT_AUTOMATION_API_DOMAIN = 'api.kameleoon.com'
22
+ TEST_AUTOMATION_API_DOMAIN = 'api.kameleoon.net'
20
23
 
21
- attr_reader :site_code, :data_api_url
24
+ attr_reader :site_code, :data_api_domain, :automation_api_domain
22
25
 
23
- def initialize(site_code, data_api_url)
26
+ def initialize(
27
+ site_code,
28
+ data_api_domain = DEFAULT_DATA_API_DOMAIN,
29
+ automation_api_domain = DEFAULT_AUTOMATION_API_DOMAIN
30
+ )
24
31
  @site_code = site_code
25
- @data_api_url = data_api_url
32
+ @data_api_domain = data_api_domain
33
+ @automation_api_domain = automation_api_domain
34
+ end
35
+
36
+ def apply_data_api_domain(domain)
37
+ @data_api_domain = domain if domain.is_a?(String)
26
38
  end
27
39
 
28
40
  def make_tracking_url(visitor_code)
@@ -32,7 +44,7 @@ module Kameleoon
32
44
  siteCode: @site_code,
33
45
  visitorCode: visitor_code
34
46
  }
35
- "#{@data_api_url}#{TRACKING_PATH}?#{UriHelper.encode_query(params)}"
47
+ "https://#{@data_api_domain}#{TRACKING_PATH}?#{UriHelper.encode_query(params)}"
36
48
  end
37
49
 
38
50
  def make_visitor_data_get_url(visitor_code)
@@ -44,7 +56,7 @@ module Kameleoon
44
56
  customData: true,
45
57
  version: 0
46
58
  }
47
- "#{@data_api_url}#{VISITOR_DATA_PATH}?#{UriHelper.encode_query(params)}"
59
+ "https://#{@data_api_domain}#{VISITOR_DATA_PATH}?#{UriHelper.encode_query(params)}"
48
60
  end
49
61
 
50
62
  def make_api_data_get_request_url(key)
@@ -52,20 +64,26 @@ module Kameleoon
52
64
  siteCode: @site_code,
53
65
  key: key
54
66
  }
55
- "#{@data_api_url}#{GET_DATA_PATH}?#{UriHelper.encode_query(params)}"
67
+ "https://#{@data_api_domain}#{GET_DATA_PATH}?#{UriHelper.encode_query(params)}"
56
68
  end
57
69
 
58
70
  def make_configuration_url(environment = nil, timestamp = nil)
59
- params = { siteCode: @site_code }
71
+ url = format(CONFIGURATION_API_URL_FORMAT, @site_code)
72
+ params = {}
60
73
  params[:environment] = environment unless environment.nil?
61
74
  params[:ts] = timestamp unless timestamp.nil?
62
- "#{CONFIGURATION_API_URL}?#{UriHelper.encode_query(params)}"
75
+ url = "#{url}?#{UriHelper.encode_query(params)}" unless params.empty?
76
+ url
63
77
  end
64
78
 
65
79
  def make_real_time_url
66
80
  params = { siteCode: @site_code }
67
81
  "#{RT_CONFIGURATION_URL}?#{UriHelper.encode_query(params)}"
68
82
  end
83
+
84
+ def make_access_token_url
85
+ "https://#{@automation_api_domain}#{ACCESS_TOKEN_PATH}"
86
+ end
69
87
  end
70
88
  end
71
89
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'kameleoon/real_time/sse_message'
4
4
 
5
+ # TODO: Fix hanging (https://project.kameleoon.net/issues/26520)
6
+
5
7
  module Kameleoon
6
8
  module RealTime
7
9
  ##
@@ -22,9 +22,8 @@ module Kameleoon
22
22
  @version_match_type = json_condition['versionMatchType']
23
23
  end
24
24
 
25
- def check(list_data)
26
- browser = get_last_targeting_data(list_data, Kameleoon::DataType::BROWSER)
27
- browser && check_targeting(browser)
25
+ def check(browser)
26
+ browser.is_a?(Kameleoon::Browser) && check_targeting(browser)
28
27
  end
29
28
 
30
29
  private
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kameleoon/data/data'
3
+ require 'kameleoon/data/conversion'
4
+ require 'kameleoon/data/manager/data_array_storage'
4
5
 
5
6
  module Kameleoon
6
7
  # @api private
@@ -12,9 +13,16 @@ module Kameleoon
12
13
  @goal_id = json_condition['goalId']
13
14
  end
14
15
 
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)
16
+ def check(conversion_storage)
17
+ return false unless conversion_storage.is_a?(Kameleoon::DataManager::DataArrayStorage)
18
+ return true if @goal_id.nil?
19
+
20
+ is_targeted = false
21
+ conversion_storage.enumerate do |conversion|
22
+ is_targeted = conversion.is_a?(Kameleoon::Conversion) && (@goal_id == conversion.goal_id)
23
+ break if is_targeted
24
+ end
25
+ is_targeted
18
26
  end
19
27
  end
20
28
  end
@@ -12,6 +12,10 @@ module Kameleoon
12
12
  include Kameleoon::Exception
13
13
 
14
14
  class << self
15
+ def op_undefined(values, value)
16
+ false
17
+ end
18
+
15
19
  def op_match(values, value)
16
20
  re = Regexp.new(value.to_s)
17
21
  values.any? { |v| re.match(v) }
@@ -26,7 +30,8 @@ module Kameleoon
26
30
  end
27
31
 
28
32
  def op_equal(values, value)
29
- values.any? { |v| v.to_f == value.to_f }
33
+ epsilon = 1e-9
34
+ values.any? { |v| (v.to_f - value.to_f).abs < epsilon }
30
35
  end
31
36
 
32
37
  def op_greater(values, value)
@@ -52,6 +57,7 @@ module Kameleoon
52
57
  end
53
58
 
54
59
  @@op = {
60
+ Operator::UNDEFINED => method(:op_undefined),
55
61
  Operator::REGULAR_EXPRESSION => method(:op_match),
56
62
  Operator::CONTAINS => method(:op_contains),
57
63
  Operator::EXACT => method(:op_exact),
@@ -71,24 +77,24 @@ module Kameleoon
71
77
  end
72
78
 
73
79
  @type = ConditionType::CUSTOM_DATUM
74
- @index = json_condition['customDataIndex']
80
+ @index = json_condition['customDataIndex'].to_i
75
81
  @operator = json_condition['valueMatchType']
82
+ @operation = @@op[@operator]
76
83
  @value = json_condition['value']
77
84
  end
78
85
 
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}"
86
+ def check(custom_data_storage)
87
+ is_targeted = nil
88
+ if custom_data_storage.is_a?(Kameleoon::DataManager::DataMapStorage)
89
+ custom_data = custom_data_storage.get(@index)
90
+ if custom_data.is_a?(Kameleoon::CustomData)
91
+ unless @operation
92
+ raise KameleoonError.new("Undefined operator #{@operator}"), "Undefined operator #{@operator}"
93
+ end
94
+ is_targeted = @operation.call(custom_data.values, @value)
88
95
  end
89
-
90
- is_targeted = @operation.call(custom_data.values, @value)
91
96
  end
97
+ is_targeted = (@operator == Operator::UNDEFINED.to_s) if is_targeted.nil?
92
98
  is_targeted
93
99
  end
94
100
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kameleoon/data/data'
3
+ require 'kameleoon/data/device'
4
4
 
5
5
  module Kameleoon
6
6
  # @api private
@@ -12,9 +12,8 @@ module Kameleoon
12
12
  @device_type = json_condition['device']
13
13
  end
14
14
 
15
- def check(list_data)
16
- device = get_last_targeting_data(list_data, Kameleoon::DataType::DEVICE)
17
- device && @device_type == device.device_type
15
+ def check(device)
16
+ device.is_a?(Kameleoon::Device) && @device_type == device.device_type
18
17
  end
19
18
  end
20
19
  end
@@ -10,7 +10,8 @@ module Kameleoon
10
10
  def check(data)
11
11
  experiment_id = data.experiment_id
12
12
  storage = data.storage
13
- storage.nil? || storage.empty? || (storage.length == 1 && !storage[experiment_id].nil?)
13
+ storage.is_a?(Kameleoon::DataManager::DataMapStorage) &&
14
+ (storage.size.zero? || ((storage.size == 1) && !storage.get(experiment_id).nil?))
14
15
  end
15
16
  end
16
17
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kameleoon/data/data'
3
+ require 'kameleoon/data/manager/data_map_storage'
4
+ require 'kameleoon/data/manager/page_view_visit'
4
5
  require_relative 'string_value_condition'
5
6
 
6
7
  module Kameleoon
@@ -12,9 +13,15 @@ module Kameleoon
12
13
  super(json_condition, json_condition['title'])
13
14
  end
14
15
 
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)
16
+ def check(page_view_visit_storage)
17
+ return false unless page_view_visit_storage.is_a?(Kameleoon::DataManager::DataMapStorage)
18
+
19
+ is_targeted = false
20
+ page_view_visit_storage.enumerate do |visit|
21
+ is_targeted = visit.is_a?(Kameleoon::DataManager::PageViewVisit) && check_targeting(visit.page_view.title)
22
+ break if is_targeted
23
+ end
24
+ is_targeted
18
25
  end
19
26
  end
20
27
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kameleoon/data/data'
3
+ require 'kameleoon/data/manager/data_map_storage'
4
+ require 'kameleoon/data/manager/page_view_visit'
4
5
  require_relative 'string_value_condition'
5
6
 
6
7
  module Kameleoon
@@ -12,9 +13,22 @@ module Kameleoon
12
13
  super(json_condition, json_condition['url'])
13
14
  end
14
15
 
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)
16
+ def check(page_view_visit_storage)
17
+ return false unless page_view_visit_storage.is_a?(Kameleoon::DataManager::DataMapStorage)
18
+ return !page_view_visit_storage.get(condition_value).nil? if operator == Operator::EXACT
19
+
20
+ is_targeted = false
21
+ page_view_visit_storage.enumerate do |visit|
22
+ is_targeted = check_page_view_visit(visit)
23
+ break if is_targeted
24
+ end
25
+ is_targeted
26
+ end
27
+
28
+ private
29
+
30
+ def check_page_view_visit(visit)
31
+ visit.is_a?(Kameleoon::DataManager::PageViewVisit) && check_targeting(visit.page_view.url)
18
32
  end
19
33
  end
20
34
  end
@@ -19,6 +19,8 @@ module Kameleoon
19
19
 
20
20
  protected
21
21
 
22
+ attr_reader :operator, :condition_value
23
+
22
24
  def check_targeting(value)
23
25
  return false if value.nil?
24
26
 
@@ -24,16 +24,21 @@ module Kameleoon
24
24
  end
25
25
 
26
26
  def check(variation_storage)
27
- is_targeted = false
28
- variation_storage_exist = !variation_storage.nil? && !variation_storage.empty?
29
- saved_variation = variation_storage[@experiment] unless variation_storage.nil?
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
+
30
33
  case @operator
31
34
  when Operator::EXACT
32
- is_targeted = variation_storage_exist && saved_variation == @variation
35
+ variation = variation_storage.get(@experiment)
36
+ variation.variation_id == @variation
33
37
  when Operator::ANY
34
- is_targeted = variation_storage_exist
38
+ true
39
+ else
40
+ false
35
41
  end
36
- is_targeted
37
42
  end
38
43
  end
39
44
  end
@@ -1,16 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'fiber'
4
+ require 'bigdecimal'
5
+ require 'kameleoon/utils'
6
+ require 'kameleoon/exceptions'
7
+
3
8
  module Kameleoon
4
9
  # Utils is a helper module for project
5
10
  module Utils
6
11
  ALPHA_NUMERIC_CHARS = 'ABCDEF0123456789'
7
12
 
8
- def self.in_seconds(days)
9
- days * 60 * 60 * 24
10
- end
11
-
12
13
  def self.generate_random_string(length)
13
14
  (1..length).map { ALPHA_NUMERIC_CHARS[rand(ALPHA_NUMERIC_CHARS.length)] }.join
14
15
  end
16
+
17
+ module VisitorCode
18
+ VISITOR_CODE_MAX_LENGTH = 255
19
+ VISITOR_CODE_LENGTH = 16
20
+
21
+ def self.validate(visitor_code)
22
+ raise Kameleoon::Exception::VisitorCodeInvalid, 'Empty visitor Code' if visitor_code&.empty?
23
+ if visitor_code.size > VISITOR_CODE_MAX_LENGTH
24
+ raise Kameleoon::Exception::VisitorCodeInvalid, "Visitor Code is longer than #{VISITOR_CODE_MAX_LENGTH} chars"
25
+ end
26
+ end
27
+
28
+ def self.generate
29
+ Utils.generate_random_string(VISITOR_CODE_LENGTH)
30
+ end
31
+ end
32
+
33
+ module HashDouble
34
+ def self.obtain(visitor_code, respool_times = {}, container_id = '')
35
+ obtain_helper(visitor_code, respool_times, container_id, '')
36
+ end
37
+
38
+ def self.obtain_rule(visitor_code, container_id = '', suffix = '')
39
+ obtain_helper(visitor_code, {}, container_id, suffix)
40
+ end
41
+
42
+ private
43
+
44
+ def self.obtain_helper(visitor_code, respool_times, container_id, suffix)
45
+ identifier = visitor_code.to_s
46
+ identifier += container_id.to_s
47
+ identifier += suffix.to_s
48
+ identifier += respool_times.sort.to_h.values.join.to_s if !respool_times.nil? && !respool_times.empty?
49
+ (Digest::SHA256.hexdigest(identifier.encode('UTF-8')).to_i(16) / (BigDecimal('2')**BigDecimal('256'))).round(16)
50
+ end
51
+ end
15
52
  end
16
53
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kameleoon
4
4
  SDK_NAME = 'RUBY'
5
- SDK_VERSION = '2.3.0'
5
+ SDK_VERSION = '3.1.0'
6
6
 
7
7
  # SdkManager is a helper method for fetching / obtaining version of SDK from string
8
8
  class SdkVersion
data/lib/kameleoon.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # Kameleoon Ruby Client SDK
3
5
  #
4
- require "kameleoon/factory"
5
- require "kameleoon/client"
6
+ require 'kameleoon/kameleoon_client_factory'
7
+ require 'kameleoon/kameleoon_client'
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.3.0
4
+ version: 3.1.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-10-02 00:00:00.000000000 Z
11
+ date: 2024-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-http-request
@@ -75,29 +75,37 @@ extra_rdoc_files: []
75
75
  files:
76
76
  - README.md
77
77
  - lib/kameleoon.rb
78
- - lib/kameleoon/client.rb
79
- - lib/kameleoon/client_config.rb
80
- - lib/kameleoon/configuration/experiment.rb
78
+ - lib/kameleoon/client_readiness.rb
79
+ - lib/kameleoon/configuration/data_file.rb
81
80
  - lib/kameleoon/configuration/feature_flag.rb
82
81
  - lib/kameleoon/configuration/rule.rb
83
82
  - lib/kameleoon/configuration/settings.rb
84
83
  - lib/kameleoon/configuration/variable.rb
85
84
  - lib/kameleoon/configuration/variation.rb
86
85
  - lib/kameleoon/configuration/variation_exposition.rb
87
- - lib/kameleoon/cookie.rb
88
86
  - lib/kameleoon/data/browser.rb
89
87
  - lib/kameleoon/data/conversion.rb
90
88
  - lib/kameleoon/data/custom_data.rb
91
89
  - lib/kameleoon/data/data.rb
92
90
  - lib/kameleoon/data/device.rb
91
+ - lib/kameleoon/data/manager/assigned_variation.rb
92
+ - lib/kameleoon/data/manager/data_array_storage.rb
93
+ - lib/kameleoon/data/manager/data_map_storage.rb
94
+ - lib/kameleoon/data/manager/page_view_visit.rb
95
+ - lib/kameleoon/data/manager/visitor.rb
96
+ - lib/kameleoon/data/manager/visitor_manager.rb
93
97
  - lib/kameleoon/data/page_view.rb
94
98
  - lib/kameleoon/data/user_agent.rb
95
99
  - lib/kameleoon/exceptions.rb
96
- - lib/kameleoon/factory.rb
97
100
  - lib/kameleoon/hybrid/manager.rb
101
+ - lib/kameleoon/kameleoon_client.rb
102
+ - lib/kameleoon/kameleoon_client_config.rb
103
+ - lib/kameleoon/kameleoon_client_factory.rb
104
+ - lib/kameleoon/managers/warehouse/warehouse_manager.rb
105
+ - lib/kameleoon/network/access_token_source.rb
98
106
  - lib/kameleoon/network/activity_event.rb
99
107
  - lib/kameleoon/network/content_type.rb
100
- - lib/kameleoon/network/experiment_event.rb
108
+ - lib/kameleoon/network/cookie/cookie_manager.rb
101
109
  - lib/kameleoon/network/method.rb
102
110
  - lib/kameleoon/network/net_provider.rb
103
111
  - lib/kameleoon/network/network_manager.rb
@@ -112,8 +120,6 @@ files:
112
120
  - lib/kameleoon/real_time/sse_request.rb
113
121
  - lib/kameleoon/storage/cache.rb
114
122
  - lib/kameleoon/storage/cache_factory.rb
115
- - lib/kameleoon/storage/variation_storage.rb
116
- - lib/kameleoon/storage/visitor_variation.rb
117
123
  - lib/kameleoon/targeting/condition.rb
118
124
  - lib/kameleoon/targeting/condition_factory.rb
119
125
  - lib/kameleoon/targeting/conditions/browser_condition.rb
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kameleoon
4
- # Client configuration which can be used instead of an external configuration file
5
- class ClientConfig
6
- CONFIGURATION_UPDATE_INTERVAL = 60
7
- VISITOR_DATA_MAXIMUM_SIZE = 500
8
- DEFAULT_TIMEOUT = 2000 # milli-seconds
9
-
10
- attr_reader :client_id, :client_secret, :data_refresh_interval, :default_timeout, :configuration_refresh_interval,
11
- :visitor_data_maximum_size, :environment, :verbose_mode
12
-
13
- def initialize(
14
- client_id: nil,
15
- client_secret: nil,
16
- configuration_refresh_interval: CONFIGURATION_UPDATE_INTERVAL,
17
- default_timeout: DEFAULT_TIMEOUT,
18
- visitor_data_maximum_size: VISITOR_DATA_MAXIMUM_SIZE,
19
- environment: nil,
20
- verbose_mode: false
21
- )
22
- @client_id = client_id
23
- @client_secret = client_secret
24
- @configuration_refresh_interval = configuration_refresh_interval || CONFIGURATION_UPDATE_INTERVAL
25
- @default_timeout = default_timeout || DEFAULT_TIMEOUT
26
- @visitor_data_maximum_size = visitor_data_maximum_size || VISITOR_DATA_MAXIMUM_SIZE
27
- @environment = environment
28
- @verbose_mode = verbose_mode || false
29
- end
30
-
31
- def self.make_from_yaml(yaml)
32
- yaml ||= {}
33
- ClientConfig.new(
34
- client_id: yaml['client_id'],
35
- client_secret: yaml['client_secret'],
36
- configuration_refresh_interval: yaml['actions_configuration_refresh_interval'],
37
- default_timeout: yaml['default_timeout'],
38
- visitor_data_maximum_size: yaml['visitor_data_maximum_size'],
39
- environment: yaml['environment'],
40
- verbose_mode: yaml['verbose_mode']
41
- )
42
- end
43
- end
44
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kameleoon/targeting/models'
4
-
5
- module Kameleoon
6
- # Module which contains all internal data of SDK
7
- module Configuration
8
- # Class for manage all experiments and old feature flags
9
- class Experiment
10
- attr_accessor :id, :status, :site_enabled, :deviations, :respool_time, :variations, :targeting_segment
11
-
12
- def self.create_from_array(array)
13
- array&.map { |it| Experiment.new(it) }
14
- end
15
-
16
- def initialize(experiment_hash)
17
- @id = experiment_hash['id']
18
- @status = experiment_hash['status']
19
- @site_enabled = experiment_hash['siteEnabled']
20
- unless experiment_hash['deviations'].nil?
21
- @deviations =
22
- Hash[*experiment_hash['deviations'].map do |it|
23
- [it['variationId'] == 'origin' ? '0' : it['variationId'], it['value']]
24
- end.flatten]
25
- end
26
- unless experiment_hash['respoolTime'].nil?
27
- @respool_time =
28
- Hash[*experiment_hash['respoolTime'].map do |it|
29
- [it['variationId'] == 'origin' ? '0' : it['variationId'], it['value']]
30
- end.flatten]
31
- end
32
- unless experiment_hash['variations'].nil?
33
- @variations =
34
- experiment_hash['variations'].map do |it|
35
- { 'id' => it['id'].to_i, 'customJson' => it['customJson'] }
36
- end
37
- end
38
- @targeting_segment = Kameleoon::Targeting::Segment.new((experiment_hash['segment'])) if experiment_hash['segment']
39
- end
40
- end
41
- end
42
- end