kameleoon-client-ruby 3.18.0 → 3.20.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kameleoon/configuration/data_file.rb +9 -4
  3. data/lib/kameleoon/configuration/variable.rb +12 -0
  4. data/lib/kameleoon/configuration/variation.rb +1 -1
  5. data/lib/kameleoon/data/browser.rb +1 -1
  6. data/lib/kameleoon/data/conversion.rb +12 -3
  7. data/lib/kameleoon/data/custom_data.rb +1 -1
  8. data/lib/kameleoon/data/data.rb +1 -1
  9. data/lib/kameleoon/data/device.rb +1 -1
  10. data/lib/kameleoon/data/geolocation.rb +1 -1
  11. data/lib/kameleoon/data/manager/assigned_variation.rb +2 -2
  12. data/lib/kameleoon/data/manager/page_view_visit.rb +2 -2
  13. data/lib/kameleoon/data/manager/visitor.rb +2 -2
  14. data/lib/kameleoon/data/manager/visitor_manager.rb +11 -1
  15. data/lib/kameleoon/data/mapping_identifier.rb +1 -1
  16. data/lib/kameleoon/data/operating_system.rb +1 -2
  17. data/lib/kameleoon/data/page_view.rb +1 -1
  18. data/lib/kameleoon/data/personalization.rb +4 -3
  19. data/lib/kameleoon/data/targeted_segment.rb +1 -1
  20. data/lib/kameleoon/data/visitor_visits.rb +1 -1
  21. data/lib/kameleoon/kameleoon_client.rb +18 -71
  22. data/lib/kameleoon/managers/data/data_manager.rb +16 -2
  23. data/lib/kameleoon/managers/remote_data/remote_visitor_data.rb +20 -5
  24. data/lib/kameleoon/managers/tracking/tracking_builder.rb +2 -2
  25. data/lib/kameleoon/network/access_token_source.rb +11 -3
  26. data/lib/kameleoon/network/activity_event.rb +1 -1
  27. data/lib/kameleoon/network/net_provider.rb +4 -1
  28. data/lib/kameleoon/network/network_manager.rb +2 -3
  29. data/lib/kameleoon/network/request.rb +6 -3
  30. data/lib/kameleoon/network/url_provider.rb +21 -3
  31. data/lib/kameleoon/targeting/conditions/conversion_condition.rb +28 -13
  32. data/lib/kameleoon/targeting/conditions/exclusive_experiment_condition.rb +38 -19
  33. data/lib/kameleoon/targeting/conditions/target_experiment_condition.rb +12 -10
  34. data/lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb +26 -22
  35. data/lib/kameleoon/targeting/conditions/target_personalization_condition.rb +12 -10
  36. data/lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb +1 -2
  37. data/lib/kameleoon/targeting/conditions/unknown_condition.rb +1 -0
  38. data/lib/kameleoon/targeting/conditions/visit_number_today_condition.rb +2 -2
  39. data/lib/kameleoon/targeting/conditions/visitor_scope_condition.rb +56 -0
  40. data/lib/kameleoon/targeting/targeting_manager.rb +12 -5
  41. data/lib/kameleoon/types/data_file.rb +14 -3
  42. data/lib/kameleoon/types/feature_flag.rb +22 -0
  43. data/lib/kameleoon/types/rule.rb +21 -0
  44. data/lib/kameleoon/types/variable.rb +8 -0
  45. data/lib/kameleoon/types/variation.rb +12 -0
  46. data/lib/kameleoon/version.rb +1 -1
  47. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 916619df3b6cdccaf7999889e5f646bcbbfcba29eb6960bbf3374607100c1efe
4
- data.tar.gz: d38b503e8cbf9d6df0a0639292b8b5436a59b4544ea53b45ab4d738a5b556dec
3
+ metadata.gz: c6e939e54b9b0f43a46d27b3ce7d1d442916d036a7db9ca5159645ffc869415b
4
+ data.tar.gz: 98b6e2c2b04c183ba5052379066e3eff95c9ffdc2b28963a0bd106dcf8adb0db
5
5
  SHA512:
