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