flipper 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. data/.rspec +1 -0
  2. data/Changelog.md +12 -0
  3. data/Gemfile +4 -7
  4. data/Guardfile +16 -4
  5. data/README.md +63 -34
  6. data/examples/basic.rb +1 -1
  7. data/examples/dsl.rb +10 -12
  8. data/examples/group.rb +10 -4
  9. data/examples/individual_actor.rb +9 -6
  10. data/examples/instrumentation.rb +39 -0
  11. data/examples/percentage_of_actors.rb +12 -9
  12. data/examples/percentage_of_random.rb +4 -2
  13. data/lib/flipper.rb +43 -10
  14. data/lib/flipper/adapter.rb +106 -21
  15. data/lib/flipper/adapters/memoized.rb +7 -0
  16. data/lib/flipper/adapters/memory.rb +10 -3
  17. data/lib/flipper/adapters/operation_logger.rb +7 -0
  18. data/lib/flipper/dsl.rb +73 -16
  19. data/lib/flipper/errors.rb +6 -0
  20. data/lib/flipper/feature.rb +117 -19
  21. data/lib/flipper/gate.rb +72 -4
  22. data/lib/flipper/gates/actor.rb +41 -12
  23. data/lib/flipper/gates/boolean.rb +21 -11
  24. data/lib/flipper/gates/group.rb +45 -12
  25. data/lib/flipper/gates/percentage_of_actors.rb +29 -10
  26. data/lib/flipper/gates/percentage_of_random.rb +22 -9
  27. data/lib/flipper/instrumentation/log_subscriber.rb +107 -0
  28. data/lib/flipper/instrumentation/metriks.rb +6 -0
  29. data/lib/flipper/instrumentation/metriks_subscriber.rb +92 -0
  30. data/lib/flipper/instrumenters/memory.rb +25 -0
  31. data/lib/flipper/instrumenters/noop.rb +9 -0
  32. data/lib/flipper/key.rb +23 -4
  33. data/lib/flipper/registry.rb +22 -6
  34. data/lib/flipper/spec/shared_adapter_specs.rb +59 -12
  35. data/lib/flipper/toggle.rb +19 -2
  36. data/lib/flipper/toggles/boolean.rb +36 -3
  37. data/lib/flipper/toggles/set.rb +9 -3
  38. data/lib/flipper/toggles/value.rb +9 -3
  39. data/lib/flipper/type.rb +1 -0
  40. data/lib/flipper/types/actor.rb +12 -14
  41. data/lib/flipper/types/percentage.rb +8 -2
  42. data/lib/flipper/version.rb +1 -1
  43. data/spec/flipper/adapter_spec.rb +163 -27
  44. data/spec/flipper/adapters/memoized_spec.rb +6 -6
  45. data/spec/flipper/dsl_spec.rb +51 -54
  46. data/spec/flipper/feature_spec.rb +179 -17
  47. data/spec/flipper/gate_spec.rb +47 -0
  48. data/spec/flipper/gates/actor_spec.rb +52 -0
  49. data/spec/flipper/gates/boolean_spec.rb +52 -0
  50. data/spec/flipper/gates/group_spec.rb +79 -0
  51. data/spec/flipper/gates/percentage_of_actors_spec.rb +98 -0
  52. data/spec/flipper/gates/percentage_of_random_spec.rb +54 -0
  53. data/spec/flipper/instrumentation/log_subscriber_spec.rb +104 -0
  54. data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +69 -0
  55. data/spec/flipper/instrumenters/memory_spec.rb +26 -0
  56. data/spec/flipper/instrumenters/noop_spec.rb +22 -0
  57. data/spec/flipper/key_spec.rb +8 -2
  58. data/spec/flipper/registry_spec.rb +20 -2
  59. data/spec/flipper/toggle_spec.rb +22 -0
  60. data/spec/flipper/toggles/boolean_spec.rb +40 -0
  61. data/spec/flipper/toggles/set_spec.rb +35 -0
  62. data/spec/flipper/toggles/value_spec.rb +55 -0
  63. data/spec/flipper/types/actor_spec.rb +28 -33
  64. data/spec/flipper_spec.rb +16 -3
  65. data/spec/helper.rb +37 -3
  66. data/spec/integration_spec.rb +90 -83
  67. metadata +40 -4
@@ -5,17 +5,19 @@ require 'flipper/adapters/memory'
5
5
  describe Flipper::Feature do
6
6
  subject { described_class.new(:search, adapter) }
7
7
 
