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