Skip to content

Commit d33bfae

Browse files
author
Michael Bleigh
committed
Merging from pull request.
2 parents 51d876b + 0123e3b commit d33bfae

File tree

2 files changed

+73
-44
lines changed

2 files changed

+73
-44
lines changed

lib/grape/api.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def route(methods, paths, &block)
145145

146146
methods.each do |method|
147147
paths.each do |path|
148-
path = Rack::Mount::Strexp.compile(compile_path(path), options)
148+
path = Rack::Mount::Strexp.compile(compile_path(path), options, ['/'], true)
149149
route_set.add_route(endpoint,
150150
:path_info => path,
151151
:request_method => (method.to_s.upcase unless method == :any)

spec/grape/api_spec.rb

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ def app; subject end
1414
end
1515

1616
get 'awesome/sauce/hello'
17-
last_response.body.should == "Hello there."
17+
last_response.body.should eql "Hello there."
1818

1919
get '/hello'
20-
last_response.status.should == 404
20+
last_response.status.should eql 404
2121
end
2222
end
2323

@@ -29,7 +29,7 @@ def app; subject end
2929
end
3030

3131
get '/v1/hello'
32-
last_response.body.should == "Version: v1"
32+
last_response.body.should eql "Version: v1"
3333
end
3434

3535
it 'should add the prefix before the API version' do
@@ -40,7 +40,7 @@ def app; subject end
4040
end
4141

4242
get '/api/v1/hello'
43-
last_response.body.should == "Version: v1"
43+
last_response.body.should eql "Version: v1"
4444
end
4545

4646
it 'should be able to specify version as a nesting' do
@@ -56,13 +56,13 @@ def app; subject end
5656
end
5757

5858
get '/v1/awesome'
59-
last_response.status.should == 404
59+
last_response.status.should eql 404
6060
get '/v2/awesome'
61-
last_response.status.should == 200
61+
last_response.status.should eql 200
6262
get '/v1/legacy'
63-
last_response.status.should == 200
63+
last_response.status.should eql 200
6464
get '/v2/legacy'
65-
last_response.status.should == 404
65+
last_response.status.should eql 404
6666
end
6767

6868
it 'should be able to specify multiple versions' do
@@ -72,11 +72,11 @@ def app; subject end
7272
end
7373

7474
get '/v1/awesome'
75-
last_response.status.should == 200
75+
last_response.status.should eql 200
7676
get '/v2/awesome'
77-
last_response.status.should == 200
77+
last_response.status.should eql 200
7878
get '/v3/awesome'
79-
last_response.status.should == 404
79+
last_response.status.should eql 404
8080
end
8181

8282
it 'should allow the same endpoint to be implemented for different versions' do
@@ -146,7 +146,7 @@ def app; subject end
146146
%w(group resource resources).each do |als|
147147
it "`.#{als}` should be an alias" do
148148
subject.send(als, :awesome) do
149-
namespace.should == "/awesome"
149+
namespace.should == "/awesome"
150150
end
151151
end
152152
end
@@ -165,9 +165,9 @@ def app; subject end
165165
end
166166

167167
get '/votes'
168-
last_response.body.should == 'Votes'
168+
last_response.body.should eql 'Votes'
169169
post '/votes'
170-
last_response.body.should == 'Created a Vote'
170+
last_response.body.should eql 'Created a Vote'
171171
end
172172

173173
it 'should allow for multiple paths' do
@@ -176,9 +176,9 @@ def app; subject end
176176
end
177177

178178
get '/abc'
179-
last_response.body.should == 'foo'
179+
last_response.body.should eql 'foo'
180180
get '/def'
181-
last_response.body.should == 'foo'
181+
last_response.body.should eql 'foo'
182182
end
183183

184184
it 'should allow for format' do
@@ -187,7 +187,7 @@ def app; subject end
187187
end
188188

189189
get '/abc.json'
190-
last_response.body.should == '"json"'
190+
last_response.body.should eql '"json"'
191191
end
192192

193193
it 'should allow for format in namespace with no path' do
@@ -198,7 +198,7 @@ def app; subject end
198198
end
199199

200200
get '/abc.json'
201-
last_response.body.should == '"json"'
201+
last_response.body.should eql '"json"'
202202
end
203203

204204
it 'should allow for multiple verbs' do
@@ -207,9 +207,38 @@ def app; subject end
207207
end
208208

209209
get '/abc'
210-
last_response.body.should == 'hiya'
210+
last_response.body.should eql 'hiya'
211211
post '/abc'
212-
last_response.body.should == 'hiya'
212+
last_response.body.should eql 'hiya'
213+
end
214+
215+
it 'should allow for multipart paths' do
216+
217+
218+
subject.route([:get, :post], '/:id/first') do
219+
"first"
220+
end
221+
222+
223+
subject.route([:get, :post], '/:id') do
224+
"ola"
225+
end
226+
subject.route([:get, :post], '/:id/first/second') do
227+
"second"
228+
end
229+
230+
231+
get '/1'
232+
last_response.body.should eql 'ola'
233+
post '/1'
234+
last_response.body.should eql 'ola'
235+
get '/1/first'
236+
last_response.body.should eql 'first'
237+
post '/1/first'
238+
last_response.body.should eql 'first'
239+
get '/1/first/second'
240+
last_response.body.should eql 'second'
241+
213242
end
214243

215244
it 'should allow for :any as a verb' do
@@ -219,7 +248,7 @@ def app; subject end
219248

220249
%w(get post put delete).each do |m|
221250
send(m, '/abc')
222-
last_response.body.should == 'lol'
251+
last_response.body.should eql 'lol'
223252
end
224253
end
225254

@@ -230,10 +259,10 @@ def app; subject end
230259
verb
231260
end
232261
send(verb, '/example')
233-
last_response.body.should == verb
262+
last_response.body.should eql verb
234263
# Call it with a method other than the properly constrained one.
235264
send(verbs[(verbs.index(verb) + 1) % verbs.size], '/example')
236-
last_response.status.should == 404
265+
last_response.status.should eql 404
237266
end
238267
end
239268

@@ -243,8 +272,8 @@ def app; subject end
243272
end
244273

245274
post '/example'
246-
last_response.status.should == 201
247-
last_response.body.should == 'Created'
275+
last_response.status.should eql 201
276+
last_response.body.should eql 'Created'
248277
end
249278
end
250279

@@ -265,7 +294,7 @@ def call(env)
265294
describe '.middleware' do
266295
it 'should include middleware arguments from settings' do
267296
subject.stub!(:settings_stack).and_return [{:middleware => [[PhonyMiddleware, 'abc', 123]]}]
268-
subject.middleware.should == [[PhonyMiddleware, 'abc', 123]]
297+
subject.middleware.should eql [[PhonyMiddleware, 'abc', 123]]
269298
end
270299

271300
it 'should include all middleware from stacked settings' do
@@ -274,7 +303,7 @@ def call(env)
274303
{:middleware => [[PhonyMiddleware, 'foo']]}
275304
]
276305

