splitclient-rb 6.4.1 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.txt +10 -1
  3. data/Detailed-README.md +9 -21
  4. data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +3 -3
  5. data/lib/splitclient-rb/cache/repositories/events/memory_repository.rb +5 -4
  6. data/lib/splitclient-rb/cache/repositories/events/redis_repository.rb +4 -3
  7. data/lib/splitclient-rb/cache/repositories/events_repository.rb +10 -9
  8. data/lib/splitclient-rb/cache/repositories/impressions/memory_repository.rb +7 -6
  9. data/lib/splitclient-rb/cache/repositories/impressions/redis_repository.rb +5 -4
  10. data/lib/splitclient-rb/cache/repositories/impressions_repository.rb +9 -8
  11. data/lib/splitclient-rb/cache/repositories/metrics/memory_repository.rb +3 -2
  12. data/lib/splitclient-rb/cache/repositories/metrics/redis_repository.rb +5 -4
  13. data/lib/splitclient-rb/cache/repositories/metrics_repository.rb +6 -4
  14. data/lib/splitclient-rb/cache/repositories/repository.rb +7 -2
  15. data/lib/splitclient-rb/cache/repositories/segments_repository.rb +6 -5
  16. data/lib/splitclient-rb/cache/repositories/splits_repository.rb +56 -14
  17. data/lib/splitclient-rb/cache/routers/impression_router.rb +5 -4
  18. data/lib/splitclient-rb/cache/senders/events_sender.rb +7 -6
  19. data/lib/splitclient-rb/cache/senders/impressions_sender.rb +10 -9
  20. data/lib/splitclient-rb/cache/senders/metrics_sender.rb +9 -8
  21. data/lib/splitclient-rb/cache/stores/sdk_blocker.rb +19 -10
  22. data/lib/splitclient-rb/cache/stores/segment_store.rb +15 -28
  23. data/lib/splitclient-rb/cache/stores/split_store.rb +13 -15
  24. data/lib/splitclient-rb/clients/localhost_split_client.rb +8 -7
  25. data/lib/splitclient-rb/clients/split_client.rb +65 -35
  26. data/lib/splitclient-rb/engine/api/client.rb +17 -13
  27. data/lib/splitclient-rb/engine/api/events.rb +7 -6
  28. data/lib/splitclient-rb/engine/api/impressions.rb +6 -5
  29. data/lib/splitclient-rb/engine/api/metrics.rb +8 -7
  30. data/lib/splitclient-rb/engine/api/segments.rb +11 -10
  31. data/lib/splitclient-rb/engine/api/splits.rb +6 -5
  32. data/lib/splitclient-rb/engine/matchers/all_keys_matcher.rb +1 -1
  33. data/lib/splitclient-rb/engine/matchers/between_matcher.rb +7 -5
  34. data/lib/splitclient-rb/engine/matchers/combining_matcher.rb +5 -4
  35. data/lib/splitclient-rb/engine/matchers/contains_all_matcher.rb +4 -4
  36. data/lib/splitclient-rb/engine/matchers/contains_any_matcher.rb +3 -3
  37. data/lib/splitclient-rb/engine/matchers/contains_matcher.rb +7 -5
  38. data/lib/splitclient-rb/engine/matchers/dependency_matcher.rb +3 -2
  39. data/lib/splitclient-rb/engine/matchers/ends_with_matcher.rb +5 -4
  40. data/lib/splitclient-rb/engine/matchers/equal_to_boolean_matcher.rb +3 -2
  41. data/lib/splitclient-rb/engine/matchers/equal_to_matcher.rb +6 -4
  42. data/lib/splitclient-rb/engine/matchers/equal_to_set_matcher.rb +3 -3
  43. data/lib/splitclient-rb/engine/matchers/greater_than_or_equal_to_matcher.rb +6 -4
  44. data/lib/splitclient-rb/engine/matchers/less_than_or_equal_to_matcher.rb +6 -4
  45. data/lib/splitclient-rb/engine/matchers/matcher.rb +4 -0
  46. data/lib/splitclient-rb/engine/matchers/matches_string_matcher.rb +3 -2
  47. data/lib/splitclient-rb/engine/matchers/negation_matcher.rb +3 -2
  48. data/lib/splitclient-rb/engine/matchers/part_of_set_matcher.rb +4 -4
  49. data/lib/splitclient-rb/engine/matchers/set_matcher.rb +2 -1
  50. data/lib/splitclient-rb/engine/matchers/starts_with_matcher.rb +4 -3
  51. data/lib/splitclient-rb/engine/matchers/user_defined_segment_matcher.rb +3 -2
  52. data/lib/splitclient-rb/engine/matchers/whitelist_matcher.rb +7 -5
  53. data/lib/splitclient-rb/engine/models/label.rb +2 -0
  54. data/lib/splitclient-rb/engine/parser/condition.rb +31 -20
  55. data/lib/splitclient-rb/engine/parser/evaluator.rb +3 -2
  56. data/lib/splitclient-rb/engine/parser/split_adapter.rb +9 -7
  57. data/lib/splitclient-rb/localhost_split_factory.rb +3 -2
  58. data/lib/splitclient-rb/managers/split_manager.rb +39 -5
  59. data/lib/splitclient-rb/redis_metrics_fixer.rb +5 -4
  60. data/lib/splitclient-rb/split_config.rb +35 -14
  61. data/lib/splitclient-rb/split_factory.rb +44 -32
  62. data/lib/splitclient-rb/split_factory_builder.rb +4 -5
  63. data/lib/splitclient-rb/split_factory_registry.rb +51 -0
  64. data/lib/splitclient-rb/split_logger.rb +5 -14
  65. data/lib/splitclient-rb/validators.rb +19 -16
  66. data/lib/splitclient-rb/version.rb +1 -1
  67. data/lib/splitclient-rb.rb +2 -1
  68. metadata +3 -2
