flipper 0.10.2 → 0.11.0.beta1

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +42 -0
  3. data/.rubocop_todo.yml +188 -0
  4. data/Changelog.md +10 -0
  5. data/Gemfile +6 -3
  6. data/README.md +4 -3
  7. data/Rakefile +13 -13
  8. data/docs/Adapters.md +2 -1
  9. data/docs/DockerCompose.md +6 -3
  10. data/docs/Gates.md +25 -3
  11. data/docs/Optimization.md +27 -5
  12. data/docs/api/README.md +73 -32
  13. data/docs/http/README.md +34 -0
  14. data/docs/read-only/README.md +22 -0
  15. data/examples/percentage_of_actors_group.rb +49 -0
  16. data/flipper.gemspec +15 -15
  17. data/lib/flipper.rb +2 -5
  18. data/lib/flipper/adapter.rb +10 -0
  19. data/lib/flipper/adapters/http.rb +147 -0
  20. data/lib/flipper/adapters/http/client.rb +83 -0
  21. data/lib/flipper/adapters/http/error.rb +14 -0
  22. data/lib/flipper/adapters/instrumented.rb +36 -36
  23. data/lib/flipper/adapters/memoizable.rb +2 -6
  24. data/lib/flipper/adapters/memory.rb +10 -9
  25. data/lib/flipper/adapters/operation_logger.rb +1 -1
  26. data/lib/flipper/adapters/pstore.rb +12 -11
  27. data/lib/flipper/adapters/read_only.rb +6 -6
  28. data/lib/flipper/dsl.rb +1 -3
  29. data/lib/flipper/feature.rb +11 -16
  30. data/lib/flipper/gate.rb +3 -3
  31. data/lib/flipper/gate_values.rb +6 -6
  32. data/lib/flipper/gates/group.rb +2 -2
  33. data/lib/flipper/gates/percentage_of_actors.rb +2 -2
  34. data/lib/flipper/instrumentation/log_subscriber.rb +2 -4
  35. data/lib/flipper/instrumentation/metriks.rb +1 -1
  36. data/lib/flipper/instrumentation/statsd.rb +1 -1
  37. data/lib/flipper/instrumentation/statsd_subscriber.rb +1 -3
  38. data/lib/flipper/instrumentation/subscriber.rb +11 -10
  39. data/lib/flipper/instrumenters/memory.rb +1 -5
  40. data/lib/flipper/instrumenters/noop.rb +1 -1
  41. data/lib/flipper/middleware/memoizer.rb +11 -27
  42. data/lib/flipper/middleware/setup_env.rb +44 -0
  43. data/lib/flipper/registry.rb +8 -10
  44. data/lib/flipper/spec/shared_adapter_specs.rb +45 -67
  45. data/lib/flipper/test/shared_adapter_test.rb +25 -31
  46. data/lib/flipper/typecast.rb +2 -2
  47. data/lib/flipper/types/actor.rb +2 -4
  48. data/lib/flipper/types/group.rb +1 -1
  49. data/lib/flipper/types/percentage.rb +2 -1
  50. data/lib/flipper/version.rb +1 -1
  51. data/spec/fixtures/feature.json +31 -0
  52. data/spec/flipper/adapters/http_spec.rb +148 -0
  53. data/spec/flipper/adapters/instrumented_spec.rb +20 -20
  54. data/spec/flipper/adapters/memoizable_spec.rb +59 -59
  55. data/spec/flipper/adapters/operation_logger_spec.rb +16 -16
  56. data/spec/flipper/adapters/pstore_spec.rb +6 -6
  57. data/spec/flipper/adapters/read_only_spec.rb +28 -34
  58. data/spec/flipper/dsl_spec.rb +73 -84
  59. data/spec/flipper/feature_check_context_spec.rb +27 -27
  60. data/spec/flipper/feature_spec.rb +186 -196
  61. data/spec/flipper/gate_spec.rb +11 -11
  62. data/spec/flipper/gate_values_spec.rb +46 -45
  63. data/spec/flipper/gates/actor_spec.rb +2 -2
  64. data/spec/flipper/gates/boolean_spec.rb +24 -23
  65. data/spec/flipper/gates/group_spec.rb +19 -19
  66. data/spec/flipper/gates/percentage_of_actors_spec.rb +10 -10
  67. data/spec/flipper/gates/percentage_of_time_spec.rb +2 -2
  68. data/spec/flipper/instrumentation/log_subscriber_spec.rb +20 -20
  69. data/spec/flipper/instrumentation/metriks_subscriber_spec.rb +20 -20
  70. data/spec/flipper/instrumentation/statsd_subscriber_spec.rb +11 -11
  71. data/spec/flipper/instrumenters/memory_spec.rb +5 -5
  72. data/spec/flipper/instrumenters/noop_spec.rb +6 -6
  73. data/spec/flipper/middleware/memoizer_spec.rb +83 -100
  74. data/spec/flipper/middleware/setup_env_spec.rb +76 -0
  75. data/spec/flipper/registry_spec.rb +35 -39
  76. data/spec/flipper/typecast_spec.rb +18 -18
  77. data/spec/flipper/types/actor_spec.rb +30 -29
  78. data/spec/flipper/types/boolean_spec.rb +8 -8
  79. data/spec/flipper/types/group_spec.rb +28 -28
  80. data/spec/flipper/types/percentage_spec.rb +14 -14
  81. data/spec/flipper_spec.rb +61 -54
  82. data/spec/helper.rb +26 -21
  83. data/spec/integration_spec.rb +121 -113
  84. data/spec/support/fake_udp_socket.rb +1 -1
  85. data/spec/support/spec_helpers.rb +32 -4
  86. data/test/adapters/pstore_test.rb +3 -3
  87. data/test/test_helper.rb +1 -1
  88. metadata +20 -5
