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
@@ -7,7 +7,7 @@ class MarkabyTest < Test::Unit::TestCase
7
7
  def markaby_app(&block)
8
8
  mock_app do
9
9
  set :views, File.dirname(__FILE__) + '/views'
10
- get '/', &block
10
+ get('/', &block)
11
11
  end
12
12
  get '/'
13
13
  end
@@ -55,7 +55,7 @@ class MarkabyTest < Test::Unit::TestCase
55
55
  assert_equal "<h1>THIS. IS. <em>SPARTA</em></h1>", body
56
56
  end
57
57
 
58
- it 'renders inline markaby blocks with file layouts' do
58
+ it 'renders inline markaby blocks with file layouts' do
59
59
  markaby_app { markaby(:layout => :layout2) { text "Hello World" } }
60
60
  assert ok?
61
61
  assert_equal "<h1>Markaby Layout!</h1><p>Hello World</p>", body
@@ -65,11 +65,11 @@ class MarkabyTest < Test::Unit::TestCase
65
65
  mock_app { get('/') { markaby :no_such_template } }
66
66
  assert_raise(Errno::ENOENT) { get('/') }
67
67
  end
68
-
68
+
69
69
  it "allows passing locals" do
70
- markaby_app do
70
+ markaby_app {
71
71
  markaby 'text value', :locals => { :value => 'foo' }
72
- end
72
+ }
73
73
  assert ok?
74
74
  assert_equal 'foo', body
75
75
  end
@@ -4,7 +4,7 @@ MarkdownTest = proc do
4
4
  def markdown_app(&block)
5
5
  mock_app do
6
6
  set :views, File.dirname(__FILE__) + '/views'
7
- get '/', &block
7
+ get('/', &block)
8
8
  end
9
9
  get '/'
10
10
  end
@@ -48,7 +48,9 @@ MarkdownTest = proc do
48
48
  end
49
49
 
50
50
  it "renders with file layouts" do
51
- markdown_app { markdown 'Hello World', :layout => :layout2, :layout_engine => :erb }
51
+ markdown_app {
52
+ markdown 'Hello World', :layout => :layout2, :layout_engine => :erb
53
+ }
52
54
  assert ok?
53
55
  assert_body "ERB Layout!\n<p>Hello World</p>"
54
56
  end
@@ -57,9 +59,7 @@ MarkdownTest = proc do
57
59
  mock_app do
58
60
  template(:inner) { "hi" }
59
61
  template(:outer) { "<outer><%= markdown :inner %></outer>" }
60
- get '/' do
61
- erb :outer
62
- end
62
+ get('/') { erb :outer }
63
63
  end
64
64
 
65
65
  get '/'
@@ -2,14 +2,14 @@ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class MiddlewareTest < Test::Unit::TestCase
4
4
  setup do
5
- @app = mock_app(Sinatra::Application) {
6
- get '/*' do
5
+ @app = mock_app(Sinatra::Application) do
6
+ get('/*')do
7
7
  response.headers['X-Tests'] = env['test.ran'].
8
8
  map { |n| n.split('::').last }.
9
9
  join(', ')
10
10
  env['PATH_INFO']
11
11
  end
12
- }
12
+ end
13
13
  end
14
14
 
15
15
  class MockMiddleware < Struct.new(:app)
@@ -7,7 +7,7 @@ class NokogiriTest < Test::Unit::TestCase
7
7
  def nokogiri_app(&block)
8
8
  mock_app do
9
9
  set :views, File.dirname(__FILE__) + '/views'
10
- get '/', &block
10
+ get('/', &block)
11
11
  end
12
12
  get '/'
13
13
  end
@@ -21,9 +21,7 @@ class NokogiriTest < Test::Unit::TestCase
21
21
  it 'renders inline blocks' do
22
22
  nokogiri_app do
23
23
  @name = "Frank & Mary"
24
- nokogiri do |xml|
25
- xml.couple @name
26
- end
24
+ nokogiri { |xml| xml.couple @name }
27
25
  end
28
26
  assert ok?
29
27
  assert_body %(<?xml version="1.0"?>\n<couple>Frank &amp; Mary</couple>\n)
@@ -51,9 +49,9 @@ class NokogiriTest < Test::Unit::TestCase
51
49
 
52
50
  it "renders with file layouts" do
53
51
  next if Tilt::VERSION <= "1.1"
54
- nokogiri_app do
52
+ nokogiri_app {
55
53
  nokogiri %(xml.em 'Hello World'), :layout => :layout2
56
- end
54
+ }
57
55
  assert ok?
58
56
  assert_body %(<?xml version="1.0"?>\n<layout>\n <em>Hello World</em>\n</layout>\n)
59
57
  end
