rack-berater 0.3.1 → 0.3.2
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.
- checksums.yaml +4 -4
- data/lib/rack/berater/prioritizer.rb +4 -22
- data/lib/rack/berater/rails_prioritizer.rb +17 -0
- data/lib/rack/berater/railtie.rb +1 -1
- data/lib/rack/berater/version.rb +1 -1
- data/lib/rack/berater.rb +1 -0
- data/spec/prioritizer_spec.rb +5 -82
- data/spec/rails_prioritizer_spec.rb +95 -0
- metadata +18 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d9e1b9ca0c696948b6d7ec973e1855c71a73fe9ca59d0833107e57295d2d9f21
|
4
|
+
data.tar.gz: fcbbeef6465c6f7cefa0c110401e4c80d6462ea3adc69a7a1e3975e19e9f8355
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d00a14d8136ac96cac236c4bb2ff55c98871dc32cb85b30d8800b4784526cb27c53e54979703f554cb1698ea99093ea77584222dab213f4cbbbe6aeba1b2e71
|
7
|
+
data.tar.gz: 03b030982e003903461f929853138f7c4dcbffbfbcccb2aba1335ffac6e2aa9aeb0b265c4c13d3ebc6f1e04ef4acc1c942606c9d57f44cf2003c3a46e42b8c64
|
@@ -48,34 +48,16 @@ module Rack
|
|
48
48
|
Thread.current[ENV_KEY] = priority
|
49
49
|
end
|
50
50
|
|
51
|
-
@@cache_prefix = 'Berater:Rack:Prioritizer'
|
52
51
|
def cache_key_for(env)
|
53
|
-
req = Rack::Request.new(env)
|
54
|
-
|
55
|
-
req_method = env[Rack::REQUEST_METHOD].downcase
|
56
|
-
path = ''
|
57
|
-
|
58
|
-
if defined?(Rails) && Rails.respond_to?(:application) && Rails.application
|
59
|
-
res = Rails.application.routes.recognize_path(
|
60
|
-
env[Rack::PATH_INFO],
|
61
|
-
method: env[Rack::REQUEST_METHOD],
|
62
|
-
)
|
63
|
-
path = res.values_at(:controller, :action).compact.join('#')
|
64
|
-
end
|
65
|
-
|
66
|
-
if path.empty?
|
67
|
-
path = env['PATH_INFO'].gsub(%r{/[0-9]+(/|$)}, '/x\1')
|
68
|
-
end
|
69
|
-
|
70
52
|
[
|
71
|
-
|
72
|
-
|
73
|
-
|
53
|
+
env[Rack::REQUEST_METHOD].downcase,
|
54
|
+
|
55
|
+
# normalize RESTful paths
|
56
|
+
env['PATH_INFO'].gsub(%r{/[0-9]+(/|$)}, '/x\1'),
|
74
57
|
].join(':')
|
75
58
|
end
|
76
59
|
|
77
60
|
@@cache = {}
|
78
|
-
|
79
61
|
def cache_get(key)
|
80
62
|
synchronize { @@cache[key] }
|
81
63
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'action_controller/metal'
|
2
|
+
require 'action_dispatch'
|
3
|
+
|
4
|
+
module Rack
|
5
|
+
class Berater
|
6
|
+
class RailsPrioritizer < Prioritizer
|
7
|
+
def cache_key_for(env)
|
8
|
+
Rails.application.routes.recognize_path(
|
9
|
+
env[Rack::PATH_INFO],
|
10
|
+
method: env[Rack::REQUEST_METHOD],
|
11
|
+
).values_at(:controller, :action).compact.join('#')
|
12
|
+
rescue ActionController::RoutingError
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/rack/berater/railtie.rb
CHANGED
@@ -5,7 +5,7 @@ module Rack
|
|
5
5
|
class Railtie < Rails::Railtie
|
6
6
|
initializer 'rack.berater' do |app|
|
7
7
|
if ::Berater.middleware.include?(::Berater::Middleware::LoadShedder)
|
8
|
-
app.middleware.use Rack::Berater::
|
8
|
+
app.middleware.use Rack::Berater::RailsPrioritizer
|
9
9
|
end
|
10
10
|
|
11
11
|
app.middleware.use Rack::Berater
|
data/lib/rack/berater/version.rb
CHANGED
data/lib/rack/berater.rb
CHANGED
data/spec/prioritizer_spec.rb
CHANGED
@@ -117,12 +117,8 @@ describe Rack::Berater::Prioritizer do
|
|
117
117
|
context 'with a basic env' do
|
118
118
|
let(:env) { Rack::MockRequest.env_for('/') }
|
119
119
|
|
120
|
-
it 'has a Berater prefix' do
|
121
|
-
is_expected.to match /^Berater:/
|
122
|
-
end
|
123
|
-
|
124
120
|
it 'combines the verb and path' do
|
125
|
-
is_expected.to match %r{
|
121
|
+
is_expected.to match %r{get:/$}
|
126
122
|
end
|
127
123
|
end
|
128
124
|
|
@@ -130,7 +126,7 @@ describe Rack::Berater::Prioritizer do
|
|
130
126
|
let(:env) { Rack::MockRequest.env_for('/', method: 'PUT') }
|
131
127
|
|
132
128
|
it 'combines the verb and path' do
|
133
|
-
is_expected.to match %r{
|
129
|
+
is_expected.to match %r{put:/$}
|
134
130
|
end
|
135
131
|
end
|
136
132
|
|
@@ -138,7 +134,7 @@ describe Rack::Berater::Prioritizer do
|
|
138
134
|
let(:env) { Rack::MockRequest.env_for('/user/123') }
|
139
135
|
|
140
136
|
it 'normalizes the id' do
|
141
|
-
is_expected.to match %r{:/user/x$}
|
137
|
+
is_expected.to match %r{get:/user/x$}
|
142
138
|
end
|
143
139
|
end
|
144
140
|
|
@@ -146,7 +142,7 @@ describe Rack::Berater::Prioritizer do
|
|
146
142
|
let(:env) { Rack::MockRequest.env_for('/user/123/') }
|
147
143
|
|
148
144
|
it 'normalizes the id and keeps the trailing slash' do
|
149
|
-
is_expected.to match %r{:/user/x/$}
|
145
|
+
is_expected.to match %r{get:/user/x/$}
|
150
146
|
end
|
151
147
|
end
|
152
148
|
|
@@ -154,7 +150,7 @@ describe Rack::Berater::Prioritizer do
|
|
154
150
|
let(:env) { Rack::MockRequest.env_for('/user/123/friend/456') }
|
155
151
|
|
156
152
|
it 'normalizes both ids' do
|
157
|
-
is_expected.to match %r{:/user/x/friend/x$}
|
153
|
+
is_expected.to match %r{get:/user/x/friend/x$}
|
158
154
|
end
|
159
155
|
end
|
160
156
|
end
|
@@ -219,77 +215,4 @@ describe Rack::Berater::Prioritizer do
|
|
219
215
|
# end
|
220
216
|
# end
|
221
217
|
end
|
222
|
-
|
223
|
-
context 'as Rails middleware' do
|
224
|
-
before do
|
225
|
-
class EchoController < ActionController::Base
|
226
|
-
def index
|
227
|
-
render plain: Rack::Berater::Prioritizer.current_priority
|
228
|
-
end
|
229
|
-
|
230
|
-
def six
|
231
|
-
response.set_header(Rack::Berater::Prioritizer::HEADER, '6')
|
232
|
-
index
|
233
|
-
end
|
234
|
-
|
235
|
-
def nine
|
236
|
-
response.set_header(Rack::Berater::Prioritizer::HEADER, '9')
|
237
|
-
index
|
238
|
-
end
|
239
|
-
end
|
240
|
-
|
241
|
-
Rails.application = Class.new(Rails::Application) do
|
242
|
-
config.eager_load = false
|
243
|
-
config.hosts.clear # disable hostname filtering
|
244
|
-
end
|
245
|
-
Rails.application.middleware.use described_class
|
246
|
-
Rails.initialize!
|
247
|
-
|
248
|
-
Rails.application.routes.draw do
|
249
|
-
get '/' => 'echo#index'
|
250
|
-
get '/six' => 'echo#six'
|
251
|
-
post '/nine' => 'echo#nine'
|
252
|
-
end
|
253
|
-
end
|
254
|
-
|
255
|
-
let(:app) { Rails.application }
|
256
|
-
let(:middleware) { described_class.new(app) }
|
257
|
-
|
258
|
-
after { Rails.application = nil }
|
259
|
-
|
260
|
-
describe '#cache_key_for' do
|
261
|
-
subject { described_class.new(app).send(:cache_key_for, env) }
|
262
|
-
|
263
|
-
let(:env) { Rack::MockRequest.env_for('/') }
|
264
|
-
|
265
|
-
it 'uses the controller and action name' do
|
266
|
-
is_expected.to match %r{:echo#index$}
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'when a priority header is sent' do
|
271
|
-
before { header described_class::HEADER, priority }
|
272
|
-
|
273
|
-
let(:priority) { '6' }
|
274
|
-
|
275
|
-
it 'sets the priority' do
|
276
|
-
expect(get('/six').body).to eq priority
|
277
|
-
end
|
278
|
-
end
|
279
|
-
|
280
|
-
context 'when the app returns a priority' do
|
281
|
-
it 'does not know the first time the controller is called' do
|
282
|
-
expect(get('/six').body).to be_empty
|
283
|
-
expect(post('/nine').body).to be_empty
|
284
|
-
end
|
285
|
-
|
286
|
-
it 'caches the repsonses for the second time' do
|
287
|
-
expect(get('/six').body).to be_empty
|
288
|
-
expect(post('/nine').body).to be_empty
|
289
|
-
|
290
|
-
expect(get('/six').body).to eq '6'
|
291
|
-
expect(post('/nine').body).to eq '9'
|
292
|
-
end
|
293
|
-
end
|
294
|
-
end
|
295
218
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'rspec/rails'
|
2
|
+
|
3
|
+
describe Rack::Berater::RailsPrioritizer do
|
4
|
+
before do
|
5
|
+
class EchoController < ActionController::Base
|
6
|
+
def index
|
7
|
+
render plain: Rack::Berater::Prioritizer.current_priority
|
8
|
+
end
|
9
|
+
|
10
|
+
def six
|
11
|
+
response.set_header(Rack::Berater::Prioritizer::HEADER, '6')
|
12
|
+
index
|
13
|
+
end
|
14
|
+
|
15
|
+
def nine
|
16
|
+
response.set_header(Rack::Berater::Prioritizer::HEADER, '9')
|
17
|
+
index
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Rails.application = Class.new(Rails::Application) do
|
22
|
+
config.eager_load = false
|
23
|
+
config.hosts.clear # disable hostname filtering
|
24
|
+
# config.logger = ActiveSupport::Logger.new($stdout)
|
25
|
+
end
|
26
|
+
Rails.application.middleware.use described_class
|
27
|
+
Rails.initialize!
|
28
|
+
|
29
|
+
Rails.application.routes.draw do
|
30
|
+
get '/' => 'echo#index'
|
31
|
+
get '/six' => 'echo#six'
|
32
|
+
post '/nine' => 'echo#nine'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:app) { Rails.application }
|
37
|
+
let(:middleware) { described_class.new(app) }
|
38
|
+
|
39
|
+
after do
|
40
|
+
cache.clear
|
41
|
+
Thread.current[described_class::ENV_KEY] = nil
|
42
|
+
Rails.application = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
let(:cache) { described_class.class_variable_get(:@@cache) }
|
46
|
+
|
47
|
+
describe '#cache_key_for' do
|
48
|
+
subject { described_class.new(app).method(:cache_key_for) }
|
49
|
+
|
50
|
+
it 'uses the controller and action name' do
|
51
|
+
expect(
|
52
|
+
subject.call(Rack::MockRequest.env_for('/'))
|
53
|
+
).to match /echo#index/
|
54
|
+
|
55
|
+
expect(
|
56
|
+
subject.call(Rack::MockRequest.env_for('/six'))
|
57
|
+
).to match /echo#six/
|
58
|
+
|
59
|
+
expect(
|
60
|
+
subject.call(Rack::MockRequest.env_for('/nine', method: 'POST'))
|
61
|
+
).to match /echo#nine/
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'falls back to Rack style names' do
|
65
|
+
expect(
|
66
|
+
subject.call(Rack::MockRequest.env_for('/nine'))
|
67
|
+
).to match %r{get:/nine}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when a priority header is sent' do
|
72
|
+
before { header described_class::HEADER, priority }
|
73
|
+
|
74
|
+
let(:priority) { '6' }
|
75
|
+
|
76
|
+
it 'sets the priority' do
|
77
|
+
expect(get('/six').body).to eq priority
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'when the app returns a priority' do
|
82
|
+
it 'does not know the first time the controller is called' do
|
83
|
+
expect(get('/six').body).to be_empty
|
84
|
+
expect(post('/nine').body).to be_empty
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'caches the repsonses for the second time' do
|
88
|
+
expect(get('/six').body).to be_empty
|
89
|
+
expect(post('/nine').body).to be_empty
|
90
|
+
|
91
|
+
expect(get('/six').body).to eq '6'
|
92
|
+
expect(post('/nine').body).to eq '9'
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-berater
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rspec-rails
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: simplecov
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,10 +145,12 @@ files:
|
|
131
145
|
- lib/rack-berater.rb
|
132
146
|
- lib/rack/berater.rb
|
133
147
|
- lib/rack/berater/prioritizer.rb
|
148
|
+
- lib/rack/berater/rails_prioritizer.rb
|
134
149
|
- lib/rack/berater/railtie.rb
|
135
150
|
- lib/rack/berater/version.rb
|
136
151
|
- spec/limiter_spec.rb
|
137
152
|
- spec/prioritizer_spec.rb
|
153
|
+
- spec/rails_prioritizer_spec.rb
|
138
154
|
- spec/railtie_spec.rb
|
139
155
|
- spec/rescuer_spec.rb
|
140
156
|
homepage: https://github.com/dpep/rack-berater
|
@@ -161,6 +177,7 @@ signing_key:
|
|
161
177
|
specification_version: 4
|
162
178
|
summary: Rack::Berater
|
163
179
|
test_files:
|
180
|
+
- spec/rails_prioritizer_spec.rb
|
164
181
|
- spec/railtie_spec.rb
|
165
182
|
- spec/rescuer_spec.rb
|
166
183
|
- spec/prioritizer_spec.rb
|