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
@@ -5,22 +5,22 @@ require 'flipper/adapters/memory'
5
5
  require 'flipper/instrumentation/log_subscriber'
6
6
 
7
7
  RSpec.describe Flipper::Instrumentation::LogSubscriber do
8
- let(:adapter) {
8
+ let(:adapter) do
9
9
  memory = Flipper::Adapters::Memory.new
10
- Flipper::Adapters::Instrumented.new(memory, :instrumenter => ActiveSupport::Notifications)
11
- }
12
- let(:flipper) {
13
- Flipper.new(adapter, :instrumenter => ActiveSupport::Notifications)
14
- }
10
+ Flipper::Adapters::Instrumented.new(memory, instrumenter: ActiveSupport::Notifications)
11
+ end
12
+ let(:flipper) do
13
+ Flipper.new(adapter, instrumenter: ActiveSupport::Notifications)
14
+ end
15
15
 
16
16
  before do
17
- Flipper.register(:admins) { |thing|
17
+ Flipper.register(:admins) do |thing|
18
18
  thing.respond_to?(:admin?) && thing.admin?
19
- }
19
+ end
20
20
 
21
21
  @io = StringIO.new
22
22
  logger = Logger.new(@io)
23
- logger.formatter = proc { |severity, datetime, progname, msg| "#{msg}\n" }
23
+ logger.formatter = proc { |_severity, _datetime, _progname, msg| "#{msg}\n" }
24
24
  described_class.logger = logger
25
25
  end
26
26
 
@@ -30,25 +30,25 @@ RSpec.describe Flipper::Instrumentation::LogSubscriber do
30
30
 
31
31
  let(:log) { @io.string }
32
32
 
33
- context "feature enabled checks" do
33
+ context 'feature enabled checks' do
34
34
  before do
35
35
  clear_logs
36
36
  flipper[:search].enabled?
37
37
  end
38
38
 
39
- it "logs feature calls with result after operation" do
39
+ it 'logs feature calls with result after operation' do
40
40
  feature_line = find_line('Flipper feature(search) enabled? false')
41
41
  expect(feature_line).to include('[ thing=nil ]')
42
42
  end
43
43
 
44
- it "logs adapter calls" do
44
+ it 'logs adapter calls' do
45
45
  adapter_line = find_line('Flipper feature(search) adapter(memory) get')
46
46
  expect(adapter_line).to include('[ result={')
47
47
  expect(adapter_line).to include('} ]')
48
48
  end
49
49
  end
50
50
 
51
- context "feature enabled checks with a thing" do
51
+ context 'feature enabled checks with a thing' do
52
52
  let(:user) { Flipper::Types::Actor.new(Struct.new(:flipper_id).new('1')) }
53
53
 
54
54
  before do
@@ -56,13 +56,13 @@ RSpec.describe Flipper::Instrumentation::LogSubscriber do
56
56
  flipper[:search].enabled?(user)
57
57
  end
58
58
 
59
- it "logs thing for feature" do
59
+ it 'logs thing for feature' do
60
60
  feature_line = find_line('Flipper feature(search) enabled?')
61
61
  expect(feature_line).to include(user.inspect)
62
62
  end
63
63
  end
64
64
 
65
- context "changing feature enabled state" do
65
+ context 'changing feature enabled state' do
66
66
  let(:user) { Flipper::Types::Actor.new(Struct.new(:flipper_id).new('1')) }
67
67
 
68
68
  before do
@@ -70,24 +70,24 @@ RSpec.describe Flipper::Instrumentation::LogSubscriber do
70
70
  flipper[:search].enable(user)
71
71
  end
72
72
 
73
- it "logs feature calls with result in brackets" do
73
+ it 'logs feature calls with result in brackets' do
74
74
  feature_line = find_line('Flipper feature(search) enable true')
75
75
  expect(feature_line).to include("[ thing=#{user.inspect} gate_name=actor ]")
76
76
  end
77
77
 
78
- it "logs adapter value" do
78
+ it 'logs adapter value' do
79
79
  adapter_line = find_line('Flipper feature(search) adapter(memory) enable')
