sinatra 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/ChangeLog +64 -0
- data/LICENSE +1 -1
- data/README.rdoc +244 -141
- data/Rakefile +111 -0
- data/lib/sinatra.rb +942 -627
- data/{vendor/rack/lib → lib/sinatra}/rack/handler/mongrel.rb +10 -3
- data/lib/sinatra/test/methods.rb +56 -36
- data/lib/sinatra/test/rspec.rb +10 -0
- data/lib/sinatra/test/spec.rb +2 -2
- data/lib/sinatra/test/unit.rb +1 -1
- data/sinatra.gemspec +71 -43
- data/test/app_test.rb +181 -32
- data/test/application_test.rb +179 -36
- data/test/custom_error_test.rb +17 -22
- data/test/erb_test.rb +42 -22
- data/test/event_context_test.rb +3 -3
- data/test/events_test.rb +8 -11
- data/test/filter_test.rb +30 -0
- data/test/haml_test.rb +83 -31
- data/test/helper.rb +6 -3
- data/test/mapped_error_test.rb +32 -21
- data/test/pipeline_test.rb +66 -0
- data/test/sass_test.rb +7 -7
- data/test/sessions_test.rb +8 -9
- data/test/streaming_test.rb +10 -4
- data/test/sym_params_test.rb +1 -1
- data/test/template_test.rb +11 -11
- data/test/use_in_file_templates_test.rb +9 -10
- metadata +22 -101
- data/CHANGELOG +0 -3
- data/Manifest +0 -122
- data/index.html +0 -9
- data/test/diddy_test.rb +0 -41
- data/test/rest_test.rb +0 -16
- data/vendor/rack/AUTHORS +0 -7
- data/vendor/rack/COPYING +0 -18
- data/vendor/rack/KNOWN-ISSUES +0 -18
- data/vendor/rack/README +0 -242
- data/vendor/rack/Rakefile +0 -174
- data/vendor/rack/bin/rackup +0 -153
- data/vendor/rack/contrib/rack_logo.svg +0 -111
- data/vendor/rack/example/lobster.ru +0 -4
- data/vendor/rack/example/protectedlobster.rb +0 -14
- data/vendor/rack/example/protectedlobster.ru +0 -8
- data/vendor/rack/lib/rack.rb +0 -92
- data/vendor/rack/lib/rack/adapter/camping.rb +0 -22
- data/vendor/rack/lib/rack/auth/abstract/handler.rb +0 -28
- data/vendor/rack/lib/rack/auth/abstract/request.rb +0 -37
- data/vendor/rack/lib/rack/auth/basic.rb +0 -58
- data/vendor/rack/lib/rack/auth/digest/md5.rb +0 -124
- data/vendor/rack/lib/rack/auth/digest/nonce.rb +0 -51
- data/vendor/rack/lib/rack/auth/digest/params.rb +0 -55
- data/vendor/rack/lib/rack/auth/digest/request.rb +0 -40
- data/vendor/rack/lib/rack/auth/openid.rb +0 -116
- data/vendor/rack/lib/rack/builder.rb +0 -56
- data/vendor/rack/lib/rack/cascade.rb +0 -36
- data/vendor/rack/lib/rack/commonlogger.rb +0 -56
- data/vendor/rack/lib/rack/file.rb +0 -112
- data/vendor/rack/lib/rack/handler/cgi.rb +0 -57
- data/vendor/rack/lib/rack/handler/fastcgi.rb +0 -83
- data/vendor/rack/lib/rack/handler/lsws.rb +0 -52
- data/vendor/rack/lib/rack/handler/scgi.rb +0 -57
- data/vendor/rack/lib/rack/handler/webrick.rb +0 -57
- data/vendor/rack/lib/rack/lint.rb +0 -394
- data/vendor/rack/lib/rack/lobster.rb +0 -65
- data/vendor/rack/lib/rack/mock.rb +0 -160
- data/vendor/rack/lib/rack/recursive.rb +0 -57
- data/vendor/rack/lib/rack/reloader.rb +0 -64
- data/vendor/rack/lib/rack/request.rb +0 -197
- data/vendor/rack/lib/rack/response.rb +0 -166
- data/vendor/rack/lib/rack/session/abstract/id.rb +0 -126
- data/vendor/rack/lib/rack/session/cookie.rb +0 -71
- data/vendor/rack/lib/rack/session/memcache.rb +0 -83
- data/vendor/rack/lib/rack/session/pool.rb +0 -67
- data/vendor/rack/lib/rack/showexceptions.rb +0 -344
- data/vendor/rack/lib/rack/showstatus.rb +0 -103
- data/vendor/rack/lib/rack/static.rb +0 -38
- data/vendor/rack/lib/rack/urlmap.rb +0 -48
- data/vendor/rack/lib/rack/utils.rb +0 -240
- data/vendor/rack/test/cgi/lighttpd.conf +0 -20
- data/vendor/rack/test/cgi/test +0 -9
- data/vendor/rack/test/cgi/test.fcgi +0 -7
- data/vendor/rack/test/cgi/test.ru +0 -7
- data/vendor/rack/test/spec_rack_auth_basic.rb +0 -69
- data/vendor/rack/test/spec_rack_auth_digest.rb +0 -169
- data/vendor/rack/test/spec_rack_builder.rb +0 -50
- data/vendor/rack/test/spec_rack_camping.rb +0 -47
- data/vendor/rack/test/spec_rack_cascade.rb +0 -50
- data/vendor/rack/test/spec_rack_cgi.rb +0 -91
- data/vendor/rack/test/spec_rack_commonlogger.rb +0 -32
- data/vendor/rack/test/spec_rack_fastcgi.rb +0 -91
- data/vendor/rack/test/spec_rack_file.rb +0 -40
- data/vendor/rack/test/spec_rack_lint.rb +0 -317
- data/vendor/rack/test/spec_rack_lobster.rb +0 -45
- data/vendor/rack/test/spec_rack_mock.rb +0 -152
- data/vendor/rack/test/spec_rack_mongrel.rb +0 -165
- data/vendor/rack/test/spec_rack_recursive.rb +0 -77
- data/vendor/rack/test/spec_rack_request.rb +0 -384
- data/vendor/rack/test/spec_rack_response.rb +0 -167
- data/vendor/rack/test/spec_rack_session_cookie.rb +0 -49
- data/vendor/rack/test/spec_rack_session_memcache.rb +0 -100
- data/vendor/rack/test/spec_rack_session_pool.rb +0 -84
- data/vendor/rack/test/spec_rack_showexceptions.rb +0 -21
- data/vendor/rack/test/spec_rack_showstatus.rb +0 -71
- data/vendor/rack/test/spec_rack_static.rb +0 -37
- data/vendor/rack/test/spec_rack_urlmap.rb +0 -175
- data/vendor/rack/test/spec_rack_utils.rb +0 -57
- data/vendor/rack/test/spec_rack_webrick.rb +0 -106
- data/vendor/rack/test/testrequest.rb +0 -43
data/test/event_context_test.rb
CHANGED
@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + '/helper'
|
|
3
3
|
context "EventContext" do
|
4
4
|
|
5
5
|
specify "DSLified setters" do
|
6
|
-
|
6
|
+
|
7
7
|
cx = Sinatra::EventContext.new(stub_everything, Rack::Response.new, {})
|
8
8
|
lambda {
|
9
9
|
cx.status 404
|
10
10
|
}.should.not.raise(ArgumentError)
|
11
|
-
|
11
|
+
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
end
|
15
15
|
|
data/test/events_test.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'test/spec'
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
5
2
|
|
6
3
|
context "Simple Events" do
|
7
4
|
|
@@ -16,7 +13,7 @@ context "Simple Events" do
|
|
16
13
|
event = Sinatra::Event.new(path, &b)
|
17
14
|
event.invoke(simple_request_hash(:get, request_path))
|
18
15
|
end
|
19
|
-
|
16
|
+
|
20
17
|
specify "return last value" do
|
21
18
|
block = Proc.new { 'Simple' }
|
22
19
|
result = invoke_simple('/', '/', &block)
|
@@ -24,27 +21,27 @@ context "Simple Events" do
|
|
24
21
|
result.block.should.be block
|
25
22
|
result.params.should.equal Hash.new
|
26
23
|
end
|
27
|
-
|
24
|
+
|
28
25
|
specify "takes params in path" do
|
29
26
|
result = invoke_simple('/:foo/:bar', '/a/b')
|
30
27
|
result.should.not.be.nil
|
31
28
|
result.params.should.equal "foo" => 'a', "bar" => 'b'
|
32
|
-
|
29
|
+
|
33
30
|
# unscapes
|
34
31
|
result = invoke_simple('/:foo/:bar', '/a/blake%20mizerany')
|
35
32
|
result.should.not.be.nil
|
36
33
|
result.params.should.equal "foo" => 'a', "bar" => 'blake mizerany'
|
37
34
|
end
|
38
|
-
|
35
|
+
|
39
36
|
specify "ignores to many /'s" do
|
40
37
|
result = invoke_simple('/x/y', '/x//y')
|
41
38
|
result.should.not.be.nil
|
42
39
|
end
|
43
|
-
|
40
|
+
|
44
41
|
specify "understands splat" do
|
45
42
|
invoke_simple('/foo/*', '/foo/bar').should.not.be.nil
|
46
43
|
invoke_simple('/foo/*', '/foo/bar/baz').should.not.be.nil
|
47
44
|
invoke_simple('/foo/*', '/foo/baz').should.not.be.nil
|
48
|
-
end
|
49
|
-
|
45
|
+
end
|
46
|
+
|
50
47
|
end
|
data/test/filter_test.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
context "before filters" do
|
4
|
+
|
5
|
+
setup do
|
6
|
+
Sinatra.application = nil
|
7
|
+
@app = Sinatra.application
|
8
|
+
end
|
9
|
+
|
10
|
+
specify "should be executed in the order defined" do
|
11
|
+
invoked = 0x0
|
12
|
+
@app.before { invoked = 0x01 }
|
13
|
+
@app.before { invoked |= 0x02 }
|
14
|
+
@app.get('/') { 'Hello World' }
|
15
|
+
get_it '/'
|
16
|
+
should.be.ok
|
17
|
+
body.should.be == 'Hello World'
|
18
|
+
invoked.should.be == 0x03
|
19
|
+
end
|
20
|
+
|
21
|
+
specify "should be capable of modifying the request" do
|
22
|
+
@app.get('/foo') { 'foo' }
|
23
|
+
@app.get('/bar') { 'bar' }
|
24
|
+
@app.before { request.path_info = '/bar' }
|
25
|
+
get_it '/foo'
|
26
|
+
should.be.ok
|
27
|
+
body.should.be == 'bar'
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/test/haml_test.rb
CHANGED
@@ -5,95 +5,95 @@ context "Haml" do
|
|
5
5
|
setup do
|
6
6
|
Sinatra.application = nil
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
context "without layouts" do
|
10
|
-
|
10
|
+
|
11
11
|
setup do
|
12
12
|
Sinatra.application = nil
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
specify "should render" do
|
16
|
-
|
16
|
+
|
17
17
|
get '/no_layout' do
|
18
18
|
haml '== #{1+1}'
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
get_it '/no_layout'
|
22
22
|
should.be.ok
|
23
23
|
body.should == "2\n"
|
24
24
|
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
context "with layouts" do
|
29
29
|
|
30
30
|
setup do
|
31
31
|
Sinatra.application = nil
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
specify "can be inline" do
|
35
|
-
|
35
|
+
|
36
36
|
layout do
|
37
37
|
'== This is #{yield}!'
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
get '/lay' do
|
41
41
|
haml 'Blake'
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
get_it '/lay'
|
45
45
|
should.be.ok
|
46
46
|
body.should.equal "This is Blake\n!\n"
|
47
47
|
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
specify "can use named layouts" do
|
51
|
-
|
51
|
+
|
52
52
|
layout :pretty do
|
53
53
|
'%h1== #{yield}'
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
get '/pretty' do
|
57
57
|
haml 'Foo', :layout => :pretty
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
get '/not_pretty' do
|
61
61
|
haml 'Bar'
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
get_it '/pretty'
|
65
65
|
body.should.equal "<h1>Foo</h1>\n"
|
66
|
-
|
66
|
+
|
67
67
|
get_it '/not_pretty'
|
68
68
|
body.should.equal "Bar\n"
|
69
|
-
|
69
|
+
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
specify "can be read from a file if they're not inlined" do
|
73
|
-
|
73
|
+
|
74
74
|
get '/foo' do
|
75
75
|
@title = 'Welcome to the Hello Program'
|
76
76
|
haml 'Blake', :layout => :foo_layout,
|
77
77
|
:views_directory => File.dirname(__FILE__) + "/views"
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
get_it '/foo'
|
81
81
|
body.should.equal "Welcome to the Hello Program\nHi Blake\n"
|
82
|
-
|
82
|
+
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
specify "can be read from file and layout from text" do
|
86
86
|
get '/foo' do
|
87
87
|
haml 'Test', :layout => '== Foo #{yield}'
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
get_it '/foo'
|
91
|
-
|
91
|
+
|
92
92
|
body.should.equal "Foo Test\n"
|
93
93
|
end
|
94
94
|
|
95
95
|
end
|
96
|
-
|
96
|
+
|
97
97
|
context "Templates (in general)" do
|
98
98
|
|
99
99
|
setup do
|
@@ -136,21 +136,21 @@ context "Haml" do
|
|
136
136
|
body.should.equal "<h1>No Layout!</h1>\n"
|
137
137
|
|
138
138
|
end
|
139
|
-
|
139
|
+
|
140
140
|
specify "can render with no layout" do
|
141
141
|
layout do
|
142
142
|
"X\n= yield\nX"
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
get '/' do
|
146
146
|
haml 'blake', :layout => false
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
get_it '/'
|
150
|
-
|
150
|
+
|
151
151
|
body.should.equal "blake\n"
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
specify "raises error if template not found" do
|
155
155
|
get '/' do
|
156
156
|
haml :not_found
|
@@ -175,7 +175,59 @@ context "Haml" do
|
|
175
175
|
body.should.equal "asdf\n"
|
176
176
|
|
177
177
|
end
|
178
|
-
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
describe 'Options passed to the HAML interpreter' do
|
182
|
+
setup do
|
183
|
+
Sinatra.application = nil
|
184
|
+
end
|
185
|
+
|
186
|
+
specify 'are empty be default' do
|
187
|
+
|
188
|
+
get '/' do
|
189
|
+
haml 'foo'
|
190
|
+
end
|
191
|
+
|
192
|
+
Haml::Engine.expects(:new).with('foo', {}).returns(stub(:render => 'foo'))
|
193
|
+
|
194
|
+
get_it '/'
|
195
|
+
should.be.ok
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
specify 'can be configured by passing :options to haml' do
|
200
|
+
|
201
|
+
get '/' do
|
202
|
+
haml 'foo', :options => {:format => :html4}
|
203
|
+
end
|
204
|
+
|
205
|
+
Haml::Engine.expects(:new).with('foo', {:format => :html4}).returns(stub(:render => 'foo'))
|
206
|
+
|
207
|
+
get_it '/'
|
208
|
+
should.be.ok
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
specify 'can be configured using set_option :haml' do
|
213
|
+
|
214
|
+
configure do
|
215
|
+
set_option :haml, :format => :html4,
|
216
|
+
:escape_html => true
|
217
|
+
end
|
218
|
+
|
219
|
+
get '/' do
|
220
|
+
haml 'foo'
|
221
|
+
end
|
222
|
+
|
223
|
+
Haml::Engine.expects(:new).with('foo', {:format => :html4,
|
224
|
+
:escape_html => true}).returns(stub(:render => 'foo'))
|
225
|
+
|
226
|
+
get_it '/'
|
227
|
+
should.be.ok
|
228
|
+
|
229
|
+
end
|
230
|
+
|
179
231
|
end
|
180
232
|
|
181
233
|
end
|
data/test/helper.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mocha'
|
3
3
|
|
4
|
-
|
4
|
+
$:.unshift File.dirname(File.dirname(__FILE__)) + "/lib"
|
5
|
+
|
6
|
+
require 'sinatra'
|
7
|
+
require 'sinatra/test/spec'
|
data/test/mapped_error_test.rb
CHANGED
@@ -3,59 +3,70 @@ require File.dirname(__FILE__) + '/helper'
|
|
3
3
|
class FooError < RuntimeError; end
|
4
4
|
|
5
5
|
context "Mapped errors" do
|
6
|
-
|
6
|
+
|
7
7
|
setup do
|
8
8
|
Sinatra.application = nil
|
9
|
+
Sinatra.application.options.raise_errors = false
|
9
10
|
end
|
10
|
-
|
11
|
+
|
11
12
|
specify "are rescued and run in context" do
|
12
|
-
|
13
|
+
|
13
14
|
error FooError do
|
14
15
|
'MAPPED ERROR!'
|
15
16
|
end
|
16
|
-
|
17
|
+
|
17
18
|
get '/' do
|
18
|
-
raise FooError
|
19
|
+
raise FooError
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
get_it '/'
|
22
|
-
|
23
|
+
|
23
24
|
should.be.server_error
|
24
25
|
body.should.equal 'MAPPED ERROR!'
|
25
|
-
|
26
|
+
|
26
27
|
end
|
27
28
|
|
28
29
|
specify "renders empty if no each method on result" do
|
29
|
-
|
30
|
+
|
30
31
|
error FooError do
|
31
32
|
nil
|
32
33
|
end
|
33
|
-
|
34
|
+
|
34
35
|
get '/' do
|
35
|
-
raise FooError
|
36
|
+
raise FooError
|
36
37
|
end
|
37
|
-
|
38
|
+
|
38
39
|
get_it '/'
|
39
|
-
|
40
|
+
|
40
41
|
should.be.server_error
|
41
42
|
body.should.be.empty
|
42
|
-
|
43
|
+
|
43
44
|
end
|
44
45
|
|
45
46
|
specify "doesn't override status if set" do
|
46
|
-
|
47
|
+
|
47
48
|
error FooError do
|
48
49
|
status(200)
|
49
50
|
end
|
50
|
-
|
51
|
+
|
51
52
|
get '/' do
|
52
|
-
raise FooError
|
53
|
+
raise FooError
|
53
54
|
end
|
54
|
-
|
55
|
+
|
55
56
|
get_it '/'
|
56
|
-
|
57
|
+
|
57
58
|
should.be.ok
|
58
|
-
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
specify "raises errors when the raise_errors option is set" do
|
63
|
+
Sinatra.application.options.raise_errors = true
|
64
|
+
error FooError do
|
65
|
+
end
|
66
|
+
get '/' do
|
67
|
+
raise FooError
|
68
|
+
end
|
69
|
+
assert_raises(FooError) { get_it('/') }
|
59
70
|
end
|
60
|
-
|
71
|
+
|
61
72
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
class UpcaseMiddleware
|
4
|
+
def initialize(app, *args, &block)
|
5
|
+
@app = app
|
6
|
+
@args = args
|
7
|
+
@block = block
|
8
|
+
end
|
9
|
+
def call(env)
|
10
|
+
env['PATH_INFO'] = env['PATH_INFO'].to_s.upcase
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "Middleware Pipelines" do
|
16
|
+
|
17
|
+
setup do
|
18
|
+
Sinatra.application = nil
|
19
|
+
@app = Sinatra.application
|
20
|
+
end
|
21
|
+
|
22
|
+
teardown do
|
23
|
+
Sinatra.application = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
specify "includes default middleware with options set" do
|
27
|
+
@app.set_options :sessions => true, :logging => true
|
28
|
+
@app.send(:optional_middleware).should.include([Rack::Session::Cookie, [], nil])
|
29
|
+
@app.send(:optional_middleware).should.include([Rack::CommonLogger, [], nil])
|
30
|
+
end
|
31
|
+
|
32
|
+
specify "does not include default middleware with options unset" do
|
33
|
+
@app.set_options :sessions => false, :logging => false
|
34
|
+
@app.send(:optional_middleware).should.not.include([Rack::Session::Cookie, [], nil])
|
35
|
+
@app.send(:optional_middleware).should.not.include([Rack::CommonLogger, [], nil])
|
36
|
+
end
|
37
|
+
|
38
|
+
specify "includes only optional middleware when no explicit middleware added" do
|
39
|
+
@app.set_options :sessions => true, :logging => true
|
40
|
+
@app.send(:middleware).should.equal @app.send(:optional_middleware)
|
41
|
+
end
|
42
|
+
|
43
|
+
specify "should clear middleware before reload" do
|
44
|
+
@app.clearables.should.include(@app.send(:explicit_middleware))
|
45
|
+
end
|
46
|
+
|
47
|
+
specify "should add middleware with use" do
|
48
|
+
block = Proc.new { |env| }
|
49
|
+
@app.use UpcaseMiddleware
|
50
|
+
@app.use UpcaseMiddleware, "foo", "bar"
|
51
|
+
@app.use UpcaseMiddleware, "foo", "bar", &block
|
52
|
+
@app.send(:middleware).should.include([UpcaseMiddleware, [], nil])
|
53
|
+
@app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], nil])
|
54
|
+
@app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], block])
|
55
|
+
end
|
56
|
+
|
57
|
+
specify "should run middleware added with use" do
|
58
|
+
get('/foo') { "FAIL!" }
|
59
|
+
get('/FOO') { "PASS!" }
|
60
|
+
use UpcaseMiddleware
|
61
|
+
get_it '/foo'
|
62
|
+
should.be.ok
|
63
|
+
body.should.equal "PASS!"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|