flipper 0.19.1 → 0.20.0.beta1
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/Gemfile +1 -0
- data/lib/flipper.rb +2 -1
- data/lib/flipper/adapters/sync.rb +6 -6
- data/lib/flipper/adapters/sync/synchronizer.rb +1 -0
- data/lib/flipper/middleware/setup_env.rb +13 -3
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/adapters/sync_spec.rb +4 -4
- data/spec/flipper/middleware/setup_env_spec.rb +39 -3
- data/spec/flipper_spec.rb +27 -0
- data/spec/support/spec_helpers.rb +5 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b11913845dd63e7156086ce778927c1986694c48472dbb5b779155318c6eeab6
|
4
|
+
data.tar.gz: bc1bf62134ccd35ef86a5373f8105a9d511e3061e5666e55b0183fd20437a74f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec24f067db0fc80d5d3e9f00ce1b87b51d5111f89e9d35842d044347dbbbfc836663e972e7eb0c640713e375938e10a7d70769af27c87aea82270eba29432ca0
|
7
|
+
data.tar.gz: fb56eb175c3067f1b301d5875818b0c0a372f6e11da7e68c88337ab2660c8a7cfa20c027e8862cfc9aca126c5bd4b424dc962b846e2c812932400cc0f9592855
|
data/Gemfile
CHANGED
data/lib/flipper.rb
CHANGED
@@ -65,7 +65,8 @@ module Flipper
|
|
65
65
|
:time, :percentage_of_time,
|
66
66
|
:features, :feature, :[], :preload, :preload_all,
|
67
67
|
:adapter, :add, :exist?, :remove, :import,
|
68
|
-
:memoize=, :memoizing
|
68
|
+
:memoize=, :memoizing?,
|
69
|
+
:sync, :sync_secret # For Flipper::Cloud. Will error for OSS Flipper.
|
69
70
|
|
70
71
|
# Public: Use this to register a group by name.
|
71
72
|
#
|
@@ -34,26 +34,26 @@ module Flipper
|
|
34
34
|
synchronizer = Synchronizer.new(@local, @remote, sync_options)
|
35
35
|
IntervalSynchronizer.new(synchronizer, interval: options[:interval])
|
36
36
|
end
|
37
|
-
|
37
|
+
synchronize
|
38
38
|
end
|
39
39
|
|
40
40
|
def features
|
41
|
-
|
41
|
+
synchronize
|
42
42
|
@local.features
|
43
43
|
end
|
44
44
|
|
45
45
|
def get(feature)
|
46
|
-
|
46
|
+
synchronize
|
47
47
|
@local.get(feature)
|
48
48
|
end
|
49
49
|
|
50
50
|
def get_multi(features)
|
51
|
-
|
51
|
+
synchronize
|
52
52
|
@local.get_multi(features)
|
53
53
|
end
|
54
54
|
|
55
55
|
def get_all
|
56
|
-
|
56
|
+
synchronize
|
57
57
|
@local.get_all
|
58
58
|
end
|
59
59
|
|
@@ -89,7 +89,7 @@ module Flipper
|
|
89
89
|
|
90
90
|
private
|
91
91
|
|
92
|
-
def
|
92
|
+
def synchronize
|
93
93
|
@synchronizer.call
|
94
94
|
end
|
95
95
|
end
|
@@ -15,6 +15,7 @@ module Flipper
|
|
15
15
|
# adapter should be brought in line with.
|
16
16
|
# options - The Hash of options.
|
17
17
|
# :instrumenter - The instrumenter used to instrument.
|
18
|
+
# :raise - Should errors be raised (default: true).
|
18
19
|
def initialize(local, remote, options = {})
|
19
20
|
@local = local
|
20
21
|
@remote = remote
|
@@ -7,7 +7,8 @@ module Flipper
|
|
7
7
|
#
|
8
8
|
# app - The app this middleware is included in.
|
9
9
|
# flipper_or_block - The Flipper::DSL instance or a block that yields a
|
10
|
-
# Flipper::DSL instance to use for all operations
|
10
|
+
# Flipper::DSL instance to use for all operations
|
11
|
+
# (optional, default: Flipper).
|
11
12
|
#
|
12
13
|
# Examples
|
13
14
|
#
|
@@ -19,18 +20,27 @@ module Flipper
|
|
19
20
|
# # using with a block that yields a flipper instance
|
20
21
|
# use Flipper::Middleware::SetupEnv, lambda { Flipper.new(...) }
|
21
22
|
#
|
22
|
-
|
23
|
+
# # using default configured Flipper instance
|
24
|
+
# Flipper.configure do |config|
|
25
|
+
# config.default { Flipper.new(...) }
|
26
|
+
# end
|
27
|
+
# use Flipper::Middleware::SetupEnv
|
28
|
+
def initialize(app, flipper_or_block = nil, options = {})
|
23
29
|
@app = app
|
24
30
|
@env_key = options.fetch(:env_key, 'flipper')
|
25
31
|
|
26
32
|
if flipper_or_block.respond_to?(:call)
|
27
33
|
@flipper_block = flipper_or_block
|
28
34
|
else
|
29
|
-
@flipper = flipper_or_block
|
35
|
+
@flipper = flipper_or_block || Flipper
|
30
36
|
end
|
31
37
|
end
|
32
38
|
|
33
39
|
def call(env)
|
40
|
+
dup.call!(env)
|
41
|
+
end
|
42
|
+
|
43
|
+
def call!(env)
|
34
44
|
env[@env_key] ||= flipper
|
35
45
|
@app.call(env)
|
36
46
|
end
|
data/lib/flipper/version.rb
CHANGED
@@ -175,22 +175,22 @@ RSpec.describe Flipper::Adapters::Sync do
|
|
175
175
|
end
|
176
176
|
|
177
177
|
it 'synchronizes for #features' do
|
178
|
-
expect(subject).to receive(:
|
178
|
+
expect(subject).to receive(:synchronize)
|
179
179
|
subject.features
|
180
180
|
end
|
181
181
|
|
182
182
|
it 'synchronizes for #get' do
|
183
|
-
expect(subject).to receive(:
|
183
|
+
expect(subject).to receive(:synchronize)
|
184
184
|
subject.get sync[:search]
|
185
185
|
end
|
186
186
|
|
187
187
|
it 'synchronizes for #get_multi' do
|
188
|
-
expect(subject).to receive(:
|
188
|
+
expect(subject).to receive(:synchronize)
|
189
189
|
subject.get_multi [sync[:search]]
|
190
190
|
end
|
191
191
|
|
192
192
|
it 'synchronizes for #get_all' do
|
193
|
-
expect(subject).to receive(:
|
193
|
+
expect(subject).to receive(:synchronize)
|
194
194
|
subject.get_all
|
195
195
|
end
|
196
196
|
|
@@ -56,21 +56,57 @@ RSpec.describe Flipper::Middleware::SetupEnv do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
context 'when flipper instance is
|
59
|
+
context 'when flipper instance or block are nil but env flipper is configured' do
|
60
60
|
let(:app) do
|
61
61
|
app = lambda do |env|
|
62
62
|
[200, { 'Content-Type' => 'text/html' }, [env['flipper'].object_id.to_s]]
|
63
63
|
end
|
64
64
|
builder = Rack::Builder.new
|
65
|
-
builder.use described_class
|
65
|
+
builder.use described_class
|
66
66
|
builder.run app
|
67
67
|
builder
|
68
68
|
end
|
69
69
|
|
70
|
-
it '
|
70
|
+
it 'can use env flipper' do
|
71
71
|
env_flipper = build_flipper
|
72
72
|
get '/', {}, 'flipper' => env_flipper
|
73
73
|
expect(last_response.body).to eq(env_flipper.object_id.to_s)
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
context 'when flipper instance or block are nil and default Flipper is configured' do
|
78
|
+
let(:app) do
|
79
|
+
Flipper.configure do |config|
|
80
|
+
config.default { flipper }
|
81
|
+
end
|
82
|
+
app = lambda do |env|
|
83
|
+
[200, { 'Content-Type' => 'text/html' }, [env['flipper'].object_id.to_s]]
|
84
|
+
end
|
85
|
+
builder = Rack::Builder.new
|
86
|
+
builder.use described_class
|
87
|
+
builder.run app
|
88
|
+
builder
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'can use env flipper' do
|
92
|
+
get '/', {}, {}
|
93
|
+
expect(last_response.body).to eq(Flipper.object_id.to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when flipper instance or block are nil and default Flipper is NOT configured' do
|
98
|
+
let(:app) do
|
99
|
+
app = lambda do |env|
|
100
|
+
[200, { 'Content-Type' => 'text/html' }, [env['flipper'].enabled?(:search)]]
|
101
|
+
end
|
102
|
+
builder = Rack::Builder.new
|
103
|
+
builder.use described_class
|
104
|
+
builder.run app
|
105
|
+
builder
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'can use env flipper' do
|
109
|
+
expect { get '/' }.to raise_error(Flipper::DefaultNotSet)
|
110
|
+
end
|
111
|
+
end
|
76
112
|
end
|
data/spec/flipper_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'helper'
|
2
|
+
require 'flipper/cloud'
|
2
3
|
|
3
4
|
RSpec.describe Flipper do
|
4
5
|
describe '.new' do
|
@@ -215,6 +216,32 @@ RSpec.describe Flipper do
|
|
215
216
|
it 'delegates memoizing? to instance' do
|
216
217
|
expect(described_class.memoizing?).to eq(described_class.adapter.memoizing?)
|
217
218
|
end
|
219
|
+
|
220
|
+
it 'delegates sync stuff to instance and errors for OSS' do
|
221
|
+
expect { described_class.sync }.to raise_error(NoMethodError)
|
222
|
+
expect { described_class.sync_secret }.to raise_error(NoMethodError)
|
223
|
+
end
|
224
|
+
|
225
|
+
it 'delegates sync stuff to instance for Flipper::Cloud' do
|
226
|
+
stub = stub_request(:get, "https://www.flippercloud.io/adapter/features").
|
227
|
+
with({
|
228
|
+
headers: {
|
229
|
+
'Flipper-Cloud-Token'=>'asdf',
|
230
|
+
},
|
231
|
+
}).to_return(status: 200, body: '{"features": {}}', headers: {})
|
232
|
+
cloud_configuration = Flipper::Cloud::Configuration.new({
|
233
|
+
token: "asdf",
|
234
|
+
sync_secret: "tasty",
|
235
|
+
sync_method: :webhook,
|
236
|
+
})
|
237
|
+
|
238
|
+
described_class.configure do |config|
|
239
|
+
config.default { Flipper::Cloud::DSL.new(cloud_configuration) }
|
240
|
+
end
|
241
|
+
described_class.sync
|
242
|
+
expect(described_class.sync_secret).to eq("tasty")
|
243
|
+
expect(stub).to have_been_requested
|
244
|
+
end
|
218
245
|
end
|
219
246
|
|
220
247
|
describe '.register' do
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'climate_control'
|
1
2
|
require 'json'
|
2
3
|
require 'rack/test'
|
3
4
|
|
@@ -56,6 +57,10 @@ module SpecHelpers
|
|
56
57
|
'more_info' => api_error_code_reference_url,
|
57
58
|
}
|
58
59
|
end
|
60
|
+
|
61
|
+
def with_modified_env(options, &block)
|
62
|
+
ClimateControl.modify(options, &block)
|
63
|
+
end
|
59
64
|
end
|
60
65
|
|
61
66
|
RSpec.configure do |config|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flipper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-12-
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -166,9 +166,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
166
|
version: '0'
|
167
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
168
|
requirements:
|
169
|
-
- - "
|
169
|
+
- - ">"
|
170
170
|
- !ruby/object:Gem::Version
|
171
|
-
version:
|
171
|
+
version: 1.3.1
|
172
172
|
requirements: []
|
173
173
|
rubygems_version: 3.0.3
|
174
174
|
signing_key:
|