splitclient-rb 2.0.1 → 3.0.2

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 (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