6
- metadata.gz: 1d154b47a9375184a1e2375cce4654b7615f51f37f656db8124228e0cce3f83414185f0ae53b40d704432c3d2ae1abb05d6700af504ce015b77df22d46caa02e
7
- data.tar.gz: 730008de9284005e1401352e48bf2707ae8707456f04e8131cfda0e6b666ba59cf5399f541d01b0b5a5baba83ac7acd78a79e82920a191bc7c49fa6dab5e4dd3
6
+ metadata.gz: c4eb181ded7a566731df5e6af6bcb271fcf852c27503b5e0c44be51eb93b729decb88c378732f9a9584d5d1ef452e71a5ba651a39d20a06f7e689a3b016bc65a
7
+ data.tar.gz: 997194371128c0c25cd394ab7ed22e05a0b57684915c96268874ab9e426aa3e0228f396488e77da61c2b122798eeccfee2ad1e8785900ddff24452faac953025
@@ -13,12 +13,13 @@ module Kameleoon
13
13
  class DataFile
14
14
  attr_reader :last_modified, :settings, :segments, :audience_tracking_segments, :feature_flags, :me_groups,
15
15
  :has_any_targeted_delivery_rule, :feature_flag_by_id, :rule_info_by_exp_id, :variation_by_id,
16
- :custom_data_info, :experiment_ids_with_js_css_variable, :holdout
16
+ :custom_data_info, :experiment_ids_with_js_css_variable, :holdout, :date_modified
17
17
 
18
18
  def to_s
19
19
  'DataFile{' \
20
20
  "environment:#{@environment}," \
21
21
  "last_modified:#{@last_modified}," \
22
+ "date_modified:#{@date_modified}," \
22
23
  "feature_flags:#{@feature_flags.size}," \
23
24
  "settings:#{@settings}" \
24
25
  '}'
@@ -46,13 +47,15 @@ module Kameleoon
46
47
  def get_feature_flag(feature_key)
47
48
  ff = @feature_flags[feature_key]
48
49
  raise Exception::FeatureNotFound, feature_key if ff.nil?
50
+ ff
51
+ end
49
52
 
50
- unless ff.environment_enabled
53
+ def ensure_environment_enabled(feature_flag)
54
+ unless feature_flag.environment_enabled
51
55
  env = @environment.nil? ? 'default' : "'#{@environment}'"
52
- msg = "Feature '#{feature_key}' is disabled for #{env} environment'"
56
+ msg = "Feature '#{feature_flag.feature_key}' is disabled for #{env} environment'"
53
57
  raise Exception::FeatureEnvironmentDisabled, msg
54
58
  end
55
- ff
56
59
  end
57
60
 
58
61
  def experiment_js_css_variable?(experiment_id)
@@ -63,6 +66,7 @@ module Kameleoon
63
66
 
64
67
  def init_default
65
68
  Logging::KameleoonLogger.debug('CALL: DataFile.init_default')
69
+ @date_modified = 0
66
70
  @settings = Settings.new
67
71
  @feature_flags = {}
68
72
  @me_groups = {}
@@ -73,6 +77,7 @@ module Kameleoon
73
77
 
74
78
  def init(configuration)
75
79
  Logging::KameleoonLogger.debug('CALL: DataFile.init(configuration: %s)', configuration)
80
+ @date_modified = configuration['dateModified'] || 0
76
81
  @settings = Settings.new(configuration['configuration'])
77
82
  @segments, @audience_tracking_segments = parse_segments(configuration)
78
83
  @custom_data_info = CustomDataInfo.new(configuration['customData'])
@@ -16,6 +16,18 @@ module Kameleoon
16
16
  @type = hash['type']
17
17
  @value = hash['value']
18
18
  end
