Syd-sinatra 0.3.2 → 0.9.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/AUTHORS +40 -0
  2. data/CHANGES +189 -0
  3. data/README.rdoc +148 -119
  4. data/Rakefile +34 -10
  5. data/{test → compat}/app_test.rb +11 -10
  6. data/{test → compat}/application_test.rb +21 -5
  7. data/compat/builder_test.rb +101 -0
  8. data/compat/erb_test.rb +136 -0
  9. data/{test → compat}/events_test.rb +16 -3
  10. data/compat/filter_test.rb +30 -0
  11. data/compat/haml_test.rb +233 -0
  12. data/compat/helper.rb +30 -0
  13. data/compat/mapped_error_test.rb +72 -0
  14. data/{test → compat}/pipeline_test.rb +9 -4
  15. data/compat/sass_test.rb +57 -0
  16. data/{test → compat}/streaming_test.rb +4 -1
  17. data/lib/sinatra/base.rb +843 -0
  18. data/lib/sinatra/compat.rb +239 -0
  19. data/lib/sinatra/main.rb +48 -0
  20. data/lib/sinatra/test/bacon.rb +17 -0
  21. data/lib/sinatra/test/rspec.rb +7 -8
  22. data/lib/sinatra/test/spec.rb +3 -4
  23. data/lib/sinatra/test/unit.rb +3 -5
  24. data/lib/sinatra/test.rb +114 -0
  25. data/lib/sinatra.rb +6 -1468
  26. data/sinatra.gemspec +68 -35
  27. data/test/base_test.rb +68 -0
  28. data/test/builder_test.rb +50 -87
  29. data/test/data/reload_app_file.rb +3 -0
  30. data/test/erb_test.rb +38 -124
  31. data/test/filter_test.rb +65 -20
  32. data/test/haml_test.rb +51 -216
  33. data/test/helper.rb +23 -5
  34. data/test/helpers_test.rb +361 -0
  35. data/test/mapped_error_test.rb +137 -49
  36. data/test/middleware_test.rb +58 -0
  37. data/test/options_test.rb +97 -0
  38. data/test/reload_test.rb +61 -0
  39. data/test/request_test.rb +18 -0
  40. data/test/result_test.rb +88 -0
  41. data/test/routing_test.rb +391 -0
  42. data/test/sass_test.rb +27 -48
  43. data/test/sinatra_test.rb +13 -0
  44. data/test/static_test.rb +57 -0
  45. data/test/templates_test.rb +88 -0
  46. data/test/views/hello.builder +1 -0
  47. data/test/views/hello.erb +1 -0
  48. data/test/views/hello.haml +1 -0
  49. data/test/views/hello.sass +2 -0
  50. data/test/views/hello.test +1 -0
  51. data/test/views/layout2.builder +3 -0
  52. data/test/views/layout2.erb +2 -0
  53. data/test/views/layout2.haml +2 -0
  54. data/test/views/layout2.test +1 -0
  55. metadata +79 -47
  56. data/ChangeLog +0 -78
  57. data/lib/sinatra/test/methods.rb +0 -76
  58. data/test/event_context_test.rb +0 -15
  59. /data/{test → compat}/custom_error_test.rb +0 -0
  60. /data/{test → compat}/public/foo.xml +0 -0
  61. /data/{test → compat}/sessions_test.rb +0 -0
  62. /data/{test → compat}/sym_params_test.rb +0 -0
  63. /data/{test → compat}/template_test.rb +0 -0
  64. /data/{test → compat}/use_in_file_templates_test.rb +0 -0
  65. /data/{test → compat}/views/foo.builder +0 -0
  66. /data/{test → compat}/views/foo.erb +0 -0
  67. /data/{test → compat}/views/foo.haml +0 -0
  68. /data/{test → compat}/views/foo.sass +0 -0
  69. /data/{test → compat}/views/foo_layout.erb +0 -0
  70. /data/{test → compat}/views/foo_layout.haml +0 -0
  71. /data/{test → compat}/views/layout_test/foo.builder +0 -0
  72. /data/{test → compat}/views/layout_test/foo.erb +0 -0
  73. /data/{test → compat}/views/layout_test/foo.haml +0 -0
  74. /data/{test → compat}/views/layout_test/foo.sass +0 -0
  75. /data/{test → compat}/views/layout_test/layout.builder +0 -0
  76. /data/{test → compat}/views/layout_test/layout.erb +0 -0
  77. /data/{test → compat}/views/layout_test/layout.haml +0 -0
  78. /data/{test → compat}/views/layout_test/layout.sass +0 -0
  79. /data/{test → compat}/views/no_layout/no_layout.builder +0 -0
  80. /data/{test → compat}/views/no_layout/no_layout.haml +0 -0
  81. /data/{images → lib/sinatra/images}/404.png +0 -0
  82. /data/{images → lib/sinatra/images}/500.png +0 -0
