flipper 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Changelog.md +12 -0
- data/Gemfile +4 -7
- data/Guardfile +16 -4
- data/README.md +63 -34
- data/examples/basic.rb +1 -1
- data/examples/dsl.rb +10 -12
- data/examples/group.rb +10 -4
- data/examples/individual_actor.rb +9 -6
- data/examples/instrumentation.rb +39 -0
- data/examples/percentage_of_actors.rb +12 -9
- data/examples/percentage_of_random.rb +4 -2
- data/lib/flipper.rb +43 -10
- data/lib/flipper/adapter.rb +106 -21
- data/lib/flipper/adapters/memoized.rb +7 -0
- data/lib/flipper/adapters/memory.rb +10 -3
- data/lib/flipper/adapters/operation_logger.rb +7 -0
- data/lib/flipper/dsl.rb +73 -16
- data/lib/flipper/errors.rb +6 -0
- data/lib/flipper/feature.rb +117 -19
- data/lib/flipper/gate.rb +72 -4
- data/lib/flipper/gates/actor.rb +41 -12
- data/lib/flipper/gates/boolean.rb +21 -11
- data/lib/flipper/gates/group.rb +45 -12
- data/lib/flipper/gates/percentage_of_actors.rb +29 -10
- data/lib/flipper/gates/percentage_of_random.rb +22 -9
- data/lib/flipper/instrumentation/log_subscriber.rb +107 -0
- data/lib/flipper/instrumentation/metriks.rb +6 -0
- data/lib/flipper/instrumentation/metriks_subscriber.rb +92 -0
- data/lib/flipper/instrumenters/memory.rb +25 -0
- data/lib/flipper/instrumenters/noop.rb +9 -0
- data/lib/flipper/key.rb +23 -4
- data/lib/flipper/registry.rb +22 -6
- data/lib/flipper/spec/shared_adapter_specs.rb +59 -12
- data/lib/flipper/toggle.rb +19 -2
- data/lib/flipper/toggles/boolean.rb +36 -3
- data/lib/flipper/toggles/set.rb +9 -3
- data/lib/flipper/toggles/value.rb +9 -3
- data/lib/flipper/type.rb +1 -0
- data/lib/flipper/types/actor.rb +12 -14
- data/lib/flipper/types/percentage.rb +8 -2
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/adapter_spec.rb +163 -27
- data/spec/flipper/adapters/memoized_spec.rb +6 -6
- data/spec/flipper/dsl_spec.rb +51 -54
- data/spec/flipper/feature_spec.rb +179 -17
- data/spec/flipper/gate_spec.rb +47 -0
- data/spec/flipper/gates/actor_spec.rb +52 -0
- data/spec/flipper/gates/boolean_spec.rb +52 -0
- data/spec/flipper/gates/group_spec.rb +79 -0
- data/spec/flipper/gates/percentage_of_actors_spec.rb +98 -0
- data/spec/flipper/gates/percentage_of_random_spec.rb +54 -0
- data/spec/flipper/instrumentation/log_subscriber_spec.rb +104 -0
- data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +69 -0
- data/spec/flipper/instrumenters/memory_spec.rb +26 -0
- data/spec/flipper/instrumenters/noop_spec.rb +22 -0
- data/spec/flipper/key_spec.rb +8 -2
- data/spec/flipper/registry_spec.rb +20 -2
- data/spec/flipper/toggle_spec.rb +22 -0
- data/spec/flipper/toggles/boolean_spec.rb +40 -0
- data/spec/flipper/toggles/set_spec.rb +35 -0
- data/spec/flipper/toggles/value_spec.rb +55 -0
- data/spec/flipper/types/actor_spec.rb +28 -33
- data/spec/flipper_spec.rb +16 -3
- data/spec/helper.rb +37 -3
- data/spec/integration_spec.rb +90 -83
- metadata +40 -4
data/lib/flipper/toggle.rb
CHANGED
@@ -1,21 +1,29 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
3
|
module Flipper
|
4
|
+
# Internal: Used by gate to toggle values (true/false, add/delete from set, etc.).
|
5
|
+
# Named poorly maybe, but haven't come up with a better name yet.
|
4
6
|
class Toggle
|
5
7
|
extend Forwardable
|
6
8
|
|
7
9
|
attr_reader :gate
|
8
10
|
|
9
|
-
def_delegators :@gate, :
|
11
|
+
def_delegators :@gate, :adapter_key, :feature, :adapter
|
10
12
|
|
11
13
|
def initialize(gate)
|
12
14
|
@gate = gate
|
13
15
|
end
|
14
16
|
|
17
|
+
# Internal: Enables thing for gate and adds feature to known features.
|
18
|
+
#
|
19
|
+
# Returns Boolean (currently always true).
|
15
20
|
def enable(thing)
|
16
21
|
add_feature_to_set
|
17
22
|
end
|
18
23
|
|
24
|
+
# Internal: Disables thing for gate and adds feature to known features.
|
25
|
+
#
|
26
|
+
# Returns Boolean (currently always true).
|
19
27
|
def disable(thing)
|
20
28
|
add_feature_to_set
|
21
29
|
end
|
@@ -24,10 +32,19 @@ module Flipper
|
|
24
32
|
raise 'Not implemented'
|
25
33
|
end
|
26
34
|
|
35
|
+
# Public: Pretty string version for debugging.
|
36
|
+
def inspect
|
37
|
+
attributes = [
|
38
|
+
"gate=#{gate.inspect}",
|
39
|
+
"value=#{value}",
|
40
|
+
]
|
41
|
+
"#<#{self.class.name}:#{object_id} #{attributes.join(', ')}>"
|
42
|
+
end
|
43
|
+
|
27
44
|
private
|
28
45
|
|
29
46
|
def add_feature_to_set
|
30
|
-
adapter.feature_add
|
47
|
+
adapter.feature_add adapter_key.feature_name
|
31
48
|
end
|
32
49
|
end
|
33
50
|
end
|
@@ -1,20 +1,53 @@
|
|
1
1
|
module Flipper
|
2
2
|
module Toggles
|
3
3
|
class Boolean < Toggle
|
4
|
+
TruthMap = {
|
5
|
+
true => true,
|
6
|
+
'true' => true,
|
7
|
+
'TRUE' => true,
|
8
|
+
'True' => true,
|
9
|
+
't' => true,
|
10
|
+
'T' => true,
|
11
|
+
'1' => true,
|
12
|
+
'on' => true,
|
13
|
+
'ON' => true,
|
14
|
+
1 => true,
|
15
|
+
1.0 => true,
|
16
|
+
false => false,
|
17
|
+
'false' => false,
|
18
|
+
'FALSE' => false,
|
19
|
+
'False' => false,
|
20
|
+
'f' => false,
|
21
|
+
'F' => false,
|
22
|
+
'0' => false,
|
23
|
+
'off' => false,
|
24
|
+
'OFF' => false,
|
25
|
+
0 => false,
|
26
|
+
0.0 => false,
|
27
|
+
nil => false,
|
28
|
+
}
|
29
|
+
|
4
30
|
def enable(thing)
|
5
31
|
super
|
6
|
-
adapter.write
|
32
|
+
adapter.write adapter_key, thing.value
|
33
|
+
true
|
7
34
|
end
|
8
35
|
|
9
36
|
def disable(thing)
|
10
37
|
super
|
11
38
|
feature.gates.each do |gate|
|
12
|
-
gate.adapter.delete gate.
|
39
|
+
gate.adapter.delete gate.adapter_key
|
13
40
|
end
|
41
|
+
true
|
14
42
|
end
|
15
43
|
|
16
44
|
def value
|
17
|
-
adapter.read
|
45
|
+
value = adapter.read(adapter_key)
|
46
|
+
!!TruthMap[value]
|
47
|
+
end
|
48
|
+
|
49
|
+
def enabled?
|
50
|
+
value
|
18
51
|
end
|
19
52
|
end
|
20
53
|
end
|
data/lib/flipper/toggles/set.rb
CHANGED
@@ -3,16 +3,22 @@ module Flipper
|
|
3
3
|
class Set < Toggle
|
4
4
|
def enable(thing)
|
5
5
|
super
|
6
|
-
adapter.set_add
|
6
|
+
adapter.set_add adapter_key, thing.value
|
7
|
+
true
|
7
8
|
end
|
8
9
|
|
9
10
|
def disable(thing)
|
10
11
|
super
|
11
|
-
adapter.set_delete
|
12
|
+
adapter.set_delete adapter_key, thing.value
|
13
|
+
true
|
12
14
|
end
|
13
15
|
|
14
16
|
def value
|
15
|
-
adapter.set_members
|
17
|
+
adapter.set_members adapter_key
|
18
|
+
end
|
19
|
+
|
20
|
+
def enabled?
|
21
|
+
!value.empty?
|
16
22
|
end
|
17
23
|
end
|
18
24
|
end
|
@@ -3,16 +3,22 @@ module Flipper
|
|
3
3
|
class Value < Toggle
|
4
4
|
def enable(thing)
|
5
5
|
super
|
6
|
-
adapter.write
|
6
|
+
adapter.write adapter_key, thing.value
|
7
|
+
true
|
7
8
|
end
|
8
9
|
|
9
10
|
def disable(thing)
|
10
11
|
super
|
11
|
-
adapter.delete
|
12
|
+
adapter.delete adapter_key
|
13
|
+
true
|
12
14
|
end
|
13
15
|
|
14
16
|
def value
|
15
|
-
adapter.read
|
17
|
+
adapter.read adapter_key
|
18
|
+
end
|
19
|
+
|
20
|
+
def enabled?
|
21
|
+
!value.nil? && value.to_i > 0
|
16
22
|
end
|
17
23
|
end
|
18
24
|
end
|
data/lib/flipper/type.rb
CHANGED
data/lib/flipper/types/actor.rb
CHANGED
@@ -2,9 +2,9 @@ module Flipper
|
|
2
2
|
module Types
|
3
3
|
class Actor < Type
|
4
4
|
def self.wrappable?(thing)
|
5
|
-
thing.
|
6
|
-
|
7
|
-
|
5
|
+
return false if thing.nil?
|
6
|
+
return true if thing.is_a?(Flipper::Types::Actor)
|
7
|
+
thing.respond_to?(:flipper_id)
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.wrap(thing)
|
@@ -15,21 +15,19 @@ module Flipper
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
attr_reader :
|
18
|
+
attr_reader :value
|
19
19
|
|
20
20
|
def initialize(thing)
|
21
|
-
|
21
|
+
if thing.nil?
|
22
|
+
raise ArgumentError.new("thing cannot be nil")
|
23
|
+
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
else
|
27
|
-
thing
|
28
|
-
end.to_i
|
29
|
-
end
|
25
|
+
unless thing.respond_to?(:flipper_id)
|
26
|
+
raise ArgumentError.new("#{thing.inspect} must respond to flipper_id, but does not")
|
27
|
+
end
|
30
28
|
|
31
|
-
|
32
|
-
@
|
29
|
+
@thing = thing
|
30
|
+
@value = thing.flipper_id.to_s
|
33
31
|
end
|
34
32
|
|
35
33
|
def respond_to?(*args)
|
@@ -4,13 +4,19 @@ module Flipper
|
|
4
4
|
attr_reader :value
|
5
5
|
|
6
6
|
def initialize(value)
|
7
|
-
|
7
|
+
value = value.to_i
|
8
|
+
|
9
|
+
if value < 0 || value > 100
|
10
|
+
raise ArgumentError, "value must be a positive number less than or equal to 100, but was #{value}"
|
11
|
+
end
|
12
|
+
|
13
|
+
@value = value
|
8
14
|
end
|
9
15
|
|
10
16
|
def eql?(other)
|
11
17
|
self.class.eql?(other.class) && value == other.value
|
12
18
|
end
|
13
|
-
|
19
|
+
alias_method :==, :eql?
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
data/lib/flipper/version.rb
CHANGED
@@ -1,13 +1,15 @@
|
|
1
1
|
require 'helper'
|
2
2
|
require 'flipper/adapter'
|
3
3
|
require 'flipper/adapters/memory'
|
4
|
+
require 'flipper/instrumenters/memory'
|
4
5
|
|
5
6
|
describe Flipper::Adapter do
|
6
7
|
let(:local_cache) { {} }
|
7
|
-
let(:
|
8
|
+
let(:source) { {} }
|
9
|
+
let(:adapter) { Flipper::Adapters::Memory.new(source) }
|
8
10
|
let(:features_key) { described_class::FeaturesKey }
|
9
11
|
|
10
|
-
subject { described_class.new(adapter, local_cache) }
|
12
|
+
subject { described_class.new(adapter, :local_cache => local_cache) }
|
11
13
|
|
12
14
|
describe ".wrap" do
|
13
15
|
context "with Flipper::Adapter instance" do
|
@@ -15,8 +17,12 @@ describe Flipper::Adapter do
|
|
15
17
|
@result = described_class.wrap(subject)
|
16
18
|
end
|
17
19
|
|
18
|
-
it "returns
|
19
|
-
@result.should
|
20
|
+
it "returns same Flipper::Adapter instance" do
|
21
|
+
@result.should equal(subject)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "wraps adapter that instance was wrapping" do
|
25
|
+
@result.adapter.should be(subject.adapter)
|
20
26
|
end
|
21
27
|
end
|
22
28
|
|
@@ -30,11 +36,54 @@ describe Flipper::Adapter do
|
|
30
36
|
end
|
31
37
|
|
32
38
|
it "wraps adapter" do
|
33
|
-
@result.adapter.should
|
39
|
+
@result.adapter.should be(adapter)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "with adapter instance and options" do
|
44
|
+
let(:instrumenter) { double('Instrumentor') }
|
45
|
+
|
46
|
+
before do
|
47
|
+
@result = described_class.wrap(adapter, :instrumenter => instrumenter)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns Flipper::Adapter instance" do
|
51
|
+
@result.should be_instance_of(described_class)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "wraps adapter" do
|
55
|
+
@result.adapter.should be(adapter)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "passes options to initialization" do
|
59
|
+
@result.instrumenter.should be(instrumenter)
|
34
60
|
end
|
35
61
|
end
|
36
62
|
end
|
37
63
|
|
64
|
+
describe "#initialize" do
|
65
|
+
it "sets adapter" do
|
66
|
+
instance = described_class.new(adapter)
|
67
|
+
instance.adapter.should be(adapter)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "sets adapter name" do
|
71
|
+
instance = described_class.new(adapter)
|
72
|
+
instance.name.should be(:memory)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "defaults instrumenter" do
|
76
|
+
instance = described_class.new(adapter)
|
77
|
+
instance.instrumenter.should be(Flipper::Instrumenters::Noop)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "allows overriding instrumenter" do
|
81
|
+
instrumenter = double('Instrumentor', :instrument => nil)
|
82
|
+
instance = described_class.new(adapter, :instrumenter => instrumenter)
|
83
|
+
instance.instrumenter.should be(instrumenter)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
38
87
|
describe "#use_local_cache=" do
|
39
88
|
it "sets value" do
|
40
89
|
subject.use_local_cache = true
|
@@ -86,18 +135,18 @@ describe Flipper::Adapter do
|
|
86
135
|
|
87
136
|
describe "#set_members" do
|
88
137
|
before do
|
89
|
-
|
138
|
+
source['foo'] = Set['1', '2']
|
90
139
|
@result = subject.set_members('foo')
|
91
140
|
end
|
92
141
|
|
93
142
|
it "returns result of adapter set members" do
|
94
|
-
@result.should eq(Set[1, 2])
|
143
|
+
@result.should eq(Set['1', '2'])
|
95
144
|
end
|
96
145
|
|
97
146
|
it "memoizes key" do
|
98
|
-
local_cache['foo'].should eq(Set[1, 2])
|
147
|
+
local_cache['foo'].should eq(Set['1', '2'])
|
99
148
|
adapter.should_not_receive(:set_members)
|
100
|
-
subject.set_members('foo').should eq(Set[1, 2])
|
149
|
+
subject.set_members('foo').should eq(Set['1', '2'])
|
101
150
|
end
|
102
151
|
end
|
103
152
|
|
@@ -132,13 +181,13 @@ describe Flipper::Adapter do
|
|
132
181
|
|
133
182
|
describe "#set_add" do
|
134
183
|
before do
|
135
|
-
|
136
|
-
local_cache['foo'] = Set[1]
|
137
|
-
subject.set_add 'foo', 2
|
184
|
+
source['foo'] = Set['1']
|
185
|
+
local_cache['foo'] = Set['1']
|
186
|
+
subject.set_add 'foo', '2'
|
138
187
|
end
|
139
188
|
|
140
189
|
it "returns result of adapter set members" do
|
141
|
-
adapter.set_members('foo').should eq(Set[1, 2])
|
190
|
+
adapter.set_members('foo').should eq(Set['1', '2'])
|
142
191
|
end
|
143
192
|
|
144
193
|
it "unmemoizes key" do
|
@@ -148,13 +197,13 @@ describe Flipper::Adapter do
|
|
148
197
|
|
149
198
|
describe "#set_delete" do
|
150
199
|
before do
|
151
|
-
|
152
|
-
local_cache['foo'] = Set[1, 2, 3]
|
153
|
-
subject.set_delete 'foo', 3
|
200
|
+
source['foo'] = Set['1', '2', '3']
|
201
|
+
local_cache['foo'] = Set['1', '2', '3']
|
202
|
+
subject.set_delete 'foo', '3'
|
154
203
|
end
|
155
204
|
|
156
205
|
it "returns result of adapter set members" do
|
157
|
-
adapter.set_members('foo').should eq(Set[1, 2])
|
206
|
+
adapter.set_members('foo').should eq(Set['1', '2'])
|
158
207
|
end
|
159
208
|
|
160
209
|
it "unmemoizes key" do
|
@@ -185,12 +234,12 @@ describe Flipper::Adapter do
|
|
185
234
|
|
186
235
|
describe "#set_members" do
|
187
236
|
before do
|
188
|
-
|
237
|
+
source['foo'] = Set['1', '2']
|
189
238
|
@result = subject.set_members('foo')
|
190
239
|
end
|
191
240
|
|
192
241
|
it "returns result of adapter set members" do
|
193
|
-
@result.should eq(Set[1, 2])
|
242
|
+
@result.should eq(Set['1', '2'])
|
194
243
|
end
|
195
244
|
|
196
245
|
it "does not memoize the adapter set member result" do
|
@@ -232,13 +281,13 @@ describe Flipper::Adapter do
|
|
232
281
|
|
233
282
|
describe "#set_add" do
|
234
283
|
before do
|
235
|
-
|
236
|
-
local_cache['foo'] = Set[1]
|
237
|
-
subject.set_add 'foo', 2
|
284
|
+
source['foo'] = Set['1']
|
285
|
+
local_cache['foo'] = Set['1']
|
286
|
+
subject.set_add 'foo', '2'
|
238
287
|
end
|
239
288
|
|
240
289
|
it "performs adapter set add" do
|
241
|
-
adapter.set_members('foo').should eq(Set[1, 2])
|
290
|
+
adapter.set_members('foo').should eq(Set['1', '2'])
|
242
291
|
end
|
243
292
|
|
244
293
|
it "does not attempt to delete local cache key" do
|
@@ -248,13 +297,13 @@ describe Flipper::Adapter do
|
|
248
297
|
|
249
298
|
describe "#set_delete" do
|
250
299
|
before do
|
251
|
-
|
252
|
-
local_cache['foo'] = Set[1, 2, 3]
|
253
|
-
subject.set_delete 'foo', 3
|
300
|
+
source['foo'] = Set['1', '2', '3']
|
301
|
+
local_cache['foo'] = Set['1', '2', '3']
|
302
|
+
subject.set_delete 'foo', '3'
|
254
303
|
end
|
255
304
|
|
256
305
|
it "performs adapter set delete" do
|
257
|
-
adapter.set_members('foo').should eq(Set[1, 2])
|
306
|
+
adapter.set_members('foo').should eq(Set['1', '2'])
|
258
307
|
end
|
259
308
|
|
260
309
|
it "does not attempt to delete local cache key" do
|
@@ -324,4 +373,91 @@ describe Flipper::Adapter do
|
|
324
373
|
end
|
325
374
|
end
|
326
375
|
end
|
376
|
+
|
377
|
+
describe "instrumentation" do
|
378
|
+
let(:instrumenter) { Flipper::Instrumenters::Memory.new }
|
379
|
+
|
380
|
+
subject {
|
381
|
+
described_class.new(adapter, :instrumenter => instrumenter)
|
382
|
+
}
|
383
|
+
|
384
|
+
it "is recorded for read" do
|
385
|
+
subject.read('foo')
|
386
|
+
|
387
|
+
event = instrumenter.events.last
|
388
|
+
event.should_not be_nil
|
389
|
+
event.name.should eq('adapter_operation.flipper')
|
390
|
+
event.payload[:key].should eq('foo')
|
391
|
+
event.payload[:operation].should eq(:read)
|
392
|
+
event.payload[:adapter_name].should eq(:memory)
|
393
|
+
event.payload[:result].should be_nil
|
394
|
+
end
|
395
|
+
|
396
|
+
it "is recorded for write" do
|
397
|
+
subject.write('foo', 'bar')
|
398
|
+
|
399
|
+
event = instrumenter.events.last
|
400
|
+
event.should_not be_nil
|
401
|
+
event.name.should eq('adapter_operation.flipper')
|
402
|
+
event.payload[:key].should eq('foo')
|
403
|
+
event.payload[:value].should eq('bar')
|
404
|
+
event.payload[:operation].should eq(:write)
|
405
|
+
event.payload[:adapter_name].should eq(:memory)
|
406
|
+
event.payload[:result].should eq('bar')
|
407
|
+
end
|
408
|
+
|
409
|
+
it "is recorded for delete" do
|
410
|
+
subject.delete('foo')
|
411
|
+
|
412
|
+
event = instrumenter.events.last
|
413
|
+
event.should_not be_nil
|
414
|
+
event.name.should eq('adapter_operation.flipper')
|
415
|
+
event.payload[:key].should eq('foo')
|
416
|
+
event.payload[:operation].should eq(:delete)
|
417
|
+
event.payload[:adapter_name].should eq(:memory)
|
418
|
+
event.payload[:result].should be_nil
|
419
|
+
end
|
420
|
+
|
421
|
+
it "is recorded for set_members" do
|
422
|
+
subject.set_members('foo')
|
423
|
+
|
424
|
+
event = instrumenter.events.last
|
425
|
+
event.should_not be_nil
|
426
|
+
event.name.should eq('adapter_operation.flipper')
|
427
|
+
event.payload[:key].should eq('foo')
|
428
|
+
event.payload[:operation].should eq(:set_members)
|
429
|
+
event.payload[:adapter_name].should eq(:memory)
|
430
|
+
event.payload[:result].should eq(Set.new)
|
431
|
+
end
|
432
|
+
|
433
|
+
it "is recorded for set_add" do
|
434
|
+
subject.set_add('foo', 'bar')
|
435
|
+
|
436
|
+
event = instrumenter.events.last
|
437
|
+
event.should_not be_nil
|
438
|
+
event.name.should eq('adapter_operation.flipper')
|
439
|
+
event.payload[:key].should eq('foo')
|
440
|
+
event.payload[:operation].should eq(:set_add)
|
441
|
+
event.payload[:adapter_name].should eq(:memory)
|
442
|
+
event.payload[:result].should eq(Set['bar'])
|
443
|
+
end
|
444
|
+
|
445
|
+
it "is recorded for set_delete" do
|
446
|
+
subject.set_delete('foo', 'bar')
|
447
|
+
|
448
|
+
event = instrumenter.events.last
|
449
|
+
event.should_not be_nil
|
450
|
+
event.name.should eq('adapter_operation.flipper')
|
451
|
+
event.payload[:key].should eq('foo')
|
452
|
+
event.payload[:operation].should eq(:set_delete)
|
453
|
+
event.payload[:adapter_name].should eq(:memory)
|
454
|
+
event.payload[:result].should eq(Set.new)
|
455
|
+
end
|
456
|
+
end
|
457
|
+
|
458
|
+
describe "#inspect" do
|
459
|
+
it "returns easy to read string representation" do
|
460
|
+
subject.inspect.should eq("#<Flipper::Adapter:#{subject.object_id} name=:memory, use_local_cache=nil>")
|
461
|
+
end
|
462
|
+
end
|
327
463
|
end
|