splitclient-rb 2.0.1 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.txt +12 -0
  3. data/NEWS +4 -0
  4. data/README.md +45 -11
  5. data/lib/cache/adapters/adapter.rb +23 -0
  6. data/lib/cache/adapters/memory_adapter.rb +46 -0
  7. data/lib/cache/repositories/repository.rb +25 -0
  8. data/lib/cache/repositories/segments_repository.rb +52 -0
  9. data/lib/cache/repositories/splits_repository.rb +51 -0
  10. data/lib/cache/stores/sdk_blocker.rb +47 -0
  11. data/lib/cache/stores/segment_store.rb +71 -0
  12. data/lib/cache/stores/split_store.rb +64 -0
  13. data/lib/engine/api/client.rb +29 -0
  14. data/lib/engine/api/segments.rb +60 -0
  15. data/lib/engine/api/splits.rb +58 -0
  16. data/lib/{splitclient-engine → engine}/evaluator/splitter.rb +0 -0
  17. data/lib/{splitclient-engine → engine}/impressions/impressions.rb +0 -0
  18. data/lib/{splitclient-engine → engine}/matchers/all_keys_matcher.rb +0 -0
  19. data/lib/{splitclient-engine → engine}/matchers/between_matcher.rb +2 -0
  20. data/lib/{splitclient-engine → engine}/matchers/combiners.rb +0 -0
  21. data/lib/{splitclient-engine → engine}/matchers/combining_matcher.rb +1 -1
  22. data/lib/{splitclient-engine → engine}/matchers/equal_to_matcher.rb +0 -0
  23. data/lib/{splitclient-engine → engine}/matchers/greater_than_or_equal_to_matcher.rb +0 -0
  24. data/lib/{splitclient-engine → engine}/matchers/less_than_or_equal_to_matcher.rb +0 -0
  25. data/lib/{splitclient-engine → engine}/matchers/negation_matcher.rb +0 -0
  26. data/lib/{splitclient-engine → engine}/matchers/user_defined_segment_matcher.rb +4 -21
  27. data/lib/{splitclient-engine → engine}/matchers/whitelist_matcher.rb +0 -0
  28. data/lib/{splitclient-engine → engine}/metrics/binary_search_latency_tracker.rb +0 -0
  29. data/lib/{splitclient-engine → engine}/metrics/metrics.rb +0 -0
  30. data/lib/{splitclient-engine → engine}/parser/condition.rb +5 -7
  31. data/lib/{splitclient-engine → engine}/parser/partition.rb +0 -0
  32. data/lib/{splitclient-engine → engine}/parser/split.rb +11 -3
  33. data/lib/{splitclient-engine → engine}/parser/split_adapter.rb +20 -184
  34. data/lib/engine/parser/split_treatment.rb +65 -0
  35. data/lib/{splitclient-engine → engine}/partitions/treatments.rb +0 -0
  36. data/lib/exceptions/sdk_blocker_timeout_expired_exception.rb +4 -0
  37. data/lib/splitclient-rb.rb +31 -23
  38. data/lib/splitclient-rb/split_config.rb +41 -4
  39. data/lib/splitclient-rb/split_factory.rb +50 -20
  40. data/lib/splitclient-rb/version.rb +1 -1
  41. data/splitclient-rb.gemspec +2 -0
  42. metadata +62 -25
  43. data/lib/splitclient-cache/local_store.rb +0 -45
  44. data/lib/splitclient-engine/parser/segment.rb +0 -84
  45. data/lib/splitclient-engine/parser/segment_parser.rb +0 -46
  46. data/lib/splitclient-engine/parser/split_parser.rb +0 -122