@@ -16,7 +16,8 @@ context "Looking up a request" do
16
16
  Sinatra.application = nil
17
17
  end
18
18
 
19
- specify "returns what's at the end" do
19
+ # Deprecated. The lookup method is no longer used.
20
+ xspecify "returns what's at the end" do
20
21
  block = Proc.new { 'Hello' }
21
22
  get '/', &block
22
23
 
@@ -31,7 +32,8 @@ context "Looking up a request" do
31
32
  result.block.should.be block
32
33
  end
33
34
 
34
- specify "takes params in path" do
35
+ # Deprecated. The lookup method is no longer used.
36
+ xspecify "takes params in path" do
35
37
  block = Proc.new { 'Hello' }
36
38
  get '/:foo', &block
37
39
 
@@ -83,7 +85,8 @@ context "An app returns" do
83
85
 
84
86
  end
85
87
 
86
- specify "the body set if set before the last" do
88
+ # Deprecated. The body method no longer halts.
89
+ xspecify "the body set if set before the last" do
87
90
 
88
91
  get '/' do
89
92
  body 'Blake'
@@ -96,6 +99,17 @@ context "An app returns" do
96
99
 
97
100
  end
98
101
 
102
+ specify "404 if NotFound is raised" do
103
+
104
+ get '/' do
105
+ raise Sinatra::NotFound
106
+ end
107
+
108
+ get_it '/'
109
+ should.be.not_found
110
+
111
+ end
112
+
99
113
  end
100
114
 
101
115
  context "Application#configure blocks" do
@@ -131,14 +145,16 @@ end
131
145
 
132
146
  context "Default Application Configuration" do
133
147
 
134
- specify "includes 404 and 500 error handlers" do
148
+ # Sinatra::ServerError is no longer used
149
+ xspecify "includes 404 and 500 error handlers" do
135
150
  Sinatra.application.errors.should.include(Sinatra::ServerError)
136
151
  Sinatra.application.errors[Sinatra::ServerError].should.not.be.nil
137
152
  Sinatra.application.errors.should.include(Sinatra::NotFound)
138
153
  Sinatra.application.errors[Sinatra::NotFound].should.not.be.nil
139
154
  end
140
155
 
141
- specify "includes Static event" do
156
+ # Deprecated. No such thing as a Static event anymore.
157
+ xspecify "includes Static event" do
142
158
  assert Sinatra.application.events[:get].any? { |e| Sinatra::Static === e }
143
159
  end
144
160
 