80
- expect(adapter_line).to include("[ result=")
80
+ expect(adapter_line).to include('[ result=')
81
81
  end
82
82
  end
83
83
 
84
- context "getting all the features from the adapter" do
84
+ context 'getting all the features from the adapter' do
85
85
  before do
86
86
  clear_logs
87
87
  flipper.features
88
88
  end
89
89
 
90
- it "logs adapter calls" do
90
+ it 'logs adapter calls' do
91
91
  adapter_line = find_line('Flipper adapter(memory) features')
92
92
  expect(adapter_line).to include('[ result=')
93
93
  end
@@ -3,13 +3,13 @@ require 'flipper/adapters/memory'
3
3
  require 'flipper/instrumentation/metriks'
4
4
 
5
5
  RSpec.describe Flipper::Instrumentation::MetriksSubscriber do
6
- let(:adapter) {
6
+ let(:adapter) do
7
7
  memory = Flipper::Adapters::Memory.new
8
- Flipper::Adapters::Instrumented.new(memory, :instrumenter => ActiveSupport::Notifications)
9
- }
10
- let(:flipper) {
11
- Flipper.new(adapter, :instrumenter => ActiveSupport::Notifications)
12
- }
8
+ Flipper::Adapters::Instrumented.new(memory, instrumenter: ActiveSupport::Notifications)
9
+ end
10
+ let(:flipper) do
11
+ Flipper.new(adapter, instrumenter: ActiveSupport::Notifications)
12
+ end
13
13
 
14
14
  let(:user) { user = Struct.new(:flipper_id).new('1') }
15
15
 
@@ -17,36 +17,36 @@ RSpec.describe Flipper::Instrumentation::MetriksSubscriber do
17
17
  Metriks::Registry.default.clear
18
18
  end
19
19
 
20
- context "for enabled feature" do
21
- it "updates feature metrics when calls happen" do
20
+ context 'for enabled feature' do
21
+ it 'updates feature metrics when calls happen' do
22
22
  flipper[:stats].enable(user)
23
- expect(Metriks.timer("flipper.feature_operation.enable").count).to be(1)
23
+ expect(Metriks.timer('flipper.feature_operation.enable').count).to be(1)
24
24
 
25
25
  flipper[:stats].enabled?(user)
26
- expect(Metriks.timer("flipper.feature_operation.enabled").count).to be(1)
27
- expect(Metriks.meter("flipper.feature.stats.enabled").count).to be(1)
26
+ expect(Metriks.timer('flipper.feature_operation.enabled').count).to be(1)
27
+ expect(Metriks.meter('flipper.feature.stats.enabled').count).to be(1)
28
28
  end
29
29
  end
30
30
 
31
- context "for disabled feature" do
32
- it "updates feature metrics when calls happen" do
31
+ context 'for disabled feature' do
32
+ it 'updates feature metrics when calls happen' do
33
33
  flipper[:stats].disable(user)
34
- expect(Metriks.timer("flipper.feature_operation.disable").count).to be(1)
34
+ expect(Metriks.timer('flipper.feature_operation.disable').count).to be(1)
35
35
 
36
36
  flipper[:stats].enabled?(user)
37
- expect(Metriks.timer("flipper.feature_operation.enabled").count).to be(1)
38
- expect(Metriks.meter("flipper.feature.stats.disabled").count).to be(1)
37
+ expect(Metriks.timer('flipper.feature_operation.enabled').count).to be(1)
38
+ expect(Metriks.meter('flipper.feature.stats.disabled').count).to be(1)
39
39
  end
40
40
  end
41
41
 
42
- it "updates adapter metrics when calls happen" do
42
+ it 'updates adapter metrics when calls happen' do
43
43
  flipper[:stats].enable(user)
44
- expect(Metriks.timer("flipper.adapter.memory.enable").count).to be(1)
44
+ expect(Metriks.timer('flipper.adapter.memory.enable').count).to be(1)
45
45
 
46
46
  flipper[:stats].enabled?(user)
47
- expect(Metriks.timer("flipper.adapter.memory.get").count).to be(1)
47
+ expect(Metriks.timer('flipper.adapter.memory.get').count).to be(1)
48
48
 