@@ -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
- SplitIoClient.configuration.logger.info('Split SDK shutdown started...')
14
+ @config.logger.info('Split SDK shutdown started...')
14
15
  @client.destroy if @client
15
16
  stop!
16
- SplitIoClient.configuration.logger.info('Split SDK shutdown complete')
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
- SplitIoClient.configure(config_hash)
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
- @cache_adapter = SplitIoClient.configuration.cache_adapter
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
- @sdk_blocker.block if @sdk_blocker
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
- SplitIoClient.configuration.threads.each { |_, t| t.exit }
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 SplitIoClient.configuration.mode
72
+ case @config.mode
61
73
  when :consumer
62
- if SplitIoClient.configuration.cache_adapter.is_a? SplitIoClient::Cache::Adapters::RedisAdapter
74
+ if @config.cache_adapter.is_a? SplitIoClient::Cache::Adapters::RedisAdapter
63
75
  valid_startup_mode = true
64
76
  else
65
- SplitIoClient.configuration.logger.error('Consumer mode cannot be used with Memory adapter. ' \
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 SplitIoClient.configuration.cache_adapter.is_a? SplitIoClient::Cache::Adapters::MemoryAdapter
81
+ if @config.cache_adapter.is_a? SplitIoClient::Cache::Adapters::MemoryAdapter
70
82
  valid_startup_mode = true
71
83
  else
72
- SplitIoClient.configuration.logger.error('Standalone mode cannot be used with Redis adapter. ' \
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
- SplitIoClient.configuration.logger.error('Producer mode is no longer supported. Use Split Synchronizer. ' \
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
- SplitIoClient.configuration.logger.error('Invalid SDK mode selected. ' \
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
- SplitIoClient.configuration.logger.error('Factory Instantiation: you passed a nil api_key, api_key must be a non-empty String')
93
- SplitIoClient.configuration.valid_mode = false
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
- SplitIoClient.configuration.logger.error('Factory Instantiation: you passed and empty api_key, api_key must be a non-empty String')
96
- SplitIoClient.configuration.valid_mode = false
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
- SplitIoClient.configure( { logger: config[:logger] } )
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
- SplitIoClient.configuration.logger.warn('Localhost mode: .split mocks ' \
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
- include Singleton
3
+ def initialize(config)
4
+ @config = config
5
+ end
6
6
 
7
7
  def log_if_debug(message)
8
- SplitIoClient.configuration.logger.debug(message) if SplitIoClient.configuration.debug_enabled
8
+ @config.logger.debug(message) if @config.debug_enabled
9
9
  end
10
10
 
11
11
  def log_if_transport(message)
12
- SplitIoClient.configuration.logger.debug(message) if SplitIoClient.configuration.transport_debug_enabled
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
- module Validators
5
- extend self
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
- SplitIoClient.configuration.logger.error("#{method}: you passed a nil #{key}, #{key} must be a non-empty String or a Symbol")
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
- SplitIoClient.configuration.logger.error("#{method}: you passed an empty #{key}, #{key} must be a non-empty String or a Symbol")
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
- SplitIoClient.configuration.logger.error("#{method}: you passed an invalid #{key} type, #{key} must be a non-empty String or a Symbol")
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
- SplitIoClient.configuration.logger.warn("#{method}: #{key} \"#{value}\" is not of type String, converting")
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
- SplitIoClient.configuration.logger.error("#{method}: #{key} is too long - must be #{SplitIoClient.configuration.max_key_size} characters or less")
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 > SplitIoClient.configuration.max_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 > SplitIoClient.configuration.max_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
- SplitIoClient.configuration.logger.error("#{method}: split_names must be a non-empty Array")
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
- SplitIoClient.configuration.logger.error("#{method}: attributes must be of type Hash")
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 > SplitIoClient.configuration.max_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
- SplitIoClient.configuration.logger.error("track: you passed '#{event_type}', " \
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
- SplitIoClient.configuration.logger.warn('track: traffic_type_name should be all lowercase - ' \
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
- SplitIoClient.configuration.logger.error('track: value must be Numeric')
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
- SplitIoClient.configuration.logger.error('track: properties must be a Hash')
263
+ @config.logger.error('track: properties must be a Hash')
261
264
  return false
262
265
  end
263
266
 
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '6.4.1'
2
+ VERSION = '7.0.0'
3
3
  end
@@ -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: 6.4.1
4
+ version: 7.0.0
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-07-26 00:00:00.000000000 Z
11
+ date: 2019-08-23 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