@@ -0,0 +1,101 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ context "Builder" do
4
+
5
+ setup do
6
+ Sinatra.application = nil
7
+ end
8
+
9
+ context "without layouts" do
10
+
11
+ setup do
12
+ Sinatra.application = nil
13
+ end
14
+
15
+ specify "should render" do
16
+
17
+ get '/no_layout' do
18
+ builder 'xml.instruct!'
19
+ end
20
+
21
+ get_it '/no_layout'
22
+ should.be.ok
23
+ body.should == %(<?xml version="1.0" encoding="UTF-8"?>\n)
24
+
25
+ end
26
+
27
+ specify "should render inline block" do
28
+
29
+ get '/no_layout_and_inlined' do
30
+ @name = "Frank & Mary"
31
+ builder do |xml|
32
+ xml.couple @name
33
+ end
34
+ end
35
+
36
+ get_it '/no_layout_and_inlined'
37
+ should.be.ok
38
+ body.should == %(<couple>Frank &amp; Mary</couple>\n)
39
+
40
+ end
41
+
42
+ end
43
+
44
+
45
+
46
+ context "Templates (in general)" do
47
+
48
+ setup do
49
+ Sinatra.application = nil
50
+ end
51
+
52
+ specify "are read from files if Symbols" do
53
+
54
+ get '/from_file' do
55
+ @name = 'Blue'
56
+ builder :foo, :views_directory => File.dirname(__FILE__) + "/views"
57
+ end
58
+
59
+ get_it '/from_file'
60
+ should.be.ok
61
+ body.should.equal %(<exclaim>You rock Blue!</exclaim>\n)
62
+
63
+ end
64
+
65
+ specify "use layout.ext by default if available" do
66
+
67
+ get '/' do
68
+ builder :foo, :views_directory => File.dirname(__FILE__) + "/views/layout_test"
69
+ end
70
+
71
+ get_it '/'
72
+ should.be.ok
73
+ body.should.equal "<layout>\n<this>is foo!</this>\n</layout>\n"
74
+
75
+ end
76
+
77
+ specify "renders without layout" do
78
+
79
+ get '/' do
80
+ builder :no_layout, :views_directory => File.dirname(__FILE__) + "/views/no_layout"
81
+ end
82
+
83
+ get_it '/'
84
+ should.be.ok
85
+ body.should.equal "<foo>No Layout!</foo>\n"
86
+
87
+ end
88
+
89
+ specify "raises error if template not found" do
90
+
91
+ get '/' do
92
+ builder :not_found
93
+ end
94
+
95
+ lambda { get_it '/' }.should.raise(Errno::ENOENT)
96
+
97
+ end
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,136 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ context "Erb" do
4
+
5
+ setup do
6
+ Sinatra.application = nil
7
+ end
8
+
9
+ context "without layouts" do
10
+
11
+ setup do
12
+ Sinatra.application = nil
13
+ end
14
+
15
+ specify "should render" do
16
+
17
+ get '/no_layout' do
18
+ erb '<%= 1 + 1 %>'
19
+ end
20
+
21
+ get_it '/no_layout'
22
+ should.be.ok
23
+ body.should == '2'
24
+
25
+ end
26
+
27
+ specify "should take an options hash with :locals set with a string" do
28
+ get '/locals' do
29
+ erb '<%= foo %>', :locals => {:foo => "Bar"}
30
+ end
31
+
32
+ get_it '/locals'
33
+ should.be.ok
34
+ body.should == 'Bar'
35
+ end
36
+
37
+ specify "should take an options hash with :locals set with a complex object" do
38
+ get '/locals-complex' do
39
+ erb '<%= foo[0] %>', :locals => {:foo => ["foo", "bar", "baz"]}
40
+ end
41
+
42
+ get_it '/locals-complex'
43
+ should.be.ok
44
+ body.should == 'foo'
45
+ end
46
+ end
47
+
48
+ context "with layouts" do
49
+
50
+ setup do
51
+ Sinatra.application = nil
52
+ end
53
+
54
+ specify "can be inline" do
55
+
56
+ layout do
57
+ %Q{This is <%= yield %>!}
58
+ end
59
+
60
+ get '/lay' do
61
+ erb 'Blake'
62
+ end
63
+
64
+ get_it '/lay'
65
+ should.be.ok
66
+ body.should.equal 'This is Blake!'
67
+
68
+ end
69
+
70
+ specify "can use named layouts" do
71
+
72
+ layout :pretty do
73
+ %Q{<h1><%= yield %></h1>}
74
+ end
75
+
76
+ get '/pretty' do
77
+ erb 'Foo', :layout => :pretty
78
+ end
79
+
80
+ get '/not_pretty' do
81
+ erb 'Bar'
82
+ end
83
+
84
+ get_it '/pretty'
85
+ body.should.equal '<h1>Foo</h1>'
86
+
87
+ get_it '/not_pretty'
88
+ body.should.equal 'Bar'
89
+
90
+ end
91
+
92
+ specify "can be read from a file if they're not inlined" do
93
+
94
+ get '/foo' do
95
+ @title = 'Welcome to the Hello Program'
96
+ erb 'Blake', :layout => :foo_layout,
97
+ :views_directory => File.dirname(__FILE__) + "/views"
98
+ end
99
+
100
+ get_it '/foo'
101
+ body.should.equal "Welcome to the Hello Program\nHi Blake\n"
102
+
103
+ end
104
+
105
+ end
106
+
107
+ context "Templates (in general)" do
108
+
109
+ specify "are read from files if Symbols" do
110
+
111
+ get '/from_file' do
112
+ @name = 'Alena'
113
+ erb :foo, :views_directory => File.dirname(__FILE__) + "/views"
114
+ end
115
+
116
+ get_it '/from_file'
117
+
118
+ body.should.equal 'You rock Alena!'
119
+
120
+ end
121
+
122
+ specify "use layout.ext by default if available" do
123
+
124
+ get '/layout_from_file' do
125
+ erb :foo, :views_directory => File.dirname(__FILE__) + "/views/layout_test"
126
+ end
127
+
128
+ get_it '/layout_from_file'
129
+ should.be.ok
130
+ body.should.equal "x This is foo! x \n"
131
+
132
+ end
133
+
134
+ end
135
+
136
+ end
@@ -1,7 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
3
  context "Simple Events" do