8
+ let(:actor_class) { Struct.new(:flipper_id) }
9
+
8
10
  let(:source) { {} }
9
11
  let(:adapter) { Flipper::Adapters::Memory.new(source) }
10
12
 
11
13
  let(:admin_group) { Flipper.group(:admins) }
12
14
  let(:dev_group) { Flipper.group(:devs) }
13
15
 
14
- let(:admin_thing) { double 'Non Flipper Thing', :identifier => 1, :admin? => true, :dev? => false }
15
- let(:dev_thing) { double 'Non Flipper Thing', :identifier => 10, :admin? => false, :dev? => true }
16
+ let(:admin_thing) { double 'Non Flipper Thing', :flipper_id => 1, :admin? => true, :dev? => false }
17
+ let(:dev_thing) { double 'Non Flipper Thing', :flipper_id => 10, :admin? => false, :dev? => true }
16
18
 
17
- let(:pitt) { Flipper::Types::Actor.new(1) }
18
- let(:clooney) { Flipper::Types::Actor.new(10) }
19
+ let(:pitt) { actor_class.new(1) }
20
+ let(:clooney) { actor_class.new(10) }
19
21
 
20
22
  let(:five_percent_of_actors) { Flipper::Types::PercentageOfActors.new(5) }
21
23
  let(:five_percent_of_random) { Flipper::Types::PercentageOfRandom.new(5) }
@@ -25,36 +27,18 @@ describe Flipper::Feature do
25
27
  Flipper.register(:devs) { |thing| thing.dev? }
26
28
  end
27
29
 
28
- def enable_feature(feature)
29
- key = Flipper::Key.new(subject.name, Flipper::Gates::Boolean::Key)
30
- adapter.write key, true
31
- end
32
-
33
- def enable_group(group)
34
- key = Flipper::Key.new(subject.name, Flipper::Gates::Group::Key)
35
- name = group.respond_to?(:name) ? group.name : group
36
- adapter.set_add key, name
37
- end
38
-
39
- def enable_actor(actor)
40
- key = Flipper::Key.new(subject.name, Flipper::Gates::Actor::Key)
41
- adapter.set_add key, actor.identifier
42
- end
43
-
44
- def enable_percentage_of_actors(percentage)
45
- key = Flipper::Key.new(subject.name, Flipper::Gates::PercentageOfActors::Key)
46
- adapter.write key, percentage.value
47
- end
48
-
49
- def enable_percentage_of_random(percentage)
50
- key = Flipper::Key.new(subject.name, Flipper::Gates::PercentageOfRandom::Key)
51
- adapter.write key, percentage.value
30
+ after do
31
+ Flipper.groups = nil
52
32
  end
53
33
 
54
34
  describe "#enable" do
55
35
  context "with no arguments" do
56
36
  before do
57
- subject.enable
37
+ @result = subject.enable
38
+ end
39
+
40
+ it "returns true" do
41
+ @result.should be_true
58
42
  end
59
43
 
60
44
  it "enables feature for all" do
@@ -68,7 +52,11 @@ describe Flipper::Feature do
68
52
 
69
53
  context "with a group" do
70
54
  before do
71
- subject.enable(admin_group)
55
+ @result = subject.enable(admin_group)
56
+ end
57
+
58
+ it "returns true" do
59
+ @result.should be_true
72
60
  end
73
61
 
74
62
  it "enables feature for non flipper thing in group" do
@@ -98,7 +86,11 @@ describe Flipper::Feature do
98
86
 
99
87
  context "with an actor" do
100
88
  before do
101
- subject.enable(pitt)
89
+ @result = subject.enable(pitt)
90
+ end
91
+
92
+ it "returns true" do
93
+ @result.should be_true
102
94
  end
103
95
 
104
96
  it "enables feature for actor" do
@@ -116,11 +108,19 @@ describe Flipper::Feature do
116
108
 
117
109
  context "with a percentage of actors" do
118
110
  before do
119
- subject.enable(five_percent_of_actors)
111
+ @result = subject.enable(five_percent_of_actors)
112
+ end
113
+
114
+ it "returns true" do
115
+ @result.should be_true
120
116
  end
121
117
 
122
118
  it "enables feature for actor within percentage" do
123
- enabled = (1..100).select { |i| subject.enabled?(Flipper::Types::Actor.new(i)) }.length
119
+ enabled = (1..100).select { |i|
120
+ thing = actor_class.new(i)
121
+ subject.enabled?(thing)
122
+ }.size
123
+
124
124
  enabled.should be_within(2).of(5)