@@ -0,0 +1,65 @@
1
+ module SplitIoClient
2
+ module Engine
3
+ module Parser
4
+ class SplitTreatment
5
+ def initialize(splits_repository, segments_repository)
6
+ @splits_repository = splits_repository
7
+ @segments_repository = segments_repository
8
+ end
9
+
10
+ def call(keys, split_name, default_treatment, attributes = nil)
11
+ split = @splits_repository.get_split(split_name)
12
+
13
+ return Treatments::CONTROL if archived?(split)
14
+
15
+ matchable?(split) ? match(split, keys, attributes, default_treatment) : default_treatment
16
+ end
17
+
18
+ private
19
+
20
+ def match(split, keys, attributes, default_treatment)
21
+ split[:conditions].each do |c|
22
+ condition = SplitIoClient::Condition.new(c)
23
+
24
+ next if condition.empty?
25
+
26
+ if matcher_type(condition).match?(keys[:matching_key], attributes)
27
+ treatment = Splitter.get_treatment(keys[:bucketing_key], split[:seed], condition.partitions)
28
+
29
+ return treatment.nil? ? default_treatment : treatment
30
+ end
31
+ end
32
+
33
+ default_treatment
34
+ end
35
+
36
+ def matcher_type(condition)
37
+ matchers = []
38
+
39
+ condition.matchers.each do |matcher|
40
+ matchers << condition.send(
41
+ "matcher_#{matcher[:matcherType].downcase}",
42
+ matcher: matcher, segments_repository: @segments_repository
43
+ )
44
+ end
45
+
46
+ final_matcher = condition.create_condition_matcher(matchers)
47
+
48
+ if final_matcher.nil?
49
+ @logger.error('Invalid matcher type')
50
+ else
51
+ final_matcher
52
+ end
53
+ end
54
+
55
+ def matchable?(split)
56
+ !split.nil? && split[:status] == 'ACTIVE' && split[:killed] == false
57
+ end
58
+
59
+ def archived?(split)
60
+ !split.nil? && split[:status] == 'ARCHIVED'
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,4 @@
1
+ module SplitIoClient
2
+ class SDKBlockerTimeoutExpiredException < StandardError
3
+ end
4
+ end
@@ -4,27 +4,35 @@ require 'splitclient-rb/split_factory_builder'
4
4
  require 'splitclient-rb/localhost_split_factory_builder'
5
5
  require 'splitclient-rb/localhost_split_factory'
6
6
  require 'splitclient-rb/split_config'
7
- require 'splitclient-cache/local_store'
8
- require 'splitclient-engine/parser/split'
9
- require 'splitclient-engine/parser/condition'
10
- require 'splitclient-engine/parser/partition'
11
- require 'splitclient-engine/parser/segment'
12
- require 'splitclient-engine/parser/split_adapter'
13
- require 'splitclient-engine/parser/split_parser'
14
- require 'splitclient-engine/parser/segment_parser'
15
- require 'splitclient-engine/partitions/treatments'
16
- require 'splitclient-engine/matchers/combiners'
17
- require 'splitclient-engine/matchers/combining_matcher'
18
- require 'splitclient-engine/matchers/all_keys_matcher'
19
- require 'splitclient-engine/matchers/negation_matcher'
20
- require 'splitclient-engine/matchers/user_defined_segment_matcher'
21
- require 'splitclient-engine/matchers/whitelist_matcher'
22
- require 'splitclient-engine/matchers/equal_to_matcher'
23
- require 'splitclient-engine/matchers/greater_than_or_equal_to_matcher'
24
- require 'splitclient-engine/matchers/less_than_or_equal_to_matcher'
25
- require 'splitclient-engine/matchers/between_matcher'
26
- require 'splitclient-engine/evaluator/splitter'
27
- require 'splitclient-engine/impressions/impressions'
28
- require 'splitclient-engine/metrics/metrics'
29
- require 'splitclient-engine/metrics/binary_search_latency_tracker'
7
+ require 'exceptions/sdk_blocker_timeout_expired_exception'
8
+ require 'cache/adapters/adapter'
9
+ require 'cache/adapters/memory_adapter'
10
+ require 'cache/repositories/repository'
11
+ require 'cache/repositories/segments_repository'
12
+ require 'cache/repositories/splits_repository'
13
+ require 'cache/stores/sdk_blocker'
14
+ require 'cache/stores/segment_store'
15
+ require 'cache/stores/split_store'
16
+ require 'engine/api/client'
17
+ require 'engine/api/segments'
18
+ require 'engine/api/splits'
19
+ require 'engine/parser/condition'
20
+ require 'engine/parser/partition'
21
+ require 'engine/parser/split_adapter'
22
+ require 'engine/parser/split_treatment'
23
+ require 'engine/partitions/treatments'
24
+ require 'engine/matchers/combiners'
25
+ require 'engine/matchers/combining_matcher'
26
+ require 'engine/matchers/all_keys_matcher'
27
+ require 'engine/matchers/negation_matcher'
28
+ require 'engine/matchers/user_defined_segment_matcher'
29
+ require 'engine/matchers/whitelist_matcher'
30
+ require 'engine/matchers/equal_to_matcher'
31
+ require 'engine/matchers/greater_than_or_equal_to_matcher'
32
+ require 'engine/matchers/less_than_or_equal_to_matcher'
33
+ require 'engine/matchers/between_matcher'
34
+ require 'engine/evaluator/splitter'
35
+ require 'engine/impressions/impressions'
36
+ require 'engine/metrics/metrics'
37
+ require 'engine/metrics/binary_search_latency_tracker'
30
38
  require 'splitclient-rb_utilitites'