49
49
  flipper[:stats].disable(user)
50
- expect(Metriks.timer("flipper.adapter.memory.disable").count).to be(1)
50
+ expect(Metriks.timer('flipper.adapter.memory.disable').count).to be(1)
51
51
  end
52
52
  end
@@ -7,13 +7,13 @@ require 'statsd'
7
7
  RSpec.describe Flipper::Instrumentation::StatsdSubscriber do
8
8
  let(:statsd_client) { Statsd.new }
9
9
  let(:socket) { FakeUDPSocket.new }
10
- let(:adapter) {
10
+ let(:adapter) do
11
11
  memory = Flipper::Adapters::Memory.new
12
- Flipper::Adapters::Instrumented.new(memory, :instrumenter => ActiveSupport::Notifications)
13
- }
14
- let(:flipper) {
15
- Flipper.new(adapter, :instrumenter => ActiveSupport::Notifications)
16
- }
12
+ Flipper::Adapters::Instrumented.new(memory, instrumenter: ActiveSupport::Notifications)
13
+ end
14
+ let(:flipper) do
15
+ Flipper.new(adapter, instrumenter: ActiveSupport::Notifications)
16
+ end
17
17
 
18
18
  let(:user) { user = Struct.new(:flipper_id).new('1') }
19
19
 
@@ -38,8 +38,8 @@ RSpec.describe Flipper::Instrumentation::StatsdSubscriber do
38
38
  expect(result).not_to be_nil
39
39
  end
40
40
 
41
- context "for enabled feature" do
42
- it "updates feature metrics when calls happen" do
41
+ context 'for enabled feature' do
42
+ it 'updates feature metrics when calls happen' do
43
43
  flipper[:stats].enable(user)
44
44
  assert_timer 'flipper.feature_operation.enable'
45
45
 
@@ -49,8 +49,8 @@ RSpec.describe Flipper::Instrumentation::StatsdSubscriber do
49
49
  end
50
50
  end
51
51
 
52
- context "for disabled feature" do
53
- it "updates feature metrics when calls happen" do
52
+ context 'for disabled feature' do
53
+ it 'updates feature metrics when calls happen' do
54
54
  flipper[:stats].disable(user)
55
55
  assert_timer 'flipper.feature_operation.disable'
56
56
 
@@ -60,7 +60,7 @@ RSpec.describe Flipper::Instrumentation::StatsdSubscriber do
60
60
  end
61
61
  end
62
62
 
63
- it "updates adapter metrics when calls happen" do
63
+ it 'updates adapter metrics when calls happen' do
64
64
  flipper[:stats].enable(user)
65
65
  assert_timer 'flipper.adapter.memory.enable'
66
66
 
@@ -2,18 +2,18 @@ require 'helper'
2
2
  require 'flipper/instrumenters/memory'
3
3
 
4
4
  RSpec.describe Flipper::Instrumenters::Memory do
5
- describe "#initialize" do
6
- it "sets events to empty array" do
5
+ describe '#initialize' do
6
+ it 'sets events to empty array' do
7
7
  instrumenter = described_class.new
8
8
  expect(instrumenter.events).to eq([])
9
9
  end
10
10
  end
11
11
 
12
- describe "#instrument" do
13
- it "adds to events" do
12
+ describe '#instrument' do
13
+ it 'adds to events' do
14
14
  instrumenter = described_class.new
15
15
  name = 'user.signup'
16
- payload = {:email => 'john@doe.com'}
16
+ payload = { email: 'john@doe.com' }
17
17
  block_result = :yielded
18
18
 
19
19
  result = instrumenter.instrument(name, payload) { block_result }
@@ -2,19 +2,19 @@ require 'helper'
2
2
  require 'flipper/instrumenters/noop'
3
3
 
4
4
  RSpec.describe Flipper::Instrumenters::Noop do
5
- describe ".instrument" do
6
- context "with name" do
7
- it "yields block" do
5
+ describe '.instrument' do
6
+ context 'with name' do
7
+ it 'yields block' do
8
8
  yielded = false
9
9
  described_class.instrument(:foo) { yielded = true }