125
125
  end
126
126
 
@@ -133,7 +133,11 @@ describe Flipper::Feature do
133
133
  before do
134
134
  @gate = Flipper::Gates::PercentageOfRandom.new(subject)
135
135
  Flipper::Gates::PercentageOfRandom.should_receive(:new).and_return(@gate)
136
- subject.enable(five_percent_of_random)
136
+ @result = subject.enable(five_percent_of_random)
137
+ end
138
+
139
+ it "returns true" do
140
+ @result.should be_true
137
141
  end
138
142
 
139
143
  it "enables feature for time within percentage" do
@@ -168,11 +172,15 @@ describe Flipper::Feature do
168
172
  @gate = Flipper::Gates::PercentageOfRandom.new(subject)
169
173
  @gate.stub(:rand => 0.04)
170
174
  Flipper::Gates::PercentageOfRandom.should_receive(:new).and_return(@gate)
171
- enable_group admin_group
172
- enable_actor pitt
173
- enable_percentage_of_actors five_percent_of_actors
174
- enable_percentage_of_random five_percent_of_random
175
- subject.disable
175
+ subject.enable admin_group
176
+ subject.enable pitt
177
+ subject.enable five_percent_of_actors
178
+ subject.enable five_percent_of_random
179
+ @result = subject.disable
180
+ end
181
+
182
+ it "returns true" do
183
+ @result.should be_true
176
184
  end
177
185
 
178
186
  it "disables feature" do
@@ -188,7 +196,11 @@ describe Flipper::Feature do
188
196
  end
189
197
 
190
198
  it "disables actor in percentage of actors" do
191
- enabled = (1..100).select { |i| subject.enabled?(Flipper::Types::Actor.new(i)) }.length
199
+ enabled = (1..100).select { |i|
200
+ thing = actor_class.new(i)
201
+ subject.enabled?(thing)
202
+ }.size
203
+
192
204
  enabled.should be(0)
193
205
  end
194
206
 
@@ -203,9 +215,13 @@ describe Flipper::Feature do
203
215
 
204
216
  context "with a group" do
205
217
  before do
206
- enable_group dev_group
207
- enable_group admin_group
208
- subject.disable(admin_group)
218
+ subject.enable dev_group
219
+ subject.enable admin_group
220
+ @result = subject.disable(admin_group)
221
+ end
222
+
223
+ it "returns true" do
224
+ @result.should be_true
209
225
  end
210
226
 
211
227
  it "disables the feature for non flipper thing in the group" do
@@ -231,9 +247,13 @@ describe Flipper::Feature do
231
247
 
232
248
  context "with an actor" do
233
249
  before do
234
- enable_actor pitt
235
- enable_actor clooney
236
- subject.disable(pitt)
250
+ subject.enable pitt
251
+ subject.enable clooney
252
+ @result = subject.disable(pitt)
253
+ end
254
+
255
+ it "returns true" do
256
+ @result.should be_true
237
257
  end
238
258
 
239
259
  it "disables feature for actor" do
@@ -251,11 +271,19 @@ describe Flipper::Feature do
251
271
 
252
272
  context "with a percentage of actors" do
253
273
  before do
254
- subject.disable(five_percent_of_actors)
274
+ @result = subject.disable(five_percent_of_actors)
275
+ end
276
+
277
+ it "returns true" do
278
+ @result.should be_true
255
279
  end
256
280
 
257
281
  it "disables feature" do
258
- enabled = (1..100).select { |i| subject.enabled?(Flipper::Types::Actor.new(i)) }.length
282
+ enabled = (1..100).select { |i|
283
+ thing = actor_class.new(i)
284
+ subject.enabled?(thing)
285
+ }.size
286
+
259
287
  enabled.should be(0)
260
288
  end
261
289
 
@@ -268,7 +296,11 @@ describe Flipper::Feature do
268
296
  before do
269
297
  @gate = Flipper::Gates::PercentageOfRandom.new(subject)
270
298
  Flipper::Gates::PercentageOfRandom.should_receive(:new).and_return(@gate)
271
- subject.disable(five_percent_of_random)
299
+ @result = subject.disable(five_percent_of_random)
300
+ end
301
+
302
+ it "returns true" do
303
+ @result.should be_true
272
304
  end
273
305
 
274
306
  it "disables feature for time within percentage" do
@@ -305,7 +337,7 @@ describe Flipper::Feature do
305
337
 
