flipper 0.3.0 → 0.4.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 (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