flipper-dalli 0.11.0.beta9 → 0.11.0.rc1
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/lib/flipper/adapters/dalli.rb +41 -11
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/adapters/dalli_spec.rb +37 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34a9a158115cd2e295c9d00b3754efcfd7aca9d7
|
4
|
+
data.tar.gz: 8d2e5e9955f24abb9eb2bc23c2392509c7a86b1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56f05426c86cba861cc43707cf793dfa0fd65f8a947a3f348dea21d27cac764f40c8ad627881785e99be696568152a183903831b2bd77c5bd27389493bc227fe
|
7
|
+
data.tar.gz: 4afdcfb18d9ec5ce3d43c2d3d328fa321a611674622fac59af7149e15957bcdfd991d4e0e4eca01ed5d5004c36be0464db4a2c31f48499f765b0eba83eafe428
|
@@ -10,6 +10,7 @@ module Flipper
|
|
10
10
|
Version = 'v1'.freeze
|
11
11
|
Namespace = "flipper/#{Version}".freeze
|
12
12
|
FeaturesKey = "#{Namespace}/features".freeze
|
13
|
+
GetAllKey = "#{Namespace}/get_all".freeze
|
13
14
|
|
14
15
|
# Private
|
15
16
|
def self.key_for(key)
|
@@ -22,6 +23,9 @@ module Flipper
|
|
22
23
|
# Public: The name of the adapter.
|
23
24
|
attr_reader :name
|
24
25
|
|
26
|
+
# Public: The ttl for all cached data.
|
27
|
+
attr_reader :ttl
|
28
|
+
|
25
29
|
# Public
|
26
30
|
def initialize(adapter, cache, ttl = 0)
|
27
31
|
@adapter = adapter
|
@@ -32,9 +36,7 @@ module Flipper
|
|
32
36
|
|
33
37
|
# Public
|
34
38
|
def features
|
35
|
-
|
36
|
-
@adapter.features
|
37
|
-
end
|
39
|
+
read_feature_keys
|
38
40
|
end
|
39
41
|
|
40
42
|
# Public
|
@@ -67,19 +69,21 @@ module Flipper
|
|
67
69
|
end
|
68
70
|
|
69
71
|
def get_multi(features)
|
70
|
-
|
71
|
-
|
72
|
-
uncached_features = features.reject { |feature| result[key_for(feature.key)] }
|
72
|
+
read_many_features(features)
|
73
|
+
end
|
73
74
|
|
74
|
-
|
75
|
-
|
75
|
+
def get_all
|
76
|
+
if @cache.add(GetAllKey, Time.now.to_i, @ttl)
|
77
|
+
response = @adapter.get_all
|
76
78
|
response.each do |key, value|
|
77
79
|
@cache.set(key_for(key), value, @ttl)
|
78
|
-
result[key] = value
|
79
80
|
end
|
81
|
+
@cache.set(FeaturesKey, response.keys.to_set, @ttl)
|
82
|
+
response
|
83
|
+
else
|
84
|
+
features = read_feature_keys.map { |key| Flipper::Feature.new(key, self) }
|
85
|
+
read_many_features(features)
|
80
86
|
end
|
81
|
-
|
82
|
-
result
|
83
87
|
end
|
84
88
|
|
85
89
|
# Public
|
@@ -101,6 +105,32 @@ module Flipper
|
|
101
105
|
def key_for(key)
|
102
106
|
self.class.key_for(key)
|
103
107
|
end
|
108
|
+
|
109
|
+
def read_feature_keys
|
110
|
+
@cache.fetch(FeaturesKey, @ttl) { @adapter.features }
|
111
|
+
end
|
112
|
+
|
113
|
+
# Internal: Given an array of features, attempts to read through cache in
|
114
|
+
# as few network calls as possible.
|
115
|
+
def read_many_features(features)
|
116
|
+
keys = features.map { |feature| key_for(feature.key) }
|
117
|
+
cache_result = @cache.get_multi(keys)
|
118
|
+
uncached_features = features.reject { |feature| cache_result[key_for(feature.key)] }
|
119
|
+
|
120
|
+
if uncached_features.any?
|
121
|
+
response = @adapter.get_multi(uncached_features)
|
122
|
+
response.each do |key, value|
|
123
|
+
@cache.set(key_for(key), value, @ttl)
|
124
|
+
cache_result[key_for(key)] = value
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
result = {}
|
129
|
+
features.each do |feature|
|
130
|
+
result[feature.key] = cache_result[key_for(feature.key)]
|
131
|
+
end
|
132
|
+
result
|
133
|
+
end
|
104
134
|
end
|
105
135
|
end
|
106
136
|
end
|
data/lib/flipper/version.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'flipper/adapters/memory'
|
3
|
+
require 'flipper/adapters/operation_logger'
|
3
4
|
require 'flipper/adapters/dalli'
|
4
5
|
require 'flipper/spec/shared_adapter_specs'
|
5
6
|
|
6
7
|
RSpec.describe Flipper::Adapters::Dalli do
|
7
|
-
let(:memory_adapter)
|
8
|
+
let(:memory_adapter) do
|
9
|
+
Flipper::Adapters::OperationLogger.new(Flipper::Adapters::Memory.new)
|
10
|
+
end
|
8
11
|
let(:cache) { Dalli::Client.new(ENV['MEMCACHED_URL'] || '127.0.0.1:11211') }
|
9
12
|
let(:adapter) { described_class.new(memory_adapter, cache) }
|
10
13
|
let(:flipper) { Flipper.new(adapter) }
|
@@ -34,6 +37,8 @@ RSpec.describe Flipper::Adapters::Dalli do
|
|
34
37
|
stats.enable
|
35
38
|
search.enable
|
36
39
|
|
40
|
+
memory_adapter.reset
|
41
|
+
|
37
42
|
adapter.get(stats)
|
38
43
|
expect(cache.get(described_class.key_for(search))).to be(nil)
|
39
44
|
expect(cache.get(described_class.key_for(other))).to be(nil)
|
@@ -42,6 +47,37 @@ RSpec.describe Flipper::Adapters::Dalli do
|
|
42
47
|
|
43
48
|
expect(cache.get(described_class.key_for(search))[:boolean]).to eq('true')
|
44
49
|
expect(cache.get(described_class.key_for(other))[:boolean]).to be(nil)
|
50
|
+
|
51
|
+
adapter.get_multi([stats, search, other])
|
52
|
+
adapter.get_multi([stats, search, other])
|
53
|
+
expect(memory_adapter.count(:get_multi)).to eq(1)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#get_all' do
|
58
|
+
let(:stats) { flipper[:stats] }
|
59
|
+
let(:search) { flipper[:search] }
|
60
|
+
|
61
|
+
before do
|
62
|
+
stats.enable
|
63
|
+
search.add
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'warms all features' do
|
67
|
+
adapter.get_all
|
68
|
+
expect(cache.get(described_class.key_for(stats))[:boolean]).to eq('true')
|
69
|
+
expect(cache.get(described_class.key_for(search))[:boolean]).to be(nil)
|
70
|
+
expect(cache.get(described_class::GetAllKey)).to be_within(2).of(Time.now.to_i)
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'returns same result when already cached' do
|
74
|
+
expect(adapter.get_all).to eq(adapter.get_all)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'only invokes one call to wrapped adapter' do
|
78
|
+
memory_adapter.reset
|
79
|
+
5.times { adapter.get_all }
|
80
|
+
expect(memory_adapter.count(:get_all)).to eq(1)
|
45
81
|
end
|
46
82
|
end
|
47
83
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flipper-dalli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.0.
|
4
|
+
version: 0.11.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: flipper
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.11.0.
|
19
|
+
version: 0.11.0.rc1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.11.0.
|
26
|
+
version: 0.11.0.rc1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: dalli
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|