@@ -27,7 +27,7 @@ module SplitIoClient
27
27
  def initialize(opts = {})
28
28
  @base_uri = (opts[:base_uri] || SplitConfig.default_base_uri).chomp('/')
29
29
  @events_uri = (opts[:events_uri] || SplitConfig.default_events_uri).chomp('/')
30
- @local_store = opts[:local_store] || SplitConfig.default_local_store
30
+ @cache_adapter = opts[:cache_adapter] || SplitConfig.default_cache_adapter
31
31
  @connection_timeout = opts[:connection_timeout] || SplitConfig.default_connection_timeout
32
32
  @read_timeout = opts[:read_timeout] || SplitConfig.default_read_timeout
33
33
  @features_refresh_rate = opts[:features_refresh_rate] || SplitConfig.default_features_refresh_rate
@@ -36,8 +36,12 @@ module SplitIoClient
36
36
  @impressions_refresh_rate = opts[:impressions_refresh_rate] || SplitConfig.default_impressions_refresh_rate
37
37
  @logger = opts[:logger] || SplitConfig.default_logger
38
38
  @debug_enabled = opts[:debug_enabled] || SplitConfig.default_debug
39
+ @transport_debug_enabled = opts[:transport_debug_enabled] || SplitConfig.default_debug
40
+ @block_until_ready = opts[:block_until_ready] || false
39
41
  @machine_name = SplitConfig.get_hostname
40
42
  @machine_ip = SplitConfig.get_ip
43
+
44
+ log_loaded_cache
41
45
  end
42
46
 
43
47
  #
@@ -65,6 +69,12 @@ module SplitIoClient
65
69
  # @return [Int] The timeout in seconds.
66
70
  attr_reader :read_timeout
67
71
 
72
+ #
73
+ # The cache adapter to store splits/segments in
74
+ #
75
+ # @return [Object] Cache adapter instance
76
+ attr_reader :cache_adapter
77
+
68
78
  #
69
79
  # The connection timeout for network connections in seconds.
70
80
  #
@@ -84,6 +94,18 @@ module SplitIoClient
84
94
  # @return [Boolean] The value for the debug flag
85
95
  attr_reader :debug_enabled
86
96
 
97
+ #
98
+ # Enable to log the content retrieved from endpoints
99
+ #
100
+ # @return [Boolean] The value for the debug flag
101
+ attr_reader :transport_debug_enabled
102
+
103
+ #
104
+ # The number of seconds to wait for SDK readiness
105
+ # or false to disable waiting
106
+ # @return [Integer]/[FalseClass]
107
+ attr_reader :block_until_ready
108
+
87
109
  attr_reader :machine_ip
88
110
  attr_reader :machine_name
89
111
 
@@ -113,8 +135,8 @@ module SplitIoClient
113
135
  end
114
136
 
115
137
  # @return [LocalStore] configuration value for local cache store
116
- def self.default_local_store
117
- defined?(Rails) && Rails.respond_to?(:cache) ? Rails.cache : LocalStore.new
138
+ def self.default_cache_adapter
139
+ SplitIoClient::Cache::Adapters::MemoryAdapter.new
118
140
  end
119
141
 