@@ -12,7 +12,7 @@ RSpec.describe Flipper::Adapters::OperationLogger do
12
12
 
13
13
  it_should_behave_like 'a flipper adapter'
14
14
 
15
- it "forwards missing methods to underlying adapter" do
15
+ it 'forwards missing methods to underlying adapter' do
16
16
  adapter = Class.new do
17
17
  def foo
18
18
  :foo
@@ -22,22 +22,22 @@ RSpec.describe Flipper::Adapters::OperationLogger do
22
22
  expect(operation_logger.foo).to eq(:foo)
23
23
  end
24
24
 
25
- describe "#get" do
25
+ describe '#get' do
26
26
  before do
27
27
  @feature = flipper[:stats]
28
28
  @result = subject.get(@feature)
29
29
  end
30
30
 
31
- it "logs operation" do
31
+ it 'logs operation' do
32
32
  expect(subject.count(:get)).to be(1)
33
33
  end
34
34
 
35
- it "returns result" do
35
+ it 'returns result' do
36
36
  expect(@result).to eq(adapter.get(@feature))
37
37
  end
38
38
  end
39
39
 
40
- describe "#enable" do
40
+ describe '#enable' do
41
41
  before do
42
42
  @feature = flipper[:stats]
43
43
  @gate = @feature.gate(:boolean)
@@ -45,16 +45,16 @@ RSpec.describe Flipper::Adapters::OperationLogger do
45
45
  @result = subject.enable(@feature, @gate, @thing)
46
46
  end
47
47
 
48
- it "logs operation" do
48
+ it 'logs operation' do
49
49
  expect(subject.count(:enable)).to be(1)
50
50
  end
51
51
 
52
- it "returns result" do
52
+ it 'returns result' do
53
53
  expect(@result).to eq(adapter.enable(@feature, @gate, @thing))
54
54
  end
55
55
  end
56
56
 
57
- describe "#disable" do
57
+ describe '#disable' do
58
58
  before do
59
59
  @feature = flipper[:stats]
60
60
  @gate = @feature.gate(:boolean)
@@ -62,41 +62,41 @@ RSpec.describe Flipper::Adapters::OperationLogger do
62
62
  @result = subject.disable(@feature, @gate, @thing)
63
63
  end
64
64
 
65
- it "logs operation" do
65
+ it 'logs operation' do
66
66
  expect(subject.count(:disable)).to be(1)
