flipper 0.6.3 → 0.7.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -2
  3. data/Gemfile +10 -10
  4. data/Guardfile +2 -1
  5. data/README.md +54 -23
  6. data/Rakefile +1 -1
  7. data/examples/dsl.rb +2 -2
  8. data/examples/{percentage_of_random.rb → percentage_of_time.rb} +1 -1
  9. data/lib/flipper.rb +25 -12
  10. data/lib/flipper/dsl.rb +96 -8
  11. data/lib/flipper/feature.rb +216 -37
  12. data/lib/flipper/gate.rb +6 -38
  13. data/lib/flipper/gate_values.rb +42 -0
  14. data/lib/flipper/gates/actor.rb +11 -13
  15. data/lib/flipper/gates/boolean.rb +3 -12
  16. data/lib/flipper/gates/group.rb +14 -16
  17. data/lib/flipper/gates/percentage_of_actors.rb +12 -13
  18. data/lib/flipper/gates/{percentage_of_random.rb → percentage_of_time.rb} +8 -11
  19. data/lib/flipper/instrumentation/log_subscriber.rb +1 -1
  20. data/lib/flipper/instrumentation/subscriber.rb +1 -1
  21. data/lib/flipper/spec/shared_adapter_specs.rb +16 -16
  22. data/lib/flipper/type.rb +1 -1
  23. data/lib/flipper/typecast.rb +44 -0
  24. data/lib/flipper/types/actor.rb +2 -5
  25. data/lib/flipper/types/group.rb +6 -0
  26. data/lib/flipper/types/percentage.rb +7 -1
  27. data/lib/flipper/types/{percentage_of_random.rb → percentage_of_time.rb} +1 -1
  28. data/lib/flipper/version.rb +1 -1
  29. data/script/bootstrap +21 -0
  30. data/script/guard +15 -0
  31. data/script/release +15 -0
  32. data/script/test +30 -0
  33. data/spec/flipper/dsl_spec.rb +67 -8
  34. data/spec/flipper/feature_spec.rb +424 -12
  35. data/spec/flipper/gate_spec.rb +1 -20
  36. data/spec/flipper/gate_values_spec.rb +134 -0
  37. data/spec/flipper/gates/actor_spec.rb +1 -21
  38. data/spec/flipper/gates/boolean_spec.rb +3 -71
  39. data/spec/flipper/gates/group_spec.rb +3 -23
  40. data/spec/flipper/gates/percentage_of_actors_spec.rb +5 -26
  41. data/spec/flipper/gates/percentage_of_time_spec.rb +23 -0
  42. data/spec/flipper/middleware/memoizer_spec.rb +1 -2
  43. data/spec/flipper/typecast_spec.rb +63 -0
  44. data/spec/flipper/types/group_spec.rb +21 -1
  45. data/spec/flipper/types/percentage_of_time_spec.rb +6 -0
  46. data/spec/flipper/types/percentage_spec.rb +20 -0
  47. data/spec/flipper_spec.rb +31 -9
  48. data/spec/helper.rb +1 -3
  49. data/spec/integration_spec.rb +22 -22
  50. metadata +21 -11
  51. data/spec/flipper/gates/percentage_of_random_spec.rb +0 -46
  52. data/spec/flipper/types/percentage_of_random_spec.rb +0 -6
