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.
- checksums.yaml +4 -4
- data/CHANGES.txt +12 -0
- data/NEWS +4 -0
- data/README.md +45 -11
- data/lib/cache/adapters/adapter.rb +23 -0
- data/lib/cache/adapters/memory_adapter.rb +46 -0
- data/lib/cache/repositories/repository.rb +25 -0
- data/lib/cache/repositories/segments_repository.rb +52 -0
- data/lib/cache/repositories/splits_repository.rb +51 -0
- data/lib/cache/stores/sdk_blocker.rb +47 -0
- data/lib/cache/stores/segment_store.rb +71 -0
- data/lib/cache/stores/split_store.rb +64 -0
- data/lib/engine/api/client.rb +29 -0
- data/lib/engine/api/segments.rb +60 -0
- data/lib/engine/api/splits.rb +58 -0
- data/lib/{splitclient-engine → engine}/evaluator/splitter.rb +0 -0
- data/lib/{splitclient-engine → engine}/impressions/impressions.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/all_keys_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/between_matcher.rb +2 -0
- data/lib/{splitclient-engine → engine}/matchers/combiners.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/combining_matcher.rb +1 -1
- data/lib/{splitclient-engine → engine}/matchers/equal_to_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/greater_than_or_equal_to_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/less_than_or_equal_to_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/negation_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/matchers/user_defined_segment_matcher.rb +4 -21
- data/lib/{splitclient-engine → engine}/matchers/whitelist_matcher.rb +0 -0
- data/lib/{splitclient-engine → engine}/metrics/binary_search_latency_tracker.rb +0 -0
- data/lib/{splitclient-engine → engine}/metrics/metrics.rb +0 -0
- data/lib/{splitclient-engine → engine}/parser/condition.rb +5 -7
- data/lib/{splitclient-engine → engine}/parser/partition.rb +0 -0
- data/lib/{splitclient-engine → engine}/parser/split.rb +11 -3
- data/lib/{splitclient-engine → engine}/parser/split_adapter.rb +20 -184
- data/lib/engine/parser/split_treatment.rb +65 -0
- data/lib/{splitclient-engine → engine}/partitions/treatments.rb +0 -0
- data/lib/exceptions/sdk_blocker_timeout_expired_exception.rb +4 -0
- data/lib/splitclient-rb.rb +31 -23
- data/lib/splitclient-rb/split_config.rb +41 -4
- data/lib/splitclient-rb/split_factory.rb +50 -20
- data/lib/splitclient-rb/version.rb +1 -1
- data/splitclient-rb.gemspec +2 -0
- metadata +62 -25
- data/lib/splitclient-cache/local_store.rb +0 -45
- data/lib/splitclient-engine/parser/segment.rb +0 -84
- data/lib/splitclient-engine/parser/segment_parser.rb +0 -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
|
File without changes
|
data/lib/splitclient-rb.rb
CHANGED
@@ -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 '
|
8
|
-
require '
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require '
|
13
|
-
require '
|
14
|
-
require '
|
15
|
-
require '
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require '
|
19
|
-
require '
|
20
|
-
require '
|
21
|
-
require '
|
22
|
-
require '
|
23
|
-
require '
|
24
|
-
require '
|
25
|
-
require '
|
26
|
-
require '
|
27
|
-
require '
|
28
|
-
require '
|
29
|
-
require '
|
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
|
-
@
|
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.
|
117
|
-
|
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
|
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(
|
109
|
-
|
110
|
-
|
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
|
-
|
115
|
-
@config.logger.warn('feature was null for
|
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(
|
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(
|
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
|
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(
|
156
|
-
|
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
|
-
|
174
|
+
Treatments::CONTROL
|
161
175
|
else
|
162
|
-
default_treatment = split
|
163
|
-
|
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 ||=
|
249
|
+
@client ||= init_client
|
228
250
|
end
|
229
251
|
|
230
252
|
def manager
|
231
|
-
@manager ||=
|
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
|
data/splitclient-rb.gemspec
CHANGED
@@ -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:
|
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-
|
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/
|
210
|
-
- lib/
|
211
|
-
- lib/
|
212
|
-
- lib/
|
213
|
-
- lib/
|
214
|
-
- lib/
|
215
|
-
- lib/
|
216
|
-
- lib/
|
217
|
-
- lib/
|
218
|
-
- lib/
|
219
|
-
- lib/
|
220
|
-
- lib/
|
221
|
-
- lib/
|
222
|
-
- lib/
|
223
|
-
- lib/
|
224
|
-
- lib/
|
225
|
-
- lib/
|
226
|
-
- lib/
|
227
|
-
- lib/
|
228
|
-
- lib/
|
229
|
-
- lib/
|
230
|
-
- lib/
|
231
|
-
- lib/
|
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
|