kameleoon-client-ruby 2.3.0 → 3.0.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 (52) 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 +3 -1
  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} +164 -336
  24. data/lib/kameleoon/kameleoon_client_config.rb +91 -0
  25. data/lib/kameleoon/kameleoon_client_factory.rb +42 -0
  26. data/lib/kameleoon/network/activity_event.rb +6 -3
  27. data/lib/kameleoon/network/cookie/cookie_manager.rb +84 -0
  28. data/lib/kameleoon/network/net_provider.rb +5 -37
  29. data/lib/kameleoon/network/network_manager.rb +8 -7
  30. data/lib/kameleoon/network/request.rb +3 -2
  31. data/lib/kameleoon/network/response.rb +0 -8
  32. data/lib/kameleoon/network/url_provider.rb +5 -3
  33. data/lib/kameleoon/targeting/conditions/browser_condition.rb +2 -3
  34. data/lib/kameleoon/targeting/conditions/conversion_condition.rb +12 -4
  35. data/lib/kameleoon/targeting/conditions/custom_datum.rb +19 -13
  36. data/lib/kameleoon/targeting/conditions/device_condition.rb +3 -4
  37. data/lib/kameleoon/targeting/conditions/exclusive_experiment.rb +2 -1
  38. data/lib/kameleoon/targeting/conditions/page_title_condition.rb +11 -4
  39. data/lib/kameleoon/targeting/conditions/page_url_condition.rb +18 -4
  40. data/lib/kameleoon/targeting/conditions/string_value_condition.rb +2 -0
  41. data/lib/kameleoon/targeting/conditions/target_experiment.rb +11 -6
  42. data/lib/kameleoon/utils.rb +41 -4
  43. data/lib/kameleoon/version.rb +1 -1
  44. data/lib/kameleoon.rb +4 -2
  45. metadata +14 -10
  46. data/lib/kameleoon/client_config.rb +0 -44
  47. data/lib/kameleoon/configuration/experiment.rb +0 -42
  48. data/lib/kameleoon/cookie.rb +0 -88
  49. data/lib/kameleoon/factory.rb +0 -43
  50. data/lib/kameleoon/network/experiment_event.rb +0 -35
  51. data/lib/kameleoon/storage/variation_storage.rb +0 -42
  52. data/lib/kameleoon/storage/visitor_variation.rb +0 -20
@@ -16,66 +16,61 @@ module Kameleoon
16
16
  end
17
17
  end
18
18
 
19
- # Variation Not Found
20
- class VariationConfigurationNotFound < NotFound
21
- def initialize(id = '')
22
- super("Variation #{id}")
23
- end
24
- end
25
-
26
- # Experiment Configuration Not Found
27
- class ExperimentConfigurationNotFound < NotFound
28
- def initialize(id = '')
29
- super("Experiment #{id}")
19
+ # Feature Error
20
+ class FeatureError < KameleoonError
21
+ def initialize(msg)
22
+ super("Feature Error: #{msg}")
30
23
  end
31
24
  end
32
25
 
33
- # Feature Flag Configuration Not Found
34
- class FeatureConfigurationNotFound < NotFound
26
+ # Feature Not Found
27
+ class FeatureNotFound < FeatureError
35
28
  def initialize(id = '')
36
29
  super("Feature flag #{id}")
37
30
  end
38
31
  end
39
32
 
40
33
  # Feature Variable Not Found
41
- class FeatureVariableNotFound < NotFound
34
+ class FeatureVariableNotFound < FeatureError
42
35
  def initialize(key = '')
43
36
  super("Feature variable #{key}")
44
37
  end
45
38
  end
46
39
 
47
- # Credentials Not Found
48
- class CredentialsNotFound < NotFound
49
- def initialize
50
- super('Credentials')
40
+ # Feature Variation Not Found
41
+ class FeatureVariationNotFound < FeatureError
42
+ def initialize(id = '')
43
+ super("Variation #{id}")
51
44
  end
52
45
  end
53
46
 
54
- # Not Targeted (when visitor is not targeted for experiment or feature flag)
55
- class NotTargeted < KameleoonError
56
- def initialize(visitor_code = '')
57
- super("Visitor #{visitor_code} is not targeted.")
47
+ # Feature Environment Disabled
48
+ class FeatureEnvironmentDisabled < FeatureError
49
+ def initialize(feature_key, environment = nil)
50
+ environment = environment.nil? ? 'default' : "'#{environment}'"
51
+ super("Feature '#{feature_key}' is disabled for #{environment} environment'")
58
52
  end