306
338
  context "with no arguments, but boolean enabled" do
307
339
  before do
308
- enable_feature subject
340
+ subject.enable
309
341
  end
310
342
 
311
343
  it "returns true" do
@@ -315,7 +347,7 @@ describe Flipper::Feature do
315
347
 
316
348
  context "for actor in enabled group" do
317
349
  before do
318
- enable_group admin_group
350
+ subject.enable admin_group
319
351
  end
320
352
 
321
353
  it "returns true" do
@@ -331,7 +363,7 @@ describe Flipper::Feature do
331
363
 
332
364
  context "for enabled actor" do
333
365
  before do
334
- enable_actor pitt
366
+ subject.enable pitt
335
367
  end
336
368
 
337
369
  it "returns true" do
@@ -345,7 +377,7 @@ describe Flipper::Feature do
345
377
  end
346
378
 
347
379
  it "returns true if boolean enabled" do
348
- enable_feature subject
380
+ subject.enable
349
381
  subject.enabled?(clooney).should be_true
350
382
  end
351
383
  end
@@ -355,7 +387,7 @@ describe Flipper::Feature do
355
387
  @gate = Flipper::Gates::PercentageOfRandom.new(subject)
356
388
  @gate.stub(:rand => 0.04)
357
389
  Flipper::Gates::PercentageOfRandom.should_receive(:new).and_return(@gate)
358
- enable_percentage_of_random five_percent_of_random
390
+ subject.enable five_percent_of_random
359
391
  end
360
392
 
361
393
  it "returns true" do
@@ -371,7 +403,7 @@ describe Flipper::Feature do
371
403
  @gate = Flipper::Gates::PercentageOfRandom.new(subject)
372
404
  @gate.stub(:rand => 0.10)
373
405
  Flipper::Gates::PercentageOfRandom.should_receive(:new).and_return(@gate)
374
- enable_percentage_of_random five_percent_of_random
406
+ subject.enable five_percent_of_random
375
407
  end
376
408
 
377
409
  it "returns false" do
@@ -382,7 +414,7 @@ describe Flipper::Feature do
382
414
  end
383
415
 
384
416
  it "returns true if boolean enabled" do
385
- enable_feature subject
417
+ subject.enable
386
418
  subject.enabled?.should be_true
387
419
  subject.enabled?(nil).should be_true
388
420
  subject.enabled?(pitt).should be_true
@@ -392,7 +424,7 @@ describe Flipper::Feature do
392
424
 
393
425
  context "for a non flipper thing" do
394
426
  before do
395
- enable_group admin_group
427
+ subject.enable admin_group
396
428
  end
397
429
 
398
430
  it "returns true if in enabled group" do
@@ -404,36 +436,11 @@ describe Flipper::Feature do
404
436
  end
405
437
 
406
438
  it "returns true if boolean enabled" do
407
- enable_feature subject
439
+ subject.enable
408
440
  subject.enabled?(admin_thing).should be_true
409
441
  subject.enabled?(dev_thing).should be_true
410
442
  end
411
443
  end
412
-
413
- context "for a non flipper thing that does not respond to something in group block" do
414
- let(:actor) { double('Actor') }
415
-
416
- before do
417
- boomboom = Flipper.register(:boomboom) { |actor| actor.boomboom? }
418
- enable_group boomboom
419
- end
420
-
421
- it "returns false" do
422
- expect { subject.enabled?(actor) }.to raise_error
423
- end
424
- end
425
-
426
- context "for a non flipper thing when group in adapter, but not defined in code" do
427
- let(:actor) { double('Actor') }
428
-
429
- before do
430
- enable_group :support
431
- end
432
-
433
- it "returns false" do
434
- subject.enabled?(actor).should be_false
435
- end
436
- end
437
444
  end
438
445
 
439
446
  context "enabling multiple groups, disabling everything, then enabling one group" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-15 00:00:00.000000000 Z
12
+ date: 2013-02-06 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Feature flipper for any adapter
15
15
  email:
@@ -19,7 +19,9 @@ extensions: []
19
19
  extra_rdoc_files: []
20
20
  files:
21
21
  - .gitignore
22
+ - .rspec
22
23
  - .travis.yml
24
+ - Changelog.md
23
25
  - Gemfile
24
26
  - Guardfile
25
27
  - LICENSE
@@ -30,6 +32,7 @@ files:
30
32
  - examples/example_setup.rb
31
33
  - examples/group.rb
32
34
  - examples/individual_actor.rb