67
67
  end
68
68
 
69
- it "returns result" do
69
+ it 'returns result' do
70
70
  expect(@result).to eq(adapter.disable(@feature, @gate, @thing))
71
71
  end
72
72
  end
73
73
 
74
- describe "#features" do
74
+ describe '#features' do
75
75
  before do
76
76
  flipper[:stats].enable
77
77
  @result = subject.features
78
78
  end
79
79
 
80
- it "logs operation" do
80
+ it 'logs operation' do
81
81
  expect(subject.count(:features)).to be(1)
82
82
  end
83
83
 
84
- it "returns result" do
84
+ it 'returns result' do
85
85
  expect(@result).to eq(adapter.features)
86
86
  end
87
87
  end
88
88
 
89
- describe "#add" do
89
+ describe '#add' do
90
90
  before do
91
91
  @feature = flipper[:stats]
92
92
  @result = subject.add(@feature)
93
93
  end
94
94
 
95
- it "logs operation" do
95
+ it 'logs operation' do
96
96
  expect(subject.count(:add)).to be(1)
97
97
  end
98
98
 
99
- it "returns result" do
99
+ it 'returns result' do
100
100
  expect(@result).to eq(adapter.add(@feature))
101
101
  end
102
102
  end
@@ -3,16 +3,16 @@ require 'flipper/adapters/pstore'
3
3
  require 'flipper/spec/shared_adapter_specs'
4
4
 
5
5
  RSpec.describe Flipper::Adapters::PStore do
6
- subject {
7
- dir = FlipperRoot.join("tmp").tap { |d| d.mkpath }
8
- pstore_file = dir.join("flipper.pstore")
6
+ subject do
7
+ dir = FlipperRoot.join('tmp').tap(&:mkpath)
8
+ pstore_file = dir.join('flipper.pstore')
9
9
  pstore_file.unlink if pstore_file.exist?
10
10
  described_class.new(pstore_file)
11
- }
11
+ end
12
12
 
13
13
  it_should_behave_like 'a flipper adapter'
14
14
 
15
- it "defaults path to flipper.pstore" do
16
- expect(described_class.new.path).to eq("flipper.pstore")
15
+ it 'defaults path to flipper.pstore' do
16
+ expect(described_class.new.path).to eq('flipper.pstore')
17
17
  end
18
18
  end
@@ -17,78 +17,72 @@ RSpec.describe Flipper::Adapters::ReadOnly do
17
17
  subject { described_class.new(adapter) }
18
18
 
19
19
  before do
20
- Flipper.register(:admins) { |actor|
20
+ Flipper.register(:admins) do |actor|
21
21
  actor.respond_to?(:admin?) && actor.admin?
22
- }
22
+ end
23
23
 
24
- Flipper.register(:early_access) { |actor|
24
+ Flipper.register(:early_access) do |actor|
25
25
  actor.respond_to?(:early_access?) && actor.early_access?
26
- }
26
+ end
27
27
  end
28
28
 
29
29
  after do
30
30
  Flipper.unregister_groups
31
31
  end
32
32
 
33
- it "has name that is a symbol" do
34
- expect(subject.name).to_not be_nil
33
+ it 'has name that is a symbol' do
34
+ expect(subject.name).not_to be_nil
35
35
  expect(subject.name).to be_instance_of(Symbol)
36
36
  end
37
37
 
38
- it "has included the flipper adapter module" do
38
+ it 'has included the flipper adapter module' do
39
39
  expect(subject.class.ancestors).to include(Flipper::Adapter)
40
40
  end
41
41
 
42
- it "returns correct default values for the gates if none are enabled" do
43
- expect(subject.get(feature)).to eq({
44
- :boolean => nil,
45
- :groups => Set.new,
46
- :actors => Set.new,
47
- :percentage_of_actors => nil,
48
- :percentage_of_time => nil,
49
- })
42
+ it 'returns correct default values for the gates if none are enabled' do
43
+ expect(subject.get(feature)).to eq(subject.default_config)
50
44
  end
51
45
 