4
-
5
4
  def simple_request_hash(method, path)
6
5
  Rack::Request.new({
7
6
  'REQUEST_METHOD' => method.to_s.upcase,
@@ -9,11 +8,21 @@ context "Simple Events" do
9
8
  })
10
9
  end
11
10
 
11
+ class MockResult < Struct.new(:block, :params)
12
+ end
13
+
12
14
  def invoke_simple(path, request_path, &b)
13
- event = Sinatra::Event.new(path, &b)
14
- event.invoke(simple_request_hash(:get, request_path))
15
+ params = nil
16
+ get path do
17
+ params = self.params
18
+ b.call if b
19
+ end
20
+ get_it request_path
21
+ MockResult.new(b, params)
15
22
  end
16
23
 
24
+ setup { Sinatra.application = nil }
25
+
17
26
  specify "return last value" do
18
27
  block = Proc.new { 'Simple' }
19
28
  result = invoke_simple('/', '/', &block)
@@ -28,6 +37,7 @@ context "Simple Events" do
28
37
  result.params.should.equal "foo" => 'a', "bar" => 'b'
29
38
 
30
39
  # unscapes
40
+ Sinatra.application = nil
31
41
  result = invoke_simple('/:foo/:bar', '/a/blake%20mizerany')
32
42
  result.should.not.be.nil
33
43
  result.params.should.equal "foo" => 'a', "bar" => 'blake mizerany'
@@ -38,14 +48,17 @@ context "Simple Events" do
38
48
  result.should.not.be.nil
39
49
  result.params.should.equal "foo" => 'a', "bar" => 'b'
40
50
 
51
+ Sinatra.application = nil
41
52
  result = invoke_simple('/?:foo?/?:bar?', '/a/')
42
53
  result.should.not.be.nil
43
54
  result.params.should.equal "foo" => 'a', "bar" => nil
44
55
 
56
+ Sinatra.application = nil
45
57
  result = invoke_simple('/?:foo?/?:bar?', '/a')
46
58
  result.should.not.be.nil
47
59
  result.params.should.equal "foo" => 'a', "bar" => nil
48
60
 
61
+ Sinatra.application = nil
49
62
  result = invoke_simple('/:foo?/?:bar?', '/')
50
63
  result.should.not.be.nil
51
64
  result.params.should.equal "foo" => nil, "bar" => nil