@@ -0,0 +1,63 @@
1
+ require 'helper'
2
+ require 'flipper/typecast'
3
+
4
+ describe Flipper::Typecast do
5
+ {
6
+ nil => false,
7
+ "" => false,
8
+ 0 => false,
9
+ 1 => true,
10
+ "0" => false,
11
+ "1" => true,
12
+ true => true,
13
+ false => false,
14
+ "true" => true,
15
+ "false" => false,
16
+ }.each do |value, expected|
17
+ context "#to_boolean for #{value.inspect}" do
18
+ it "returns #{expected}" do
19
+ described_class.to_boolean(value).should be(expected)
20
+ end
21
+ end
22
+ end
23
+
24
+ {
25
+ nil => 0,
26
+ "" => 0,
27
+ 0 => 0,
28
+ 1 => 1,
29
+ "1" => 1,
30
+ "99" => 99,
31
+ }.each do |value, expected|
32
+ context "#to_integer for #{value.inspect}" do
33
+ it "returns #{expected}" do
34
+ described_class.to_integer(value).should be(expected)
35
+ end
36
+ end
37
+ end
38
+
39
+ {
40
+ nil => Set.new,
41
+ "" => Set.new,
42
+ Set.new([1, 2]) => Set.new([1, 2]),
43
+ [1, 2] => Set.new([1, 2])
44
+ }.each do |value, expected|
45
+ context "#to_set for #{value.inspect}" do
46
+ it "returns #{expected}" do
47
+ described_class.to_set(value).should eq(expected)
48
+ end
49
+ end
50
+ end
51
+
52
+ it "raises argument error for integer value that cannot be converted to an integer" do
53
+ expect {
54
+ described_class.to_integer(["asdf"])
55
+ }.to raise_error(ArgumentError, %Q(["asdf"] cannot be converted to an integer))
56
+ end
57
+
58
+ it "raises argument error for set value that cannot be converted to a set" do
59
+ expect {
60
+ described_class.to_set("asdf")
61
+ }.to raise_error(ArgumentError, %Q("asdf" cannot be converted to a set))
62
+ end
63
+ end
@@ -3,7 +3,27 @@ require 'flipper/types/group'
3
3
 
4
4
  describe Flipper::Types::Group do
5
5
  subject do
6
- Flipper::Types::Group.new(:admins) { |actor| actor.admin? }
6
+ Flipper.register(:admins) { |actor| actor.admin? }
7
+ end
8
+
9
+ describe ".wrap" do
10
+ context "with group instance" do
11
+ it "returns group instance" do
12
+ described_class.wrap(subject).should eq(subject)
13
+ end
14
+ end
15
+
16
+ context "with Symbol group name" do
17
+ it "returns group instance" do
18
+ described_class.wrap(subject.name).should eq(subject)
19
+ end
20
+ end
21
+
22
+ context "with String group name" do
23
+ it "returns group instance" do
24
+ described_class.wrap(subject.name.to_s).should eq(subject)
25
+ end
26
+ end
7
27
  end
8
28
 
9
29
  it "initializes with name" do
@@ -0,0 +1,6 @@
1
+ require 'helper'
2
+ require 'flipper/types/percentage_of_time'
3
+
4
+ describe Flipper::Types::PercentageOfTime do
5
+ it_should_behave_like 'a percentage'
6
+ end
@@ -7,6 +7,26 @@ describe Flipper::Types::Percentage do
7
7
  }
8
8
  it_should_behave_like 'a percentage'
9
9
 
10
+ describe ".wrap" do
11
+ context "with percentage instance" do
12
+ it "returns percentage instance" do
13
+ described_class.wrap(subject).should eq(subject)
14
+ end
15
+ end
16
+
17
+ context "with Integer" do
18
+ it "returns percentage instance" do
19
+ described_class.wrap(subject.value).should eq(subject)
20
+ end
21
+ end
22
+
23
+ context "with String" do
24
+ it "returns percentage instance" do
25
+ described_class.wrap(subject.value.to_s).should eq(subject)
26
+ end
27
+ end
28
+ end
29
+
10
30
  describe "#eql?" do
11
31
  it "returns true for same class and value" do
12
32
  subject.eql?(described_class.new(subject.value)).should eq(true)
data/spec/flipper_spec.rb CHANGED
@@ -19,31 +19,31 @@ describe Flipper do
19
19
  end
20
20
  end
21
21
 
22
- describe ".groups" do
22
+ describe ".groups_registry" do
23
23
  it "returns a registry instance" do
24
- Flipper.groups.should be_instance_of(Flipper::Registry)
24
+ Flipper.groups_registry.should be_instance_of(Flipper::Registry)
25
25
  end
26
26
  end
27
27
 
28
- describe ".groups=" do
29
- it "sets groups registry" do
28
+ describe ".groups_registry=" do
29
+ it "sets groups_registry registry" do
30
30
  registry = Flipper::Registry.new
31
- Flipper.groups = registry
32
- Flipper.instance_variable_get("@groups").should eq(registry)
31
+ Flipper.groups_registry = registry
32
+ Flipper.instance_variable_get("@groups_registry").should eq(registry)
33
33
  end
34
34
  end
35
35
 
36
36
  describe ".register" do
37
37
  it "adds a group to the group_registry" do
38
38
  registry = Flipper::Registry.new
39
- Flipper.groups = registry
39
+ Flipper.groups_registry = registry
40
40
  group = Flipper.register(:admins) { |actor| actor.admin? }
