splitclient-rb 5.1.2 → 5.1.3.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.txt +3 -0
- data/Detailed-README.md +8 -0
- data/NEWS +4 -0
- data/lib/splitclient-rb.rb +1 -0
- data/lib/splitclient-rb/cache/adapters/cache_adapter.rb +131 -0
- data/lib/splitclient-rb/cache/repositories/segments_repository.rb +6 -1
- data/lib/splitclient-rb/cache/repositories/splits_repository.rb +6 -1
- data/lib/splitclient-rb/split_config.rb +23 -0
- data/lib/splitclient-rb/version.rb +1 -1
- data/splitclient-rb.gemspec +2 -0
- metadata +33 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7470b6e84f8bf0cef00815acc17c0fa9d1f8ab81e6746676b19e9119ce12ba1f
|
4
|
+
data.tar.gz: 7d95234b01d68aa0da0bdf8a3dd07849836ca3a9194e9a56094bb054e597c0d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc1135d77d83d1c037716ce4aaa2f9a9f40bcb386cc0efa1665bcd82e2fa2294907d1bc1f42e8fa72541179761d22965c0daee1b51a354677a5ca4bc5d20dc26
|
7
|
+
data.tar.gz: 9bc52d47fb482081015c4849e15105142de7033880f5d3de1cbef5a8766636389a055e35b4dfa5986a6e63136cc760ba945c702d80a31ae16cde8ad655a71906
|
data/CHANGES.txt
CHANGED
data/Detailed-README.md
CHANGED
@@ -301,6 +301,14 @@ _To use Redis, include `redis-rb` in your app's Gemfile._
|
|
301
301
|
|
302
302
|
*default value* = (your current hostname)
|
303
303
|
|
304
|
+
**cache_ttl** : Time to live in seconds for the memory cache values when using Redis.
|
305
|
+
|
306
|
+
*default value* = `5`
|
307
|
+
|
308
|
+
**max_cache_size** : Maximum number of items held in the memory cache values when using Redis. When cache is full an LRU strategy for pruning shall be used.
|
309
|
+
|
310
|
+
*default value* = `500`
|
311
|
+
|
304
312
|
**redis_url** : Redis URL or hash with configuration for the SDK to connect to. See [Redis#initialize](https://www.rubydoc.info/github/redis/redis-rb/Redis%3Ainitialize) for detailed information.
|
305
313
|
|
306
314
|
*default value* = `'redis://127.0.0.1:6379/0'`
|
data/NEWS
CHANGED
data/lib/splitclient-rb.rb
CHANGED
@@ -6,6 +6,7 @@ require 'splitclient-rb/exceptions'
|
|
6
6
|
require 'splitclient-rb/cache/routers/impression_router'
|
7
7
|
require 'splitclient-rb/cache/adapters/memory_adapters/map_adapter'
|
8
8
|
require 'splitclient-rb/cache/adapters/memory_adapters/queue_adapter'
|
9
|
+
require 'splitclient-rb/cache/adapters/cache_adapter'
|
9
10
|
require 'splitclient-rb/cache/adapters/memory_adapter'
|
10
11
|
require 'splitclient-rb/cache/adapters/redis_adapter'
|
11
12
|
require 'splitclient-rb/cache/repositories/repository'
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'lru_redux'
|
2
|
+
|
3
|
+
module SplitIoClient
|
4
|
+
module Cache
|
5
|
+
module Adapters
|
6
|
+
class CacheAdapter
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators :@adapter, :initialize_set, :set_bool, :pipelined
|
9
|
+
|
10
|
+
def initialize(adapter)
|
11
|
+
@cache = LruRedux::TTL::ThreadSafeCache.new(SplitIoClient.configuration.max_cache_size, SplitIoClient.configuration.cache_ttl)
|
12
|
+
@adapter = adapter
|
13
|
+
end
|
14
|
+
|
15
|
+
def delete(key)
|
16
|
+
@cache.delete(key)
|
17
|
+
@adapter.delete(key)
|
18
|
+
end
|
19
|
+
|
20
|
+
def clear(namespace_key)
|
21
|
+
@cache.clear
|
22
|
+
@adapter.clear(namespace_key)
|
23
|
+
end
|
24
|
+
|
25
|
+
def string(key)
|
26
|
+
value = get(key)
|
27
|
+
return value if value
|
28
|
+
value = @adapter.string(key)
|
29
|
+
add(key, value)
|
30
|
+
value
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_string(key, value)
|
34
|
+
add(key, value)
|
35
|
+
@adapter.set_string(key, value)
|
36
|
+
end
|
37
|
+
|
38
|
+
def multiple_strings(keys)
|
39
|
+
cached_values = keys.each_with_object({}) do |key, memo|
|
40
|
+
memo[key] = get(key)
|
41
|
+
end
|
42
|
+
|
43
|
+
non_cached_keys = []
|
44
|
+
cached_values.delete_if{ |k,v| v.nil? ? non_cached_keys << k : false }
|
45
|
+
|
46
|
+
if non_cached_keys.any?
|
47
|
+
new_values = @adapter.multiple_strings(non_cached_keys)
|
48
|
+
|
49
|
+
new_values.keys.each do |key, value|
|
50
|
+
add(key, value)
|
51
|
+
end
|
52
|
+
|
53
|
+
cached_values.merge!(new_values)
|
54
|
+
end
|
55
|
+
|
56
|
+
cached_values
|
57
|
+
end
|
58
|
+
|
59
|
+
def find_strings_by_prefix(prefix)
|
60
|
+
@adapter.find_strings_by_prefix(prefix)
|
61
|
+
end
|
62
|
+
|
63
|
+
def exists?(key)
|
64
|
+
cached_value = get(key)
|
65
|
+
if cached_value.nil?
|
66
|
+
@adapter.exists?(key)
|
67
|
+
else
|
68
|
+
true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def add_to_set(key, values)
|
73
|
+
if values.is_a? Array
|
74
|
+
values.each { |value| add_to_map(key, value, 1) }
|
75
|
+
else
|
76
|
+
add_to_map(key, values, 1)
|
77
|
+
end
|
78
|
+
@adapter.add_to_set(key, values)
|
79
|
+
end
|
80
|
+
|
81
|
+
def in_set?(key, field)
|
82
|
+
cached_value = get(key)
|
83
|
+
if cached_value.nil?
|
84
|
+
return @adapter.in_set?(key, field)
|
85
|
+
end
|
86
|
+
cached_value.key?(field)
|
87
|
+
end
|
88
|
+
|
89
|
+
def get_set(key)
|
90
|
+
cached_value = get(key)
|
91
|
+
if cached_value.nil?
|
92
|
+
return @adapter.get_set(key)
|
93
|
+
end
|
94
|
+
cached_value.keys
|
95
|
+
end
|
96
|
+
|
97
|
+
def delete_from_set(key, fields)
|
98
|
+
cached_value = get(key)
|
99
|
+
if cached_value
|
100
|
+
if fields.is_a? Array
|
101
|
+
fields.each { |field| cached_value.delete(field) }
|
102
|
+
else
|
103
|
+
cached_value.delete(fields)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
@adapter.delete_from_set(key, fields)
|
108
|
+
end
|
109
|
+
|
110
|
+
def initialize_map(key)
|
111
|
+
@cache[key] = Concurrent::Map.new
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
def add_to_map(key, field, value)
|
117
|
+
initialize_map(key) unless get(key)
|
118
|
+
get(key).put(field.to_s, value.to_s)
|
119
|
+
end
|
120
|
+
|
121
|
+
def add(key, value)
|
122
|
+
@cache[key] = value.to_s unless value.nil?
|
123
|
+
end
|
124
|
+
|
125
|
+
def get(key)
|
126
|
+
@cache[key]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -7,7 +7,12 @@ module SplitIoClient
|
|
7
7
|
attr_reader :adapter
|
8
8
|
|
9
9
|
def initialize(adapter)
|
10
|
-
@adapter = adapter
|
10
|
+
@adapter = case adapter.class.to_s
|
11
|
+
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
|
12
|
+
SplitIoClient::Cache::Adapters::CacheAdapter.new(adapter)
|
13
|
+
else
|
14
|
+
adapter
|
15
|
+
end
|
11
16
|
@adapter.set_bool(namespace_key('.ready'), false) unless SplitIoClient.configuration.mode == :consumer
|
12
17
|
end
|
13
18
|
|
@@ -7,7 +7,12 @@ module SplitIoClient
|
|
7
7
|
attr_reader :adapter
|
8
8
|
|
9
9
|
def initialize(adapter)
|
10
|
-
@adapter = adapter
|
10
|
+
@adapter = case adapter.class.to_s
|
11
|
+
when 'SplitIoClient::Cache::Adapters::RedisAdapter'
|
12
|
+
SplitIoClient::Cache::Adapters::CacheAdapter.new(adapter)
|
13
|
+
else
|
14
|
+
adapter
|
15
|
+
end
|
11
16
|
unless SplitIoClient.configuration.mode == :consumer
|
12
17
|
@adapter.set_string(namespace_key('.splits.till'), '-1')
|
13
18
|
@adapter.initialize_map(namespace_key('.segments.registered'))
|
@@ -33,6 +33,8 @@ module SplitIoClient
|
|
33
33
|
# @option opts [Int] :impressions_queue_size Size of the impressions queue in the memory repository. Once reached, newer impressions will be dropped
|
34
34
|
# @option opts [Int] :impressions_bulk_size Max number of impressions to be sent to the backend on each post
|
35
35
|
# @option opts [#log] :impression_listener this object will capture all impressions and process them through `#log`
|
36
|
+
# @option opts [Int] :cache_ttl Time to live in seconds for the memory cache values when using Redis.
|
37
|
+
# @option opts [Int] :max_cache_size Max number of items to be held in the memory cache before prunning when using Redis.
|
36
38
|
# @return [type] SplitConfig with configuration options
|
37
39
|
def initialize(opts = {})
|
38
40
|
@base_uri = (opts[:base_uri] || SplitConfig.default_base_uri).chomp('/')
|
@@ -70,6 +72,9 @@ module SplitIoClient
|
|
70
72
|
@machine_name = opts[:machine_name] || SplitConfig.machine_hostname
|
71
73
|
@machine_ip = opts[:machine_ip] || SplitConfig.machine_ip
|
72
74
|
|
75
|
+
@cache_ttl = opts[:cache_ttl] || SplitConfig.cache_ttl
|
76
|
+
@max_cache_size = opts[:max_cache_size] || SplitConfig.max_cache_size
|
77
|
+
|
73
78
|
@language = opts[:language] || 'ruby'
|
74
79
|
@version = opts[:version] || SplitIoClient::VERSION
|
75
80
|
|
@@ -176,6 +181,9 @@ module SplitIoClient
|
|
176
181
|
attr_accessor :machine_ip
|
177
182
|
attr_accessor :machine_name
|
178
183
|
|
184
|
+
attr_accessor :cache_ttl
|
185
|
+
attr_accessor :max_cache_size
|
186
|
+
|
179
187
|
attr_accessor :language
|
180
188
|
attr_accessor :version
|
181
189
|
|
@@ -357,6 +365,21 @@ module SplitIoClient
|
|
357
365
|
false
|
358
366
|
end
|
359
367
|
|
368
|
+
#
|
369
|
+
# The default cache time to live
|
370
|
+
#
|
371
|
+
# @return [boolean]
|
372
|
+
def self.cache_ttl
|
373
|
+
5
|
374
|
+
end
|
375
|
+
|
376
|
+
# The default max cache size
|
377
|
+
#
|
378
|
+
# @return [boolean]
|
379
|
+
def self.max_cache_size
|
380
|
+
500
|
381
|
+
end
|
382
|
+
|
360
383
|
#
|
361
384
|
# custom logger of exceptions
|
362
385
|
#
|
data/splitclient-rb.gemspec
CHANGED
@@ -46,11 +46,13 @@ Gem::Specification.new do |spec|
|
|
46
46
|
spec.add_development_dependency 'rspec'
|
47
47
|
spec.add_development_dependency 'rubocop', '0.59.0'
|
48
48
|
spec.add_development_dependency 'simplecov'
|
49
|
+
spec.add_development_dependency 'timecop'
|
49
50
|
spec.add_development_dependency 'webmock'
|
50
51
|
|
51
52
|
spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
|
52
53
|
spec.add_runtime_dependency 'faraday', '>= 0.8'
|
53
54
|
spec.add_runtime_dependency 'json', '>= 1.8'
|
55
|
+
spec.add_runtime_dependency 'lru_redux'
|
54
56
|
spec.add_runtime_dependency 'net-http-persistent', '~> 2.9'
|
55
57
|
spec.add_runtime_dependency 'redis', '>= 3.2'
|
56
58
|
spec.add_runtime_dependency 'thread_safe', '>= 0.3'
|
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: 5.1.
|
4
|
+
version: 5.1.3.pre.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Split Software
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: allocation_stats
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: timecop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: webmock
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +206,20 @@ dependencies:
|
|
192
206
|
- - ">="
|
193
207
|
- !ruby/object:Gem::Version
|
194
208
|
version: '1.8'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: lru_redux
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - ">="
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - ">="
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '0'
|
195
223
|
- !ruby/object:Gem::Dependency
|
196
224
|
name: net-http-persistent
|
197
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -261,6 +289,7 @@ files:
|
|
261
289
|
- lib/murmurhash/murmurhash.jar
|
262
290
|
- lib/murmurhash/murmurhash_mri.rb
|
263
291
|
- lib/splitclient-rb.rb
|
292
|
+
- lib/splitclient-rb/cache/adapters/cache_adapter.rb
|
264
293
|
- lib/splitclient-rb/cache/adapters/memory_adapter.rb
|
265
294
|
- lib/splitclient-rb/cache/adapters/memory_adapters/map_adapter.rb
|
266
295
|
- lib/splitclient-rb/cache/adapters/memory_adapters/queue_adapter.rb
|
@@ -357,9 +386,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
357
386
|
version: '0'
|
358
387
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
359
388
|
requirements:
|
360
|
-
- - "
|
389
|
+
- - ">"
|
361
390
|
- !ruby/object:Gem::Version
|
362
|
-
version:
|
391
|
+
version: 1.3.1
|
363
392
|
requirements: []
|
364
393
|
rubyforge_project:
|
365
394
|
rubygems_version: 2.7.6
|