10
10
  expect(yielded).to eq(true)
11
11
  end
12
12
  end
13
13
 
14
- context "with name and payload" do
15
- it "yields block" do
14
+ context 'with name and payload' do
15
+ it 'yields block' do
16
16
  yielded = false
17
- described_class.instrument(:foo, {:pay => :load}) { yielded = true }
17
+ described_class.instrument(:foo, pay: :load) { yielded = true }
18
18
  expect(yielded).to eq(true)
19
19
  end
20
20
  end
@@ -8,66 +8,71 @@ RSpec.describe Flipper::Middleware::Memoizer do
8
8
  include Rack::Test::Methods
9
9
 
10
10
  let(:memory_adapter) { Flipper::Adapters::Memory.new }
11
- let(:adapter) {
11
+ let(:adapter) do
12
12
  Flipper::Adapters::OperationLogger.new(memory_adapter)
13
- }
14
- let(:flipper) { Flipper.new(adapter) }
13
+ end
14
+ let(:flipper) { Flipper.new(adapter) }
15
+ let(:env) { { 'flipper' => flipper } }
15
16
 
16
17
  after do
17
18
  flipper.adapter.memoize = nil
18
19
  end
19
20
 
20
- RSpec.shared_examples_for "flipper middleware" do
21
- it "delegates" do
21
+ RSpec.shared_examples_for 'flipper middleware' do
22
+ it 'delegates' do
22
23
  called = false
23
- app = lambda { |env|
24
+ app = lambda do |_env|
24
25
  called = true
25
26
  [200, {}, nil]
26
- }
27
- middleware = described_class.new app, flipper
28
- middleware.call({})
27
+ end
28
+ middleware = described_class.new(app)
29
+ middleware.call(env)
29
30
  expect(called).to eq(true)
30
31
  end
31
32
 
32
- it "disables local cache after body close" do
33
- app = lambda { |env| [200, {}, []] }
34
- middleware = described_class.new app, flipper
35
- body = middleware.call({}).last
33
+ it 'disables local cache after body close' do
34
+ app = ->(_env) { [200, {}, []] }
35
+ middleware = described_class.new(app)
36
+ body = middleware.call(env).last
36
37
 
37
38
  expect(flipper.adapter.memoizing?).to eq(true)
38
39
  body.close
39
40
  expect(flipper.adapter.memoizing?).to eq(false)
40
41
  end
41
42
 
42
- it "clears local cache after body close" do
43
- app = lambda { |env| [200, {}, []] }
44
- middleware = described_class.new app, flipper
45
- body = middleware.call({}).last
43
+ it 'clears local cache after body close' do
44
+ app = ->(_env) { [200, {}, []] }
45
+ middleware = described_class.new(app)
46
+ body = middleware.call(env).last
46
47
 
47
48
  flipper.adapter.cache['hello'] = 'world'
48
49
  body.close
49
50
  expect(flipper.adapter.cache).to be_empty
50
51
  end
51
52
 
52
- it "clears the local cache with a successful request" do
53
+ it 'clears the local cache with a successful request' do
53
54
  flipper.adapter.cache['hello'] = 'world'
54
- get '/'
55
+ get '/', {}, 'flipper' => flipper
55
56
  expect(flipper.adapter.cache).to be_empty
56
57
  end
57
58
 
58
- it "clears the local cache even when the request raises an error" do
59
+ it 'clears the local cache even when the request raises an error' do
59
60
  flipper.adapter.cache['hello'] = 'world'
60
- get '/fail' rescue nil
61
+ begin
62
+ get '/fail', {}, 'flipper' => flipper
63
+ rescue
64
+ nil
65
+ end
61
66
  expect(flipper.adapter.cache).to be_empty
62
67
  end
63
68
 
64
- it "caches getting a feature for duration of request" do
69
+ it 'caches getting a feature for duration of request' do
65
70
  flipper[:stats].enable
66
71
 
67
72
  # clear the log of operations
68
73
  adapter.reset
69
74
 