41
41
  registry.get(:admins).should eq(group)
42
42
  end
43
43
 
44
44
  it "adds a group to the group_registry for string name" do
45
45
  registry = Flipper::Registry.new
46
- Flipper.groups = registry
46
+ Flipper.groups_registry = registry
47
47
  group = Flipper.register('admins') { |actor| actor.admin? }
48
48
  registry.get(:admins).should eq(group)
49
49
  end
@@ -59,7 +59,7 @@ describe Flipper do
59
59
 
60
60
  describe ".unregister_groups" do
61
61
  it "clear group registry" do
62
- Flipper.groups.should_receive(:clear)
62
+ Flipper.groups_registry.should_receive(:clear)
63
63
  Flipper.unregister_groups
64
64
  end
65
65
  end
@@ -87,4 +87,26 @@ describe Flipper do
87
87
  end
88
88
  end
89
89
  end
90
+
91
+ describe ".groups" do
92
+ it "returns array of group instances" do
93
+ admins = Flipper.register(:admins) { |actor| actor.admin? }
94
+ preview_features = Flipper.register(:preview_features) { |actor| actor.preview_features? }
95
+ Flipper.groups.should eq(Set[
96
+ admins,
97
+ preview_features,
98
+ ])
99
+ end
100
+ end
101
+
102
+ describe ".group_names" do
103
+ it "returns array of group names" do
104
+ Flipper.register(:admins) { |actor| actor.admin? }
105
+ Flipper.register(:preview_features) { |actor| actor.preview_features? }
106
+ Flipper.group_names.should eq(Set[
107
+ :admins,
108
+ :preview_features,
109
+ ])
110
+ end
111
+ end
90
112
  end
data/spec/helper.rb CHANGED
@@ -18,9 +18,7 @@ require 'flipper'
18
18
  Dir[root_path.join("spec/support/**/*.rb")].each { |f| require f }
19
19
 
20
20
  RSpec.configure do |config|
21
- config.fail_fast = true
22
-
23
- config.filter_run :focused => true
21
+ config.filter_run :focus => true
24
22
  config.alias_example_to :fit, :focused => true
25
23
  config.alias_example_to :xit, :pending => true
26
24
  config.run_all_when_everything_filtered = true
@@ -3,9 +3,7 @@ require 'flipper/feature'
3
3
  require 'flipper/adapters/memory'
4
4
 
5
5
  describe Flipper do
6
- let(:source) { {} }
7
- let(:adapter) { Flipper::Adapters::Memory.new(source) }
8
-
6
+ let(:adapter) { Flipper::Adapters::Memory.new }
9
7
  let(:flipper) { Flipper.new(adapter) }
10
8
  let(:feature) { flipper[:search] }
11
9
 
@@ -21,7 +19,7 @@ describe Flipper do
21
19
  let(:clooney) { actor_class.new(10) }
22
20
 
23
21
  let(:five_percent_of_actors) { flipper.actors(5) }
24
- let(:five_percent_of_random) { flipper.random(5) }
22
+ let(:five_percent_of_time) { flipper.time(5) }
25
23
 
26
24
  before do
27
25
  Flipper.register(:admins) { |thing| thing.admin? }
@@ -126,10 +124,10 @@ describe Flipper do
126
124
  end
127
125
  end
128
126
 
129
- context "with a percentage of random" do
127
+ context "with a percentage of time" do
130
128
  before do
131
- @gate = feature.gate(:percentage_of_random)
132
- @result = feature.enable(five_percent_of_random)
129
+ @gate = feature.gate(:percentage_of_time)
130
+ @result = feature.enable(five_percent_of_time)
133
131
  end
134
132
 
135
133
  it "returns true" do
@@ -164,19 +162,19 @@ describe Flipper do
164
162
  describe "#disable" do
165
163
  context "with no arguments" do
166
164
  before do
167
- # ensures that random gate is stubbed with result that would be true for pitt
168
- @gate = feature.gate(:percentage_of_random)
165
+ # ensures that time gate is stubbed with result that would be true for pitt
166
+ @gate = feature.gate(:percentage_of_time)
169
167
  @gate.stub(:rand => 0.04)
170
168
 
171
169
  feature.enable admin_group
172
170
  feature.enable pitt
173
171
  feature.enable five_percent_of_actors
174
- feature.enable five_percent_of_random
172
+ feature.enable five_percent_of_time
175
173
  @result = feature.disable
