optimizely-sdk 5.0.0.pre.beta → 5.0.1
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/LICENSE +202 -202
- data/lib/optimizely/audience.rb +127 -127
- data/lib/optimizely/bucketer.rb +156 -156
- data/lib/optimizely/condition_tree_evaluator.rb +123 -123
- data/lib/optimizely/config/datafile_project_config.rb +48 -32
- data/lib/optimizely/config/proxy_config.rb +34 -34
- data/lib/optimizely/config_manager/async_scheduler.rb +95 -95
- data/lib/optimizely/config_manager/http_project_config_manager.rb +340 -338
- data/lib/optimizely/config_manager/project_config_manager.rb +25 -25
- data/lib/optimizely/config_manager/static_project_config_manager.rb +55 -54
- data/lib/optimizely/decide/optimizely_decide_option.rb +28 -28
- data/lib/optimizely/decide/optimizely_decision.rb +60 -60
- data/lib/optimizely/decide/optimizely_decision_message.rb +26 -26
- data/lib/optimizely/decision_service.rb +563 -563
- data/lib/optimizely/error_handler.rb +39 -39
- data/lib/optimizely/event/batch_event_processor.rb +235 -235
- data/lib/optimizely/event/entity/conversion_event.rb +44 -44
- data/lib/optimizely/event/entity/decision.rb +38 -38
- data/lib/optimizely/event/entity/event_batch.rb +86 -86
- data/lib/optimizely/event/entity/event_context.rb +50 -50
- data/lib/optimizely/event/entity/impression_event.rb +48 -48
- data/lib/optimizely/event/entity/snapshot.rb +33 -33
- data/lib/optimizely/event/entity/snapshot_event.rb +48 -48
- data/lib/optimizely/event/entity/user_event.rb +22 -22
- data/lib/optimizely/event/entity/visitor.rb +36 -36
- data/lib/optimizely/event/entity/visitor_attribute.rb +38 -38
- data/lib/optimizely/event/event_factory.rb +156 -156
- data/lib/optimizely/event/event_processor.rb +25 -25
- data/lib/optimizely/event/forwarding_event_processor.rb +44 -44
- data/lib/optimizely/event/user_event_factory.rb +88 -88
- data/lib/optimizely/event_builder.rb +221 -221
- data/lib/optimizely/event_dispatcher.rb +69 -69
- data/lib/optimizely/exceptions.rb +193 -149
- data/lib/optimizely/helpers/constants.rb +459 -459
- data/lib/optimizely/helpers/date_time_utils.rb +30 -30
- data/lib/optimizely/helpers/event_tag_utils.rb +132 -132
- data/lib/optimizely/helpers/group.rb +31 -31
- data/lib/optimizely/helpers/http_utils.rb +68 -68
- data/lib/optimizely/helpers/sdk_settings.rb +61 -61
- data/lib/optimizely/helpers/validator.rb +236 -238
- data/lib/optimizely/helpers/variable_type.rb +67 -67
- data/lib/optimizely/logger.rb +46 -46
- data/lib/optimizely/notification_center.rb +174 -174
- data/lib/optimizely/notification_center_registry.rb +71 -71
- data/lib/optimizely/odp/lru_cache.rb +114 -114
- data/lib/optimizely/odp/odp_config.rb +102 -102
- data/lib/optimizely/odp/odp_event.rb +75 -75
- data/lib/optimizely/odp/odp_event_api_manager.rb +70 -70
- data/lib/optimizely/odp/odp_event_manager.rb +286 -286
- data/lib/optimizely/odp/odp_manager.rb +159 -159
- data/lib/optimizely/odp/odp_segment_api_manager.rb +122 -122
- data/lib/optimizely/odp/odp_segment_manager.rb +97 -97
- data/lib/optimizely/optimizely_config.rb +273 -271
- data/lib/optimizely/optimizely_factory.rb +184 -186
- data/lib/optimizely/optimizely_user_context.rb +238 -238
- data/lib/optimizely/params.rb +31 -31
- data/lib/optimizely/project_config.rb +99 -99
- data/lib/optimizely/semantic_version.rb +166 -166
- data/lib/optimizely/user_condition_evaluator.rb +391 -391
- data/lib/optimizely/user_profile_service.rb +35 -35
- data/lib/optimizely/version.rb +21 -21
- data/lib/optimizely.rb +1262 -1262
- metadata +12 -10
@@ -1,114 +1,114 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright 2022, Optimizely and contributors
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
module Optimizely
|
20
|
-
class LRUCache
|
21
|
-
# Least Recently Used cache that invalidates entries older than the timeout.
|
22
|
-
|
23
|
-
attr_reader :capacity, :timeout
|
24
|
-
|
25
|
-
def initialize(capacity, timeout_in_secs)
|
26
|
-
# @param capacity - The max size of the cache. If set <= 0, caching is disabled.
|
27
|
-
# @param timeout_in_secs - Seconds until a cache item is considered stale.
|
28
|
-
# If set <= 0, items never expire.
|
29
|
-
@cache_mutex = Mutex.new
|
30
|
-
@map = {}
|
31
|
-
@capacity = capacity
|
32
|
-
@timeout = timeout_in_secs
|
33
|
-
end
|
34
|
-
|
35
|
-
# Retrieve the non stale value from the cache corresponding to the provided key
|
36
|
-
# or nil if key is not found
|
37
|
-
# Moves the key/value pair to the end of the cache
|
38
|
-
#
|
39
|
-
# @param key - The key to retrieve
|
40
|
-
|
41
|
-
def lookup(key)
|
42
|
-
return nil if @capacity <= 0
|
43
|
-
|
44
|
-
@cache_mutex.synchronize do
|
45
|
-
return nil unless @map.include?(key)
|
46
|
-
|
47
|
-
element = @map.delete(key)
|
48
|
-
return nil if element.stale?(@timeout)
|
49
|
-
|
50
|
-
@map[key] = element
|
51
|
-
|
52
|
-
element.value
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Save a key/value pair into the cache
|
57
|
-
# Moves the key/value pair to the end of the cache
|
58
|
-
#
|
59
|
-
# @param key - A user key
|
60
|
-
# @param value - A user value
|
61
|
-
|
62
|
-
def save(key, value)
|
63
|
-
return if @capacity <= 0
|
64
|
-
|
65
|
-
@cache_mutex.synchronize do
|
66
|
-
@map.delete(key) if @map.key?(key)
|
67
|
-
|
68
|
-
@map[key] = CacheElement.new(value)
|
69
|
-
|
70
|
-
@map.delete(@map.first[0]) if @map.size > @capacity
|
71
|
-
nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Clears the cache
|
76
|
-
|
77
|
-
def reset
|
78
|
-
return if @capacity <= 0
|
79
|
-
|
80
|
-
@cache_mutex.synchronize { @map.clear }
|
81
|
-
nil
|
82
|
-
end
|
83
|
-
|
84
|
-
# Retrieve a value from the cache for a given key or nil if key is not found
|
85
|
-
# Doesn't update the cache
|
86
|
-
#
|
87
|
-
# @param key - The key to retrieve
|
88
|
-
|
89
|
-
def peek(key)
|
90
|
-
return nil if @capacity <= 0
|
91
|
-
|
92
|
-
@cache_mutex.synchronize { @map[key]&.value }
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
class CacheElement
|
97
|
-
# Individual element for the LRUCache.
|
98
|
-
attr_reader :value, :timestamp
|
99
|
-
|
100
|
-
def initialize(value)
|
101
|
-
@value = value
|
102
|
-
@timestamp = Time.new
|
103
|
-
end
|
104
|
-
|
105
|
-
def stale?(timeout)
|
106
|
-
# Returns true if the provided timeout has passed since the element's timestamp.
|
107
|
-
#
|
108
|
-
# @param timeout - The duration to check against
|
109
|
-
return false if timeout <= 0
|
110
|
-
|
111
|
-
Time.new - @timestamp >= timeout
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright 2022, Optimizely and contributors
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
module Optimizely
|
20
|
+
class LRUCache
|
21
|
+
# Least Recently Used cache that invalidates entries older than the timeout.
|
22
|
+
|
23
|
+
attr_reader :capacity, :timeout
|
24
|
+
|
25
|
+
def initialize(capacity, timeout_in_secs)
|
26
|
+
# @param capacity - The max size of the cache. If set <= 0, caching is disabled.
|
27
|
+
# @param timeout_in_secs - Seconds until a cache item is considered stale.
|
28
|
+
# If set <= 0, items never expire.
|
29
|
+
@cache_mutex = Mutex.new
|
30
|
+
@map = {}
|
31
|
+
@capacity = capacity
|
32
|
+
@timeout = timeout_in_secs
|
33
|
+
end
|
34
|
+
|
35
|
+
# Retrieve the non stale value from the cache corresponding to the provided key
|
36
|
+
# or nil if key is not found
|
37
|
+
# Moves the key/value pair to the end of the cache
|
38
|
+
#
|
39
|
+
# @param key - The key to retrieve
|
40
|
+
|
41
|
+
def lookup(key)
|
42
|
+
return nil if @capacity <= 0
|
43
|
+
|
44
|
+
@cache_mutex.synchronize do
|
45
|
+
return nil unless @map.include?(key)
|
46
|
+
|
47
|
+
element = @map.delete(key)
|
48
|
+
return nil if element.stale?(@timeout)
|
49
|
+
|
50
|
+
@map[key] = element
|
51
|
+
|
52
|
+
element.value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Save a key/value pair into the cache
|
57
|
+
# Moves the key/value pair to the end of the cache
|
58
|
+
#
|
59
|
+
# @param key - A user key
|
60
|
+
# @param value - A user value
|
61
|
+
|
62
|
+
def save(key, value)
|
63
|
+
return if @capacity <= 0
|
64
|
+
|
65
|
+
@cache_mutex.synchronize do
|
66
|
+
@map.delete(key) if @map.key?(key)
|
67
|
+
|
68
|
+
@map[key] = CacheElement.new(value)
|
69
|
+
|
70
|
+
@map.delete(@map.first[0]) if @map.size > @capacity
|
71
|
+
nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Clears the cache
|
76
|
+
|
77
|
+
def reset
|
78
|
+
return if @capacity <= 0
|
79
|
+
|
80
|
+
@cache_mutex.synchronize { @map.clear }
|
81
|
+
nil
|
82
|
+
end
|
83
|
+
|
84
|
+
# Retrieve a value from the cache for a given key or nil if key is not found
|
85
|
+
# Doesn't update the cache
|
86
|
+
#
|
87
|
+
# @param key - The key to retrieve
|
88
|
+
|
89
|
+
def peek(key)
|
90
|
+
return nil if @capacity <= 0
|
91
|
+
|
92
|
+
@cache_mutex.synchronize { @map[key]&.value }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class CacheElement
|
97
|
+
# Individual element for the LRUCache.
|
98
|
+
attr_reader :value, :timestamp
|
99
|
+
|
100
|
+
def initialize(value)
|
101
|
+
@value = value
|
102
|
+
@timestamp = Time.new
|
103
|
+
end
|
104
|
+
|
105
|
+
def stale?(timeout)
|
106
|
+
# Returns true if the provided timeout has passed since the element's timestamp.
|
107
|
+
#
|
108
|
+
# @param timeout - The duration to check against
|
109
|
+
return false if timeout <= 0
|
110
|
+
|
111
|
+
Time.new - @timestamp >= timeout
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -1,102 +1,102 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright 2022, Optimizely and contributors
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
require 'optimizely/logger'
|
20
|
-
require_relative '../helpers/constants'
|
21
|
-
|
22
|
-
module Optimizely
|
23
|
-
class OdpConfig
|
24
|
-
ODP_CONFIG_STATE = Helpers::Constants::ODP_CONFIG_STATE
|
25
|
-
# Contains configuration used for ODP integration.
|
26
|
-
#
|
27
|
-
# @param api_host - The host URL for the ODP audience segments API (optional).
|
28
|
-
# @param api_key - The public API key for the ODP account from which the audience segments will be fetched (optional).
|
29
|
-
# @param segments_to_check - An array of all ODP segments used in the current datafile (associated with api_host/api_key).
|
30
|
-
def initialize(api_key = nil, api_host = nil, segments_to_check = [])
|
31
|
-
@api_key = api_key
|
32
|
-
@api_host = api_host
|
33
|
-
@segments_to_check = segments_to_check
|
34
|
-
@mutex = Mutex.new
|
35
|
-
@odp_state = @api_host.nil? || @api_key.nil? ? ODP_CONFIG_STATE[:UNDETERMINED] : ODP_CONFIG_STATE[:INTEGRATED]
|
36
|
-
end
|
37
|
-
|
38
|
-
# Replaces the existing configuration
|
39
|
-
#
|
40
|
-
# @param api_host - The host URL for the ODP audience segments API (optional).
|
41
|
-
# @param api_key - The public API key for the ODP account from which the audience segments will be fetched (optional).
|
42
|
-
# @param segments_to_check - An array of all ODP segments used in the current datafile (associated with api_host/api_key).
|
43
|
-
#
|
44
|
-
# @return - True if the provided values were different than the existing values.
|
45
|
-
|
46
|
-
def update(api_key = nil, api_host = nil, segments_to_check = [])
|
47
|
-
updated = false
|
48
|
-
@mutex.synchronize do
|
49
|
-
@odp_state = api_host.nil? || api_key.nil? ? ODP_CONFIG_STATE[:NOT_INTEGRATED] : ODP_CONFIG_STATE[:INTEGRATED]
|
50
|
-
|
51
|
-
if @api_key != api_key || @api_host != api_host || @segments_to_check != segments_to_check
|
52
|
-
@api_key = api_key
|
53
|
-
@api_host = api_host
|
54
|
-
@segments_to_check = segments_to_check
|
55
|
-
updated = true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
updated
|
60
|
-
end
|
61
|
-
|
62
|
-
# Returns the api host for odp connections
|
63
|
-
#
|
64
|
-
# @return - The api host.
|
65
|
-
|
66
|
-
def api_host
|
67
|
-
@mutex.synchronize { @api_host.clone }
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns the api key for odp connections
|
71
|
-
#
|
72
|
-
# @return - The api key.
|
73
|
-
|
74
|
-
def api_key
|
75
|
-
@mutex.synchronize { @api_key.clone }
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns An array of qualified segments for this user
|
79
|
-
#
|
80
|
-
# @return - An array of segments names.
|
81
|
-
|
82
|
-
def segments_to_check
|
83
|
-
@mutex.synchronize { @segments_to_check.clone }
|
84
|
-
end
|
85
|
-
|
86
|
-
# Replace qualified segments with provided segments
|
87
|
-
#
|
88
|
-
# @param segments - An array of segment names
|
89
|
-
|
90
|
-
def segments_to_check=(segments_to_check)
|
91
|
-
@mutex.synchronize { @segments_to_check = segments_to_check.clone }
|
92
|
-
end
|
93
|
-
|
94
|
-
# Returns the state of odp integration (UNDETERMINED, INTEGRATED, NOT_INTEGRATED)
|
95
|
-
#
|
96
|
-
# @return - string
|
97
|
-
|
98
|
-
def odp_state
|
99
|
-
@mutex.synchronize { @odp_state }
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright 2022, Optimizely and contributors
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'optimizely/logger'
|
20
|
+
require_relative '../helpers/constants'
|
21
|
+
|
22
|
+
module Optimizely
|
23
|
+
class OdpConfig
|
24
|
+
ODP_CONFIG_STATE = Helpers::Constants::ODP_CONFIG_STATE
|
25
|
+
# Contains configuration used for ODP integration.
|
26
|
+
#
|
27
|
+
# @param api_host - The host URL for the ODP audience segments API (optional).
|
28
|
+
# @param api_key - The public API key for the ODP account from which the audience segments will be fetched (optional).
|
29
|
+
# @param segments_to_check - An array of all ODP segments used in the current datafile (associated with api_host/api_key).
|
30
|
+
def initialize(api_key = nil, api_host = nil, segments_to_check = [])
|
31
|
+
@api_key = api_key
|
32
|
+
@api_host = api_host
|
33
|
+
@segments_to_check = segments_to_check
|
34
|
+
@mutex = Mutex.new
|
35
|
+
@odp_state = @api_host.nil? || @api_key.nil? ? ODP_CONFIG_STATE[:UNDETERMINED] : ODP_CONFIG_STATE[:INTEGRATED]
|
36
|
+
end
|
37
|
+
|
38
|
+
# Replaces the existing configuration
|
39
|
+
#
|
40
|
+
# @param api_host - The host URL for the ODP audience segments API (optional).
|
41
|
+
# @param api_key - The public API key for the ODP account from which the audience segments will be fetched (optional).
|
42
|
+
# @param segments_to_check - An array of all ODP segments used in the current datafile (associated with api_host/api_key).
|
43
|
+
#
|
44
|
+
# @return - True if the provided values were different than the existing values.
|
45
|
+
|
46
|
+
def update(api_key = nil, api_host = nil, segments_to_check = [])
|
47
|
+
updated = false
|
48
|
+
@mutex.synchronize do
|
49
|
+
@odp_state = api_host.nil? || api_key.nil? ? ODP_CONFIG_STATE[:NOT_INTEGRATED] : ODP_CONFIG_STATE[:INTEGRATED]
|
50
|
+
|
51
|
+
if @api_key != api_key || @api_host != api_host || @segments_to_check != segments_to_check
|
52
|
+
@api_key = api_key
|
53
|
+
@api_host = api_host
|
54
|
+
@segments_to_check = segments_to_check
|
55
|
+
updated = true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
updated
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns the api host for odp connections
|
63
|
+
#
|
64
|
+
# @return - The api host.
|
65
|
+
|
66
|
+
def api_host
|
67
|
+
@mutex.synchronize { @api_host.clone }
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns the api key for odp connections
|
71
|
+
#
|
72
|
+
# @return - The api key.
|
73
|
+
|
74
|
+
def api_key
|
75
|
+
@mutex.synchronize { @api_key.clone }
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns An array of qualified segments for this user
|
79
|
+
#
|
80
|
+
# @return - An array of segments names.
|
81
|
+
|
82
|
+
def segments_to_check
|
83
|
+
@mutex.synchronize { @segments_to_check.clone }
|
84
|
+
end
|
85
|
+
|
86
|
+
# Replace qualified segments with provided segments
|
87
|
+
#
|
88
|
+
# @param segments - An array of segment names
|
89
|
+
|
90
|
+
def segments_to_check=(segments_to_check)
|
91
|
+
@mutex.synchronize { @segments_to_check = segments_to_check.clone }
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the state of odp integration (UNDETERMINED, INTEGRATED, NOT_INTEGRATED)
|
95
|
+
#
|
96
|
+
# @return - string
|
97
|
+
|
98
|
+
def odp_state
|
99
|
+
@mutex.synchronize { @odp_state }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -1,75 +1,75 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
#
|
4
|
-
# Copyright 2022, Optimizely and contributors
|
5
|
-
#
|
6
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
-
# you may not use this file except in compliance with the License.
|
8
|
-
# You may obtain a copy of the License at
|
9
|
-
#
|
10
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
-
#
|
12
|
-
# Unless required by applicable law or agreed to in writing, software
|
13
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
-
# See the License for the specific language governing permissions and
|
16
|
-
# limitations under the License.
|
17
|
-
#
|
18
|
-
|
19
|
-
require 'json'
|
20
|
-
require_relative '../helpers/constants'
|
21
|
-
|
22
|
-
module Optimizely
|
23
|
-
class OdpEvent
|
24
|
-
# Representation of an odp event which can be sent to the Optimizely odp platform.
|
25
|
-
|
26
|
-
KEY_FOR_USER_ID = Helpers::Constants::ODP_MANAGER_CONFIG[:KEY_FOR_USER_ID]
|
27
|
-
|
28
|
-
def initialize(type:, action:, identifiers:, data:)
|
29
|
-
@type = type
|
30
|
-
@action = action
|
31
|
-
@identifiers = convert_identifiers(identifiers)
|
32
|
-
@data = add_common_event_data(data)
|
33
|
-
end
|
34
|
-
|
35
|
-
def add_common_event_data(custom_data)
|
36
|
-
data = {
|
37
|
-
idempotence_id: SecureRandom.uuid,
|
38
|
-
data_source_type: 'sdk',
|
39
|
-
data_source: 'ruby-sdk',
|
40
|
-
data_source_version: VERSION
|
41
|
-
}
|
42
|
-
data.update(custom_data)
|
43
|
-
data
|
44
|
-
end
|
45
|
-
|
46
|
-
def convert_identifiers(identifiers)
|
47
|
-
# Convert incorrect case/separator of identifier key `fs_user_id`
|
48
|
-
# (ie. `fs-user-id`, `FS_USER_ID`).
|
49
|
-
|
50
|
-
identifiers.clone.each_key do |key|
|
51
|
-
break if key == KEY_FOR_USER_ID
|
52
|
-
|
53
|
-
if ['fs-user-id', KEY_FOR_USER_ID].include?(key.downcase)
|
54
|
-
identifiers[KEY_FOR_USER_ID] = identifiers.delete(key)
|
55
|
-
break
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
identifiers
|
60
|
-
end
|
61
|
-
|
62
|
-
def to_json(*_args)
|
63
|
-
{
|
64
|
-
type: @type,
|
65
|
-
action: @action,
|
66
|
-
identifiers: @identifiers,
|
67
|
-
data: @data
|
68
|
-
}.to_json
|
69
|
-
end
|
70
|
-
|
71
|
-
def ==(other)
|
72
|
-
to_json == other.to_json
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright 2022, Optimizely and contributors
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'json'
|
20
|
+
require_relative '../helpers/constants'
|
21
|
+
|
22
|
+
module Optimizely
|
23
|
+
class OdpEvent
|
24
|
+
# Representation of an odp event which can be sent to the Optimizely odp platform.
|
25
|
+
|
26
|
+
KEY_FOR_USER_ID = Helpers::Constants::ODP_MANAGER_CONFIG[:KEY_FOR_USER_ID]
|
27
|
+
|
28
|
+
def initialize(type:, action:, identifiers:, data:)
|
29
|
+
@type = type
|
30
|
+
@action = action
|
31
|
+
@identifiers = convert_identifiers(identifiers)
|
32
|
+
@data = add_common_event_data(data)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_common_event_data(custom_data)
|
36
|
+
data = {
|
37
|
+
idempotence_id: SecureRandom.uuid,
|
38
|
+
data_source_type: 'sdk',
|
39
|
+
data_source: 'ruby-sdk',
|
40
|
+
data_source_version: VERSION
|
41
|
+
}
|
42
|
+
data.update(custom_data)
|
43
|
+
data
|
44
|
+
end
|
45
|
+
|
46
|
+
def convert_identifiers(identifiers)
|
47
|
+
# Convert incorrect case/separator of identifier key `fs_user_id`
|
48
|
+
# (ie. `fs-user-id`, `FS_USER_ID`).
|
49
|
+
|
50
|
+
identifiers.clone.each_key do |key|
|
51
|
+
break if key == KEY_FOR_USER_ID
|
52
|
+
|
53
|
+
if ['fs-user-id', KEY_FOR_USER_ID].include?(key.downcase)
|
54
|
+
identifiers[KEY_FOR_USER_ID] = identifiers.delete(key)
|
55
|
+
break
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
identifiers
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_json(*_args)
|
63
|
+
{
|
64
|
+
type: @type,
|
65
|
+
action: @action,
|
66
|
+
identifiers: @identifiers,
|
67
|
+
data: @data
|
68
|
+
}.to_json
|
69
|
+
end
|
70
|
+
|
71
|
+
def ==(other)
|
72
|
+
to_json == other.to_json
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|