flipper 0.24.1 → 0.25.0
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/Changelog.md +11 -0
- data/Gemfile +1 -1
- data/lib/flipper/adapters/failsafe.rb +76 -0
- data/lib/flipper/errors.rb +0 -17
- data/lib/flipper/middleware/memoizer.rb +2 -12
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/adapters/failsafe_spec.rb +58 -0
- data/spec/flipper/middleware/memoizer_spec.rb +0 -20
- data/spec/spec_helper.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 896d9fb7468ffbc19e1200a6abe2a5c3992fae7abb3d4211fd29829364fb1a42
|
4
|
+
data.tar.gz: e157fa74da897e4ad56b3548cd438adc0ddbc0e2fec89e4d8214dd4ca2b2596e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c99039ff6cc5dc62953289d9343bcee6b2d2935e52b4cc7b33f5134c266a3ac99180d713220432cbde7e2cb57a90d42e41249eb0bcf55f20eb60a9e0cc379208
|
7
|
+
data.tar.gz: 9f3b2dea4b9137b20f86d359a5dd5eb3b220655364dc9baf498faecbd42ddca286f6d94e91694b203d21cce8c0a986ed421e6f7436ec0fd956d9e590698ec59c
|
data/Changelog.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## Unreleased
|
2
|
+
|
3
|
+
### Additions/Changes
|
4
|
+
|
5
|
+
* Added a prompt in Flipper UI for the 'Delete' button to prevent accidental delete of features (https://github.com/jnunemaker/flipper/pull/625)
|
6
|
+
* Added failsafe adapter (https://github.com/jnunemaker/flipper/pull/626)
|
7
|
+
* Removed previously deprecated options and settings. Those upgrading from `<0.21` should upgrade to `~>0.24` first and fix any deprecation warnings when initializing Flipper. (https://github.com/jnunemaker/flipper/pull/627)
|
8
|
+
* ActiveRecord: base class for internal models (https://github.com/jnunemaker/flipper/pull/629)
|
9
|
+
* Remove use of `Rack::BodyProxy` in the memoizer middleware (https://github.com/jnunemaker/flipper/pull/631)
|
10
|
+
|
1
11
|
## 0.24.1
|
2
12
|
|
3
13
|
### Additions/Changes
|
@@ -7,6 +17,7 @@
|
|
7
17
|
* Add Flipper::Actor#hash so actors can be hash keys (https://github.com/jnunemaker/flipper/pull/616).
|
8
18
|
* Pretty Up `rails routes` again and make rack-protection dependency less strict (https://github.com/jnunemaker/flipper/pull/619).
|
9
19
|
* Add kwargs for method_missing using ruby 3.0 (https://github.com/jnunemaker/flipper/pull/620).
|
20
|
+
* Relax the rack-protection dependency (https://github.com/jnunemaker/flipper/commit/c1cb9cd78140c2b09123687642558101e6e5d37d).
|
10
21
|
|
11
22
|
## 0.24.0
|
12
23
|
|
data/Gemfile
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
module Flipper
|
2
|
+
module Adapters
|
3
|
+
class Failsafe
|
4
|
+
include ::Flipper::Adapter
|
5
|
+
|
6
|
+
# Public: The name of the adapter.
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
# Public: Build a new Failsafe instance.
|
10
|
+
#
|
11
|
+
# adapter - Flipper adapter to guard.
|
12
|
+
# options - Hash of options:
|
13
|
+
# :errors - Array of exception types for which to fail safe
|
14
|
+
|
15
|
+
def initialize(adapter, options = {})
|
16
|
+
@adapter = adapter
|
17
|
+
@errors = options.fetch(:errors, [StandardError])
|
18
|
+
@name = :failsafe
|
19
|
+
end
|
20
|
+
|
21
|
+
def features
|
22
|
+
@adapter.features
|
23
|
+
rescue *@errors
|
24
|
+
Set.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def add(feature)
|
28
|
+
@adapter.add(feature)
|
29
|
+
rescue *@errors
|
30
|
+
false
|
31
|
+
end
|
32
|
+
|
33
|
+
def remove(feature)
|
34
|
+
@adapter.remove(feature)
|
35
|
+
rescue *@errors
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
def clear(feature)
|
40
|
+
@adapter.clear(feature)
|
41
|
+
rescue *@errors
|
42
|
+
false
|
43
|
+
end
|
44
|
+
|
45
|
+
def get(feature)
|
46
|
+
@adapter.get(feature)
|
47
|
+
rescue *@errors
|
48
|
+
{}
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_multi(features)
|
52
|
+
@adapter.get_multi(features)
|
53
|
+
rescue *@errors
|
54
|
+
{}
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_all
|
58
|
+
@adapter.get_all
|
59
|
+
rescue *@errors
|
60
|
+
{}
|
61
|
+
end
|
62
|
+
|
63
|
+
def enable(feature, gate, thing)
|
64
|
+
@adapter.enable(feature, gate, thing)
|
65
|
+
rescue *@errors
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
def disable(feature, gate, thing)
|
70
|
+
@adapter.disable(feature, gate, thing)
|
71
|
+
rescue *@errors
|
72
|
+
false
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/flipper/errors.rb
CHANGED
@@ -12,15 +12,6 @@ module Flipper
|
|
12
12
|
# Raised when attempting to declare a group name that has already been used.
|
13
13
|
class DuplicateGroup < Error; end
|
14
14
|
|
15
|
-
# Raised when default instance not configured but there is an attempt to
|
16
|
-
# use it.
|
17
|
-
class DefaultNotSet < Flipper::Error
|
18
|
-
def initialize(message = nil)
|
19
|
-
warn "Flipper::DefaultNotSet is deprecated and will be removed in 1.0"
|
20
|
-
super
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
15
|
# Raised when an invalid value is set to a configuration property
|
25
16
|
class InvalidConfigurationValue < Flipper::Error
|
26
17
|
def initialize(message = nil)
|
@@ -28,12 +19,4 @@ module Flipper
|
|
28
19
|
super(message || default)
|
29
20
|
end
|
30
21
|
end
|
31
|
-
|
32
|
-
# Raised when accessing a configuration property that has been deprecated
|
33
|
-
class ConfigurationDeprecated < Flipper::Error
|
34
|
-
def initialize(message = nil)
|
35
|
-
default = "The configuration property has been deprecated"
|
36
|
-
super(message || default)
|
37
|
-
end
|
38
|
-
end
|
39
22
|
end
|
@@ -25,11 +25,6 @@ module Flipper
|
|
25
25
|
raise 'Flipper::Middleware::Memoizer no longer initializes with a flipper instance or block. Read more at: https://git.io/vSo31.'
|
26
26
|
end
|
27
27
|
|
28
|
-
if opts[:preload_all]
|
29
|
-
warn "Flipper::Middleware::Memoizer: `preload_all` is deprecated, use `preload: true`"
|
30
|
-
opts[:preload] = true
|
31
|
-
end
|
32
|
-
|
33
28
|
@app = app
|
34
29
|
@opts = opts
|
35
30
|
@env_key = opts.fetch(:env_key, 'flipper')
|
@@ -74,14 +69,9 @@ module Flipper
|
|
74
69
|
when Array then flipper.preload(@opts[:preload])
|
75
70
|
end
|
76
71
|
|
77
|
-
|
78
|
-
response[2] = Rack::BodyProxy.new(response[2]) do
|
79
|
-
flipper.memoize = false
|
80
|
-
end
|
81
|
-
reset_on_body_close = true
|
82
|
-
response
|
72
|
+
@app.call(env)
|
83
73
|
ensure
|
84
|
-
flipper.memoize = false if flipper
|
74
|
+
flipper.memoize = false if flipper
|
85
75
|
end
|
86
76
|
end
|
87
77
|
end
|
data/lib/flipper/version.rb
CHANGED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'flipper/adapters/failsafe'
|
2
|
+
|
3
|
+
RSpec.describe Flipper::Adapters::Failsafe do
|
4
|
+
subject { described_class.new(memory_adapter, options) }
|
5
|
+
|
6
|
+
let(:memory_adapter) { Flipper::Adapters::Memory.new }
|
7
|
+
let(:options) { {} }
|
8
|
+
let(:flipper) { Flipper.new(subject) }
|
9
|
+
|
10
|
+
it_should_behave_like 'a flipper adapter'
|
11
|
+
|
12
|
+
context 'when disaster strikes' do
|
13
|
+
before do
|
14
|
+
expect(flipper[feature.name].enable).to be(true)
|
15
|
+
|
16
|
+
(subject.methods - Object.methods).each do |method_name|
|
17
|
+
allow(memory_adapter).to receive(method_name).and_raise(IOError)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:feature) { Flipper::Feature.new(:my_feature, subject) }
|
22
|
+
|
23
|
+
it { expect(subject.features).to eq(Set.new) }
|
24
|
+
it { expect(feature.add).to eq(false) }
|
25
|
+
it { expect(feature.remove).to eq(false) }
|
26
|
+
it { expect(feature.clear).to eq(false) }
|
27
|
+
it { expect(subject.get(feature)).to eq({}) }
|
28
|
+
it { expect(subject.get_multi([feature])).to eq({}) }
|
29
|
+
it { expect(subject.get_all).to eq({}) }
|
30
|
+
it { expect(feature.enable).to eq(false) }
|
31
|
+
it { expect(feature.disable).to eq(false) }
|
32
|
+
|
33
|
+
context 'when used via Flipper' do
|
34
|
+
it { expect(flipper.features).to eq(Set.new) }
|
35
|
+
it { expect(flipper[feature.name].enabled?).to eq(false) }
|
36
|
+
it { expect(flipper[feature.name].enable).to eq(false) }
|
37
|
+
it { expect(flipper[feature.name].disable).to eq(false) }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when there is a syntax error' do
|
41
|
+
let(:test) { flipper[feature.name].enabled? }
|
42
|
+
|
43
|
+
before do
|
44
|
+
expect(memory_adapter).to receive(:get).and_raise(SyntaxError)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'does not catch this type of error' do
|
48
|
+
expect { test }.to raise_error(SyntaxError)
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when configured to catch SyntaxError' do
|
52
|
+
let(:options) { { errors: [SyntaxError] } }
|
53
|
+
|
54
|
+
it { expect(test).to eq(false) }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -38,26 +38,6 @@ RSpec.describe Flipper::Middleware::Memoizer do
|
|
38
38
|
expect(called).to eq(true)
|
39
39
|
end
|
40
40
|
|
41
|
-
it 'disables local cache after body close' do
|
42
|
-
app = ->(_env) { [200, {}, []] }
|
43
|
-
middleware = described_class.new(app)
|
44
|
-
body = middleware.call(env).last
|
45
|
-
|
46
|
-
expect(flipper.memoizing?).to eq(true)
|
47
|
-
body.close
|
48
|
-
expect(flipper.memoizing?).to eq(false)
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'clears local cache after body close' do
|
52
|
-
app = ->(_env) { [200, {}, []] }
|
53
|
-
middleware = described_class.new(app)
|
54
|
-
body = middleware.call(env).last
|
55
|
-
|
56
|
-
flipper.adapter.cache['hello'] = 'world'
|
57
|
-
body.close
|
58
|
-
expect(flipper.adapter.cache).to be_empty
|
59
|
-
end
|
60
|
-
|
61
41
|
it 'clears the local cache with a successful request' do
|
62
42
|
flipper.adapter.cache['hello'] = 'world'
|
63
43
|
get '/', {}, 'flipper' => flipper
|
data/spec/spec_helper.rb
CHANGED
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.25.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Nunemaker
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- lib/flipper/adapter.rb
|
58
58
|
- lib/flipper/adapters/dual_write.rb
|
59
59
|
- lib/flipper/adapters/failover.rb
|
60
|
+
- lib/flipper/adapters/failsafe.rb
|
60
61
|
- lib/flipper/adapters/http.rb
|
61
62
|
- lib/flipper/adapters/http/client.rb
|
62
63
|
- lib/flipper/adapters/http/error.rb
|
@@ -110,6 +111,7 @@ files:
|
|
110
111
|
- spec/flipper/adapter_spec.rb
|
111
112
|
- spec/flipper/adapters/dual_write_spec.rb
|
112
113
|
- spec/flipper/adapters/failover_spec.rb
|
114
|
+
- spec/flipper/adapters/failsafe_spec.rb
|
113
115
|
- spec/flipper/adapters/http_spec.rb
|
114
116
|
- spec/flipper/adapters/instrumented_spec.rb
|
115
117
|
- spec/flipper/adapters/memoizable_spec.rb
|
@@ -188,6 +190,7 @@ test_files:
|
|
188
190
|
- spec/flipper/adapter_spec.rb
|
189
191
|
- spec/flipper/adapters/dual_write_spec.rb
|
190
192
|
- spec/flipper/adapters/failover_spec.rb
|
193
|
+
- spec/flipper/adapters/failsafe_spec.rb
|
191
194
|
- spec/flipper/adapters/http_spec.rb
|
192
195
|
- spec/flipper/adapters/instrumented_spec.rb
|
193
196
|
- spec/flipper/adapters/memoizable_spec.rb
|