176
174
  end
177
175
 
178
176
  it "returns true" do
179
- @result.should be_true
177
+ @result.should be(true)
180
178
  end
181
179
 
182
180
  it "disables feature" do
@@ -200,7 +198,7 @@ describe Flipper do
200
198
  enabled.should be(0)
201
199
  end
202
200
 
203
- it "disables percentage of random" do
201
+ it "disables percentage of time" do
204
202
  feature.enabled?(pitt).should eq(false)
205
203
  end
206
204
 
@@ -290,8 +288,8 @@ describe Flipper do
290
288
 
291
289
  context "with a percentage of time" do
292
290
  before do
293
- @gate = feature.gate(:percentage_of_random)
294
- @result = feature.disable(flipper.random(0))
291
+ @gate = feature.gate(:percentage_of_time)
292
+ @result = feature.disable(flipper.time(0))
295
293
  end
296
294
 
297
295
  it "returns true" do
@@ -379,13 +377,14 @@ describe Flipper do
379
377
  end
380
378
  end
381
379
 
382
- context "during enabled percentage of time" do
380
+ context "for enabled percentage of time" do
383
381
  before do
384
- # ensure percentage of random returns enabled percentage
385
- @gate = feature.gate(:percentage_of_random)
382
+ # ensure percentage of time returns percentage that makes five percent
383
+ # of time true
384
+ @gate = feature.gate(:percentage_of_time)
386
385
  @gate.stub(:rand => 0.04)
387
386
 
388
- feature.enable five_percent_of_random
387
+ feature.enable five_percent_of_time
389
388
  end
390
389
 
391
390
  it "returns true" do
@@ -396,13 +395,14 @@ describe Flipper do
396
395
  end
397
396
  end
398
397
 
399
- context "during not enabled percentage of time" do
398
+ context "for not enabled percentage of time" do
400
399
  before do
401
- # ensure percentage of random returns not enabled percentage
402
- @gate = feature.gate(:percentage_of_random)
400
+ # ensure percentage of time returns percentage that makes five percent
401
+ # of time false
402
+ @gate = feature.gate(:percentage_of_time)
403
403
  @gate.stub(:rand => 0.10)
404
404
 
405
- feature.enable five_percent_of_random
405
+ feature.enable five_percent_of_time
406
406
  end
407
407
 
408
408
  it "returns false" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-21 00:00:00.000000000 Z
11
+ date: 2015-04-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Feature flipper for any adapter
14
14
  email:
@@ -33,7 +33,7 @@ files:
33
33
  - examples/individual_actor.rb
34
34
  - examples/instrumentation.rb
35
35
  - examples/percentage_of_actors.rb
36
- - examples/percentage_of_random.rb
36
+ - examples/percentage_of_time.rb
37
37
  - flipper.gemspec
38
38
  - lib/flipper.rb
39
39
  - lib/flipper/adapter.rb
@@ -47,11 +47,12 @@ files:
47
47
  - lib/flipper/errors.rb
48
48
  - lib/flipper/feature.rb
49
49
  - lib/flipper/gate.rb
50
+ - lib/flipper/gate_values.rb
50
51
  - lib/flipper/gates/actor.rb
51
52
  - lib/flipper/gates/boolean.rb
52
53
  - lib/flipper/gates/group.rb
53
54
  - lib/flipper/gates/percentage_of_actors.rb
54
- - lib/flipper/gates/percentage_of_random.rb
55
+ - lib/flipper/gates/percentage_of_time.rb
55
56
  - lib/flipper/instrumentation/log_subscriber.rb
56
57
  - lib/flipper/instrumentation/metriks.rb
57
58
  - lib/flipper/instrumentation/metriks_subscriber.rb
@@ -64,13 +65,18 @@ files:
64
65
  - lib/flipper/registry.rb
65
66
  - lib/flipper/spec/shared_adapter_specs.rb
66
67
  - lib/flipper/type.rb
68
+ - lib/flipper/typecast.rb
67
69
  - lib/flipper/types/actor.rb
68
70
  - lib/flipper/types/boolean.rb
69
71
  - lib/flipper/types/group.rb
70
72
  - lib/flipper/types/percentage.rb
71
73
  - lib/flipper/types/percentage_of_actors.rb
72
- - lib/flipper/types/percentage_of_random.rb
74
+ - lib/flipper/types/percentage_of_time.rb
73
75
  - lib/flipper/version.rb