@@ -0,0 +1,89 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ begin
4
+ require 'rabl'
5
+ require 'ostruct'
6
+ require 'json'
7
+ require 'active_support/core_ext/hash/conversions'
8
+
9
+ class RablTest < Test::Unit::TestCase
10
+ def rabl_app(&block)
11
+ mock_app {
12
+ set :views, File.dirname(__FILE__) + '/views'
13
+ get '/', &block
14
+ }
15
+ get '/'
16
+ end
17
+
18
+ it 'renders inline rabl strings' do
19
+ rabl_app do
20
+ @foo = OpenStruct.new(:baz => 'w00t')
21
+ rabl %q{
22
+ object @foo
23
+ attributes :baz
24
+ }
25
+ end
26
+ assert ok?
27
+ assert_equal '{"openstruct":{"baz":"w00t"}}', body
28
+ end
29
+ it 'renders .rabl files in views path' do
30
+ rabl_app do
31
+ @foo = OpenStruct.new(:bar => 'baz')
32
+ rabl :hello
33
+ end
34
+ assert ok?
35
+ assert_equal '{"openstruct":{"bar":"baz"}}', body
36
+ end
37
+
38
+ it "renders with file layouts" do
39
+ rabl_app {
40
+ @foo = OpenStruct.new(:bar => 'baz')
41
+ rabl :hello, :layout => :layout2
42
+ }
43
+ assert ok?
44
+ assert_equal '{"qux":{"openstruct":{"bar":"baz"}}}', body
45
+ end
46
+
47
+ it "raises error if template not found" do
48
+ mock_app {
49
+ get('/') { rabl :no_such_template }
50
+ }
51
+ assert_raise(Errno::ENOENT) { get('/') }
52
+ end
53
+
54
+ it "passes rabl options to the rabl engine" do
55
+ mock_app do
56
+ get('/') do
57
+ @foo = OpenStruct.new(:bar => 'baz')
58
+ rabl %q{
59
+ object @foo
60
+ attributes :bar
61
+ }, :format => 'xml'
62
+ end
63
+ end
64
+ get '/'
65
+ assert ok?
66
+ assert_body '<?xml version="1.0" encoding="UTF-8"?><openstruct><bar>baz</bar></openstruct>'
67
+ end
68
+
69
+ it "passes default rabl options to the rabl engine" do
70
+ mock_app do
71
+ set :rabl, :format => 'xml'
72
+ get('/') do
73
+ @foo = OpenStruct.new(:bar => 'baz')
74
+ rabl %q{
75
+ object @foo
76
+ attributes :bar
77
+ }
78
+ end
79
+ end
80
+ get '/'
81
+ assert ok?
82
+ assert_body '<?xml version="1.0" encoding="UTF-8"?><openstruct><bar>baz</bar></openstruct>'
83
+ end
84
+
85
+ end
86
+
87
+ rescue LoadError
88
+ warn "#{$!.to_s}: skipping rabl tests"
89
+ end
@@ -7,7 +7,7 @@ class RadiusTest < Test::Unit::TestCase
7
7
  def radius_app(&block)
8
8
  mock_app do
9
9
  set :views, File.dirname(__FILE__) + '/views'
10
- get '/', &block
10
+ get('/', &block)
11
11
  end
12
12
  get '/'
13
13
  end
@@ -44,11 +44,11 @@ class RadiusTest < Test::Unit::TestCase
44
44
  mock_app { get('/') { radius :no_such_template } }
45
45
  assert_raise(Errno::ENOENT) { get('/') }
46
46
  end
47
-
47
+
48
48
  it "allows passing locals" do
49
- radius_app do
49
+ radius_app {
50
50
  radius '<r:value />', :locals => { :value => 'foo' }
51
- end
51
+ }
52
52
  assert ok?
53
53
  assert_equal 'foo', body
54
54
  end
@@ -8,7 +8,7 @@ class RdocTest < Test::Unit::TestCase
8
8
  def rdoc_app(&block)
9
9
  mock_app do
10
10
  set :views, File.dirname(__FILE__) + '/views'
11
- get '/', &block
11
+ get('/', &block)
12
12
  end
13
13
  get '/'
14
14
  end
@@ -16,13 +16,13 @@ class RdocTest < Test::Unit::TestCase
16
16
  it 'renders inline rdoc strings' do
17
17
  rdoc_app { rdoc '= Hiya' }
18
18
  assert ok?
