sinatra 1.3.6 → 1.4.0.a
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/CHANGES +96 -22
- data/Gemfile +11 -3
- data/README.de.md +2590 -0
- data/README.es.rdoc +66 -38
- data/README.fr.md +2630 -0
- data/README.hu.rdoc +3 -2
- data/README.jp.rdoc +16 -3
- data/README.ko.rdoc +11 -5
- data/README.md +2699 -0
- data/README.pt-br.rdoc +152 -21
- data/README.pt-pt.rdoc +3 -2
- data/README.ru.md +2724 -0
- data/README.zh.rdoc +3 -3
- data/Rakefile +3 -4
- data/examples/chat.rb +3 -3
- data/lib/sinatra/base.rb +433 -247
- data/lib/sinatra/main.rb +4 -2
- data/lib/sinatra/showexceptions.rb +6 -1
- data/lib/sinatra/version.rb +1 -1
- data/test/base_test.rb +21 -9
- data/test/builder_test.rb +15 -19
- data/test/coffee_test.rb +4 -6
- data/test/compile_test.rb +154 -0
- data/test/contest.rb +4 -6
- data/test/creole_test.rb +5 -5
- data/test/delegator_test.rb +1 -3
- data/test/erb_test.rb +32 -20
- data/test/extensions_test.rb +1 -3
- data/test/filter_test.rb +65 -56
- data/test/haml_test.rb +34 -26
- data/test/helpers_test.rb +331 -221
- data/test/integration_helper.rb +8 -0
- data/test/integration_test.rb +3 -1
- data/test/less_test.rb +10 -8
- data/test/liquid_test.rb +22 -4
- data/test/mapped_error_test.rb +122 -96
- data/test/markaby_test.rb +5 -5
- data/test/markdown_test.rb +5 -5
- data/test/middleware_test.rb +3 -3
- data/test/nokogiri_test.rb +4 -6
- data/test/rabl_test.rb +89 -0
- data/test/radius_test.rb +4 -4
- data/test/rdoc_test.rb +7 -7
- data/test/readme_test.rb +14 -30
- data/test/request_test.rb +15 -0
- data/test/response_test.rb +3 -4
- data/test/result_test.rb +11 -33
- data/test/route_added_hook_test.rb +10 -10
- data/test/routing_test.rb +123 -1
- data/test/sass_test.rb +26 -26
- data/test/scss_test.rb +16 -16
- data/test/server_test.rb +2 -2
- data/test/settings_test.rb +48 -4
- data/test/sinatra_test.rb +2 -7
- data/test/slim_test.rb +37 -23
- data/test/static_test.rb +56 -15
- data/test/streaming_test.rb +11 -2
- data/test/templates_test.rb +117 -45
- data/test/textile_test.rb +9 -9
- data/test/views/hello.rabl +2 -0
- data/test/views/hello.wlang +1 -0
- data/test/views/hello.yajl +1 -0
- data/test/views/layout2.rabl +3 -0
- data/test/views/layout2.wlang +2 -0
- data/test/wlang_test.rb +87 -0
- data/test/yajl_test.rb +86 -0
- metadata +27 -17
- data/README.de.rdoc +0 -2097
- data/README.fr.rdoc +0 -2036
- data/README.rdoc +0 -2017
- data/README.ru.rdoc +0 -1785
data/test/extensions_test.rb
CHANGED
@@ -42,9 +42,7 @@ class ExtensionsTest < Test::Unit::TestCase
|
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'allows extending by passing a block' do
|
45
|
-
Sinatra::Base.register {
|
46
|
-
def im_in_ur_anonymous_module; end
|
47
|
-
}
|
45
|
+
Sinatra::Base.register { def im_in_ur_anonymous_module; end }
|
48
46
|
assert Sinatra::Base.respond_to?(:im_in_ur_anonymous_module)
|
49
47
|
end
|
50
48
|
|
data/test/filter_test.rb
CHANGED
@@ -5,14 +5,14 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
5
5
|
count = 0
|
6
6
|
mock_app do
|
7
7
|
get('/') { 'Hello World' }
|
8
|
-
before
|
8
|
+
before do
|
9
9
|
assert_equal 0, count
|
10
10
|
count = 1
|
11
|
-
|
12
|
-
before
|
11
|
+
end
|
12
|
+
before do
|
13
13
|
assert_equal 1, count
|
14
14
|
count = 2
|
15
|
-
|
15
|
+
end
|
16
16
|
end
|
17
17
|
|
18
18
|
get '/'
|
@@ -22,11 +22,11 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "can modify the request" do
|
25
|
-
mock_app
|
25
|
+
mock_app do
|
26
26
|
get('/foo') { 'foo' }
|
27
27
|
get('/bar') { 'bar' }
|
28
28
|
before { request.path_info = '/bar' }
|
29
|
-
|
29
|
+
end
|
30
30
|
|
31
31
|
get '/foo'
|
32
32
|
assert ok?
|
@@ -34,10 +34,10 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "can modify instance variables available to routes" do
|
37
|
-
mock_app
|
37
|
+
mock_app do
|
38
38
|
before { @foo = 'bar' }
|
39
39
|
get('/foo') { @foo }
|
40
|
-
|
40
|
+
end
|
41
41
|
|
42
42
|
get '/foo'
|
43
43
|
assert ok?
|
@@ -45,13 +45,13 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "allows redirects" do
|
48
|
-
mock_app
|
48
|
+
mock_app do
|
49
49
|
before { redirect '/bar' }
|
50
50
|
get('/foo') do
|
51
51
|
fail 'before block should have halted processing'
|
52
52
|
'ORLY?!'
|
53
53
|
end
|
54
|
-
|
54
|
+
end
|
55
55
|
|
56
56
|
get '/foo'
|
57
57
|
assert redirect?
|
@@ -60,13 +60,13 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
60
60
|
end
|
61
61
|
|
62
62
|
it "does not modify the response with its return value" do
|
63
|
-
mock_app
|
63
|
+
mock_app do
|
64
64
|
before { 'Hello World!' }
|
65
|
-
get
|
65
|
+
get('/foo') do
|
66
66
|
assert_equal [], response.body
|
67
67
|
'cool'
|
68
68
|
end
|
69
|
-
|
69
|
+
end
|
70
70
|
|
71
71
|
get '/foo'
|
72
72
|
assert ok?
|
@@ -74,12 +74,12 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "does modify the response with halt" do
|
77
|
-
mock_app
|
77
|
+
mock_app do
|
78
78
|
before { halt 302, 'Hi' }
|
79
79
|
get '/foo' do
|
80
80
|
"should not happen"
|
81
81
|
end
|
82
|
-
|
82
|
+
end
|
83
83
|
|
84
84
|
get '/foo'
|
85
85
|
assert_equal 302, response.status
|
@@ -87,10 +87,10 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
87
87
|
end
|
88
88
|
|
89
89
|
it "gives you access to params" do
|
90
|
-
mock_app
|
90
|
+
mock_app do
|
91
91
|
before { @foo = params['foo'] }
|
92
92
|
get('/foo') { @foo }
|
93
|
-
|
93
|
+
end
|
94
94
|
|
95
95
|
get '/foo?foo=cool'
|
96
96
|
assert ok?
|
@@ -98,10 +98,10 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it "properly unescapes parameters" do
|
101
|
-
mock_app
|
101
|
+
mock_app do
|
102
102
|
before { @foo = params['foo'] }
|
103
103
|
get('/foo') { @foo }
|
104
|
-
|
104
|
+
end
|
105
105
|
|
106
106
|
get '/foo?foo=bar%3Abaz%2Fbend'
|
107
107
|
assert ok?
|
@@ -112,9 +112,7 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
112
112
|
base = Class.new(Sinatra::Base)
|
113
113
|
base.before { @foo = 'hello from superclass' }
|
114
114
|
|
115
|
-
mock_app(base) {
|
116
|
-
get('/foo') { @foo }
|
117
|
-
}
|
115
|
+
mock_app(base) { get('/foo') { @foo } }
|
118
116
|
|
119
117
|
get '/foo'
|
120
118
|
assert_equal 'hello from superclass', body
|
@@ -122,11 +120,11 @@ class BeforeFilterTest < Test::Unit::TestCase
|
|
122
120
|
|
123
121
|
it 'does not run before filter when serving static files' do
|
124
122
|
ran_filter = false
|
125
|
-
mock_app
|
123
|
+
mock_app do
|
126
124
|
before { ran_filter = true }
|
127
125
|
set :static, true
|
128
126
|
set :public_folder, File.dirname(__FILE__)
|
129
|
-
|
127
|
+
end
|
130
128
|
get "/#{File.basename(__FILE__)}"
|
131
129
|
assert ok?
|
132
130
|
assert_equal File.read(__FILE__), body
|
@@ -176,14 +174,14 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
176
174
|
count = 0
|
177
175
|
mock_app do
|
178
176
|
get('/') { 'Hello World' }
|
179
|
-
after
|
177
|
+
after do
|
180
178
|
assert_equal 0, count
|
181
179
|
count = 1
|
182
|
-
|
183
|
-
after
|
180
|
+
end
|
181
|
+
after do
|
184
182
|
assert_equal 1, count
|
185
183
|
count = 2
|
186
|
-
|
184
|
+
end
|
187
185
|
end
|
188
186
|
|
189
187
|
get '/'
|
@@ -193,10 +191,10 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
193
191
|
end
|
194
192
|
|
195
193
|
it "allows redirects" do
|
196
|
-
mock_app
|
194
|
+
mock_app do
|
197
195
|
get('/foo') { 'ORLY' }
|
198
196
|
after { redirect '/bar' }
|
199
|
-
|
197
|
+
end
|
200
198
|
|
201
199
|
get '/foo'
|
202
200
|
assert redirect?
|
@@ -205,10 +203,10 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
205
203
|
end
|
206
204
|
|
207
205
|
it "does not modify the response with its return value" do
|
208
|
-
mock_app
|
206
|
+
mock_app do
|
209
207
|
get('/foo') { 'cool' }
|
210
208
|
after { 'Hello World!' }
|
211
|
-
|
209
|
+
end
|
212
210
|
|
213
211
|
get '/foo'
|
214
212
|
assert ok?
|
@@ -216,12 +214,12 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
216
214
|
end
|
217
215
|
|
218
216
|
it "does modify the response with halt" do
|
219
|
-
mock_app
|
217
|
+
mock_app do
|
220
218
|
get '/foo' do
|
221
219
|
"should not be returned"
|
222
220
|
end
|
223
221
|
after { halt 302, 'Hi' }
|
224
|
-
|
222
|
+
end
|
225
223
|
|
226
224
|
get '/foo'
|
227
225
|
assert_equal 302, response.status
|
@@ -245,11 +243,11 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
245
243
|
|
246
244
|
it 'does not run after filter when serving static files' do
|
247
245
|
ran_filter = false
|
248
|
-
mock_app
|
246
|
+
mock_app do
|
249
247
|
after { ran_filter = true }
|
250
248
|
set :static, true
|
251
249
|
set :public_folder, File.dirname(__FILE__)
|
252
|
-
|
250
|
+
end
|
253
251
|
get "/#{File.basename(__FILE__)}"
|
254
252
|
assert ok?
|
255
253
|
assert_equal File.read(__FILE__), body
|
@@ -308,9 +306,9 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
308
306
|
before(:host_name => 'example.com') { ran = true }
|
309
307
|
get('/') { 'welcome' }
|
310
308
|
end
|
311
|
-
get
|
309
|
+
get('/', {}, { 'HTTP_HOST' => 'example.org' })
|
312
310
|
assert !ran
|
313
|
-
get
|
311
|
+
get('/', {}, { 'HTTP_HOST' => 'example.com' })
|
314
312
|
assert ran
|
315
313
|
end
|
316
314
|
|
@@ -320,11 +318,11 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
320
318
|
before('/foo', :host_name => 'example.com') { ran = true }
|
321
319
|
get('/') { 'welcome' }
|
322
320
|
end
|
323
|
-
get
|
321
|
+
get('/', {}, { 'HTTP_HOST' => 'example.com' })
|
324
322
|
assert !ran
|
325
|
-
get
|
323
|
+
get('/foo', {}, { 'HTTP_HOST' => 'example.org' })
|
326
324
|
assert !ran
|
327
|
-
get
|
325
|
+
get('/foo', {}, { 'HTTP_HOST' => 'example.com' })
|
328
326
|
assert ran
|
329
327
|
end
|
330
328
|
|
@@ -334,9 +332,9 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
334
332
|
after(:host_name => 'example.com') { ran = true }
|
335
333
|
get('/') { 'welcome' }
|
336
334
|
end
|
337
|
-
get
|
335
|
+
get('/', {}, { 'HTTP_HOST' => 'example.org' })
|
338
336
|
assert !ran
|
339
|
-
get
|
337
|
+
get('/', {}, { 'HTTP_HOST' => 'example.com' })
|
340
338
|
assert ran
|
341
339
|
end
|
342
340
|
|
@@ -346,11 +344,11 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
346
344
|
after('/foo', :host_name => 'example.com') { ran = true }
|
347
345
|
get('/') { 'welcome' }
|
348
346
|
end
|
349
|
-
get
|
347
|
+
get('/', {}, { 'HTTP_HOST' => 'example.com' })
|
350
348
|
assert !ran
|
351
|
-
get
|
349
|
+
get('/foo', {}, { 'HTTP_HOST' => 'example.org' })
|
352
350
|
assert !ran
|
353
|
-
get
|
351
|
+
get('/foo', {}, { 'HTTP_HOST' => 'example.com' })
|
354
352
|
assert ran
|
355
353
|
end
|
356
354
|
|
@@ -360,9 +358,9 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
360
358
|
before(:user_agent => /foo/) { ran = true }
|
361
359
|
get('/') { 'welcome' }
|
362
360
|
end
|
363
|
-
get
|
361
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'bar' })
|
364
362
|
assert !ran
|
365
|
-
get
|
363
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
366
364
|
assert ran
|
367
365
|
end
|
368
366
|
|
@@ -372,11 +370,11 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
372
370
|
before('/foo', :user_agent => /foo/) { ran = true }
|
373
371
|
get('/') { 'welcome' }
|
374
372
|
end
|
375
|
-
get
|
373
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
376
374
|
assert !ran
|
377
|
-
get
|
375
|
+
get('/foo', {}, { 'HTTP_USER_AGENT' => 'bar' })
|
378
376
|
assert !ran
|
379
|
-
get
|
377
|
+
get('/foo', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
380
378
|
assert ran
|
381
379
|
end
|
382
380
|
|
@@ -406,9 +404,9 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
406
404
|
after(:user_agent => /foo/) { ran = true }
|
407
405
|
get('/') { 'welcome' }
|
408
406
|
end
|
409
|
-
get
|
407
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'bar' })
|
410
408
|
assert !ran
|
411
|
-
get
|
409
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
412
410
|
assert ran
|
413
411
|
end
|
414
412
|
|
@@ -418,11 +416,22 @@ class AfterFilterTest < Test::Unit::TestCase
|
|
418
416
|
after('/foo', :user_agent => /foo/) { ran = true }
|
419
417
|
get('/') { 'welcome' }
|
420
418
|
end
|
421
|
-
get
|
419
|
+
get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
422
420
|
assert !ran
|
423
|
-
get
|
421
|
+
get('/foo', {}, { 'HTTP_USER_AGENT' => 'bar' })
|
424
422
|
assert !ran
|
425
|
-
get
|
423
|
+
get('/foo', {}, { 'HTTP_USER_AGENT' => 'foo' })
|
426
424
|
assert ran
|
427
425
|
end
|
426
|
+
|
427
|
+
it 'only triggeres provides condition if conforms with current Content-Type' do
|
428
|
+
mock_app do
|
429
|
+
before(:provides => :txt) { @type = 'txt' }
|
430
|
+
before(:provides => :html) { @type = 'html' }
|
431
|
+
get('/') { @type }
|
432
|
+
end
|
433
|
+
|
434
|
+
get('/', {}, { 'HTTP_ACCEPT' => '*/*' })
|
435
|
+
assert_body 'txt'
|
436
|
+
end
|
428
437
|
end
|
data/test/haml_test.rb
CHANGED
@@ -5,10 +5,10 @@ require 'haml'
|
|
5
5
|
|
6
6
|
class HAMLTest < Test::Unit::TestCase
|
7
7
|
def haml_app(&block)
|
8
|
-
mock_app
|
8
|
+
mock_app do
|
9
9
|
set :views, File.dirname(__FILE__) + '/views'
|
10
|
-
get
|
11
|
-
|
10
|
+
get('/', &block)
|
11
|
+
end
|
12
12
|
get '/'
|
13
13
|
end
|
14
14
|
|
@@ -25,35 +25,29 @@ class HAMLTest < Test::Unit::TestCase
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "renders with inline layouts" do
|
28
|
-
mock_app
|
28
|
+
mock_app do
|
29
29
|
layout { %q(%h1= 'THIS. IS. ' + yield.upcase) }
|
30
30
|
get('/') { haml '%em Sparta' }
|
31
|
-
|
31
|
+
end
|
32
32
|
get '/'
|
33
33
|
assert ok?
|
34
34
|
assert_equal "<h1>THIS. IS. <EM>SPARTA</EM></h1>\n", body
|
35
35
|
end
|
36
36
|
|
37
37
|
it "renders with file layouts" do
|
38
|
-
haml_app {
|
39
|
-
haml 'Hello World', :layout => :layout2
|
40
|
-
}
|
38
|
+
haml_app { haml 'Hello World', :layout => :layout2 }
|
41
39
|
assert ok?
|
42
40
|
assert_equal "<h1>HAML Layout!</h1>\n<p>Hello World</p>\n", body
|
43
41
|
end
|
44
42
|
|
45
43
|
it "raises error if template not found" do
|
46
|
-
mock_app {
|
47
|
-
get('/') { haml :no_such_template }
|
48
|
-
}
|
44
|
+
mock_app { get('/') { haml :no_such_template } }
|
49
45
|
assert_raise(Errno::ENOENT) { get('/') }
|
50
46
|
end
|
51
47
|
|
52
48
|
it "passes HAML options to the Haml engine" do
|
53
49
|
mock_app {
|
54
|
-
get
|
55
|
-
haml "!!!\n%h1 Hello World", :format => :html5
|
56
|
-
end
|
50
|
+
get('/') { haml "!!!\n%h1 Hello World", :format => :html5 }
|
57
51
|
}
|
58
52
|
get '/'
|
59
53
|
assert ok?
|
@@ -61,27 +55,23 @@ class HAMLTest < Test::Unit::TestCase
|
|
61
55
|
end
|
62
56
|
|
63
57
|
it "passes default HAML options to the Haml engine" do
|
64
|
-
mock_app
|
58
|
+
mock_app do
|
65
59
|
set :haml, {:format => :html5}
|
66
|
-
get
|
67
|
-
|
68
|
-
end
|
69
|
-
}
|
60
|
+
get('/') { haml "!!!\n%h1 Hello World" }
|
61
|
+
end
|
70
62
|
get '/'
|
71
63
|
assert ok?
|
72
64
|
assert_equal "<!DOCTYPE html>\n<h1>Hello World</h1>\n", body
|
73
65
|
end
|
74
66
|
|
75
67
|
it "merges the default HAML options with the overrides and passes them to the Haml engine" do
|
76
|
-
mock_app
|
68
|
+
mock_app do
|
77
69
|
set :haml, {:format => :html5, :attr_wrapper => '"'} # default HAML attr are <tag attr='single-quoted'>
|
78
|
-
get
|
79
|
-
|
80
|
-
end
|
81
|
-
get '/html4' do
|
70
|
+
get('/') { haml "!!!\n%h1{:class => :header} Hello World" }
|
71
|
+
get('/html4') {
|
82
72
|
haml "!!!\n%h1{:class => 'header'} Hello World", :format => :html4
|
83
|
-
|
84
|
-
|
73
|
+
}
|
74
|
+
end
|
85
75
|
get '/'
|
86
76
|
assert ok?
|
87
77
|
assert_equal "<!DOCTYPE html>\n<h1 class=\"header\">Hello World</h1>\n", body
|
@@ -94,6 +84,24 @@ class HAMLTest < Test::Unit::TestCase
|
|
94
84
|
haml_app { haml "= foo", :locals => { :foo => 'bar' }}
|
95
85
|
assert_equal "bar\n", body
|
96
86
|
end
|
87
|
+
|
88
|
+
it "can rendere truly nested layouts by accepting a layout and a block with the contents" do
|
89
|
+
mock_app do
|
90
|
+
template(:main_outer_layout) { "%h1 Title\n= yield" }
|
91
|
+
template(:an_inner_layout) { "%h2 Subtitle\n= yield" }
|
92
|
+
template(:a_page) { "%p Contents." }
|
93
|
+
get('/') do
|
94
|
+
haml :main_outer_layout, :layout => false do
|
95
|
+
haml :an_inner_layout do
|
96
|
+
haml :a_page
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
get '/'
|
102
|
+
assert ok?
|
103
|
+
assert_body "<h1>Title</h1>\n<h2>Subtitle</h2>\n<p>Contents.</p>\n"
|
104
|
+
end
|
97
105
|
end
|
98
106
|
|
99
107
|
rescue LoadError
|