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.
- checksums.yaml +4 -4
- data/lib/kameleoon/configuration/data_file.rb +9 -4
- data/lib/kameleoon/configuration/variable.rb +12 -0
- data/lib/kameleoon/configuration/variation.rb +1 -1
- data/lib/kameleoon/data/browser.rb +1 -1
- data/lib/kameleoon/data/conversion.rb +12 -3
- data/lib/kameleoon/data/custom_data.rb +1 -1
- data/lib/kameleoon/data/data.rb +1 -1
- data/lib/kameleoon/data/device.rb +1 -1
- data/lib/kameleoon/data/geolocation.rb +1 -1
- data/lib/kameleoon/data/manager/assigned_variation.rb +2 -2
- data/lib/kameleoon/data/manager/page_view_visit.rb +2 -2
- data/lib/kameleoon/data/manager/visitor.rb +2 -2
- data/lib/kameleoon/data/manager/visitor_manager.rb +11 -1
- data/lib/kameleoon/data/mapping_identifier.rb +1 -1
- data/lib/kameleoon/data/operating_system.rb +1 -2
- data/lib/kameleoon/data/page_view.rb +1 -1
- data/lib/kameleoon/data/personalization.rb +4 -3
- data/lib/kameleoon/data/targeted_segment.rb +1 -1
- data/lib/kameleoon/data/visitor_visits.rb +1 -1
- data/lib/kameleoon/kameleoon_client.rb +18 -71
- data/lib/kameleoon/managers/data/data_manager.rb +16 -2
- data/lib/kameleoon/managers/remote_data/remote_visitor_data.rb +20 -5
- data/lib/kameleoon/managers/tracking/tracking_builder.rb +2 -2
- data/lib/kameleoon/network/access_token_source.rb +11 -3
- data/lib/kameleoon/network/activity_event.rb +1 -1
- data/lib/kameleoon/network/net_provider.rb +4 -1
- data/lib/kameleoon/network/network_manager.rb +2 -3
- data/lib/kameleoon/network/request.rb +6 -3
- data/lib/kameleoon/network/url_provider.rb +21 -3
- data/lib/kameleoon/targeting/conditions/conversion_condition.rb +28 -13
- data/lib/kameleoon/targeting/conditions/exclusive_experiment_condition.rb +38 -19
- data/lib/kameleoon/targeting/conditions/target_experiment_condition.rb +12 -10
- data/lib/kameleoon/targeting/conditions/target_feature_flag_condition.rb +26 -22
- data/lib/kameleoon/targeting/conditions/target_personalization_condition.rb +12 -10
- data/lib/kameleoon/targeting/conditions/time_elapsed_since_visit_condition.rb +1 -2
- data/lib/kameleoon/targeting/conditions/unknown_condition.rb +1 -0
- data/lib/kameleoon/targeting/conditions/visit_number_today_condition.rb +2 -2
- data/lib/kameleoon/targeting/conditions/visitor_scope_condition.rb +56 -0
- data/lib/kameleoon/targeting/targeting_manager.rb +12 -5
- data/lib/kameleoon/types/data_file.rb +14 -3
- data/lib/kameleoon/types/feature_flag.rb +22 -0
- data/lib/kameleoon/types/rule.rb +21 -0
- data/lib/kameleoon/types/variable.rb +8 -0
- data/lib/kameleoon/types/variation.rb +12 -0
- data/lib/kameleoon/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c6e939e54b9b0f43a46d27b3ce7d1d442916d036a7db9ca5159645ffc869415b
|
|
4
|
+
data.tar.gz: 98b6e2c2b04c183ba5052379066e3eff95c9ffdc2b28963a0bd106dcf8adb0db
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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
|
|
@@ -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
|
-
|
|
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,
|
data/lib/kameleoon/data/data.rb
CHANGED
|
@@ -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.
|
|
28
|
+
@assignment_time = assignment_time || Time.now.to_f
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def
|
|
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.
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
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
|
|
|
@@ -62,7 +62,7 @@ module Kameleoon
|
|
|
62
62
|
@os_type = os_type
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def
|
|
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
|
-
|
|
@@ -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
|
|
@@ -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 =
|
|
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] =
|
|
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
|
-
|
|
1280
|
-
|
|
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(
|
|
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.
|
|
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(
|
|
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.
|
|
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.
|
|
130
|
+
line = data.query
|
|
131
131
|
next if line.empty?
|
|
132
132
|
|
|
133
133
|
line = add_line_params(line, visitor_code_param, user_agent)
|