59
53
  end
60
54
 
61
- # Not Allocated (when visitor is not allocated for experiment)
62
- class NotAllocated < KameleoonError
63
- def initialize(visitor_code = '')
64
- super("Visitor #{visitor_code} is not targeted.")
55
+ # Config Error
56
+ class ConfigError < KameleoonError
57
+ def initialize(msg)
58
+ super("Config Error: #{msg}")
65
59
  end
66
60
  end
67
61
 
68
- # Visitor Code Not Valod (empty or length > 255)
69
- class VisitorCodeNotValid < KameleoonError
70
- def initialize(message = '')
71
- super("Visitor code not valid: #{message}")
72
- end
62
+ # Config Credentials Invalid
63
+ class ConfigCredentialsInvalid < ConfigError
64
+ end
65
+
66
+ # Site Code is Empty
67
+ class SiteCodeIsEmpty < KameleoonError
73
68
  end
74
69
 
75
- # SiteCode Disabled
76
- class SiteCodeDisabled < KameleoonError
77
- def initialize(message = '')
78
- super("Site with siteCode '#{message}' is disabled")
70
+ # Visitor Code Not Valid (empty or length > 255)
71
+ class VisitorCodeInvalid < KameleoonError
72
+ def initialize(visitor_code)
73
+ super("Visitor code '#{visitor_code}' is not valid")
79
74
  end
80
75
  end
81
76
  end
@@ -10,50 +10,32 @@ module Kameleoon
10
10
  # Will be useful for Ruby 3.0
11
11
  # Abstract Manager class (interface)
12
12
  class Manager
13
- def add_variation(_visitor, _experiment_id, _variation_id)
14
- raise 'Abstract method `add` called'
15
- end
16
-
17
- def get_engine_tracking_code(_visitor)
13
+ def get_engine_tracking_code(_visitor_variations)
18
14
  raise 'Abstract method `get_engine_tracking_code` called'
19
15
  end
20
16
  end
21
17
 
22
18
  # Implementation of Cache with auto cleaning feature
23
19
  class ManagerImpl < Manager
24
- def initialize(expiration_time, cleaning_interval, cache_factory, log_func)
20
+ def initialize(expiration_time, log_func)
25
21
  super()
26
- # synchronization is necessary for adding same visitor_code from different threads
27
- @mutex = Mutex.new
28
22
  @expiration_time = expiration_time
29
- @cache_factory = cache_factory
30
23
  @log = log_func
31
- # it's recommend to use cleaning_interval 3-4 times more than experiation_time for more performance
32
- # in this case on every cleaning iteration storage will be cleaned 2/3 - 3/4 of volume
33
- @cache = cache_factory.create(expiration_time, cleaning_interval)
34
24
  @log.call('Hybrid Manager was successfully initialized')
35
25
  end
36
26
 
37
- def add_variation(visitor_code, experiment_id, variation_id)
38
- @mutex.synchronize do
39
- visitor_cache = @cache.get(visitor_code)
40
- visitor_cache = @cache_factory.create(@expiration_time, 0) if visitor_cache.nil?
41
- visitor_cache.set(experiment_id, variation_id)
42
- @cache.set(visitor_code, visitor_cache)
43
- end
44
- @log.call("Hybrid Manager successfully added variation for visitor_code: #{visitor_code}, " \
45
- "experiment: #{experiment_id}, variation: #{variation_id}")
46
- end
47
-
48
- def get_engine_tracking_code(visitor_code)
49
- tracking_code = TC_INIT
50
- visitor_cache = @cache.get(visitor_code)
51
- return tracking_code if visitor_cache.nil?
52
-
53
- visitor_cache.active_items.each_pair do |key, value|
54
- tracking_code += format(TC_ASSIGN_VARIATION_TRIGGER_FORMAT, key, value, key)
27
+ def get_engine_tracking_code(visitor_variations)
28
+ tracking_code = [TC_INIT]
29
+ unless visitor_variations.nil?
30
+ expired_time = (Time.now - @expiration_time).to_i
31
+ visitor_variations.enumerate do |v|
32
+ if v.assignment_time > expired_time
33
+ v_code = format(TC_ASSIGN_VARIATION_TRIGGER_FORMAT, v.experiment_id, v.variation_id, v.experiment_id)
34
+ tracking_code.push(v_code)
35
+ end
36
+ end
55
37
  end
56
- tracking_code
38
+ tracking_code.join
57
39
  end
58
40
  end
59
41
  end