@@ -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
@@ -0,0 +1,233 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ context "Haml" do
4
+
5
+ setup do
6
+ Sinatra.application = nil
7
+ end
8
+
9
+ context "without layouts" do
10
+
11
+ setup do
12
+ Sinatra.application = nil
13
+ end
14
+
15
+ specify "should render" do
16
+
17
+ get '/no_layout' do
18
+ haml '== #{1+1}'
19
+ end
20
+
21
+ get_it '/no_layout'
22
+ should.be.ok
23
+ body.should == "2\n"
24
+
25
+ end
26
+ end
27
+
28
+ context "with layouts" do
29
+
30
+ setup do
31
+ Sinatra.application = nil
32
+ end
33
+
34
+ specify "can be inline" do
35
+
36
+ layout do
37
+ '== This is #{yield}!'
38
+ end
39
+
40
+ get '/lay' do
41
+ haml 'Blake'
42
+ end
43
+
44
+ get_it '/lay'
45
+ should.be.ok
46
+ body.should.equal "This is Blake\n!\n"
47
+
48
+ end
49
+
50
+ specify "can use named layouts" do
51
+
52
+ layout :pretty do
53
+ '%h1== #{yield}'
54
+ end
55
+
56
+ get '/pretty' do
57
+ haml 'Foo', :layout => :pretty
58
+ end
59
+
60
+ get '/not_pretty' do
61
+ haml 'Bar'
62
+ end
63
+
64
+ get_it '/pretty'
65
+ body.should.equal "<h1>Foo</h1>\n"
66
+
67
+ get_it '/not_pretty'
68
+ body.should.equal "Bar\n"
69
+
70
+ end
71
+
72
+ specify "can be read from a file if they're not inlined" do
73
+
74
+ get '/foo' do
75
+ @title = 'Welcome to the Hello Program'
76
+ haml 'Blake', :layout => :foo_layout,
77
+ :views_directory => File.dirname(__FILE__) + "/views"
78
+ end
79
+
80
+ get_it '/foo'
81
+ body.should.equal "Welcome to the Hello Program\nHi Blake\n"
82
+
83
+ end
84
+
85
+ specify "can be read from file and layout from text" do
86
+ get '/foo' do
87
+ haml 'Test', :layout => '== Foo #{yield}'
88
+ end
89
+
90
+ get_it '/foo'
91
+
92
+ body.should.equal "Foo Test\n"
93
+ end
94
+
95
+ end
96
+
97
+ context "Templates (in general)" do
98
+
99
+ setup do
100
+ Sinatra.application = nil
101
+ end
102
+
103
+ specify "are read from files if Symbols" do
104
+
105
+ get '/from_file' do
106
+ @name = 'Alena'
107
+ haml :foo, :views_directory => File.dirname(__FILE__) + "/views"
108
+ end
109
+
110
+ get_it '/from_file'
111
+
112
+ body.should.equal "You rock Alena!\n"
113
+
114
+ end
115
+
116
+ specify "use layout.ext by default if available" do
117
+
118
+ get '/' do
119
+ haml :foo, :views_directory => File.dirname(__FILE__) + "/views/layout_test"
120
+ end
121
+
122
+ get_it '/'
123
+ should.be.ok
124
+ body.should.equal "x This is foo!\n x\n"
125
+
126
+ end
127
+
128
+ specify "renders without layout" do
129
+
130
+ get '/' do
131
+ haml :no_layout, :views_directory => File.dirname(__FILE__) + "/views/no_layout"
132
+ end
133
+
134
+ get_it '/'
135
+ should.be.ok
136
+ body.should.equal "<h1>No Layout!</h1>\n"
137
+
138
+ end
139
+
140
+ specify "can render with no layout" do
141
+ layout do
142
+ "X\n= yield\nX"
143
+ end
144
+
145
+ get '/' do
146
+ haml 'blake', :layout => false
147
+ end
148
+
149
+ get_it '/'
150
+
151
+ body.should.equal "blake\n"
152
+ end
153
+
154
+ specify "raises error if template not found" do
155
+ get '/' do
156
+ haml :not_found
157
+ end
158
+
159
+ lambda { get_it '/' }.should.raise(Errno::ENOENT)
160
+ end
161
+
162
+ specify "use layout.ext by default if available" do
163
+
164
+ template :foo do
165
+ 'asdf'
166
+ end
167
+
168
+ get '/' do
169
+ haml :foo, :layout => false,
170
+ :views_directory => File.dirname(__FILE__) + "/views/layout_test"
171
+ end
172
+
173
+ get_it '/'
174
+ should.be.ok
175
+ body.should.equal "asdf\n"
176
+
177
+ end
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
+
231
+ end
232
+
233
+ end
data/compat/helper.rb ADDED
@@ -0,0 +1,30 @@
1
+ require 'rubygems'
2
+ require 'mocha'
3
+
4
+ # disable warnings in compat specs.
5
+ $VERBOSE = nil
6
+
7
+ $:.unshift File.dirname(File.dirname(__FILE__)) + "/lib"
8
+
9
+ ENV['RACK_ENV'] ||= 'test'
10
+
11
+ require 'sinatra'
12
+ require 'sinatra/test'
13
+ require 'sinatra/test/unit'
14
+ require 'sinatra/test/spec'
15
+
16
+ module Sinatra::Test
17
+ # we need to remove the new test helper methods since they conflict with
18
+ # the top-level methods of the same name.
19
+ %w(get head post put delete).each do |verb|
20
+ remove_method verb
21
+ end
22
+ include Sinatra::Delegator
23
+ end
24
+
25
+ class Test::Unit::TestCase
26
+ include Sinatra::Test
27
+ def setup
28
+ @app = lambda { |env| Sinatra::Application.call(env) }
29
+ end
30
+ end