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.
Files changed (59) hide show
  1. data/Guardfile +3 -8
  2. data/README.md +26 -38
  3. data/examples/percentage_of_actors.rb +17 -12
  4. data/examples/percentage_of_random.rb +3 -7
  5. data/lib/flipper.rb +8 -1
  6. data/lib/flipper/adapter.rb +2 -208
  7. data/lib/flipper/adapters/decorator.rb +9 -0
  8. data/lib/flipper/adapters/instrumented.rb +92 -0
  9. data/lib/flipper/adapters/memoizable.rb +88 -0
  10. data/lib/flipper/adapters/memory.rb +89 -7
  11. data/lib/flipper/adapters/operation_logger.rb +31 -45
  12. data/lib/flipper/decorator.rb +6 -0
  13. data/lib/flipper/dsl.rb +29 -2
  14. data/lib/flipper/feature.rb +83 -49
  15. data/lib/flipper/gate.rb +24 -41
  16. data/lib/flipper/gates/actor.rb +24 -24
  17. data/lib/flipper/gates/boolean.rb +28 -15
  18. data/lib/flipper/gates/group.rb +25 -34
  19. data/lib/flipper/gates/percentage_of_actors.rb +21 -13
  20. data/lib/flipper/gates/percentage_of_random.rb +20 -12
  21. data/lib/flipper/instrumentation/log_subscriber.rb +14 -22
  22. data/lib/flipper/middleware/memoizer.rb +23 -0
  23. data/lib/flipper/spec/shared_adapter_specs.rb +141 -92
  24. data/lib/flipper/types/boolean.rb +5 -1
  25. data/lib/flipper/version.rb +1 -1
  26. data/spec/flipper/adapters/instrumented_spec.rb +92 -0
  27. data/spec/flipper/adapters/memoizable_spec.rb +184 -0
  28. data/spec/flipper/adapters/memory_spec.rb +1 -11
  29. data/spec/flipper/adapters/operation_logger_spec.rb +93 -0
  30. data/spec/flipper/dsl_spec.rb +18 -43
  31. data/spec/flipper/feature_spec.rb +25 -9
  32. data/spec/flipper/gate_spec.rb +8 -20
  33. data/spec/flipper/gates/actor_spec.rb +6 -14
  34. data/spec/flipper/gates/boolean_spec.rb +80 -13
  35. data/spec/flipper/gates/group_spec.rb +8 -18
  36. data/spec/flipper/gates/percentage_of_actors_spec.rb +12 -28
  37. data/spec/flipper/gates/percentage_of_random_spec.rb +6 -14
  38. data/spec/flipper/instrumentation/log_subscriber_spec.rb +15 -8
  39. data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +3 -6
  40. data/spec/flipper/middleware/{local_cache_spec.rb → memoizer_spec.rb} +25 -55
  41. data/spec/flipper/types/boolean_spec.rb +13 -3
  42. data/spec/flipper_spec.rb +7 -0
  43. data/spec/helper.rb +21 -3
  44. data/spec/integration_spec.rb +115 -116
  45. metadata +17 -27
  46. data/lib/flipper/adapters/memoized.rb +0 -55
  47. data/lib/flipper/key.rb +0 -38
  48. data/lib/flipper/middleware/local_cache.rb +0 -36
  49. data/lib/flipper/toggle.rb +0 -54
  50. data/lib/flipper/toggles/boolean.rb +0 -54
  51. data/lib/flipper/toggles/set.rb +0 -25
  52. data/lib/flipper/toggles/value.rb +0 -25
  53. data/spec/flipper/adapter_spec.rb +0 -463
  54. data/spec/flipper/adapters/memoized_spec.rb +0 -93
  55. data/spec/flipper/key_spec.rb +0 -23
  56. data/spec/flipper/toggle_spec.rb +0 -22
  57. data/spec/flipper/toggles/boolean_spec.rb +0 -40
  58. data/spec/flipper/toggles/set_spec.rb +0 -35
  59. 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
@@ -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
@@ -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