52
- it "can get feature" do
53
- actor_22 = actor_class.new('22')
46
+ it 'can get feature' do
47
+ actor22 = actor_class.new('22')
54
48
  adapter.enable(feature, boolean_gate, flipper.boolean)
55
49
  adapter.enable(feature, group_gate, flipper.group(:admins))
56
- adapter.enable(feature, actor_gate, flipper.actor(actor_22))
50
+ adapter.enable(feature, actor_gate, flipper.actor(actor22))
57
51
  adapter.enable(feature, actors_gate, flipper.actors(25))
58
52
  adapter.enable(feature, time_gate, flipper.time(45))
59
53
 
60
- expect(subject.get(feature)).to eq({
61
- :boolean => "true",
62
- :groups => Set["admins"],
63
- :actors => Set["22"],
64
- :percentage_of_actors => "25",
65
- :percentage_of_time => "45",
66
- })
54
+ expect(subject.get(feature)).to eq(boolean: 'true',
55
+ groups: Set['admins'],
56
+ actors: Set['22'],
57
+ percentage_of_actors: '25',
58
+ percentage_of_time: '45')
67
59
  end
68
60
 
69
- it "can get features" do
61
+ it 'can get features' do
70
62
  expect(subject.features).to eq(Set.new)
71
63
  adapter.add(feature)
72
- expect(subject.features).to eq(Set["stats"])
64
+ expect(subject.features).to eq(Set['stats'])
73
65
  end
74
66
 
75
- it "raises error on add" do
67
+ it 'raises error on add' do
76
68
  expect { subject.add(feature) }.to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
77
69
  end
78
70
 
79
- it "raises error on remove" do
71
+ it 'raises error on remove' do
80
72
  expect { subject.remove(feature) }.to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
81
73
  end
82
74
 
83
- it "raises on clear" do
75
+ it 'raises on clear' do
84
76
  expect { subject.clear(feature) }.to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
85
77
  end
86
78
 
87
- it "raises error on enable" do
88
- expect { subject.enable(feature, boolean_gate, flipper.boolean) }.to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
79
+ it 'raises error on enable' do
80
+ expect { subject.enable(feature, boolean_gate, flipper.boolean) }
81
+ .to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
89
82
  end
90
83
 
91
- it "raises error on disable" do
92
- expect { subject.disable(feature, boolean_gate, flipper.boolean) }.to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
84
+ it 'raises error on disable' do
85
+ expect { subject.disable(feature, boolean_gate, flipper.boolean) }
86
+ .to raise_error(Flipper::Adapters::ReadOnly::WriteAttempted)
93
87
  end
94
88
  end
@@ -3,121 +3,110 @@ require 'flipper/dsl'
3
3
  require 'flipper/adapters/memory'
4
4
 
5
5
  RSpec.describe Flipper::DSL do
6
- subject { Flipper::DSL.new(adapter) }
6
+ subject { described_class.new(adapter) }
7
7
 
8
8
  let(:adapter) { Flipper::Adapters::Memory.new }
9
9
 
10
- describe "#initialize" do
11
- it "sets adapter" do
10
+ describe '#initialize' do
11
+ it 'sets adapter' do
12
12
  dsl = described_class.new(adapter)
13
13
  expect(dsl.adapter).not_to be_nil
14
14
  end
15
15
 
16
- it "defaults instrumenter to noop" do
16
+ it 'defaults instrumenter to noop' do
17
17
  dsl = described_class.new(adapter)
18
18
  expect(dsl.instrumenter).to be(Flipper::Instrumenters::Noop)
19
19
  end
20
20
 
21
- context "with overriden instrumenter" do
22
- let(:instrumenter) { double('Instrumentor', :instrument => nil) }
21
+ context 'with overriden instrumenter' do
22
+ let(:instrumenter) { double('Instrumentor', instrument: nil) }
23
23
 
24
- it "overrides default instrumenter" do
25
- dsl = described_class.new(adapter, :instrumenter => instrumenter)
24
+ it 'overrides default instrumenter' do
25
+ dsl = described_class.new(adapter, instrumenter: instrumenter)
26
26
  expect(dsl.instrumenter).to be(instrumenter)