70
- app = lambda { |env|
75
+ app = lambda do |_env|
71
76
  flipper[:stats].enabled?
72
77
  flipper[:stats].enabled?
73
78
  flipper[:stats].enabled?
@@ -75,188 +80,166 @@ RSpec.describe Flipper::Middleware::Memoizer do
75
80
  flipper[:stats].enabled?
76
81
  flipper[:stats].enabled?
77
82
  [200, {}, []]
78
- }
83
+ end
79
84
 
80
- middleware = described_class.new app, flipper
81
- middleware.call({})
85
+ middleware = described_class.new(app)
86
+ middleware.call(env)
82
87
 
83
88
  expect(adapter.count(:get)).to be(1)
84
89
  end
85
90
  end
86
91
 
87
- context "with flipper instance" do
88
- let(:app) {
92
+ context 'with preload_all' do
93
+ let(:app) do
89
94
  # ensure scoped for builder block, annoying...
90
95
  instance = flipper
91
96
  middleware = described_class
92
97
 
93
98
  Rack::Builder.new do
94
- use middleware, instance
99
+ use middleware, preload_all: true
95
100
 
96
- map "/" do
97
- run lambda {|env| [200, {}, []] }
101
+ map '/' do
102
+ run ->(_env) { [200, {}, []] }
98
103
  end
99
104
 
100
- map "/fail" do
101
- run lambda {|env| raise "FAIL!" }
105
+ map '/fail' do
106
+ run ->(_env) { raise 'FAIL!' }
102
107
  end
103
108
  end.to_app
104
- }
105
-
106
- include_examples "flipper middleware"
107
- end
108
-
109
- context "with preload_all" do
110
- let(:app) {
111
- # ensure scoped for builder block, annoying...
112
- instance = flipper
113
- middleware = described_class
114
-
115
- Rack::Builder.new do
116
- use middleware, instance, preload_all: true
117
-
118
- map "/" do
119
- run lambda {|env| [200, {}, []] }
120
- end
121
-
122
- map "/fail" do
123
- run lambda {|env| raise "FAIL!" }
124
- end
125
- end.to_app
126
- }
109
+ end
127
110
 
128
- include_examples "flipper middleware"
111
+ include_examples 'flipper middleware'
129
112
 
130
- it "eagerly caches known features for duration of request" do
113
+ it 'eagerly caches known features for duration of request' do
131
114
  flipper[:stats].enable
132
115
  flipper[:shiny].enable
133
116
 
134
117
  # clear the log of operations
135
118
  adapter.reset
136
119
 
137
- app = lambda { |env|
120
+ app = lambda do |_env|
138
121
  flipper[:stats].enabled?
139
122
  flipper[:stats].enabled?
140
123
  flipper[:shiny].enabled?
141
124
  flipper[:shiny].enabled?
142
125
  [200, {}, []]
143
- }
126
+ end
144
127
 
145
- middleware = described_class.new app, flipper, preload_all: true
146
- middleware.call({})
128
+ middleware = described_class.new(app, preload_all: true)
129
+ middleware.call(env)
147
130
 
148
131
  expect(adapter.count(:features)).to be(1)
149
132
  expect(adapter.count(:get_multi)).to be(1)
150
133
  expect(adapter.last(:get_multi).args).to eq([[flipper[:stats], flipper[:shiny]]])
151
134
  end
152
135
 
153
- it "caches unknown features for duration of request" do
136
+ it 'caches unknown features for duration of request' do
154
137
  # clear the log of operations
155
138
  adapter.reset
156
139
 
157
- app = lambda { |env|
140
+ app = lambda do |_env|
158
141
  flipper[:other].enabled?
159
142
  flipper[:other].enabled?
160
143
  [200, {}, []]
161
- }
144
+ end
162
145
 
163
- middleware = described_class.new app, flipper, preload_all: true
164
- middleware.call({})
146
+ middleware = described_class.new(app, preload_all: true)
147
+ middleware.call(env)
165
148
 
166
149
  expect(adapter.count(:get)).to be(1)
167
150
  expect(adapter.last(:get).args).to eq([flipper[:other]])
168
151
  end
169
152
  end
170
153
 
