sinatra-contrib 1.3.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -8
- data/lib/sinatra/capture.rb +87 -5
- data/lib/sinatra/config_file.rb +19 -3
- data/lib/sinatra/content_for.rb +2 -2
- data/lib/sinatra/contrib/setup.rb +2 -2
- data/lib/sinatra/cookies.rb +4 -4
- data/lib/sinatra/decompile.rb +13 -5
- data/lib/sinatra/extension.rb +5 -5
- data/lib/sinatra/json.rb +26 -30
- data/lib/sinatra/link_header.rb +2 -2
- data/lib/sinatra/multi_route.rb +6 -0
- data/lib/sinatra/namespace.rb +9 -6
- data/lib/sinatra/reloader.rb +7 -7
- data/lib/sinatra/respond_with.rb +18 -14
- data/lib/sinatra/streaming.rb +6 -6
- data/lib/sinatra/test_helpers.rb +1 -1
- data/sinatra-contrib.gemspec +5 -22
- data/spec/capture_spec.rb +14 -1
- data/spec/config_file/key_value.yml.erb +6 -0
- data/spec/config_file_spec.rb +10 -0
- data/spec/content_for_spec.rb +3 -3
- data/spec/cookies_spec.rb +26 -6
- data/spec/json_spec.rb +5 -3
- data/spec/multi_route_spec.rb +28 -13
- data/spec/namespace_spec.rb +294 -283
- data/spec/respond_with_spec.rb +10 -0
- data/spec/spec_helper.rb +1 -0
- metadata +8 -25
- data/spec/content_for/footer.erb +0 -3
- data/spec/content_for/footer.erubis +0 -3
- data/spec/content_for/footer.haml +0 -2
- data/spec/content_for/footer.slim +0 -2
data/lib/sinatra/reloader.rb
CHANGED
@@ -13,7 +13,7 @@ module Sinatra
|
|
13
13
|
#
|
14
14
|
# === Classic Application
|
15
15
|
#
|
16
|
-
# To enable the
|
16
|
+
# To enable the reloader in a classic application all you need to do is
|
17
17
|
# require it:
|
18
18
|
#
|
19
19
|
# require "sinatra"
|
@@ -23,7 +23,7 @@ module Sinatra
|
|
23
23
|
#
|
24
24
|
# === Modular Application
|
25
25
|
#
|
26
|
-
# To enable the
|
26
|
+
# To enable the reloader in a modular application all you need to do is
|
27
27
|
# require it, and then, register it:
|
28
28
|
#
|
29
29
|
# require "sinatra/base"
|
@@ -75,7 +75,7 @@ module Sinatra
|
|
75
75
|
module Reloader
|
76
76
|
|
77
77
|
# Watches a file so it can tell when it has been updated, and what
|
78
|
-
# elements
|
78
|
+
# elements does it contain.
|
79
79
|
class Watcher
|
80
80
|
|
81
81
|
# Represents an element of a Sinatra application that may need to
|
@@ -95,8 +95,8 @@ module Sinatra
|
|
95
95
|
# Collection of file +Watcher+ that can be associated with a
|
96
96
|
# Sinatra application. That way, we can know which files belong
|
97
97
|
# to a given application and which files have been modified. It
|
98
|
-
# also provides a mechanism to inform a Watcher the elements
|
99
|
-
# defined in the file being watched and if
|
98
|
+
# also provides a mechanism to inform a Watcher of the elements
|
99
|
+
# defined in the file being watched and if its changes should be
|
100
100
|
# ignored.
|
101
101
|
class List
|
102
102
|
@app_list_map = Hash.new { |hash, key| hash[key] = new }
|
@@ -113,7 +113,7 @@ module Sinatra
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
# Lets the +Watcher+ for the file
|
116
|
+
# Lets the +Watcher+ for the file located at +path+ know that the
|
117
117
|
# +element+ is defined there, and adds the +Watcher+ to the +List+,
|
118
118
|
# if it isn't already there.
|
119
119
|
def watch(path, element)
|
@@ -159,7 +159,7 @@ module Sinatra
|
|
159
159
|
!ignore? && !removed? && mtime != File.mtime(path)
|
160
160
|
end
|
161
161
|
|
162
|
-
# Updates the file being watched
|
162
|
+
# Updates the mtime of the file being watched.
|
163
163
|
def update
|
164
164
|
@mtime = File.mtime(path)
|
165
165
|
end
|
data/lib/sinatra/respond_with.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'sinatra/base'
|
2
1
|
require 'sinatra/json'
|
2
|
+
require 'sinatra/base'
|
3
3
|
|
4
4
|
module Sinatra
|
5
|
-
|
5
|
+
#
|
6
6
|
# = Sinatra::RespondWith
|
7
7
|
#
|
8
|
-
#
|
8
|
+
# These extensions let Sinatra automatically choose what template to render or
|
9
9
|
# action to perform depending on the request's Accept header.
|
10
10
|
#
|
11
11
|
# Example:
|
@@ -53,8 +53,8 @@ module Sinatra
|
|
53
53
|
# == Security
|
54
54
|
#
|
55
55
|
# Since methods are triggered based on client input, this can lead to security
|
56
|
-
# issues (but not as
|
57
|
-
# mind that only known file extensions are used). You
|
56
|
+
# issues (but not as severe as those might appear in the first place: keep in
|
57
|
+
# mind that only known file extensions are used). You should limit
|
58
58
|
# the possible formats you serve.
|
59
59
|
#
|
60
60
|
# This is possible with the +provides+ condition:
|
@@ -64,7 +64,7 @@ module Sinatra
|
|
64
64
|
# end
|
65
65
|
#
|
66
66
|
# However, since you have to set +provides+ for every route, this extension
|
67
|
-
# adds
|
67
|
+
# adds an app global (class method) `respond_to`, that lets you define content
|
68
68
|
# types for all routes:
|
69
69
|
#
|
70
70
|
# respond_to :html, :json, :xml, :atom
|
@@ -118,9 +118,9 @@ module Sinatra
|
|
118
118
|
@app.halt 406
|
119
119
|
end
|
120
120
|
|
121
|
-
def method_missing(
|
122
|
-
return super if args.any? or block.nil? or not @app.mime_type(
|
123
|
-
on(
|
121
|
+
def method_missing(method, *args, &block)
|
122
|
+
return super if args.any? or block.nil? or not @app.mime_type(method)
|
123
|
+
on(method, &block)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -138,15 +138,18 @@ module Sinatra
|
|
138
138
|
if args.any?
|
139
139
|
locals = { :object => object }
|
140
140
|
locals.merge! object.to_hash if object.respond_to? :to_hash
|
141
|
-
|
142
|
-
|
141
|
+
|
142
|
+
renderer = args.first
|
143
|
+
options = args[1..-1] + [{:locals => locals}]
|
144
|
+
|
145
|
+
halt send(renderer, *options)
|
143
146
|
end
|
144
147
|
end
|
145
148
|
if object
|
146
149
|
exts.each do |ext|
|
147
150
|
halt json(object) if ext == :json
|
148
|
-
next unless
|
149
|
-
halt(*object.send(
|
151
|
+
next unless object.respond_to? method = "to_#{ext}"
|
152
|
+
halt(*object.send(method))
|
150
153
|
end
|
151
154
|
end
|
152
155
|
false
|
@@ -161,7 +164,7 @@ module Sinatra
|
|
161
164
|
private
|
162
165
|
|
163
166
|
def template_for(name, exts)
|
164
|
-
# in production this is cached, so don't worry
|
167
|
+
# in production this is cached, so don't worry too much about runtime
|
165
168
|
possible = []
|
166
169
|
settings.template_engines[:all].each do |engine|
|
167
170
|
exts.each { |ext| possible << [engine, "#{name}.#{ext}"] }
|
@@ -224,6 +227,7 @@ module Sinatra
|
|
224
227
|
:css => [:less, :sass, :scss],
|
225
228
|
:xml => [:builder, :nokogiri],
|
226
229
|
:js => [:coffee],
|
230
|
+
:json => [:yajl],
|
227
231
|
:html => [:erb, :erubis, :haml, :slim, :liquid, :radius, :mab, :markdown,
|
228
232
|
:textile, :rdoc],
|
229
233
|
:all => Sinatra::Templates.instance_methods.map(&:to_sym) + [:mab] -
|
data/lib/sinatra/streaming.rb
CHANGED
@@ -7,7 +7,7 @@ module Sinatra
|
|
7
7
|
# = Sinatra::Streaming
|
8
8
|
#
|
9
9
|
# Sinatra 1.3 introduced the +stream+ helper. This addon improves the
|
10
|
-
# streaming API by making the stream object immitate an IO object,
|
10
|
+
# streaming API by making the stream object immitate an IO object, turning
|
11
11
|
# it into a real Deferrable and making the body play nicer with middleware
|
12
12
|
# unaware of streaming.
|
13
13
|
#
|
@@ -44,9 +44,9 @@ module Sinatra
|
|
44
44
|
#
|
45
45
|
# == Better Middleware Handling
|
46
46
|
#
|
47
|
-
# Blocks passed to #map! or #map will actually be applied
|
48
|
-
# (as you might
|
49
|
-
# #map creates a new one):
|
47
|
+
# Blocks passed to #map! or #map will actually be applied when streaming
|
48
|
+
# takes place (as you might have suspected, #map! applies modifications
|
49
|
+
# to the current body, while #map creates a new one):
|
50
50
|
#
|
51
51
|
# class StupidMiddleware
|
52
52
|
# def initialize(app) @app = app end
|
@@ -89,7 +89,7 @@ module Sinatra
|
|
89
89
|
#
|
90
90
|
# require "sinatra/base"
|
91
91
|
# require "sinatra/streaming"
|
92
|
-
#
|
92
|
+
#
|
93
93
|
# class MyApp < Sinatra::Base
|
94
94
|
# helpers Sinatra::Streaming
|
95
95
|
# end
|
@@ -264,4 +264,4 @@ module Sinatra
|
|
264
264
|
end
|
265
265
|
|
266
266
|
helpers Streaming
|
267
|
-
end
|
267
|
+
end
|
data/lib/sinatra/test_helpers.rb
CHANGED
@@ -72,7 +72,7 @@ module Sinatra
|
|
72
72
|
|
73
73
|
def session
|
74
74
|
return {} unless last_request?
|
75
|
-
raise Rack::Test
|
75
|
+
raise Rack::Test::Error, "session not enabled for app" unless last_env["rack.session"] or app.session?
|
76
76
|
last_request.session
|
77
77
|
end
|
78
78
|
|
data/sinatra-contrib.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Run `rake sinatra-contrib.gemspec` to update the gemspec.
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "sinatra-contrib"
|
4
|
-
s.version = "1.
|
4
|
+
s.version = "1.4.0"
|
5
5
|
s.description = "Collection of useful Sinatra extensions"
|
6
6
|
s.homepage = "http://github.com/sinatra/sinatra-contrib"
|
7
7
|
s.summary = s.description
|
@@ -10,17 +10,10 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.authors = [
|
11
11
|
"Konstantin Haase",
|
12
12
|
"Gabriel Andretta",
|
13
|
-
"Trevor Bramble",
|
14
13
|
"Nicolas Sanguinetti",
|
15
|
-
"Ilya Shindyapin",
|
16
|
-
"Masahiro Fujiwara",
|
17
|
-
"Adrian Pacała",
|
18
|
-
"Andrew Crump",
|
19
14
|
"Eliot Shepard",
|
20
|
-
"
|
21
|
-
"Gray Manley",
|
15
|
+
"Andrew Crump",
|
22
16
|
"Matt Lyon",
|
23
|
-
"lest",
|
24
17
|
"undr"
|
25
18
|
]
|
26
19
|
|
@@ -28,17 +21,10 @@ Gem::Specification.new do |s|
|
|
28
21
|
s.email = [
|
29
22
|
"konstantin.mailinglists@googlemail.com",
|
30
23
|
"ohhgabriel@gmail.com",
|
31
|
-
"inbox@trevorbramble.com",
|
32
24
|
"contacto@nicolassanguinetti.info",
|
33
|
-
"ilya@shindyapin.com",
|
34
|
-
"m-fujiwara@axsh.net",
|
35
|
-
"altpacala@gmail.com",
|
36
|
-
"andrew.crump@ieee.org",
|
37
25
|
"eshepard@slower.net",
|
38
|
-
"
|
39
|
-
"g.manley@tukaiz.com",
|
26
|
+
"andrew.crump@ieee.org",
|
40
27
|
"matt@flowerpowered.com",
|
41
|
-
"just.lest@gmail.com",
|
42
28
|
"undr@yandex.ru"
|
43
29
|
]
|
44
30
|
|
@@ -70,6 +56,7 @@ Gem::Specification.new do |s|
|
|
70
56
|
"sinatra-contrib.gemspec",
|
71
57
|
"spec/capture_spec.rb",
|
72
58
|
"spec/config_file/key_value.yml",
|
59
|
+
"spec/config_file/key_value.yml.erb",
|
73
60
|
"spec/config_file/key_value_override.yml",
|
74
61
|
"spec/config_file/missing_env.yml",
|
75
62
|
"spec/config_file/with_envs.yml",
|
@@ -79,10 +66,6 @@ Gem::Specification.new do |s|
|
|
79
66
|
"spec/content_for/different_key.erubis",
|
80
67
|
"spec/content_for/different_key.haml",
|
81
68
|
"spec/content_for/different_key.slim",
|
82
|
-
"spec/content_for/footer.erb",
|
83
|
-
"spec/content_for/footer.erubis",
|
84
|
-
"spec/content_for/footer.haml",
|
85
|
-
"spec/content_for/footer.slim",
|
86
69
|
"spec/content_for/layout.erb",
|
87
70
|
"spec/content_for/layout.erubis",
|
88
71
|
"spec/content_for/layout.haml",
|
@@ -129,7 +112,7 @@ Gem::Specification.new do |s|
|
|
129
112
|
"spec/streaming_spec.rb"
|
130
113
|
]
|
131
114
|
|
132
|
-
s.add_dependency "sinatra", "~> 1.
|
115
|
+
s.add_dependency "sinatra", "~> 1.4.2"
|
133
116
|
s.add_dependency "backports", ">= 2.0"
|
134
117
|
s.add_dependency "tilt", "~> 1.3"
|
135
118
|
s.add_dependency "rack-test"
|
data/spec/capture_spec.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
require 'backports'
|
2
3
|
require 'slim'
|
3
4
|
require_relative 'spec_helper'
|
@@ -20,6 +21,7 @@ describe Sinatra::Capture do
|
|
20
21
|
|
21
22
|
shared_examples_for "a template language" do |engine|
|
22
23
|
lang = engine == :erubis ? :erb : engine
|
24
|
+
require "#{engine}"
|
23
25
|
|
24
26
|
it "captures content" do
|
25
27
|
render(engine, "simple_#{lang}").should == "Say Hello World!"
|
@@ -32,8 +34,15 @@ describe Sinatra::Capture do
|
|
32
34
|
|
33
35
|
describe('haml') { it_behaves_like "a template language", :haml }
|
34
36
|
describe('slim') { it_behaves_like "a template language", :slim }
|
35
|
-
describe('erb') { it_behaves_like "a template language", :erb }
|
36
37
|
describe('erubis') { it_behaves_like "a template language", :erubis }
|
38
|
+
|
39
|
+
describe 'erb' do
|
40
|
+
it_behaves_like "a template language", :erb
|
41
|
+
|
42
|
+
it "handles utf-8 encoding" do
|
43
|
+
render(:erb, "utf_8").should == "UTF-8 –"
|
44
|
+
end
|
45
|
+
end
|
37
46
|
end
|
38
47
|
|
39
48
|
__END__
|
@@ -78,3 +87,7 @@ Say
|
|
78
87
|
World
|
79
88
|
#{b.strip}!
|
80
89
|
Hello #{a.strip}
|
90
|
+
|
91
|
+
@@ utf_8
|
92
|
+
<% a = capture do %>–<% end %>
|
93
|
+
UTF-8 <%= a %>
|
data/spec/config_file_spec.rb
CHANGED
@@ -23,6 +23,16 @@ describe Sinatra::ConfigFile do
|
|
23
23
|
settings.nested[:a].should == 1
|
24
24
|
end
|
25
25
|
|
26
|
+
it 'should render options in ERB tags' do
|
27
|
+
config_file 'key_value.yml.erb'
|
28
|
+
settings.foo.should == "bar"
|
29
|
+
settings.something.should == 42
|
30
|
+
settings.nested['a'].should == 1
|
31
|
+
settings.nested[:a].should == 1
|
32
|
+
settings.nested['b'].should == 2
|
33
|
+
settings.nested[:b].should == 2
|
34
|
+
end
|
35
|
+
|
26
36
|
it 'should recognize env specific settings per file' do
|
27
37
|
config_file 'with_envs.yml'
|
28
38
|
settings.foo.should == 'test'
|
data/spec/content_for_spec.rb
CHANGED
@@ -138,13 +138,13 @@ describe Sinatra::ContentFor do
|
|
138
138
|
render(inner, :passes_values).should == "<i>1</i>2"
|
139
139
|
end
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
describe "with content_for? in Ruby" do
|
143
|
-
it 'renders block if key is set' do
|
143
|
+
it 'renders block if key is set' do
|
144
144
|
content_for(:foo) { "foot" }
|
145
145
|
render(inner, :footer).should == "foot"
|
146
146
|
end
|
147
|
-
|
147
|
+
|
148
148
|
it 'does not render a block if different key' do
|
149
149
|
content_for(:different_key) { "foot" }
|
150
150
|
render(inner, :footer).should be_empty
|
data/spec/cookies_spec.rb
CHANGED
@@ -154,11 +154,11 @@ describe Sinatra::Cookies do
|
|
154
154
|
end.should be_nil
|
155
155
|
end
|
156
156
|
|
157
|
-
it '
|
157
|
+
it 'expires existing cookies' do
|
158
158
|
cookie_route("foo=bar") do
|
159
159
|
cookies.clear
|
160
160
|
response['Set-Cookie']
|
161
|
-
end.should include("foo=; expires=
|
161
|
+
end.should include("foo=;", "expires=", "1970 00:00:00")
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
@@ -185,16 +185,32 @@ describe Sinatra::Cookies do
|
|
185
185
|
it 'removes response cookies from cookies hash' do
|
186
186
|
cookie_route do
|
187
187
|
cookies['foo'] = 'bar'
|
188
|
-
cookies.
|
188
|
+
cookies.delete 'foo'
|
189
189
|
cookies['foo']
|
190
190
|
end.should be_nil
|
191
191
|
end
|
192
192
|
|
193
|
-
it '
|
193
|
+
it 'expires existing cookies' do
|
194
194
|
cookie_route("foo=bar") do
|
195
195
|
cookies.delete 'foo'
|
196
196
|
response['Set-Cookie']
|
197
|
-
end.should include("foo=; expires=
|
197
|
+
end.should include("foo=;", "expires=", "1970 00:00:00")
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'honours the app cookie_options' do
|
201
|
+
@cookie_app.class_eval do
|
202
|
+
set :cookie_options, {
|
203
|
+
:path => '/foo',
|
204
|
+
:domain => 'bar.com',
|
205
|
+
:secure => true,
|
206
|
+
:httponly => true
|
207
|
+
}
|
208
|
+
end
|
209
|
+
cookie_header = cookie_route("foo=bar") do
|
210
|
+
cookies.delete 'foo'
|
211
|
+
response['Set-Cookie']
|
212
|
+
end
|
213
|
+
cookie_header.should include("path=/foo;", "domain=bar.com;", "secure;", "HttpOnly")
|
198
214
|
end
|
199
215
|
|
200
216
|
it 'does not touch other cookies' do
|
@@ -466,7 +482,11 @@ describe Sinatra::Cookies do
|
|
466
482
|
end
|
467
483
|
|
468
484
|
it 'raises an exception if key does not exist' do
|
469
|
-
error =
|
485
|
+
error = if defined? JRUBY_VERSION
|
486
|
+
IndexError
|
487
|
+
else
|
488
|
+
RUBY_VERSION >= '1.9' ? KeyError : IndexError
|
489
|
+
end
|
470
490
|
expect { cookies.fetch('foo') }.to raise_exception(error)
|
471
491
|
end
|
472
492
|
|
data/spec/json_spec.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'backports'
|
2
|
+
require 'multi_json'
|
3
|
+
|
2
4
|
require_relative 'spec_helper'
|
3
5
|
require_relative 'okjson'
|
4
6
|
|
@@ -41,8 +43,8 @@ describe Sinatra::JSON do
|
|
41
43
|
end
|
42
44
|
|
43
45
|
it "encodes objects to json out of the box" do
|
44
|
-
mock_app { get('/') { json :foo => [1, 'bar'] } }
|
45
|
-
results_in 'foo' => [1, 'bar']
|
46
|
+
mock_app { get('/') { json :foo => [1, 'bar', nil] } }
|
47
|
+
results_in 'foo' => [1, 'bar', nil]
|
46
48
|
end
|
47
49
|
|
48
50
|
it "sets the content type to 'application/json'" do
|
@@ -107,7 +109,7 @@ describe Sinatra::JSON do
|
|
107
109
|
get('/').body.should == '42'
|
108
110
|
end
|
109
111
|
|
110
|
-
describe('Yajl') { it_should_behave_like "a json encoder", "yajl", "Yajl::Encoder" }
|
112
|
+
describe('Yajl') { it_should_behave_like "a json encoder", "yajl", "Yajl::Encoder" } unless defined? JRUBY_VERSION
|
111
113
|
describe('JSON') { it_should_behave_like "a json encoder", "json", "::JSON" }
|
112
114
|
describe('OkJson') { it_should_behave_like "a json encoder", nil, "OkJson" }
|
113
115
|
describe('to_json') { it_should_behave_like "a json encoder", "json", ":to_json" }
|
data/spec/multi_route_spec.rb
CHANGED
@@ -2,25 +2,23 @@ require 'backports'
|
|
2
2
|
require_relative 'spec_helper'
|
3
3
|
|
4
4
|
describe Sinatra::MultiRoute do
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
it 'does not break normal routing' do
|
7
7
|
mock_app do
|
8
|
-
set(:some_condition) { |_| count += 1 }
|
9
8
|
register Sinatra::MultiRoute
|
10
9
|
get('/') { 'normal' }
|
11
|
-
get('/foo', '/bar', :some_condition => true) { 'paths' }
|
12
|
-
route('PUT', 'POST', '/') { 'verb' }
|
13
|
-
route(:get, '/baz') { 'symbol as verb' }
|
14
10
|
end
|
15
|
-
@count = count
|
16
|
-
end
|
17
11
|
|
18
|
-
it 'does still allow normal routing' do
|
19
12
|
get('/').should be_ok
|
20
13
|
body.should be == 'normal'
|
21
14
|
end
|
22
15
|
|
23
|
-
it 'supports
|
16
|
+
it 'supports multiple routes' do
|
17
|
+
mock_app do
|
18
|
+
register Sinatra::MultiRoute
|
19
|
+
get('/foo', '/bar') { 'paths' }
|
20
|
+
end
|
21
|
+
|
24
22
|
get('/foo').should be_ok
|
25
23
|
body.should be == 'paths'
|
26
24
|
get('/bar').should be_ok
|
@@ -28,10 +26,22 @@ describe Sinatra::MultiRoute do
|
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'triggers conditions' do
|
31
|
-
|
29
|
+
count = 0
|
30
|
+
mock_app do
|
31
|
+
register Sinatra::MultiRoute
|
32
|
+
set(:some_condition) { |_| count += 1 }
|
33
|
+
get('/foo', '/bar', :some_condition => true) { 'paths' }
|
34
|
+
end
|
35
|
+
|
36
|
+
count.should be == 4
|
32
37
|
end
|
33
38
|
|
34
|
-
it 'supports
|
39
|
+
it 'supports multiple verbs' do
|
40
|
+
mock_app do
|
41
|
+
register Sinatra::MultiRoute
|
42
|
+
route('PUT', 'POST', '/') { 'verb' }
|
43
|
+
end
|
44
|
+
|
35
45
|
post('/').should be_ok
|
36
46
|
body.should be == 'verb'
|
37
47
|
put('/').should be_ok
|
@@ -39,7 +49,12 @@ describe Sinatra::MultiRoute do
|
|
39
49
|
end
|
40
50
|
|
41
51
|
it 'takes symbols as verbs' do
|
52
|
+
mock_app do
|
53
|
+
register Sinatra::MultiRoute
|
54
|
+
route(:get, '/baz') { 'symbol as verb' }
|
55
|
+
end
|
56
|
+
|
42
57
|
get('/baz').should be_ok
|
43
58
|
body.should be == 'symbol as verb'
|
44
59
|
end
|
45
|
-
end
|
60
|
+
end
|