27
27
  end
28
28
  end
29
29
  end
30
30
 
31
- describe "#feature" do
32
- it_should_behave_like "a DSL feature" do
31
+ describe '#feature' do
32
+ it_should_behave_like 'a DSL feature' do
33
33
  let(:method_name) { :feature }
34
- let(:instrumenter) { double('Instrumentor', :instrument => nil) }
34
+ let(:instrumenter) { double('Instrumentor', instrument: nil) }
35
35
  let(:feature) { dsl.send(method_name, :stats) }
36
- let(:dsl) { Flipper::DSL.new(adapter, :instrumenter => instrumenter) }
36
+ let(:dsl) { described_class.new(adapter, instrumenter: instrumenter) }
37
37
  end
38
38
  end
39
39
 
40
- describe "#preload" do
41
- let(:instrumenter) { double('Instrumentor', :instrument => nil) }
42
- let(:dsl) { Flipper::DSL.new(adapter, :instrumenter => instrumenter) }
43
- let(:names) { %i{stats shiny} }
40
+ describe '#preload' do
41
+ let(:instrumenter) { double('Instrumentor', instrument: nil) }
42
+ let(:dsl) { described_class.new(adapter, instrumenter: instrumenter) }
43
+ let(:names) { %i(stats shiny) }
44
44
  let(:features) { dsl.preload(names) }
45
45
 
46
- it "returns array of features" do
46
+ it 'returns array of features' do
47
47
  expect(features).to all be_instance_of(Flipper::Feature)
48
48
  end
49
49
 
50
- it "sets names" do
50
+ it 'sets names' do
51
51
  expect(features.map(&:name)).to eq(names)
52
52
  end
53
53
 
54
- it "sets adapter" do
54
+ it 'sets adapter' do
55
55
  features.each do |feature|
56
56
  expect(feature.adapter.name).to eq(dsl.adapter.name)
57
57
  end
58
58
  end
59
59
 
60
- it "sets instrumenter" do
60
+ it 'sets instrumenter' do
61
61
  features.each do |feature|
62
62
  expect(feature.instrumenter).to eq(dsl.instrumenter)
63
63
  end
64
64
  end
65
65
 
66
- it "memoizes the feature" do
66
+ it 'memoizes the feature' do
67
67
  features.each do |feature|
68
68
  expect(dsl.feature(feature.name)).to equal(feature)
69
69
  end
70
70
  end
71
71
  end
72
72
 
73
- describe "#[]" do
74
- it_should_behave_like "a DSL feature" do
73
+ describe '#[]' do
74
+ it_should_behave_like 'a DSL feature' do
75
75
  let(:method_name) { :[] }
76
- let(:instrumenter) { double('Instrumentor', :instrument => nil) }
76
+ let(:instrumenter) { double('Instrumentor', instrument: nil) }
77
77
  let(:feature) { dsl.send(method_name, :stats) }
78
- let(:dsl) { Flipper::DSL.new(adapter, :instrumenter => instrumenter) }
78
+ let(:dsl) { described_class.new(adapter, instrumenter: instrumenter) }
79
79
  end
80
80
  end
81
81
 
82
- describe "#boolean" do
83
- it_should_behave_like "a DSL boolean method" do
82
+ describe '#boolean' do
83
+ it_should_behave_like 'a DSL boolean method' do
84
84
  let(:method_name) { :boolean }
85
85
  end
86
86
  end
87
87
 
88
- describe "#bool" do
89
- it_should_behave_like "a DSL boolean method" do
88
+ describe '#bool' do
89
+ it_should_behave_like 'a DSL boolean method' do
90
90
  let(:method_name) { :bool }
91
91
  end
92
92
  end
93
93
 
94
- describe "#group" do
95
- context "for registered group" do
94
+ describe '#group' do
95
+ context 'for registered group' do
96
96
  before do
97
- @group = Flipper.register(:admins) { }
97
+ @group = Flipper.register(:admins) {}
98
98
  end
99
99
 