120
142
  #
@@ -165,6 +187,14 @@ module SplitIoClient
165
187
  false
166
188
  end
167
189
 
190
+ #
191
+ # The default transport_debug_enabled value
192
+ #
193
+ # @return [boolean]
194
+ def self.transport_debug
195
+ false
196
+ end
197
+
168
198
  #
169
199
  # custom logger of exceptions
170
200
  #
@@ -175,6 +205,14 @@ module SplitIoClient
175
205
  @logger.error(error)
176
206
  end
177
207
 
208
+ #
209
+ # log which cache class was loaded
210
+ #
211
+ # @return [void]
212
+ def log_loaded_cache
213
+ @logger.info("Loaded cache class: #{@cache_adapter.class}")
214
+ end
215
+
178
216
  #
179
217
  # gets the hostname where the sdk gem is running
180
218
  #
@@ -200,6 +238,5 @@ module SplitIoClient
200
238
  '127.0.0.0'
201
239
  end
202
240
  end
203
-
204
241
  end
205
242
  end
@@ -84,12 +84,15 @@ module SplitIoClient
84
84
  # @param api_key [String] the API key for your split account
85
85
  #
86
86
  # @return [SplitIoClient] split.io client instance
87
- def initialize(api_key, config = {}, adapter = nil, localhost_mode = false)
87
+ def initialize(api_key, config = {}, adapter = nil, localhost_mode = false, splits_repository, segments_repository)
88
88
  @localhost_mode = localhost_mode
89
89
  @localhost_mode_features = []
90
90
 
91
91
  @config = config
92
92
 
93
+ @splits_repository = splits_repository
94
+ @segments_repository = segments_repository
95
+
93
96
  if api_key == LOCALHOST_MODE
94
97
  @localhost_mode = true
95
98
  load_localhost_mode_features
@@ -101,18 +104,21 @@ module SplitIoClient
101
104
  #
102
105
  # obtains the treatment for a given feature
103
106
  #
104
- # @param id [string] user id
107
+ # @param key [string/hash] user id or hash with matching_key/bucketing_key
105
108
  # @param feature [string] name of the feature that is being validated
106
109
  #
107
110
  # @return [Treatment] treatment constant value
108
- def get_treatment(id, feature, attributes = nil)
109
- unless id
110
- @config.logger.warn('id was null for feature: ' + feature)
111
+ def get_treatment(key, feature, attributes = nil)
112
+ bucketing_key, matching_key = keys_from_key(key)
113
+ bucketing_key = matching_key if bucketing_key.nil?
114
+
115
+ if matching_key.nil?
116
+ @config.logger.warn('matching_key was null for feature: ' + feature)
111
117
  return Treatments::CONTROL
112
118
  end
113
119
 
114
- unless feature
115
- @config.logger.warn('feature was null for id: ' + id)
120
+ if feature.nil?
121
+ @config.logger.warn('feature was null for key: ' + key)
116
122
  return Treatments::CONTROL
117
123
  end
118
124
 
@@ -123,7 +129,7 @@ module SplitIoClient
123
129
  result = nil
124
130
 
125
131
  begin
126
- result = get_treatment_without_exception_handling(id, feature, attributes)
132
+ result = get_treatment_without_exception_handling({ bucketing_key: bucketing_key, matching_key: matching_key }, feature, attributes)
127
133
  rescue StandardError => error
128
134
  @config.log_found_exception(__method__.to_s, error)
129
135
  end
@@ -131,7 +137,7 @@ module SplitIoClient
131
137
  result = result.nil? ? Treatments::CONTROL : result
132
138
 
133
139
  begin
134
- @adapter.impressions.log(id, feature, result, (Time.now.to_f * 1000.0))
140
+ @adapter.impressions.log(matching_key, feature, result, (Time.now.to_f * 1000.0))
135
141
  latency = (Time.now - start) * 1000.0
136
142
  if (@adapter.impressions.queue.length >= @adapter.impressions.max_number_of_keys)
137
143
  @adapter.impressions_producer.wakeup
@@ -145,22 +151,33 @@ module SplitIoClient
145
151
  result
146
152
  end
147
153
 