171
- context "with preload specific" do
172
- let(:app) {
154
+ context 'with preload specific' do
155
+ let(:app) do
173
156
  # ensure scoped for builder block, annoying...
174
157
  instance = flipper
175
158
  middleware = described_class
176
159
 
177
160
  Rack::Builder.new do
178
- use middleware, instance, preload: %i{stats}
161
+ use middleware, preload: %i(stats)
179
162
 
180
- map "/" do
181
- run lambda {|env| [200, {}, []] }
163
+ map '/' do
164
+ run ->(_env) { [200, {}, []] }
182
165
  end
183
166
 
184
- map "/fail" do
185
- run lambda {|env| raise "FAIL!" }
167
+ map '/fail' do
168
+ run ->(_env) { raise 'FAIL!' }
186
169
  end
187
170
  end.to_app
188
- }
171
+ end
189
172
 
190
- include_examples "flipper middleware"
173
+ include_examples 'flipper middleware'
191
174
 
192
- it "eagerly caches specified features for duration of request" do
175
+ it 'eagerly caches specified features for duration of request' do
193
176
  # clear the log of operations
194
177
  adapter.reset
195
178
 
196
- app = lambda { |env|
179
+ app = lambda do |_env|
197
180
  flipper[:stats].enabled?
198
181
  flipper[:stats].enabled?
199
182
  flipper[:shiny].enabled?
200
183
  flipper[:shiny].enabled?
201
184
  [200, {}, []]
202
- }
185
+ end
203
186
 
204
- middleware = described_class.new app, flipper, preload: %i{stats}
205
- middleware.call({})
187
+ middleware = described_class.new app, preload: %i(stats)
188
+ middleware.call(env)
206
189
 
207
190
  expect(adapter.count(:get_multi)).to be(1)
208
191
  expect(adapter.last(:get_multi).args).to eq([[flipper[:stats]]])
209
192
  end
210
193
 
211
- it "caches unknown features for duration of request" do
194
+ it 'caches unknown features for duration of request' do
212
195
  # clear the log of operations
213
196
  adapter.reset
214
197
 
215
- app = lambda { |env|
198
+ app = lambda do |_env|
216
199
  flipper[:other].enabled?
217
200
  flipper[:other].enabled?
218
201
  [200, {}, []]
219
- }
202
+ end
220
203
 
221
- middleware = described_class.new app, flipper, preload: %i{stats}
222
- middleware.call({})
204
+ middleware = described_class.new app, preload: %i(stats)
205
+ middleware.call(env)
223
206
 
224
207
  expect(adapter.count(:get)).to be(1)
225
208
  expect(adapter.last(:get).args).to eq([flipper[:other]])
226
209
  end
227
210
  end
228
211
 
229
- context "when an app raises an exception" do
230
- it "resets memoize" do
212
+ context 'when an app raises an exception' do
213
+ it 'resets memoize' do
231
214
  begin
232
- app = lambda { |env| raise }
233
- middleware = described_class.new app, flipper
234
- middleware.call({})
215
+ app = ->(_env) { raise }
216
+ middleware = described_class.new(app)
217
+ middleware.call(env)
235
218
  rescue RuntimeError
236
219
  expect(flipper.adapter.memoizing?).to be(false)
237
220
  end
238
221
  end
239
222
  end
240
223
 
241
- context "with block that yields flipper instance" do
242
- let(:app) {
224
+ context 'with flipper setup in env' do
225
+ let(:app) do
243
226
  # ensure scoped for builder block, annoying...
244
227
  instance = flipper
245
228
  middleware = described_class
246
229
 
247
230
  Rack::Builder.new do
248
- use middleware, lambda { instance }
231
+ use middleware
249
232
 
250
- map "/" do
251
- run lambda {|env| [200, {}, []] }
233
+ map '/' do
234
+ run ->(_env) { [200, {}, []] }
252
235
  end
253
236
 
254
- map "/fail" do
255
- run lambda {|env| raise "FAIL!" }
237
+ map '/fail' do
238
+ run ->(_env) { raise 'FAIL!' }
256
239
  end
257
240
  end.to_app
258
- }
241
+ end
259
242
 
260
- include_examples "flipper middleware"
243
+ include_examples 'flipper middleware'
261
244
  end
262
245
  end