flipper 0.4.0 → 0.5.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.
- data/Guardfile +3 -8
- data/README.md +26 -38
- data/examples/percentage_of_actors.rb +17 -12
- data/examples/percentage_of_random.rb +3 -7
- data/lib/flipper.rb +8 -1
- data/lib/flipper/adapter.rb +2 -208
- data/lib/flipper/adapters/decorator.rb +9 -0
- data/lib/flipper/adapters/instrumented.rb +92 -0
- data/lib/flipper/adapters/memoizable.rb +88 -0
- data/lib/flipper/adapters/memory.rb +89 -7
- data/lib/flipper/adapters/operation_logger.rb +31 -45
- data/lib/flipper/decorator.rb +6 -0
- data/lib/flipper/dsl.rb +29 -2
- data/lib/flipper/feature.rb +83 -49
- data/lib/flipper/gate.rb +24 -41
- data/lib/flipper/gates/actor.rb +24 -24
- data/lib/flipper/gates/boolean.rb +28 -15
- data/lib/flipper/gates/group.rb +25 -34
- data/lib/flipper/gates/percentage_of_actors.rb +21 -13
- data/lib/flipper/gates/percentage_of_random.rb +20 -12
- data/lib/flipper/instrumentation/log_subscriber.rb +14 -22
- data/lib/flipper/middleware/memoizer.rb +23 -0
- data/lib/flipper/spec/shared_adapter_specs.rb +141 -92
- data/lib/flipper/types/boolean.rb +5 -1
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/adapters/instrumented_spec.rb +92 -0
- data/spec/flipper/adapters/memoizable_spec.rb +184 -0
- data/spec/flipper/adapters/memory_spec.rb +1 -11
- data/spec/flipper/adapters/operation_logger_spec.rb +93 -0
- data/spec/flipper/dsl_spec.rb +18 -43
- data/spec/flipper/feature_spec.rb +25 -9
- data/spec/flipper/gate_spec.rb +8 -20
- data/spec/flipper/gates/actor_spec.rb +6 -14
- data/spec/flipper/gates/boolean_spec.rb +80 -13
- data/spec/flipper/gates/group_spec.rb +8 -18
- data/spec/flipper/gates/percentage_of_actors_spec.rb +12 -28
- data/spec/flipper/gates/percentage_of_random_spec.rb +6 -14
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +15 -8
- data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +3 -6
- data/spec/flipper/middleware/{local_cache_spec.rb → memoizer_spec.rb} +25 -55
- data/spec/flipper/types/boolean_spec.rb +13 -3
- data/spec/flipper_spec.rb +7 -0
- data/spec/helper.rb +21 -3
- data/spec/integration_spec.rb +115 -116
- metadata +17 -27
- data/lib/flipper/adapters/memoized.rb +0 -55
- data/lib/flipper/key.rb +0 -38
- data/lib/flipper/middleware/local_cache.rb +0 -36
- data/lib/flipper/toggle.rb +0 -54
- data/lib/flipper/toggles/boolean.rb +0 -54
- data/lib/flipper/toggles/set.rb +0 -25
- data/lib/flipper/toggles/value.rb +0 -25
- data/spec/flipper/adapter_spec.rb +0 -463
- data/spec/flipper/adapters/memoized_spec.rb +0 -93
- data/spec/flipper/key_spec.rb +0 -23
- data/spec/flipper/toggle_spec.rb +0 -22
- data/spec/flipper/toggles/boolean_spec.rb +0 -40
- data/spec/flipper/toggles/set_spec.rb +0 -35
- data/spec/flipper/toggles/value_spec.rb +0 -55
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'flipper/adapters/memoized'
|
3
|
-
require 'flipper/adapters/memory'
|
4
|
-
require 'flipper/spec/shared_adapter_specs'
|
5
|
-
|
6
|
-
describe Flipper::Adapters::Memoized do
|
7
|
-
let(:cache) { {} }
|
8
|
-
let(:source) { {} }
|
9
|
-
let(:adapter) { Flipper::Adapters::Memory.new(source) }
|
10
|
-
|
11
|
-
subject { described_class.new(adapter, cache) }
|
12
|
-
|
13
|
-
def read_key(key)
|
14
|
-
source[key.to_s]
|
15
|
-
end
|
16
|
-
|
17
|
-
def write_key(key, value)
|
18
|
-
source[key.to_s] = value
|
19
|
-
end
|
20
|
-
|
21
|
-
it_should_behave_like 'a flipper adapter'
|
22
|
-
|
23
|
-
describe "#read" do
|
24
|
-
before do
|
25
|
-
source['foo'] = 'bar'
|
26
|
-
subject.read('foo')
|
27
|
-
end
|
28
|
-
|
29
|
-
it "memoizes key" do
|
30
|
-
cache['foo'].should eq(source['foo'])
|
31
|
-
cache['foo'].should eq('bar')
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe "#set_members" do
|
36
|
-
before do
|
37
|
-
source['foo'] = Set['1', '2']
|
38
|
-
subject.set_members('foo')
|
39
|
-
end
|
40
|
-
|
41
|
-
it "memoizes key" do
|
42
|
-
cache['foo'].should eq(source['foo'])
|
43
|
-
cache['foo'].should eq(Set['1', '2'])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe "#write" do
|
48
|
-
before do
|
49
|
-
source['foo'] = 'bar'
|
50
|
-
@result = subject.read('foo')
|
51
|
-
subject.write('foo', 'bar')
|
52
|
-
end
|
53
|
-
|
54
|
-
it "unmemoizes key" do
|
55
|
-
cache.key?('foo').should be_false
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#delete" do
|
60
|
-
before do
|
61
|
-
source['foo'] = 'bar'
|
62
|
-
@result = subject.read('foo')
|
63
|
-
subject.delete('foo')
|
64
|
-
end
|
65
|
-
|
66
|
-
it "unmemoizes key" do
|
67
|
-
cache.key?('foo').should be_false
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "#set_add" do
|
72
|
-
before do
|
73
|
-
source['foo'] = Set['1', '2']
|
74
|
-
@result = subject.set_members('foo')
|
75
|
-
subject.set_add('foo', '3')
|
76
|
-
end
|
77
|
-
|
78
|
-
it "unmemoizes key" do
|
79
|
-
cache.key?('foo').should be_false
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe "#set_delete" do
|
84
|
-
before do
|
85
|
-
source['foo'] = Set['1', '2']
|
86
|
-
subject.set_delete('foo', '2')
|
87
|
-
end
|
88
|
-
|
89
|
-
it "unmemoizes key" do
|
90
|
-
cache.key?('foo').should be_false
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
data/spec/flipper/key_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'flipper/key'
|
3
|
-
|
4
|
-
describe Flipper::Key do
|
5
|
-
subject { described_class.new(:foo, :bar) }
|
6
|
-
|
7
|
-
it "initializes with feature_name and gate_key" do
|
8
|
-
key = described_class.new(:foo, :bar)
|
9
|
-
key.should be_instance_of(described_class)
|
10
|
-
end
|
11
|
-
|
12
|
-
describe "#to_s" do
|
13
|
-
it "returns feature_name and gate_key joined by separator" do
|
14
|
-
subject.to_s.should eq("foo#{subject.separator}bar")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe "#inspect" do
|
19
|
-
it "returns easy to read string representation" do
|
20
|
-
subject.inspect.should eq("#<Flipper::Key:#{subject.object_id} feature_name=:foo, gate_key=:bar>")
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/spec/flipper/toggle_spec.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Flipper::Toggle do
|
4
|
-
let(:key) { double('Key') }
|
5
|
-
let(:adapter) { double('Adapter', :read => '22') }
|
6
|
-
let(:gate) { double('Gate', :adapter => adapter, :key => key) }
|
7
|
-
|
8
|
-
subject {
|
9
|
-
toggle = Flipper::Toggle.new(gate)
|
10
|
-
toggle.stub(:value => '22') # implemented in subclass
|
11
|
-
toggle
|
12
|
-
}
|
13
|
-
|
14
|
-
describe "#inspect" do
|
15
|
-
it "returns easy to read string representation" do
|
16
|
-
string = subject.inspect
|
17
|
-
string.should match(/Flipper::Toggle/)
|
18
|
-
string.should match(/gate=/)
|
19
|
-
string.should match(/value=22/)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Flipper::Toggles::Boolean do
|
4
|
-
let(:key) { double('Key') }
|
5
|
-
let(:adapter) { double('Adapter', :read => true) }
|
6
|
-
let(:gate) { double('Gate', :adapter => adapter, :key => key, :adapter_key => 'foo') }
|
7
|
-
|
8
|
-
subject {
|
9
|
-
described_class.new(gate)
|
10
|
-
}
|
11
|
-
|
12
|
-
describe "#value" do
|
13
|
-
described_class::TruthMap.each do |value, expected|
|
14
|
-
context "when adapter value set to #{value.inspect}" do
|
15
|
-
it "returns #{expected.inspect}" do
|
16
|
-
adapter.stub(:read => value)
|
17
|
-
subject.value.should be(expected)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context "for value not in truth map" do
|
23
|
-
it "returns false" do
|
24
|
-
adapter.stub(:read => 'jibberish')
|
25
|
-
subject.value.should be(false)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
describe "#enabled?" do
|
31
|
-
described_class::TruthMap.each do |value, expected|
|
32
|
-
context "when adapter value set to #{value.inspect}" do
|
33
|
-
it "returns #{expected.inspect}" do
|
34
|
-
adapter.stub(:read => value)
|
35
|
-
subject.enabled?.should be(expected)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Flipper::Toggles::Set do
|
4
|
-
let(:key) { double('Key') }
|
5
|
-
let(:adapter) { double('Adapter', :read => '22') }
|
6
|
-
let(:gate) { double('Gate', :adapter => adapter, :key => key) }
|
7
|
-
|
8
|
-
subject {
|
9
|
-
toggle = described_class.new(gate)
|
10
|
-
toggle.stub(:value => Set['bacon']) # implemented in subclass
|
11
|
-
toggle
|
12
|
-
}
|
13
|
-
|
14
|
-
describe "#enabled?" do
|
15
|
-
context "for empty set" do
|
16
|
-
before do
|
17
|
-
subject.stub(:value => Set.new)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns false" do
|
21
|
-
subject.enabled?.should be_false
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "for non-empty set" do
|
26
|
-
before do
|
27
|
-
subject.stub(:value => Set['bacon'])
|
28
|
-
end
|
29
|
-
|
30
|
-
it "returns true" do
|
31
|
-
subject.enabled?.should be_true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
describe Flipper::Toggles::Value do
|
4
|
-
let(:key) { double('Key') }
|
5
|
-
let(:adapter) { double('Adapter', :read => '22') }
|
6
|
-
let(:gate) { double('Gate', :adapter => adapter, :key => key) }
|
7
|
-
|
8
|
-
subject {
|
9
|
-
toggle = described_class.new(gate)
|
10
|
-
toggle.stub(:value => 22)
|
11
|
-
toggle
|
12
|
-
}
|
13
|
-
|
14
|
-
describe "#enabled?" do
|
15
|
-
context "for nil value" do
|
16
|
-
before do
|
17
|
-
subject.stub(:value => nil)
|
18
|
-
end
|
19
|
-
|
20
|
-
it "returns false" do
|
21
|
-
subject.enabled?.should be_false
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context "for integer" do
|
26
|
-
before do
|
27
|
-
subject.stub(:value => 22)
|
28
|
-
end
|
29
|
-
|
30
|
-
it "returns true" do
|
31
|
-
subject.enabled?.should be_true
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "for string integer" do
|
36
|
-
before do
|
37
|
-
subject.stub(:value => '22')
|
38
|
-
end
|
39
|
-
|
40
|
-
it "returns true" do
|
41
|
-
subject.enabled?.should be_true
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "for zero" do
|
46
|
-
before do
|
47
|
-
subject.stub(:value => 0)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns false" do
|
51
|
-
subject.enabled?.should be_false
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|