19
- assert_body /<h1[^>]*>Hiya(<span><a href=\"#label-Hiya\">&para;<\/a> <a href=\"#documentation\">&uarr;<\/a><\/span>)?<\/h1>/
19
+ assert_body /<h1[^>]*>Hiya<\/h1>/
20
20
  end
21
21
 
22
22
  it 'renders .rdoc files in views path' do
23
23
  rdoc_app { rdoc :hello }
24
24
  assert ok?
25
- assert_body /<h1[^>]*>Hello From RDoc(<span><a href=\"#label-Hello\+From\+RDoc\">&para;<\/a> <a href=\"#documentation\">&uarr;<\/a><\/span>)?<\/h1>/
25
+ assert_body /<h1[^>]*>Hello From RDoc<\/h1>/
26
26
  end
27
27
 
28
28
  it "raises error if template not found" do
@@ -41,7 +41,9 @@ class RdocTest < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  it "renders with file layouts" do
44
- rdoc_app { rdoc 'Hello World', :layout => :layout2, :layout_engine => :erb }
44
+ rdoc_app {
45
+ rdoc 'Hello World', :layout => :layout2, :layout_engine => :erb
46
+ }
45
47
  assert ok?
46
48
  assert_body "ERB Layout!\n<p>Hello World</p>"
47
49
  end
@@ -50,9 +52,7 @@ class RdocTest < Test::Unit::TestCase
50
52
  mock_app do
51
53
  template(:inner) { "hi" }
52
54
  template(:outer) { "<outer><%= rdoc :inner %></outer>" }
53
- get '/' do
54
- erb :outer
55
- end
55
+ get('/') { erb :outer }
56
56
  end
57
57
 
58
58
  get '/'
@@ -11,29 +11,17 @@ class ReadmeTest < Test::Unit::TestCase
11
11
  section "Routes" do
12
12
  example do
13
13
  mock_app do
14
- get '/' do
15
- ".. show something .."
16
- end
14
+ get('/') { ".. show something .." }
17
15
 
18
- post '/' do
19
- ".. create something .."
20
- end
16
+ post('/') { ".. create something .." }
21
17
 
22
- put '/' do
23
- ".. replace something .."
24
- end
18
+ put('/') { ".. replace something .." }
25
19
 
26
- patch '/' do
27
- ".. modify something .."
28
- end
20
+ patch('/') { ".. modify something .." }
29
21
 
30
- delete '/' do
31
- ".. annihilate something .."
32
- end
22
+ delete('/') { ".. annihilate something .." }
33
23
 
34
- options '/' do
35
- ".. appease something .."
36
- end
24
+ options('/') { ".. appease something .." }
37
25
  end
38
26
 
39
27
  get '/'
@@ -57,7 +45,7 @@ class ReadmeTest < Test::Unit::TestCase
57
45
 
58
46
  example do
59
47
  mock_app do
60
- get '/hello/:name' do
48
+ get('/hello/:name') do
61
49
  # matches "GET /hello/foo" and "GET /hello/bar"
62
50
  # params[:name] is 'foo' or 'bar'
63
51
  "Hello #{params[:name]}!"
@@ -72,11 +60,7 @@ class ReadmeTest < Test::Unit::TestCase
72
60
  end
73
61
 
74
62
  example do
75
- mock_app do
76
- get '/hello/:name' do |n|
77
- "Hello #{n}!"
78
- end
79
- end
63
+ mock_app { get('/hello/:name') { |n| "Hello #{n}!" } }
80
64
 
81
65
  get '/hello/foo'
82
66
  assert_body 'Hello foo!'
@@ -87,12 +71,12 @@ class ReadmeTest < Test::Unit::TestCase
87
71
 
88
72
  example do
89
73
  mock_app do
90
- get '/say/*/to/*' do
74
+ get('/say/*/to/*') do
91
75
  # matches /say/hello/to/world
92
76
  params[:splat].inspect # => ["hello", "world"]
93
77
  end
94
78
 
95
- get '/download/*.*' do
79
+ get('/download/*.*') do
96
80
  # matches /download/path/to/file.xml
97
81
  params[:splat].inspect # => ["path/to/file", "xml"]
98
82
  end
@@ -107,9 +91,9 @@ class ReadmeTest < Test::Unit::TestCase
107
91
 
108
92
  example do
109
93
  mock_app do
110
- get %r{/hello/([\w]+)} do
94
+ get(%r{/hello/([\w]+)}) {
111
95
  "Hello, #{params[:captures].first}!"
112
- end
96
+ }
113
97
  end
114
98
 
115
99
  get '/hello/foo'
@@ -121,9 +105,9 @@ class ReadmeTest < Test::Unit::TestCase
121
105
 
122
106
  example do
123
107
  mock_app do
124
- get %r{/hello/([\w]+)} do |c|
108
+ get( %r{/hello/([\w]+)}) { |c|
125
109
  "Hello, #{c}!"
126
- end
110
+ }
127
111
  end
128
112
 
129
113
  get '/hello/foo'
@@ -42,4 +42,19 @@ class RequestTest < Test::Unit::TestCase
42
42
  dumped = Marshal.dump(request.params)
43
43
  assert_equal 'bar', Marshal.load(dumped)['foo']
44
44
  end
45
+
46
+ it "exposes the preferred type's parameters" do
47
+ request = Sinatra::Request.new(
48
+ 'HTTP_ACCEPT' => 'image/jpeg; compress=0.25'
49
+ )
50
+ assert_equal({ 'compress' => '0.25' }, request.preferred_type.params)
51
+ end
52
+
53
+ it "properly decodes MIME type parameters" do
54
+ request = Sinatra::Request.new(
55
+ 'HTTP_ACCEPT' => 'image/jpeg;unquoted=0.25;quoted="0.25";chartest="\";,\x"'
56
+ )
57
+ expected = { 'unquoted' => '0.25', 'quoted' => '0.25', 'chartest' => '";,x' }
58
+ assert_equal(expected, request.preferred_type.params)
59
+ end
45
60
  end
@@ -3,12 +3,11 @@
3
3
  require File.expand_path('../helper', __FILE__)
4
4
 
5
5
  class ResponseTest < Test::Unit::TestCase
6
- setup do
7
- @response = Sinatra::Response.new
8
- end
6
+ setup { @response = Sinatra::Response.new }
9
7
 
10
8
  def assert_same_body(a, b)
11
- assert_equal a.to_enum(:each).to_a, b.to_enum(:each).to_a
9
+ enum = Enumerable.const_get(:Enumerator)
10
+ assert_equal enum.new(a).to_a, enum.new(b).to_a
12
11
  end
13
12
 
14
13
  it "initializes with 200, text/html, and empty body" do
@@ -2,11 +2,7 @@ require File.expand_path('../helper', __FILE__)
2
2
 
3
3
  class ResultTest < Test::Unit::TestCase
4
4
  it "sets response.body when result is a String" do
5
- mock_app {
6
- get '/' do
7
- 'Hello World'
8
- end
9
- }
5
+ mock_app { get('/') { 'Hello World' } }
10
6
 
11
7
  get '/'
12
8
  assert ok?
@@ -14,11 +10,7 @@ class ResultTest < Test::Unit::TestCase
14
10
  end
15
11
 
16
12
  it "sets response.body when result is an Array of Strings" do
17
- mock_app {
18
- get '/' do
19
- ['Hello', 'World']
20
- end
21
- }
13
+ mock_app { get('/') { ['Hello', 'World'] } }
22
14
 
23
15
  get '/'
24
16
  assert ok?
@@ -26,13 +18,13 @@ class ResultTest < Test::Unit::TestCase
26
18
  end
27
19
 
28
20
  it "sets response.body when result responds to #each" do
29
- mock_app {
30
- get '/' do
21
+ mock_app do
22
+ get('/') do
31
23
  res = lambda { 'Hello World' }
32
24
  def res.each ; yield call ; end
33
- res
25
+ return res
34
26
  end
35
- }
27
+ end
36
28
 
37
29
  get '/'
38
30
  assert ok?
@@ -40,11 +32,7 @@ class ResultTest < Test::Unit::TestCase
40
32
  end
41
33
 
42
34
  it "sets response.body to [] when result is nil" do
43
- mock_app {
44
- get '/' do
45
- nil
46
- end
47
- }
35
+ mock_app { get( '/') { nil } }
48
36
 
49
37
  get '/'
50
38
  assert ok?
@@ -53,9 +41,7 @@ class ResultTest < Test::Unit::TestCase
53
41
 
54
42
  it "sets status, headers, and body when result is a Rack response tuple" do
55
43
  mock_app {
56
- get '/' do
57
- [203, {'Content-Type' => 'foo/bar'}, 'Hello World']
58
- end
44
+ get('/') { [203, {'Content-Type' => 'foo/bar'}, 'Hello World'] }
59
45
  }
60
46
 
61
47
  get '/'
@@ -65,11 +51,7 @@ class ResultTest < Test::Unit::TestCase
65
51
  end
66
52
 
67
53
  it "sets status and body when result is a two-tuple" do
68
- mock_app {
69
- get '/' do
70
- [409, 'formula of']
71
- end
72
- }
54
+ mock_app { get('/') { [409, 'formula of'] } }
73
55
 
74
56
  get '/'
75
57
  assert_equal 409, status
@@ -78,18 +60,14 @@ class ResultTest < Test::Unit::TestCase
78
60
 
79
61
  it "raises a ArgumentError when result is a non two or three tuple Array" do
80
62
  mock_app {
81
- get '/' do
82
- [409, 'formula of', 'something else', 'even more']
83
- end
63
+ get('/') { [409, 'formula of', 'something else', 'even more'] }
84
64
  }
85
65
 
86
66
  assert_raise(ArgumentError) { get '/' }
87
67
  end
88
68
 
89
69
  it "sets status when result is a Fixnum status code" do
90
- mock_app {
91
- get('/') { 205 }
92
- }
70
+ mock_app { get('/') { 205 } }
93
71
 
94
72
  get '/'
95
73
  assert_equal 205, status