splitclient-rb 6.4.1 → 7.0.0.pre.rc1
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/Detailed-README.md +9 -21
- data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +3 -3
- data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +5 -4
- data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +4 -3
- data/lib/splitclient-rb/cache/repositories/events_repository.rb +10 -9
- data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +7 -6
- data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +5 -4
- data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +9 -8
- data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +3 -2
- data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +5 -4
- data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +6 -4
- data/lib/splitclient-rb/cache/repositories/repository.rb +7 -2
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +6 -5
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +54 -7
- data/lib/splitclient-rb/cache/routers/impression_router.rb +5 -4
- data/lib/splitclient-rb/cache/senders/events_sender.rb +7 -6
- data/lib/splitclient-rb/cache/senders/impressions_sender.rb +10 -9
- data/lib/splitclient-rb/cache/senders/metrics_sender.rb +9 -8
- data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +19 -10
- data/lib/splitclient-rb/cache/stores/segment_store.rb +15 -28
- data/lib/splitclient-rb/cache/stores/split_store.rb +13 -15
- data/lib/splitclient-rb/clients/localhost_split_client.rb +8 -7
- data/lib/splitclient-rb/clients/split_client.rb +65 -35
- data/lib/splitclient-rb/engine/api/client.rb +17 -13
- data/lib/splitclient-rb/engine/api/events.rb +7 -6
- data/lib/splitclient-rb/engine/api/impressions.rb +6 -5
- data/lib/splitclient-rb/engine/api/metrics.rb +8 -7
- data/lib/splitclient-rb/engine/api/segments.rb +11 -10
- data/lib/splitclient-rb/engine/api/splits.rb +6 -5
- data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +1 -1
- data/lib/splitclient-rb/engine/matchers/between_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +5 -4
- data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +4 -4
- data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +3 -3
- data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +5 -4
- data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +3 -3
- data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +6 -4
- data/lib/splitclient-rb/engine/matchers/matcher.rb +4 -0
- data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +4 -4
- data/lib/splitclient-rb/engine/matchers/set_matcher.rb +2 -1
- data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +4 -3
- data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +3 -2
- data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +7 -5
- data/lib/splitclient-rb/engine/models/label.rb +2 -0
- data/lib/splitclient-rb/engine/parser/condition.rb +31 -20
- data/lib/splitclient-rb/engine/parser/evaluator.rb +3 -2
- data/lib/splitclient-rb/engine/parser/split_adapter.rb +9 -7
- data/lib/splitclient-rb/localhost_split_factory.rb +3 -2
- data/lib/splitclient-rb/managers/split_manager.rb +39 -5
- data/lib/splitclient-rb/redis_metrics_fixer.rb +5 -4
- data/lib/splitclient-rb/split_config.rb +35 -14
- data/lib/splitclient-rb/split_factory.rb +44 -32
- data/lib/splitclient-rb/split_factory_builder.rb +4 -5
- data/lib/splitclient-rb/split_factory_registry.rb +51 -0
- data/lib/splitclient-rb/split_logger.rb +5 -14
- data/lib/splitclient-rb/validators.rb +19 -16
- data/lib/splitclient-rb/version.rb +1 -1
- data/lib/splitclient-rb.rb +2 -1
- metadata +5 -4
@@ -1,82 +1,94 @@
|
|
1
1
|
module SplitIoClient
|
2
2
|
class SplitFactory
|
3
3
|
ROOT_PROCESS_ID = Process.pid
|
4
|
+
SINGLETON_WARN = 'We recommend keeping only one instance of the factory at all times (Singleton pattern) and reusing it throughout your application'
|
4
5
|
include SplitIoClient::Cache::Repositories
|
5
6
|
include SplitIoClient::Cache::Stores
|
6
7
|
|
7
|
-
attr_reader :adapter, :client, :manager
|
8
|
+
attr_reader :adapter, :client, :manager, :config
|
8
9
|
|
9
10
|
def initialize(api_key, config_hash = {})
|
10
11
|
at_exit do
|
11
12
|
unless ENV['SPLITCLIENT_ENV'] == 'test'
|
12
13
|
if (Process.pid == ROOT_PROCESS_ID)
|
13
|
-
|
14
|
+
@config.logger.info('Split SDK shutdown started...')
|
14
15
|
@client.destroy if @client
|
15
16
|
stop!
|
16
|
-
|
17
|
+
@config.logger.info('Split SDK shutdown complete')
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
@api_key = api_key
|
22
|
-
|
23
|
+
@config = SplitConfig.new (config_hash)
|
23
24
|
|
24
25
|
raise 'Invalid SDK mode' unless valid_mode
|
26
|
+
|
27
|
+
@splits_repository = SplitsRepository.new(@config)
|
28
|
+
@segments_repository = SegmentsRepository.new(@config)
|
29
|
+
@impressions_repository = ImpressionsRepository.new(@config)
|
30
|
+
@metrics_repository = MetricsRepository.new(@config)
|
31
|
+
@events_repository = EventsRepository.new(@config, @api_key)
|
25
32
|
|
26
|
-
@
|
27
|
-
|
28
|
-
@splits_repository = SplitsRepository.new(@cache_adapter)
|
29
|
-
@segments_repository = SegmentsRepository.new(@cache_adapter)
|
30
|
-
@impressions_repository = ImpressionsRepository.new(SplitIoClient.configuration.impressions_adapter)
|
31
|
-
@metrics_repository = MetricsRepository.new(SplitIoClient.configuration.metrics_adapter)
|
32
|
-
@events_repository = EventsRepository.new(SplitIoClient.configuration.events_adapter, @api_key)
|
33
|
-
|
34
|
-
if SplitIoClient.configuration.mode == :standalone && SplitIoClient.configuration.block_until_ready > 0
|
35
|
-
@sdk_blocker = SDKBlocker.new(@splits_repository, @segments_repository)
|
36
|
-
end
|
33
|
+
@sdk_blocker = SDKBlocker.new(@splits_repository, @segments_repository, @config)
|
37
34
|
|
38
35
|
@adapter = start!
|
39
36
|
|
40
|
-
@client = SplitClient.new(@api_key, @adapter, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository)
|
41
|
-
@manager = SplitManager.new(@api_key, @adapter, @splits_repository)
|
37
|
+
@client = SplitClient.new(@api_key, @adapter, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository, @sdk_blocker, @config)
|
38
|
+
@manager = SplitManager.new(@api_key, @adapter, @splits_repository, @sdk_blocker, @config)
|
42
39
|
|
43
40
|
validate_api_key
|
44
41
|
|
45
|
-
RedisMetricsFixer.new(@metrics_repository).call
|
42
|
+
RedisMetricsFixer.new(@metrics_repository, @config).call
|
46
43
|
|
47
|
-
|
44
|
+
register_factory
|
48
45
|
end
|
49
46
|
|
50
47
|
def start!
|
51
|
-
SplitAdapter.new(@api_key, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository, @sdk_blocker)
|
48
|
+
SplitAdapter.new(@api_key, @splits_repository, @segments_repository, @impressions_repository, @metrics_repository, @events_repository, @sdk_blocker, @config)
|
52
49
|
end
|
53
50
|
|
54
51
|
def stop!
|
55
|
-
|
52
|
+
@config.threads.each { |_, t| t.exit }
|
53
|
+
end
|
54
|
+
|
55
|
+
def register_factory
|
56
|
+
SplitIoClient.load_factory_registry
|
57
|
+
|
58
|
+
number_of_factories = SplitIoClient.split_factory_registry.number_of_factories_for(@api_key)
|
59
|
+
|
60
|
+
if(number_of_factories > 0)
|
61
|
+
@config.logger.warn("Factory instantiation: You already have #{number_of_factories} factories with this API Key. #{SINGLETON_WARN}")
|
62
|
+
elsif(SplitIoClient.split_factory_registry.other_factories)
|
63
|
+
@config.logger.warn('Factory instantiation: You already have an instance of the Split factory.' \
|
64
|
+
" Make sure you definitely want this additional instance. #{SINGLETON_WARN}")
|
65
|
+
end
|
66
|
+
|
67
|
+
SplitIoClient.split_factory_registry.add(@api_key)
|
56
68
|
end
|
57
69
|
|
58
70
|
def valid_mode
|
59
71
|
valid_startup_mode = false
|
60
|
-
case
|
72
|
+
case @config.mode
|
61
73
|
when :consumer
|
62
|
-
if
|
74
|
+
if @config.cache_adapter.is_a? SplitIoClient::Cache::Adapters::RedisAdapter
|
63
75
|
valid_startup_mode = true
|
64
76
|
else
|
65
|
-
|
77
|
+
@config.logger.error('Consumer mode cannot be used with Memory adapter. ' \
|
66
78
|
'Use Redis adapter instead.')
|
67
79
|
end
|
68
80
|
when :standalone
|
69
|
-
if
|
81
|
+
if @config.cache_adapter.is_a? SplitIoClient::Cache::Adapters::MemoryAdapter
|
70
82
|
valid_startup_mode = true
|
71
83
|
else
|
72
|
-
|
84
|
+
@config.logger.error('Standalone mode cannot be used with Redis adapter. ' \
|
73
85
|
'Use Memory adapter instead.')
|
74
86
|
end
|
75
87
|
when :producer
|
76
|
-
|
88
|
+
@config.logger.error('Producer mode is no longer supported. Use Split Synchronizer. ' \
|
77
89
|
'See: https://github.com/splitio/split-synchronizer')
|
78
90
|
else
|
79
|
-
|
91
|
+
@config.logger.error('Invalid SDK mode selected. ' \
|
80
92
|
"Valid modes are 'standalone with memory adapter' and 'consumer with redis adapter'")
|
81
93
|
end
|
82
94
|
|
@@ -89,11 +101,11 @@ module SplitIoClient
|
|
89
101
|
|
90
102
|
def validate_api_key
|
91
103
|
if(@api_key.nil?)
|
92
|
-
|
93
|
-
|
104
|
+
@config.logger.error('Factory Instantiation: you passed a nil api_key, api_key must be a non-empty String')
|
105
|
+
@config.valid_mode = false
|
94
106
|
elsif (@api_key.empty?)
|
95
|
-
|
96
|
-
|
107
|
+
@config.logger.error('Factory Instantiation: you passed and empty api_key, api_key must be a non-empty String')
|
108
|
+
@config.valid_mode = false
|
97
109
|
end
|
98
110
|
end
|
99
111
|
end
|
@@ -5,9 +5,8 @@ module SplitIoClient
|
|
5
5
|
def self.build(api_key, config = {})
|
6
6
|
case api_key
|
7
7
|
when 'localhost'
|
8
|
-
|
9
|
-
|
10
|
-
LocalhostSplitFactory.new(split_file(config[:split_file]), config[:reload_rate])
|
8
|
+
configuration = SplitConfig.new(config)
|
9
|
+
LocalhostSplitFactory.new(split_file(config[:split_file], configuration.logger), configuration, config[:reload_rate])
|
11
10
|
else
|
12
11
|
SplitFactory.new(api_key, config)
|
13
12
|
end
|
@@ -15,10 +14,10 @@ module SplitIoClient
|
|
15
14
|
|
16
15
|
private
|
17
16
|
|
18
|
-
def self.split_file(split_file_path)
|
17
|
+
def self.split_file(split_file_path, logger)
|
19
18
|
return split_file_path unless split_file_path.nil?
|
20
19
|
|
21
|
-
|
20
|
+
logger.warn('Localhost mode: .split mocks ' \
|
22
21
|
'will be deprecated soon in favor of YAML files, which provide more ' \
|
23
22
|
'targeting power. Take a look in our documentation.')
|
24
23
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
module SplitIoClient
|
5
|
+
|
6
|
+
class << self
|
7
|
+
attr_accessor :split_factory_registry
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.load_factory_registry
|
11
|
+
self.split_factory_registry ||= SplitFactoryRegistry.new
|
12
|
+
end
|
13
|
+
|
14
|
+
#
|
15
|
+
# This class manages configuration options for the split client library.
|
16
|
+
# If not custom configuration is required the default configuration values will be used
|
17
|
+
#
|
18
|
+
class SplitFactoryRegistry
|
19
|
+
|
20
|
+
attr_accessor :api_keys_hash
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@api_keys_hash = Hash.new
|
24
|
+
end
|
25
|
+
|
26
|
+
def add(api_key)
|
27
|
+
return unless api_key
|
28
|
+
|
29
|
+
@api_keys_hash[api_key] = 0 unless @api_keys_hash[api_key]
|
30
|
+
@api_keys_hash[api_key] += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def remove(api_key)
|
34
|
+
return unless api_key
|
35
|
+
|
36
|
+
@api_keys_hash[api_key] -= 1 if @api_keys_hash[api_key]
|
37
|
+
@api_keys_hash.delete(api_key) if @api_keys_hash[api_key] == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def number_of_factories_for(api_key)
|
41
|
+
return 0 unless api_key
|
42
|
+
return 0 unless @api_keys_hash.key?(api_key)
|
43
|
+
|
44
|
+
@api_keys_hash[api_key]
|
45
|
+
end
|
46
|
+
|
47
|
+
def other_factories
|
48
|
+
return !@api_keys_hash.empty?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -1,24 +1,15 @@
|
|
1
|
-
require 'singleton'
|
2
|
-
|
3
1
|
module SplitIoClient
|
4
2
|
class SplitLogger
|
5
|
-
|
3
|
+
def initialize(config)
|
4
|
+
@config = config
|
5
|
+
end
|
6
6
|
|
7
7
|
def log_if_debug(message)
|
8
|
-
|
8
|
+
@config.logger.debug(message) if @config.debug_enabled
|
9
9
|
end
|
10
10
|
|
11
11
|
def log_if_transport(message)
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
def log_error(message)
|
16
|
-
SplitIoClient.configuration.logger.error(message)
|
17
|
-
end
|
18
|
-
|
19
|
-
class << self
|
20
|
-
extend Forwardable
|
21
|
-
def_delegators :instance, *SplitLogger.instance_methods(false)
|
12
|
+
@config.logger.debug(message) if @config.transport_debug_enabled
|
22
13
|
end
|
23
14
|
end
|
24
15
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SplitIoClient
|
4
|
-
|
5
|
-
|
4
|
+
class Validators
|
5
|
+
|
6
|
+
def initialize(config)
|
7
|
+
@config = config
|
8
|
+
end
|
6
9
|
|
7
10
|
def valid_get_treatment_parameters(method, key, split_name, matching_key, bucketing_key, attributes)
|
8
11
|
valid_key?(method, key) &&
|
@@ -50,23 +53,23 @@ module SplitIoClient
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def log_nil(key, method)
|
53
|
-
|
56
|
+
@config.logger.error("#{method}: you passed a nil #{key}, #{key} must be a non-empty String or a Symbol")
|
54
57
|
end
|
55
58
|
|
56
59
|
def log_empty_string(key, method)
|
57
|
-
|
60
|
+
@config.logger.error("#{method}: you passed an empty #{key}, #{key} must be a non-empty String or a Symbol")
|
58
61
|
end
|
59
62
|
|
60
63
|
def log_invalid_type(key, method)
|
61
|
-
|
64
|
+
@config.logger.error("#{method}: you passed an invalid #{key} type, #{key} must be a non-empty String or a Symbol")
|
62
65
|
end
|
63
66
|
|
64
67
|
def log_convert_numeric(key, method, value)
|
65
|
-
|
68
|
+
@config.logger.warn("#{method}: #{key} \"#{value}\" is not of type String, converting")
|
66
69
|
end
|
67
70
|
|
68
71
|
def log_key_too_long(key, method)
|
69
|
-
|
72
|
+
@config.logger.error("#{method}: #{key} is too long - must be #{@config.max_key_size} characters or less")
|
70
73
|
end
|
71
74
|
|
72
75
|
def valid_split_name?(method, split_name)
|
@@ -115,7 +118,7 @@ module SplitIoClient
|
|
115
118
|
|
116
119
|
log_convert_numeric(:matching_key, method, matching_key) if matching_key.is_a? Numeric
|
117
120
|
|
118
|
-
if matching_key.size >
|
121
|
+
if matching_key.size > @config.max_key_size
|
119
122
|
log_key_too_long(:matching_key, method)
|
120
123
|
return false
|
121
124
|
end
|
@@ -142,7 +145,7 @@ module SplitIoClient
|
|
142
145
|
|
143
146
|
log_convert_numeric(:bucketing_key, method, bucketing_key) if bucketing_key.is_a? Numeric
|
144
147
|
|
145
|
-
if bucketing_key.size >
|
148
|
+
if bucketing_key.size > @config.max_key_size
|
146
149
|
log_key_too_long(:bucketing_key, method)
|
147
150
|
return false
|
148
151
|
end
|
@@ -153,7 +156,7 @@ module SplitIoClient
|
|
153
156
|
|
154
157
|
def valid_split_names?(method, split_names)
|
155
158
|
unless !split_names.nil? && split_names.is_a?(Array)
|
156
|
-
|
159
|
+
@config.logger.error("#{method}: split_names must be a non-empty Array")
|
157
160
|
return false
|
158
161
|
end
|
159
162
|
|
@@ -162,7 +165,7 @@ module SplitIoClient
|
|
162
165
|
|
163
166
|
def valid_attributes?(method, attributes)
|
164
167
|
unless attributes.nil? || attributes.is_a?(Hash)
|
165
|
-
|
168
|
+
@config.logger.error("#{method}: attributes must be of type Hash")
|
166
169
|
return false
|
167
170
|
end
|
168
171
|
|
@@ -187,7 +190,7 @@ module SplitIoClient
|
|
187
190
|
|
188
191
|
log_convert_numeric(:key, :track, key) if key.is_a? Numeric
|
189
192
|
|
190
|
-
if key.size >
|
193
|
+
if key.size > @config.max_key_size
|
191
194
|
log_key_too_long(:key, :track)
|
192
195
|
return false
|
193
196
|
end
|
@@ -212,7 +215,7 @@ module SplitIoClient
|
|
212
215
|
end
|
213
216
|
|
214
217
|
if (event_type.to_s =~ /^[a-zA-Z0-9][-_.:a-zA-Z0-9]{0,79}$/).nil?
|
215
|
-
|
218
|
+
@config.logger.error("track: you passed '#{event_type}', " \
|
216
219
|
'event_type must adhere to the regular expression ^[a-zA-Z0-9][-_.:a-zA-Z0-9]{0,79}$. ' \
|
217
220
|
'This means an event name must be alphanumeric, cannot be more than 80 characters long, ' \
|
218
221
|
'and can only include a dash, underscore, period, or colon as separators of alphanumeric characters')
|
@@ -239,7 +242,7 @@ module SplitIoClient
|
|
239
242
|
end
|
240
243
|
|
241
244
|
unless traffic_type_name == traffic_type_name.downcase
|
242
|
-
|
245
|
+
@config.logger.warn('track: traffic_type_name should be all lowercase - ' \
|
243
246
|
'converting string to lowercase')
|
244
247
|
end
|
245
248
|
|
@@ -248,7 +251,7 @@ module SplitIoClient
|
|
248
251
|
|
249
252
|
def valid_value?(value)
|
250
253
|
unless (value.is_a?(Numeric) && !value.to_f.nan?) || value.nil?
|
251
|
-
|
254
|
+
@config.logger.error('track: value must be Numeric')
|
252
255
|
return false
|
253
256
|
end
|
254
257
|
|
@@ -257,7 +260,7 @@ module SplitIoClient
|
|
257
260
|
|
258
261
|
def valid_properties?(properties)
|
259
262
|
unless properties.is_a?(Hash) || properties.nil?
|
260
|
-
|
263
|
+
@config.logger.error('track: properties must be a Hash')
|
261
264
|
return false
|
262
265
|
end
|
263
266
|
|
data/lib/splitclient-rb.rb
CHANGED
@@ -39,6 +39,8 @@ require 'splitclient-rb/split_factory_builder'
|
|
39
39
|
require 'splitclient-rb/localhost_split_factory'
|
40
40
|
require 'splitclient-rb/split_config'
|
41
41
|
require 'splitclient-rb/split_logger'
|
42
|
+
require 'splitclient-rb/validators'
|
43
|
+
require 'splitclient-rb/split_factory_registry'
|
42
44
|
|
43
45
|
require 'splitclient-rb/engine/api/faraday_middleware/gzip'
|
44
46
|
require 'splitclient-rb/engine/api/faraday_adapter/patched_net_http_persistent'
|
@@ -82,7 +84,6 @@ require 'splitclient-rb/engine/models/split'
|
|
82
84
|
require 'splitclient-rb/engine/models/label'
|
83
85
|
require 'splitclient-rb/engine/models/treatment'
|
84
86
|
require 'splitclient-rb/utilitites'
|
85
|
-
require 'splitclient-rb/validators'
|
86
87
|
|
87
88
|
# redis metrics fixer
|
88
89
|
require 'splitclient-rb/redis_metrics_fixer'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: splitclient-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 7.0.0.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: allocation_stats
|
@@ -382,6 +382,7 @@ files:
|
|
382
382
|
- lib/splitclient-rb/split_config.rb
|
383
383
|
- lib/splitclient-rb/split_factory.rb
|
384
384
|
- lib/splitclient-rb/split_factory_builder.rb
|
385
|
+
- lib/splitclient-rb/split_factory_registry.rb
|
385
386
|
- lib/splitclient-rb/split_logger.rb
|
386
387
|
- lib/splitclient-rb/utilitites.rb
|
387
388
|
- lib/splitclient-rb/validators.rb
|
@@ -404,9 +405,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
404
405
|
version: '0'
|
405
406
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
406
407
|
requirements:
|
407
|
-
- - "
|
408
|
+
- - ">"
|
408
409
|
- !ruby/object:Gem::Version
|
409
|
-
version:
|
410
|
+
version: 1.3.1
|
410
411
|
requirements: []
|
411
412
|
rubygems_version: 3.0.3
|
412
413
|
signing_key:
|