35
+ - examples/instrumentation.rb
33
36
  - examples/percentage_of_actors.rb
34
37
  - examples/percentage_of_random.rb
35
38
  - flipper.gemspec
@@ -47,6 +50,11 @@ files:
47
50
  - lib/flipper/gates/group.rb
48
51
  - lib/flipper/gates/percentage_of_actors.rb
49
52
  - lib/flipper/gates/percentage_of_random.rb
53
+ - lib/flipper/instrumentation/log_subscriber.rb
54
+ - lib/flipper/instrumentation/metriks.rb
55
+ - lib/flipper/instrumentation/metriks_subscriber.rb
56
+ - lib/flipper/instrumenters/memory.rb
57
+ - lib/flipper/instrumenters/noop.rb
50
58
  - lib/flipper/key.rb
51
59
  - lib/flipper/middleware/local_cache.rb
52
60
  - lib/flipper/registry.rb
@@ -68,9 +76,23 @@ files:
68
76
  - spec/flipper/adapters/memory_spec.rb
69
77
  - spec/flipper/dsl_spec.rb
70
78
  - spec/flipper/feature_spec.rb
79
+ - spec/flipper/gate_spec.rb
80
+ - spec/flipper/gates/actor_spec.rb
81
+ - spec/flipper/gates/boolean_spec.rb
82
+ - spec/flipper/gates/group_spec.rb
83
+ - spec/flipper/gates/percentage_of_actors_spec.rb
84
+ - spec/flipper/gates/percentage_of_random_spec.rb
85
+ - spec/flipper/instrumentation/log_subscriber_spec.rb
86
+ - spec/flipper/instrumentation/metriks_subscriber_spec.rb
87
+ - spec/flipper/instrumenters/memory_spec.rb
88
+ - spec/flipper/instrumenters/noop_spec.rb
71
89
  - spec/flipper/key_spec.rb
72
90
  - spec/flipper/middleware/local_cache_spec.rb
73
91
  - spec/flipper/registry_spec.rb
92
+ - spec/flipper/toggle_spec.rb
93
+ - spec/flipper/toggles/boolean_spec.rb
94
+ - spec/flipper/toggles/set_spec.rb
95
+ - spec/flipper/toggles/value_spec.rb
74
96
  - spec/flipper/types/actor_spec.rb
75
97
  - spec/flipper/types/boolean_spec.rb
76
98
  - spec/flipper/types/group_spec.rb
@@ -94,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
94
116
  version: '0'
95
117
  segments:
96
118
  - 0
97
- hash: 505989874497348978
119
+ hash: 890771361704353632
98
120
  required_rubygems_version: !ruby/object:Gem::Requirement
99
121
  none: false
100
122
  requirements:
@@ -103,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
103
125
  version: '0'
104
126
  segments:
105
127
  - 0
106
- hash: 505989874497348978
128
+ hash: 890771361704353632
107
129
  requirements: []
108
130
  rubyforge_project:
109
131
  rubygems_version: 1.8.23
@@ -116,9 +138,23 @@ test_files:
116
138
  - spec/flipper/adapters/memory_spec.rb
117
139
  - spec/flipper/dsl_spec.rb
118
140
  - spec/flipper/feature_spec.rb
141
+ - spec/flipper/gate_spec.rb
142
+ - spec/flipper/gates/actor_spec.rb
143
+ - spec/flipper/gates/boolean_spec.rb
144
+ - spec/flipper/gates/group_spec.rb
145
+ - spec/flipper/gates/percentage_of_actors_spec.rb
146
+ - spec/flipper/gates/percentage_of_random_spec.rb
147
+ - spec/flipper/instrumentation/log_subscriber_spec.rb
148
+ - spec/flipper/instrumentation/metriks_subscriber_spec.rb
149
+ - spec/flipper/instrumenters/memory_spec.rb
150
+ - spec/flipper/instrumenters/noop_spec.rb
119
151
  - spec/flipper/key_spec.rb
120
152
  - spec/flipper/middleware/local_cache_spec.rb
121
153
  - spec/flipper/registry_spec.rb
154
+ - spec/flipper/toggle_spec.rb
155
+ - spec/flipper/toggles/boolean_spec.rb
156
+ - spec/flipper/toggles/set_spec.rb
157
+ - spec/flipper/toggles/value_spec.rb
122
158
  - spec/flipper/types/actor_spec.rb
123
159
  - spec/flipper/types/boolean_spec.rb
124
160
  - spec/flipper/types/group_spec.rb