flipper-dalli 0.11.0.beta9 → 0.11.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f0e885c3a861e13d624272de21687bef04e106d
4
- data.tar.gz: a96395558a3343f89aac93fbead0109a70332477
3
+ metadata.gz: 34a9a158115cd2e295c9d00b3754efcfd7aca9d7
4
+ data.tar.gz: 8d2e5e9955f24abb9eb2bc23c2392509c7a86b1f
5
5
  SHA512:
6
- metadata.gz: 61e0470e2d1ac03a2877794108dff89786d6ce9e22e06ab091df2e0b382dc2c18be976daa8d5811d6c15344554399381aac3fbd32e816d0dbb1d133f9cfb659b
7
- data.tar.gz: a2b4650389c85603e4cb2a7dbec388ac3ed9cc03455b276dbfa2dad217872cbf5b20ae28e5647b0de6eb8cf2c9561272178806a1001565dc304e7454221a8f39
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
- @cache.fetch(FeaturesKey, @ttl) do
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
- keys = features.map { |feature| key_for(feature.key) }
71
- result = @cache.get_multi(keys)
72
- uncached_features = features.reject { |feature| result[key_for(feature.key)] }
72
+ read_many_features(features)
73
+ end
73
74
 
74
- if uncached_features.any?
75
- response = @adapter.get_multi(uncached_features)
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
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.11.0.beta9'.freeze
2
+ VERSION = '0.11.0.rc1'.freeze
3
3
  end
@@ -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) { Flipper::Adapters::Memory.new }
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.beta9
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-10-28 00:00:00.000000000 Z
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.beta9
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.beta9
26
+ version: 0.11.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: dalli
29
29
  requirement: !ruby/object:Gem::Requirement