100
- it "returns group" do
101
- expect(subject.group(:admins)).to eq(@group)
102
- end
103
-
104
- it "always returns same instance for same name" do
105
- expect(subject.group(:admins)).to equal(subject.group(:admins))
106
- end
107
- end
108
-
109
- context "for unregistered group" do
110
- it "raises error" do
111
- expect {
112
- subject.group(:admins)
113
- }.to raise_error(Flipper::GroupNotRegistered)
100
+ it 'delegates to Flipper' do
101
+ expect(Flipper).to receive(:group).with(:admins).and_return(@group)
102
+ expect(subject.group(:admins)).to be(@group)
114
103
  end
115
104
  end
116
105
  end
117
106
 
118
- describe "#actor" do
119
- context "for a thing" do
120
- it "returns actor instance" do
107
+ describe '#actor' do
108
+ context 'for a thing' do
109
+ it 'returns actor instance' do
121
110
  thing = Struct.new(:flipper_id).new(33)
122
111
  actor = subject.actor(thing)
123
112
  expect(actor).to be_instance_of(Flipper::Types::Actor)
@@ -125,85 +114,85 @@ RSpec.describe Flipper::DSL do
125
114
  end
126
115
  end
127
116
 
128
- context "for nil" do
129
- it "raises argument error" do
130
- expect {
117
+ context 'for nil' do
118
+ it 'raises argument error' do
119
+ expect do
131
120
  subject.actor(nil)
132
- }.to raise_error(ArgumentError)
121
+ end.to raise_error(ArgumentError)
133
122
  end
134
123
  end
135
124
 
136
- context "for something that is not actor wrappable" do
137
- it "raises argument error" do
138
- expect {
125
+ context 'for something that is not actor wrappable' do
126
+ it 'raises argument error' do
127
+ expect do
139
128
  subject.actor(Object.new)
140
- }.to raise_error(ArgumentError)
129
+ end.to raise_error(ArgumentError)
141
130
  end
142
131
  end
143
132
  end
144
133
 
145
- describe "#time" do
134
+ describe '#time' do
146
135
  before do
147
136
  @result = subject.time(5)
148
137
  end
149
138
 
150
- it "returns percentage of time" do
139
+ it 'returns percentage of time' do
151
140
  expect(@result).to be_instance_of(Flipper::Types::PercentageOfTime)
152
141
  end
153
142
 
154
- it "sets value" do
143
+ it 'sets value' do
155
144
  expect(@result.value).to eq(5)
156
145
  end
157
146
 
158
- it "is aliased to percentage_of_time" do
147
+ it 'is aliased to percentage_of_time' do
159
148
  expect(@result).to eq(subject.percentage_of_time(@result.value))
160
149
  end
161
150
  end
162
151
 
163
- describe "#actors" do
152
+ describe '#actors' do
164
153
  before do
165
154
  @result = subject.actors(17)
166
155
  end
167
156
 
168
- it "returns percentage of actors" do
157
+ it 'returns percentage of actors' do
169
158
  expect(@result).to be_instance_of(Flipper::Types::PercentageOfActors)
170
159
  end
171
160
 
172
- it "sets value" do
161
+ it 'sets value' do
173
162
  expect(@result.value).to eq(17)
174
163
  end
175
164
 
176
- it "is aliased to percentage_of_actors" do
165
+ it 'is aliased to percentage_of_actors' do
177
166
  expect(@result).to eq(subject.percentage_of_actors(@result.value))
178
167
  end
179
168
  end
180
169
 
181
- describe "#features" do
182
- context "with no features enabled/disabled" do
183
- it "defaults to empty set" do
170
+ describe '#features' do
171
+ context 'with no features enabled/disabled' do
172
+ it 'defaults to empty set' do
184
173
  expect(subject.features).to eq(Set.new)
185
174
  end
186
175
  end
187
176
 
188
- context "with features enabled and disabled" do
177
+ context 'with features enabled and disabled' do
189
178
  before do
190
179
  subject[:stats].enable
191
180
  subject[:cache].enable
192
181
  subject[:search].disable
193
182
  end
194
183
 