76
+ - script/bootstrap
77
+ - script/guard
78
+ - script/release
79
+ - script/test
74
80
  - spec/flipper/adapters/instrumented_spec.rb
75
81
  - spec/flipper/adapters/memoizable_spec.rb
76
82
  - spec/flipper/adapters/memory_spec.rb
@@ -78,11 +84,12 @@ files:
78
84
  - spec/flipper/dsl_spec.rb
79
85
  - spec/flipper/feature_spec.rb
80
86
  - spec/flipper/gate_spec.rb
87
+ - spec/flipper/gate_values_spec.rb
81
88
  - spec/flipper/gates/actor_spec.rb
82
89
  - spec/flipper/gates/boolean_spec.rb
83
90
  - spec/flipper/gates/group_spec.rb
84
91
  - spec/flipper/gates/percentage_of_actors_spec.rb
85
- - spec/flipper/gates/percentage_of_random_spec.rb
92
+ - spec/flipper/gates/percentage_of_time_spec.rb
86
93
  - spec/flipper/instrumentation/log_subscriber_spec.rb
87
94
  - spec/flipper/instrumentation/metriks_subscriber_spec.rb
88
95
  - spec/flipper/instrumentation/statsd_subscriber_spec.rb
@@ -90,11 +97,12 @@ files:
90
97
  - spec/flipper/instrumenters/noop_spec.rb
91
98
  - spec/flipper/middleware/memoizer_spec.rb
92
99
  - spec/flipper/registry_spec.rb
100
+ - spec/flipper/typecast_spec.rb
93
101
  - spec/flipper/types/actor_spec.rb
94
102
  - spec/flipper/types/boolean_spec.rb
95
103
  - spec/flipper/types/group_spec.rb
96
104
  - spec/flipper/types/percentage_of_actors_spec.rb
97
- - spec/flipper/types/percentage_of_random_spec.rb
105
+ - spec/flipper/types/percentage_of_time_spec.rb
98
106
  - spec/flipper/types/percentage_spec.rb
99
107
  - spec/flipper_spec.rb
100
108
  - spec/helper.rb
@@ -114,9 +122,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
122
  version: '0'
115
123
  required_rubygems_version: !ruby/object:Gem::Requirement
116
124
  requirements:
117
- - - ">="
125
+ - - ">"
118
126
  - !ruby/object:Gem::Version
119
- version: '0'
127
+ version: 1.3.1
120
128
  requirements: []
121
129
  rubyforge_project:
122
130
  rubygems_version: 2.2.2
@@ -131,11 +139,12 @@ test_files:
131
139
  - spec/flipper/dsl_spec.rb
132
140
  - spec/flipper/feature_spec.rb
133
141
  - spec/flipper/gate_spec.rb
142
+ - spec/flipper/gate_values_spec.rb
134
143
  - spec/flipper/gates/actor_spec.rb
135
144
  - spec/flipper/gates/boolean_spec.rb
136
145
  - spec/flipper/gates/group_spec.rb
137
146
  - spec/flipper/gates/percentage_of_actors_spec.rb
138
- - spec/flipper/gates/percentage_of_random_spec.rb
147
+ - spec/flipper/gates/percentage_of_time_spec.rb
139
148
  - spec/flipper/instrumentation/log_subscriber_spec.rb
140
149
  - spec/flipper/instrumentation/metriks_subscriber_spec.rb
141
150
  - spec/flipper/instrumentation/statsd_subscriber_spec.rb
@@ -143,11 +152,12 @@ test_files:
143
152
  - spec/flipper/instrumenters/noop_spec.rb
144
153
  - spec/flipper/middleware/memoizer_spec.rb
145
154
  - spec/flipper/registry_spec.rb
155
+ - spec/flipper/typecast_spec.rb
146
156
  - spec/flipper/types/actor_spec.rb
147
157
  - spec/flipper/types/boolean_spec.rb
148
158
  - spec/flipper/types/group_spec.rb
149
159
  - spec/flipper/types/percentage_of_actors_spec.rb
150
- - spec/flipper/types/percentage_of_random_spec.rb
160
+ - spec/flipper/types/percentage_of_time_spec.rb
151
161
  - spec/flipper/types/percentage_spec.rb
152
162
  - spec/flipper_spec.rb
153
163
  - spec/helper.rb