277-
subject.middleware.should == [
306+
subject.middleware.should eql [
278307
[PhonyMiddleware, 123],
279308
[PhonyMiddleware, 'abc'],
280309
[PhonyMiddleware, 'foo']
@@ -285,7 +314,7 @@ def call(env)
285314
describe '.use' do
286315
it 'should add middleware' do
287316
subject.use PhonyMiddleware, 123
288-
subject.middleware.should == [[PhonyMiddleware, 123]]
317+
subject.middleware.should eql [[PhonyMiddleware, 123]]
289318
end
290319

291320
it 'should not show up outside the namespace' do
@@ -295,7 +324,7 @@ def call(env)
295324
middleware.should == [[PhonyMiddleware, 123],[PhonyMiddleware, 'abc']]
296325
end
297326

298-
subject.middleware.should == [[PhonyMiddleware, 123]]
327+
subject.middleware.should eql [[PhonyMiddleware, 123]]
299328
end
300329

301330
it 'should actually call the middleware' do
@@ -305,7 +334,7 @@ def call(env)
305334
end
306335

307336
get '/'
308-
last_response.body.should == 'hello'
337+
last_response.body.should eql 'hello'
309338
end
310339
end
311340
end
@@ -316,9 +345,9 @@ def call(env)
316345
end
317346
subject.get(:hello){ "Hello, world."}
318347
get '/hello'
319-
last_response.status.should == 401
348+
last_response.status.should eql 401
320349
get '/hello', {}, 'HTTP_AUTHORIZATION' => encode_basic('allow','whatever')
321-
last_response.status.should == 200
350+
last_response.status.should eql 200
322351
end
323352

324353
it 'should be scopable' do
@@ -332,9 +361,9 @@ def call(env)
332361
end
333362

334363
get '/hello'
335-
last_response.status.should == 200
364+
last_response.status.should eql 200
336365
get '/admin/hello'
337-
last_response.status.should == 401
366+
last_response.status.should eql 401
338367
end
339368

340369
it 'should be callable via .auth as well' do
@@ -344,9 +373,9 @@ def call(env)
344373

345374
subject.get(:hello){ "Hello, world."}
346375
get '/hello'
347-
last_response.status.should == 401
376+
last_response.status.should eql 401
348377
get '/hello', {}, 'HTTP_AUTHORIZATION' => encode_basic('allow','whatever')
349-
last_response.status.should == 200
378+
last_response.status.should eql 200
350379
end
351380
end
352381

@@ -363,7 +392,7 @@ def hello
363392
end
364393

365394
get '/howdy'
366-
last_response.body.should == 'Hello, world.'
395+
last_response.body.should eql 'Hello, world.'
367396
end
368397

369398
it 'should be scopable' do
@@ -390,9 +419,9 @@ def secret
390419
end
391420

392421
get '/generic'
393-
last_response.body.should == 'always there:false'
422+
last_response.body.should eql 'always there:false'
394423
get '/admin/secret'
395-
last_response.body.should == 'always there:only in admin'
424+
last_response.body.should eql 'always there:only in admin'
396425
end
397426

398427
it 'should be reopenable' do
@@ -433,13 +462,13 @@ def two
433462
end
434463

435464
get '/v2/abc'
436-
last_response.status.should == 404
465+
last_response.status.should eql 404
437466
get '/v1/abc'
438-
last_response.status.should == 200
467+
last_response.status.should eql 200
439468
get '/v1/def'
440-
last_response.status.should == 404
469+
last_response.status.should eql 404
441470
get '/v2/def'
442-
last_response.status.should == 200
471+
last_response.status.should eql 200
443472
end
444473
end
445474
end

0 commit comments

Comments
 (0)