195
- it "returns set of feature instances" do
184
+ it 'returns set of feature instances' do
196
185
  expect(subject.features).to be_instance_of(Set)
197
186
  subject.features.each do |feature|
198
187
  expect(feature).to be_instance_of(Flipper::Feature)
199
188
  end
200
- expect(subject.features.map(&:name).map(&:to_s).sort).to eq(['cache', 'search', 'stats'])
189
+ expect(subject.features.map(&:name).map(&:to_s).sort).to eq(%w(cache search stats))
201
190
  end
202
191
  end
203
192
  end
204
193
 
205
- describe "#enable/disable" do
206
- it "enables and disables the feature" do
194
+ describe '#enable/disable' do
195
+ it 'enables and disables the feature' do
207
196
  expect(subject[:stats].boolean_value).to eq(false)
208
197
  subject.enable(:stats)
209
198
  expect(subject[:stats].boolean_value).to eq(true)
@@ -213,35 +202,35 @@ RSpec.describe Flipper::DSL do
213
202
  end
214
203
  end
215
204
 
216
- describe "#enable_actor/disable_actor" do
217
- it "enables and disables the feature for actor" do
205
+ describe '#enable_actor/disable_actor' do
206
+ it 'enables and disables the feature for actor' do
218
207
  actor = Struct.new(:flipper_id).new(5)
219
208
 
220
209
  expect(subject[:stats].actors_value).to be_empty
221
210
  subject.enable_actor(:stats, actor)
222
- expect(subject[:stats].actors_value).to eq(Set["5"])
211
+ expect(subject[:stats].actors_value).to eq(Set['5'])
223
212
 
224
213
  subject.disable_actor(:stats, actor)
225
214
  expect(subject[:stats].actors_value).to be_empty
226
215
  end
227
216
  end
228
217
 
229
- describe "#enable_group/disable_group" do
230
- it "enables and disables the feature for group" do
218
+ describe '#enable_group/disable_group' do
219
+ it 'enables and disables the feature for group' do
231
220
  actor = Struct.new(:flipper_id).new(5)
232
221
  group = Flipper.register(:fives) { |actor| actor.flipper_id == 5 }
233
222
 
234
223
  expect(subject[:stats].groups_value).to be_empty
235
224
  subject.enable_group(:stats, :fives)
236
- expect(subject[:stats].groups_value).to eq(Set["fives"])
225
+ expect(subject[:stats].groups_value).to eq(Set['fives'])
237
226
 
238
227
  subject.disable_group(:stats, :fives)
239
228
  expect(subject[:stats].groups_value).to be_empty
240
229
  end
241
230
  end
242
231
 
243
- describe "#enable_percentage_of_time/disable_percentage_of_time" do
244
- it "enables and disables the feature for percentage of time" do
232
+ describe '#enable_percentage_of_time/disable_percentage_of_time' do
233
+ it 'enables and disables the feature for percentage of time' do
245
234
  expect(subject[:stats].percentage_of_time_value).to be(0)
246
235
  subject.enable_percentage_of_time(:stats, 6)
247
236
  expect(subject[:stats].percentage_of_time_value).to be(6)
@@ -251,8 +240,8 @@ RSpec.describe Flipper::DSL do
251
240
  end
252
241
  end
253
242
 
254
- describe "#enable_percentage_of_actors/disable_percentage_of_actors" do
255
- it "enables and disables the feature for percentage of time" do
243
+ describe '#enable_percentage_of_actors/disable_percentage_of_actors' do
244
+ it 'enables and disables the feature for percentage of time' do
256
245
  expect(subject[:stats].percentage_of_actors_value).to be(0)
257
246
  subject.enable_percentage_of_actors(:stats, 6)
258
247
  expect(subject[:stats].percentage_of_actors_value).to be(6)
@@ -263,7 +252,7 @@ RSpec.describe Flipper::DSL do
263
252
  end
264
253
 
265
254
  describe '#remove' do
266
- it "removes the feature" do
255
+ it 'removes the feature' do
267
256
  subject.enable(:stats)
268
257
 
269
258
  expect { subject.remove(:stats) }.to change { subject.enabled?(:stats) }.to(false)