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.

Files changed (71) hide show
  1. data/CHANGES +96 -22
  2. data/Gemfile +11 -3
  3. data/README.de.md +2590 -0
  4. data/README.es.rdoc +66 -38
  5. data/README.fr.md +2630 -0
  6. data/README.hu.rdoc +3 -2
  7. data/README.jp.rdoc +16 -3
  8. data/README.ko.rdoc +11 -5
  9. data/README.md +2699 -0
  10. data/README.pt-br.rdoc +152 -21
  11. data/README.pt-pt.rdoc +3 -2
  12. data/README.ru.md +2724 -0
  13. data/README.zh.rdoc +3 -3
  14. data/Rakefile +3 -4
  15. data/examples/chat.rb +3 -3
  16. data/lib/sinatra/base.rb +433 -247
  17. data/lib/sinatra/main.rb +4 -2
  18. data/lib/sinatra/showexceptions.rb +6 -1
  19. data/lib/sinatra/version.rb +1 -1
  20. data/test/base_test.rb +21 -9
  21. data/test/builder_test.rb +15 -19
  22. data/test/coffee_test.rb +4 -6
  23. data/test/compile_test.rb +154 -0
  24. data/test/contest.rb +4 -6
  25. data/test/creole_test.rb +5 -5
  26. data/test/delegator_test.rb +1 -3
  27. data/test/erb_test.rb +32 -20
  28. data/test/extensions_test.rb +1 -3
  29. data/test/filter_test.rb +65 -56
  30. data/test/haml_test.rb +34 -26
  31. data/test/helpers_test.rb +331 -221
  32. data/test/integration_helper.rb +8 -0
  33. data/test/integration_test.rb +3 -1
  34. data/test/less_test.rb +10 -8
  35. data/test/liquid_test.rb +22 -4
  36. data/test/mapped_error_test.rb +122 -96
  37. data/test/markaby_test.rb +5 -5
  38. data/test/markdown_test.rb +5 -5
  39. data/test/middleware_test.rb +3 -3
  40. data/test/nokogiri_test.rb +4 -6
  41. data/test/rabl_test.rb +89 -0
  42. data/test/radius_test.rb +4 -4
  43. data/test/rdoc_test.rb +7 -7
  44. data/test/readme_test.rb +14 -30
  45. data/test/request_test.rb +15 -0
  46. data/test/response_test.rb +3 -4
  47. data/test/result_test.rb +11 -33
  48. data/test/route_added_hook_test.rb +10 -10
  49. data/test/routing_test.rb +123 -1
  50. data/test/sass_test.rb +26 -26
  51. data/test/scss_test.rb +16 -16
  52. data/test/server_test.rb +2 -2
  53. data/test/settings_test.rb +48 -4
  54. data/test/sinatra_test.rb +2 -7
  55. data/test/slim_test.rb +37 -23
  56. data/test/static_test.rb +56 -15
  57. data/test/streaming_test.rb +11 -2
  58. data/test/templates_test.rb +117 -45
  59. data/test/textile_test.rb +9 -9
  60. data/test/views/hello.rabl +2 -0
  61. data/test/views/hello.wlang +1 -0
  62. data/test/views/hello.yajl +1 -0
  63. data/test/views/layout2.rabl +3 -0
  64. data/test/views/layout2.wlang +2 -0
  65. data/test/wlang_test.rb +87 -0
  66. data/test/yajl_test.rb +86 -0
  67. metadata +27 -17
  68. data/README.de.rdoc +0 -2097
  69. data/README.fr.rdoc +0 -2036
  70. data/README.rdoc +0 -2017
  71. data/README.ru.rdoc +0 -1785
@@ -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
 
@@ -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 '/foo' do
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 '/', {}, { 'HTTP_HOST' => 'example.org' }
309
+ get('/', {}, { 'HTTP_HOST' => 'example.org' })
312
310
  assert !ran
313
- get '/', {}, { 'HTTP_HOST' => 'example.com' }
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 '/', {}, { 'HTTP_HOST' => 'example.com' }
321
+ get('/', {}, { 'HTTP_HOST' => 'example.com' })
324
322
  assert !ran
325
- get '/foo', {}, { 'HTTP_HOST' => 'example.org' }
323
+ get('/foo', {}, { 'HTTP_HOST' => 'example.org' })
326
324
  assert !ran
327
- get '/foo', {}, { 'HTTP_HOST' => 'example.com' }
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 '/', {}, { 'HTTP_HOST' => 'example.org' }
335
+ get('/', {}, { 'HTTP_HOST' => 'example.org' })
338
336
  assert !ran
339
- get '/', {}, { 'HTTP_HOST' => 'example.com' }
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 '/', {}, { 'HTTP_HOST' => 'example.com' }
347
+ get('/', {}, { 'HTTP_HOST' => 'example.com' })
350
348
  assert !ran
351
- get '/foo', {}, { 'HTTP_HOST' => 'example.org' }
349
+ get('/foo', {}, { 'HTTP_HOST' => 'example.org' })
352
350
  assert !ran
353
- get '/foo', {}, { 'HTTP_HOST' => 'example.com' }
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 '/', {}, { 'HTTP_USER_AGENT' => 'bar' }
361
+ get('/', {}, { 'HTTP_USER_AGENT' => 'bar' })
364
362
  assert !ran
365
- get '/', {}, { 'HTTP_USER_AGENT' => 'foo' }
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 '/', {}, { 'HTTP_USER_AGENT' => 'foo' }
373
+ get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
376
374
  assert !ran
377
- get '/foo', {}, { 'HTTP_USER_AGENT' => 'bar' }
375
+ get('/foo', {}, { 'HTTP_USER_AGENT' => 'bar' })
378
376
  assert !ran
379
- get '/foo', {}, { 'HTTP_USER_AGENT' => 'foo' }
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 '/', {}, { 'HTTP_USER_AGENT' => 'bar' }
407
+ get('/', {}, { 'HTTP_USER_AGENT' => 'bar' })
410
408
  assert !ran
411
- get '/', {}, { 'HTTP_USER_AGENT' => 'foo' }
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 '/', {}, { 'HTTP_USER_AGENT' => 'foo' }
419
+ get('/', {}, { 'HTTP_USER_AGENT' => 'foo' })
422
420
  assert !ran
423
- get '/foo', {}, { 'HTTP_USER_AGENT' => 'bar' }
421
+ get('/foo', {}, { 'HTTP_USER_AGENT' => 'bar' })
424
422
  assert !ran
425
- get '/foo', {}, { 'HTTP_USER_AGENT' => 'foo' }
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
@@ -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 '/', &block
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 '/' do
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 '/' do
67
- haml "!!!\n%h1 Hello World"
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 '/' do
79
- haml "!!!\n%h1{:class => :header} Hello World"
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
- end
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