19
+
20
+ def get_value
21
+ case @type
22
+ when 'BOOLEAN', 'STRING', 'NUMBER', 'JS', 'CSS'
23
+ @value
24
+ when 'JSON'
25
+ JSON.parse(@value)
26
+ else
27
+ Logging::KameleoonLogger.error("Unknown type '#{@type}' for feature variable")
28
+ @value
29
+ end
30
+ end
19
31
  end
20
32
  end
21
33
  end
@@ -19,7 +19,7 @@ module Kameleoon
19
19
  end
20
20
 
21
21
  def initialize(hash)
22
- @key = hash['key']
22
+ @key = hash['key'] || ''
23
23
  @variables = Variable.create_from_array(hash['variables'])
24
24
  @name = hash['name'] || ''
25
25
  end
@@ -49,7 +49,7 @@ module Kameleoon
49
49
  @version = version
50
50
  end
51
51
 
52
- def obtain_full_post_text_line
52
+ def query
53
53
  params = {
54
54
  eventType: 'staticData',
55
55
  browserIndex: @type,
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
+ require 'set'
4
5
  require 'kameleoon/data/custom_data'
5
6
  require 'kameleoon/network/uri_helper'
6
7
  require 'kameleoon/utils'
@@ -9,11 +10,11 @@ require_relative 'data'
9
10
  module Kameleoon
10
11
  # Conversion class uses for tracking conversion
11
12
  class Conversion < DuplicationSafeData
12
- attr_reader :goal_id, :revenue, :negative, :metadata
13
+ attr_reader :goal_id, :revenue, :negative, :metadata, :assignment_time
13
14
 
14
15
  def to_s
15
16
  "Conversion{goal_id:#{@goal_id},revenue:#{@revenue},negative:#{@negative}," \
16
- "metadata:#{Utils::Strval.obj_to_s(@metadata)}}"
17
+ "metadata:#{Utils::Strval.obj_to_s(@metadata)},assignment_time:#{@assignment_time}}"
17
18
  end
18
19
 
19
20
  # @param [Integer] goal_id Id of the goal associated to the conversion
@@ -26,9 +27,17 @@ module Kameleoon
26
27
  @revenue = revenue || 0.0
27
28
  @negative = negative || false
28
29
  @metadata = metadata
30
+ @assignment_time = Time.now.to_f
29
31
  end
30
32
 
31
- def obtain_full_post_text_line
33
+ # @api private
34
+ def self.build_internal(goal_id, revenue = 0.0, negative = false, metadata: nil, assignment_time: nil)
35
+ conversion = new(goal_id, revenue, negative, metadata: metadata)
36
+ conversion.instance_variable_set(:@assignment_time, assignment_time || Time.now.to_f)
37
+ conversion
38
+ end
39
+
40
+ def query
32
41
  params = {
33
42
  eventType: 'conversion',
34
43
  goalId: @goal_id,
@@ -85,7 +85,7 @@ module Kameleoon
85
85
  @index
86
86
  end
87
87
 
88
- def obtain_full_post_text_line
88
+ def query
89
89
  str_values = JSON.generate(Hash[@values.collect { |k| [k, 1] }])
90
90
  params = {
91
91
  eventType: 'customData',
@@ -38,7 +38,7 @@ module Kameleoon
38
38
  @state = DataState::UNSENT
39
39
  end
40
40
 
41
- def obtain_full_post_text_line
41
+ def query
42
42
  raise KameleoonError.new('ToDo: implement this method.'), 'ToDo: implement this method.'
43
43
  end
44
44
 
@@ -24,7 +24,7 @@ module Kameleoon
24
24
  @device_type = device_type
25
25
  end
26
26
 
27
- def obtain_full_post_text_line
27
+ def query
28
28
  params = {
29
29
  eventType: 'staticData',
30
30
  deviceType: @device_type,
@@ -26,7 +26,7 @@ module Kameleoon
26
26
  @longitude = longitude
27
27
  end
28
28
 
29
- def obtain_full_post_text_line
29
+ def query
30
30
  params = {
31
31
  eventType: 'geolocation',
32
32
  nonce: nonce
@@ -25,10 +25,10 @@ module Kameleoon
25
25
  @experiment_id = experiment_id
26
26
  @variation_id = variation_id
27
27
  @rule_type = rule_type
28
- @assignment_time = assignment_time || Time.new.to_i
28
+ @assignment_time = assignment_time || Time.now.to_f
29
29
  end
30
30
 
31
- def obtain_full_post_text_line
31
+ def query
32
32
  params = {
33
33
  eventType: EVENT_TYPE,
34
34
  id: @experiment_id,
@@ -12,7 +12,7 @@ module Kameleoon
12
12
  def initialize(page_view, count = 1, timestamp = nil)
13
13
  @page_view = page_view
14
14
  @count = count
15
- @last_timestamp = timestamp.nil? ? Time.new.to_i : timestamp
15
+ @last_timestamp = timestamp.nil? ? Time.new.to_f : timestamp
16
16
  end
17
17
 
18
18
  # Not thread-save method, should be called in synchronized code
@@ -20,7 +20,7 @@ module Kameleoon
20
20
  def overwrite(page_view)
21
21
  @page_view = page_view
22
22
  @count += 1
23
- @last_timestamp = Time.new.to_i
23
+ @last_timestamp = Time.new.to_f
24
24
  end
25
25
 
26
26
  # Not thread-save method, should be called in synchronized code
@@ -55,7 +55,7 @@ module Kameleoon
55
55
  end
56
56
 
57
57
  def update_last_activity_time
58
- @data.last_activity_time = Time.new.to_i
58
+ @data.last_activity_time = Time.new.to_f
59
59
  end
60
60
 
61
61
  def enumerate_sendable_data(&blk)
@@ -322,7 +322,7 @@ module Kameleoon
322
322
 
323
323
  def initialize
324
324
  Logging::KameleoonLogger.debug('CALL: VisitorData.new')
325
- @time_started = (Time.now.to_f * 1000).to_i
325
+ @time_started = Time.now.to_f
326
326
  @mutex = Concurrent::ReadWriteLock.new
327
327
  @legal_consent = LegalConsent::UNKNOWN
328
328
  Logging::KameleoonLogger.debug('RETURN: VisitorData.new')
@@ -64,6 +64,16 @@ module Kameleoon
64
64
  visitor
65
65
  end
66
66
 
67
+ def peek_visitor(visitor_code)
68
+ Logging::KameleoonLogger.debug("CALL: VisitorManager.peek_visitor(visitor_code: '%s')", visitor_code)
69
+
70
+ visitor = @visitors[visitor_code]
71
+
72
+ Logging::KameleoonLogger.debug("RETURN: VisitorManager.peek_visitor(visitor_code: '%s') -> (visitor: %s)",
73
+ visitor_code, visitor)
74
+ visitor
75
+ end
76
+
67
77
  def enumerate(&blk)
68
78
  @visitors.each_pair { |vc, v| blk.call(vc, v) }
69
79
  end
@@ -144,7 +154,7 @@ module Kameleoon
144
154
 
145
155
  def purge
146
156
  Logging::KameleoonLogger.debug('CALL: VisitorManager.purge')
147
- expired_time = Time.new.to_i - @expiration_period
157
+ expired_time = Time.new.to_f - @expiration_period
148
158
  @visitors.each_pair do |vc, v|
149
159
  next if v.last_activity_time >= expired_time
150
160
 
@@ -28,7 +28,7 @@ module Kameleoon
28
28
  false
29
29
  end
30
30
 
31
- def obtain_full_post_text_line
31
+ def query
32
32
  mip = Kameleoon::Network::UriHelper.encode_query({ mappingIdentifier: true })
33
33
  "#{super}&#{mip}"
34
34
  end
@@ -62,7 +62,7 @@ module Kameleoon
62
62
  @os_type = os_type
63
63
  end
64
64
 
65
- def obtain_full_post_text_line
65
+ def query
66
66
  params = {
67
67
  eventType: 'staticData',
68
68
  os: OperatingSystemType.name_from_type(@os_type),
@@ -73,4 +73,3 @@ module Kameleoon
73
73
  end
74
74
  end
75
75
  end
76
-
@@ -25,7 +25,7 @@ module Kameleoon
25
25
  @referrers = referrers.instance_of?(Integer) ? [referrers] : referrers
26
26
  end
27
27
 
28
- def obtain_full_post_text_line
28
+ def query
29
29
  params = {
30
30
  eventType: 'page',
31
31
  href: @url,
@@ -2,15 +2,16 @@
2
2
 
3
3
  module Kameleoon
4
4
  class Personalization
5
- attr_reader :id, :variation_id
5
+ attr_reader :id, :variation_id, :assignment_time
6
6
 
7
- def initialize(id, variation_id)
7
+ def initialize(id, variation_id, assignment_time: nil)
8
8
  @id = id
9
9
  @variation_id = variation_id
10
+ @assignment_time = assignment_time || Time.now.to_f
10
11
  end
11
12
 
12
13
  def to_s
13
- "Personalization{id:#{@id},variation_id:#{@variation_id}}"
14
+ "Personalization{id:#{@id},variation_id:#{@variation_id},assignment_time:#{@assignment_time}}"
14
15
  end
15
16
  end
16
17
  end
@@ -14,7 +14,7 @@ module Kameleoon
14
14
  @id = id
15
15
  end
16
16
 
17
- def obtain_full_post_text_line
17
+ def query
18
18
  params = {
19
19
  eventType: EVENT_TYPE,
20
20
  id: @id,
@@ -33,7 +33,7 @@ module Kameleoon
33
33
  )
34
34
  end
35
35
 
36
- def obtain_full_post_text_line
36
+ def query
37
37
  params = {
38
38
  eventType: 'staticData',
39
39
  visitNumber: @visit_number,
@@ -369,8 +369,6 @@ module Kameleoon
369
369
  Utils::VisitorCode.validate(visitor_code)
370
370
  variations = {}
371
371
  @data_manager.data_file.feature_flags.each_value do |feature_flag|
372
- next unless feature_flag.environment_enabled
373
-
374
372
  begin
375
373
  variation_key, eval_exp = get_variation_info(visitor_code, feature_flag, track)
376
374
  rescue Exception::FeatureEnvironmentDisabled
@@ -468,7 +466,7 @@ module Kameleoon
468
466
  raise Exception::FeatureVariableNotFound.new(variable_name),
469
467
  "Feature variable #{variable_name} not found"
470
468
  end
471
- value = _parse_feature_variable(variable)
469
+ value = variable.get_value
472
470
  Logging::KameleoonLogger.info(
473
471
  "RETURN: KameleoonClient.get_feature_variable(visitor_code: '%s', feature_key: '%s', variable_name: '%s', " \
474
472
  'is_unique_identifier: %s) -> (variable: %s)',
@@ -503,12 +501,13 @@ module Kameleoon
503
501
  )
504
502
  feature_flag = @data_manager.data_file.get_feature_flag(feature_key)
505
503
  variation = feature_flag.get_variation_by_key(variation_key)
504
+ @data_manager.data_file.ensure_environment_enabled(feature_flag)
506
505
  if variation.nil?
507
506
  raise Exception::FeatureVariationNotFound.new(variation_key),
508
507
  "Variation key #{variation_key} not found"
509
508
  end
510
509
  variables = {}
511
- variation.variables.each { |var| variables[var.key] = _parse_feature_variable(var) }
510
+ variation.variables.each { |var| variables[var.key] = var.get_value }
512
511
  Logging::KameleoonLogger.info(
513
512
  "RETURN: KameleoonClient.get_feature_variation_variables(feature_key: '%s', variation_key: '%s') " \
514
513
  '-> (variables: %s)', feature_key, variation_key, variables
@@ -607,12 +606,16 @@ module Kameleoon
607
606
  )
608
607
  warehouse_audience
609
608
  end
610
-
611
609
  ##
612
- # Returns a list of all feature flag keys
610
+ # Returns a list of all feature flag keys.
613
611
  #
614
612
  # @return [Array] array of all feature flag keys
613
+ #
614
+ # DEPRECATED. Please use `get_data_file` instead.
615
615
  def get_feature_list # rubocop:disable Naming/AccessorMethodName
616
+ Logging::KameleoonLogger.info(
617
+ '[DEPRECATION] `get_feature_list` is deprecated. Please use `get_data_file` instead.'
618
+ )
616
619
  Logging::KameleoonLogger.info('CALL: KameleoonClient.get_feature_list')
617
620
  features = @data_manager.data_file.feature_flags.keys
618
621
  Logging::KameleoonLogger.info('RETURN: KameleoonClient.get_feature_list -> (features: %s)', features)
@@ -638,8 +641,6 @@ module Kameleoon
638
641
  visitor = @visitor_manager.get_visitor(visitor_code)
639
642
  list_keys = []
640
643
  @data_manager.data_file.feature_flags.each do |feature_key, feature_flag|
641
- next unless feature_flag.environment_enabled
642
-
643
644
  begin
644
645
  eval_exp = evaluate(visitor, visitor_code, feature_flag, false, false)
645
646
  rescue Exception::FeatureEnvironmentDisabled
@@ -677,8 +678,6 @@ module Kameleoon
677
678
  map_active_features = {}
678
679
 
679
680
  @data_manager.data_file.feature_flags.each_value do |feature_flag|
680
- next unless feature_flag.environment_enabled
681
-
682
681
  begin
683
682
  eval_exp = evaluate(visitor, visitor_code, feature_flag, false, false)
684
683
  rescue Exception::FeatureEnvironmentDisabled
@@ -803,41 +802,7 @@ module Kameleoon
803
802
  # @return [Kameleoon::Types::DataFile] The current DataFile instance.
804
803
  def get_data_file
805
804
  Logging::KameleoonLogger.info('CALL: KameleoonClient.get_data_file')
806
-
807
- feature_flags_map = @data_manager.data_file.feature_flags.transform_values do |source_feature_flag|
808
- # Collect variations
809
- variations_map = source_feature_flag.variations.each_with_object({}) do |variation, variations_map|
810
- variables_map = variation.variables.each_with_object({}) do |var, variables_map|
811
- variables_map[var.key] = Types::Variable.new(var.key, var.type, _parse_feature_variable(var))
812
- end
813
- variations_map[variation.key] = Types::Variation.new(variation.key, nil, nil, variables_map, variation.name)
814
- end
815
-
816
- # Collect rules
817
- rules = source_feature_flag.rules.map do |rule|
818
- rule_variations = rule.experiment.variations_by_exposition.each_with_object({}) do |var_by_exp, rule_variations|
819
- base_variation = variations_map[var_by_exp.variation_key]
820
- next unless base_variation
821
- rule_variations[base_variation.key] = Types::Variation.new(
822
- base_variation.key,
823
- var_by_exp.variation_id,
824
- rule.experiment.id,
825
- base_variation.variables,
826
- base_variation.name
827
- )
828
- end
829
- Types::Rule.new(rule_variations)
830
- end
831
-
832
- Types::FeatureFlag.new(
833
- variations_map,
834
- source_feature_flag.environment_enabled,
835
- rules,
836
- source_feature_flag.default_variation_key
837
- )
838
- end
839
-
840
- data_file = Types::DataFile.new(feature_flags_map)
805
+ data_file = @data_manager.external_data_file
841
806
  Logging::KameleoonLogger.info('RETURN: KameleoonClient.get_data_file -> (data_file: %s)', data_file)
842
807
  data_file
843
808
  end
@@ -1015,6 +980,11 @@ module Kameleoon
1015
980
  )
1016
981
  eval_exp = nil
1017
982
  forced_variation = visitor&.get_forced_feature_variation(feature_flag.feature_key)
983
+
984
+ unless forced_variation&.simulated
985
+ @data_manager.data_file.ensure_environment_enabled(feature_flag)
986
+ end
987
+
1018
988
  if forced_variation
1019
989
  eval_exp = EvaluatedExperiment.from_forced_variation(forced_variation)
1020
990
  elsif visitor_not_in_holdout?(visitor, visitor_code, track, save, feature_flag.bucketing_custom_data_index) && \
@@ -1276,21 +1246,10 @@ module Kameleoon
1276
1246
  Logging::KameleoonLogger.debug(
1277
1247
  'CALL: KameleoonClient.create_external_variation(variation: %s, eval_exp: %s)', variation, eval_exp
1278
1248
  )
1279
- ext_variables = {}
1280
- variation&.variables&.each do |variable|
1281
- ext_variables[variable.key] = Types::Variable.new(
1282
- variable.key,
1283
- variable.type,
1284
- _parse_feature_variable(variable)
1285
- )
1286
- end
1287
- ext_variables.freeze
1288
- ext_variation = Types::Variation.new(
1289
- variation&.key || '',
1249
+ ext_variation = Types::Variation._build_from_internal(
1250
+ variation,
1290
1251
  eval_exp&.var_by_exp&.variation_id,
1291
- eval_exp&.experiment&.id,
1292
- ext_variables,
1293
- variation&.name || ''
1252
+ eval_exp&.experiment&.id
1294
1253
  )
1295
1254
  Logging::KameleoonLogger.debug(
1296
1255
  'RETURN: KameleoonClient.create_external_variation(variation: %s, eval_exp: %s) -> (ext_variation: %s)',
@@ -1301,18 +1260,6 @@ module Kameleoon
1301
1260
 
1302
1261
  ##
1303
1262
  # helper method for fetching values from a Variable
1304
- def _parse_feature_variable(variable)
1305
- case variable.type
1306
- when 'BOOLEAN', 'STRING', 'NUMBER', 'JS', 'CSS'
1307
- variable.value
1308
- when 'JSON'
1309
- JSON.parse(variable.value)
1310
- else
1311
- Logging::KameleoonLogger.error("Unknown type '#{variable.type}' for feature variable")
1312
- variable.value
1313
- end
1314
- end
1315
-
1316
1263
  def set_unique_identifier(visitor_code, is_unique_identifier)
1317
1264
  Logging::KameleoonLogger.info(
1318
1265
  "The 'isUniqueIdentifier' parameter is deprecated. Please, add 'UniqueIdentifier' to a visitor instead."
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'kameleoon/types/data_file'
4
+
3
5
  module Kameleoon
4
6
  module Managers
5
7
  module Data
@@ -13,7 +15,11 @@ module Kameleoon
13
15
  end
14
16
 
15
17
  def data_file=(value)
16
- @container = Container.new(value)
18
+ @container = Container.new(value, create_external_data_file(value))
19
+ end
20
+
21
+ def external_data_file
22
+ @container.external_data_file
17
23
  end
18
24
 
19
25
  def visitor_code_managed?
@@ -22,14 +28,22 @@ module Kameleoon
22
28
 
23
29
  class Container
24
30
  attr_reader :data_file, :visitor_code_managed
31
+ attr_reader :external_data_file
25
32
 
26
- def initialize(data_file)
33
+ def initialize(data_file, external_data_file)
27
34
  @data_file = data_file
35
+ @external_data_file = external_data_file
28
36
  # Regarding GDPR policy we should set visitorCode if legal consent isn't required or we have at
29
37
  # least one Targeted Delivery rule in datafile
30
38
  @visitor_code_managed = data_file.settings.is_consent_required && !data_file.has_any_targeted_delivery_rule
31
39
  end
32
40
  end
41
+
42
+ private
43
+
44
+ def create_external_data_file(source_data_file)
45
+ Types::DataFile._build_from_internal(source_data_file)
46
+ end
33
47
  end
34
48
  end
35
49
  end
@@ -32,7 +32,9 @@ module Kameleoon
32
32
  prev_visits = []
33
33
  previous_visits.each_index do |i|
34
34
  visit = previous_visits[i]
35
- prev_visits.push(VisitorVisits::Visit.new(visit['timeStarted'] || 0, visit['timeLastEvent']))
35
+ prev_visits.push(
36
+ VisitorVisits::Visit.new(ms_to_s(visit['timeStarted'] || 0), ms_to_s(visit['timeLastEvent']))
37
+ )
36
38
  parse_visit(visit, i + 1)
37
39
  end
38
40
  @visitor_visits = VisitorVisits.new(prev_visits, @visit_number)
@@ -113,7 +115,7 @@ module Kameleoon
113
115
  page_view_visit = @page_view_visits[href]
114
116
  if page_view_visit.nil?
115
117
  page_view = PageView.new(href, page_event['data']['title'])
116
- @page_view_visits[href] = DataManager::PageViewVisit.new(page_view, 1, page_event['time'])
118
+ @page_view_visits[href] = DataManager::PageViewVisit.new(page_view, 1, ms_to_s(page_event['time']))
117
119
  else
118
120
  page_view_visit.increase_page_visits
119
121
  end
@@ -128,7 +130,7 @@ module Kameleoon
128
130
 
129
131
  @experiments[id] = DataManager::AssignedVariation.new(
130
132
  id, experiment_event['data']['variationId'],
131
- Configuration::RuleType::UNKNOWN, assignment_time: experiment_event['time']
133
+ Configuration::RuleType::UNKNOWN, assignment_time: ms_to_s(experiment_event['time'])
132
134
  )
133
135
  end
134
136
  end
@@ -137,7 +139,10 @@ module Kameleoon
137
139
  @conversions = [] if @conversions.nil?
138
140
  conversion_events.each do |conversion_event|
139
141
  data = conversion_event['data']
140
- conversion = Conversion.new(data['goalId'], data['revenue'], data['negative'])
142
+ conversion = Conversion.send(
143
+ :build_internal, data['goalId'], data['revenue'], data['negative'],
144
+ assignment_time: ms_to_s(conversion_event['time'])
145
+ )
141
146
  @conversions.push(conversion)
142
147
  end
143
148
  end
@@ -173,10 +178,20 @@ module Kameleoon
173
178
  id = personalization_event['data']['id']
174
179
  next if @personalizations.include?(id)
175
180
 
176
- @personalizations[id] = Personalization.new(id, personalization_event['data']['variationId'])
181
+ @personalizations[id] = Personalization.new(
182
+ id,
183
+ personalization_event['data']['variationId'],
184
+ assignment_time: ms_to_s(personalization_event['time'])
185
+ )
177
186
  end
178
187
  end
179
188
 
189
+ def ms_to_s(timestamp)
190
+ return nil if timestamp.nil?
191
+
192
+ timestamp / 1000.0
193
+ end
194
+
180
195
  def conversions_single_objects
181
196
  objects = []
182
197
  objects += @conversions unless @conversions.nil?
@@ -32,7 +32,7 @@ module Kameleoon
32
32
 
33
33
  @visitor_codes.each do |visitor_code|
34
34
  if @total_size <= @request_size_limit
35
- visitor = @visitor_manager.get_visitor(visitor_code)
35
+ visitor = @visitor_manager.peek_visitor(visitor_code)
36
36
  is_consent_given = consent_given?(visitor)
37
37
  data = collect_tracking_data(visitor_code, visitor, is_consent_given)
38
38
  if !data.empty?
@@ -127,7 +127,7 @@ module Kameleoon
127
127
  )
128
128
  user_agent = visitor&.user_agent
129
129
  unsent_data.each do |data|
130
- line = data.obtain_full_post_text_line
130
+ line = data.query
131
131
  next if line.empty?
132
132
 
133
133
  line = add_line_params(line, visitor_code_param, user_agent)