154
+ def keys_from_key(key)
155
+ case key.class.to_s
156
+ when 'Hash'
157
+ key.values_at(:bucketing_key, :matching_key)
158
+ when 'String'
159
+ [key, key]
160
+ end
161
+ end
162
+
148
163
  #
149
164
  # auxiliary method to get the treatments avoding exceptions
150
165
  #
151
- # @param id [string] user id
166
+ # @param key [string/hash] user id or hash with matching_key/bucketing_key
152
167
  # @param feature [string] name of the feature that is being validated
153
168
  #
154
169
  # @return [Treatment] tretment constant value
155
- def get_treatment_without_exception_handling(id, feature, attributes = nil)
156
- @adapter.parsed_splits.segments = @adapter.parsed_segments
157
- split = @adapter.parsed_splits.get_split(feature)
170
+ def get_treatment_without_exception_handling(key, feature, attributes = nil)
171
+ split = @splits_repository.get_split(feature)
158
172
 
159
173
  if split.nil?
160
- return Treatments::CONTROL
174
+ Treatments::CONTROL
161
175
  else
162
- default_treatment = split.data[:defaultTreatment]
163
- return @adapter.parsed_splits.get_split_treatment(id, feature, default_treatment, attributes)
176
+ default_treatment = split[:defaultTreatment]
177
+
178
+ SplitIoClient::Engine::Parser::SplitTreatment
179
+ .new(@splits_repository, @segments_repository)
180
+ .call(key, feature, default_treatment, attributes)
164
181
  end
165
182
  end
166
183
 
@@ -208,7 +225,6 @@ module SplitIoClient
208
225
 
209
226
  private :get_treatment_without_exception_handling, :is_localhost_mode?,
210
227
  :load_localhost_mode_features, :get_localhost_treatment
211
-
212
228
  end
213
229
 
214
230
  private_constant :SplitClient
@@ -217,18 +233,24 @@ module SplitIoClient
217
233
  def initialize(api_key, config = {})
218
234
  @api_key = api_key
219
235
  @config = SplitConfig.new(config)
236
+ @cache_adapter = @config.cache_adapter
237
+ @splits_repository = SplitIoClient::Cache::Repositories::SplitsRepository.new(@cache_adapter)
238
+ @segments_repository = SplitIoClient::Cache::Repositories::SegmentsRepository.new(@cache_adapter)
239
+ @sdk_blocker = SplitIoClient::Cache::Stores::SDKBlocker.new(@config)
220
240
  @adapter = api_key != 'localhost' \
221
- ? SplitAdapter.new(api_key, @config)
241
+ ? SplitAdapter.new(api_key, @config, @splits_repository, @segments_repository, @sdk_blocker)
222
242
  : nil
223
243
  @localhost_mode = api_key == 'localhost'
244
+
245
+ @sdk_blocker.block if @config.block_until_ready
224
246
  end
225
247
 
226
248
  def client
227
- @client ||= SplitClient.new(@api_key, @config, @adapter, @localhost_mode)
249
+ @client ||= init_client
228
250
  end
229
251
 
230
252
  def manager
231
- @manager ||= SplitManager.new(@api_key, @config, @adapter, @localhost_mode)
253
+ @manager ||= init_manager
232
254
  end
233
255
 
234
256
  #
@@ -241,5 +263,13 @@ module SplitIoClient
241
263
 
242
264
  private
243
265
  attr_reader :adapter
266
+
267
+ def init_client
268
+ SplitClient.new(@api_key, @config, @adapter, @localhost_mode, @splits_repository, @segments_repository)
269
+ end
270
+
271
+ def init_manager
272
+ SplitManager.new(@api_key, @config, @adapter, @localhost_mode)
273
+ end
244
274
  end
245
275
  end
@@ -1,3 +1,3 @@
1
1
  module SplitIoClient
2
- VERSION = '2.0.1'
2
+ VERSION = '3.0.2'
3
3
  end
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rspec"
25
25
  spec.add_development_dependency "webmock"
26
26
  spec.add_development_dependency "byebug"
27
+ spec.add_development_dependency "pry"
28
+ spec.add_development_dependency "pry-byebug"
27
29
  spec.add_development_dependency "simplecov"
28
30
 
29
31
  spec.add_runtime_dependency "json", "~> 1.8"
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: 2.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Split Software
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-10 00:00:00.000000000 Z
11
+ date: 2016-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: simplecov
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -206,29 +234,38 @@ files:
206
234
  - NEWS
207
235
  - README.md
208
236
  - Rakefile
209
- - lib/splitclient-cache/local_store.rb
210
- - lib/splitclient-engine/evaluator/splitter.rb
211
- - lib/splitclient-engine/impressions/impressions.rb
212
- - lib/splitclient-engine/matchers/all_keys_matcher.rb
213
- - lib/splitclient-engine/matchers/between_matcher.rb
214
- - lib/splitclient-engine/matchers/combiners.rb
215
- - lib/splitclient-engine/matchers/combining_matcher.rb
216
- - lib/splitclient-engine/matchers/equal_to_matcher.rb
217
- - lib/splitclient-engine/matchers/greater_than_or_equal_to_matcher.rb
218
- - lib/splitclient-engine/matchers/less_than_or_equal_to_matcher.rb
219
- - lib/splitclient-engine/matchers/negation_matcher.rb
220
- - lib/splitclient-engine/matchers/user_defined_segment_matcher.rb
221
- - lib/splitclient-engine/matchers/whitelist_matcher.rb
222
- - lib/splitclient-engine/metrics/binary_search_latency_tracker.rb
223
- - lib/splitclient-engine/metrics/metrics.rb
224
- - lib/splitclient-engine/parser/condition.rb
225
- - lib/splitclient-engine/parser/partition.rb
226
- - lib/splitclient-engine/parser/segment.rb
227
- - lib/splitclient-engine/parser/segment_parser.rb
228
- - lib/splitclient-engine/parser/split.rb
229
- - lib/splitclient-engine/parser/split_adapter.rb
230
- - lib/splitclient-engine/parser/split_parser.rb
231
- - lib/splitclient-engine/partitions/treatments.rb
237
+ - lib/cache/adapters/adapter.rb
238
+ - lib/cache/adapters/memory_adapter.rb
239
+ - lib/cache/repositories/repository.rb
240
+ - lib/cache/repositories/segments_repository.rb
241
+ - lib/cache/repositories/splits_repository.rb
242
+ - lib/cache/stores/sdk_blocker.rb
243
+ - lib/cache/stores/segment_store.rb
244
+ - lib/cache/stores/split_store.rb
245
+ - lib/engine/api/client.rb
246
+ - lib/engine/api/segments.rb
247
+ - lib/engine/api/splits.rb
248
+ - lib/engine/evaluator/splitter.rb
249
+ - lib/engine/impressions/impressions.rb
250
+ - lib/engine/matchers/all_keys_matcher.rb
251
+ - lib/engine/matchers/between_matcher.rb
252
+ - lib/engine/matchers/combiners.rb
253
+ - lib/engine/matchers/combining_matcher.rb
254
+ - lib/engine/matchers/equal_to_matcher.rb
255
+ - lib/engine/matchers/greater_than_or_equal_to_matcher.rb
256
+ - lib/engine/matchers/less_than_or_equal_to_matcher.rb
257
+ - lib/engine/matchers/negation_matcher.rb
258
+ - lib/engine/matchers/user_defined_segment_matcher.rb
259
+ - lib/engine/matchers/whitelist_matcher.rb
260
+ - lib/engine/metrics/binary_search_latency_tracker.rb
261
+ - lib/engine/metrics/metrics.rb
262
+ - lib/engine/parser/condition.rb
263
+ - lib/engine/parser/partition.rb
264
+ - lib/engine/parser/split.rb
265
+ - lib/engine/parser/split_adapter.rb
266
+ - lib/engine/parser/split_treatment.rb
267
+ - lib/engine/partitions/treatments.rb
268
+ - lib/exceptions/sdk_blocker_timeout_expired_exception.rb
232
269
  - lib/splitclient-rb.rb
233
270
  - lib/splitclient-rb/localhost_split_factory.rb
234
271
  - lib/splitclient-rb/localhost_split_factory_builder.rb