rtomayko-sinatra 0.3.3 → 0.8.9

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 (81) hide show
  1. data/AUTHORS +40 -0
  2. data/CHANGES +167 -0
  3. data/README.rdoc +104 -98
  4. data/Rakefile +27 -9
  5. data/{test → compat}/app_test.rb +11 -10
  6. data/{test → compat}/application_test.rb +10 -5
  7. data/compat/builder_test.rb +101 -0
  8. data/{test → compat}/custom_error_test.rb +0 -0
  9. data/compat/erb_test.rb +136 -0
  10. data/{test → compat}/events_test.rb +12 -2
  11. data/compat/filter_test.rb +30 -0
  12. data/compat/haml_test.rb +233 -0
  13. data/compat/helper.rb +21 -0
  14. data/compat/mapped_error_test.rb +72 -0
  15. data/{test → compat}/pipeline_test.rb +9 -4
  16. data/{test → compat}/public/foo.xml +0 -0
  17. data/compat/sass_test.rb +57 -0
  18. data/{test → compat}/sessions_test.rb +0 -0
  19. data/{test → compat}/streaming_test.rb +4 -1
  20. data/{test → compat}/sym_params_test.rb +0 -0
  21. data/{test → compat}/template_test.rb +0 -0
  22. data/{test → compat}/use_in_file_templates_test.rb +0 -0
  23. data/{test → compat}/views/foo.builder +0 -0
  24. data/{test → compat}/views/foo.erb +0 -0
  25. data/{test → compat}/views/foo.haml +0 -0
  26. data/{test → compat}/views/foo.sass +0 -0
  27. data/{test → compat}/views/foo_layout.erb +0 -0
  28. data/{test → compat}/views/foo_layout.haml +0 -0
  29. data/{test → compat}/views/layout_test/foo.builder +0 -0
  30. data/{test → compat}/views/layout_test/foo.erb +0 -0
  31. data/{test → compat}/views/layout_test/foo.haml +0 -0
  32. data/{test → compat}/views/layout_test/foo.sass +0 -0
  33. data/{test → compat}/views/layout_test/layout.builder +0 -0
  34. data/{test → compat}/views/layout_test/layout.erb +0 -0
  35. data/{test → compat}/views/layout_test/layout.haml +0 -0
  36. data/{test → compat}/views/layout_test/layout.sass +0 -0
  37. data/{test → compat}/views/no_layout/no_layout.builder +0 -0
  38. data/{test → compat}/views/no_layout/no_layout.haml +0 -0
  39. data/lib/sinatra/base.rb +818 -0
  40. data/lib/sinatra/compat.rb +239 -0
  41. data/{images → lib/sinatra/images}/404.png +0 -0
  42. data/{images → lib/sinatra/images}/500.png +0 -0
  43. data/lib/sinatra/main.rb +48 -0
  44. data/lib/sinatra/test/rspec.rb +1 -9
  45. data/lib/sinatra/test/spec.rb +1 -9
  46. data/lib/sinatra/test/unit.rb +3 -5
  47. data/lib/sinatra/test.rb +112 -0
  48. data/lib/sinatra.rb +3 -1486
  49. data/sinatra.gemspec +66 -36
  50. data/test/base_test.rb +72 -0
  51. data/test/builder_test.rb +56 -89
  52. data/test/data/reload_app_file.rb +3 -0
  53. data/test/erb_test.rb +44 -125
  54. data/test/filter_test.rb +29 -20
  55. data/test/haml_test.rb +57 -218
  56. data/test/helpers_test.rb +368 -0
  57. data/test/mapped_error_test.rb +141 -49
  58. data/test/middleware_test.rb +63 -0
  59. data/test/options_test.rb +103 -0
  60. data/test/reload_test.rb +65 -0
  61. data/test/request_test.rb +11 -0
  62. data/test/result_test.rb +92 -0
  63. data/test/routing_test.rb +338 -0
  64. data/test/sass_test.rb +33 -50
  65. data/test/sinatra_test.rb +15 -0
  66. data/test/static_test.rb +60 -0
  67. data/test/templates_test.rb +92 -0
  68. data/test/views/hello.builder +1 -0
  69. data/test/views/hello.erb +1 -0
  70. data/test/views/hello.haml +1 -0
  71. data/test/views/hello.sass +2 -0
  72. data/test/views/hello.test +1 -0
  73. data/test/views/layout2.builder +3 -0
  74. data/test/views/layout2.erb +2 -0
  75. data/test/views/layout2.haml +2 -0
  76. data/test/views/layout2.test +1 -0
  77. metadata +78 -48
  78. data/ChangeLog +0 -96
  79. data/lib/sinatra/test/methods.rb +0 -76
  80. data/test/event_context_test.rb +0 -15
  81. data/test/helper.rb +0 -9
@@ -108,7 +108,9 @@ context "Sinatra" do
108
108
  end
109
109
 
110
110
  specify "renders a body with a redirect" do
111
- Sinatra::EventContext.any_instance.expects(:foo).returns('blah')
111
+ helpers do
112
+ def foo ; 'blah' ; end
113
+ end
112
114
  get "/" do
113
115
  redirect 'foo', :foo
114
116
  end
@@ -130,13 +132,10 @@ context "Sinatra" do
130
132
  end
131
133
 
132
134
  specify "stop sets content and ends event" do
133
-
134
- Sinatra::EventContext.any_instance.expects(:foo).never
135
-
136
135
  get '/set_body' do
137
136
  stop 'Hello!'
138
137
  stop 'World!'
139
- foo
138
+ fail 'stop should have halted'
140
139
  end
141
140
 
142
141
  get_it '/set_body'
@@ -146,8 +145,13 @@ context "Sinatra" do
146
145
 
147
146
  end
148
147
 
149
- specify "should set status then call helper with a var" do
150
- Sinatra::EventContext.any_instance.expects(:foo).once.with(1).returns('bah!')
148
+ # Deprecated. WTF was going on here? What's the 1 in [:foo, 1] do?
149
+ xspecify "should set status then call helper with a var" do
150
+ helpers do
151
+ def foo
152
+ 'bah!'
153
+ end
154
+ end
151
155
 
152
156
  get '/set_body' do
153
157
  stop [404, [:foo, 1]]
@@ -252,8 +256,6 @@ context "Sinatra" do
252
256
  assert_equal 'puted', body
253
257
  end
254
258
 
255
- # Some Ajax libraries downcase the _method parameter value. Make
256
- # sure we can handle that.
257
259
  specify "rewrites POSTs with lowercase _method param to PUT" do
258
260
  put '/' do
259
261
  'puted'
@@ -262,7 +264,6 @@ context "Sinatra" do
262
264
  body.should.equal 'puted'
263
265
  end
264
266
 
265
- # Ignore any _method parameters specified in GET requests or on the query string in POST requests.
266
267
  specify "does not rewrite GETs with _method param to PUT" do
267
268
  get '/' do
268
269
  'getted'
@@ -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'
@@ -142,14 +145,16 @@ end
142
145
 
143
146
  context "Default Application Configuration" do
144
147
 
145
- specify "includes 404 and 500 error handlers" do
148
+ # Sinatra::ServerError is no longer used
149
+ xspecify "includes 404 and 500 error handlers" do
146
150
  Sinatra.application.errors.should.include(Sinatra::ServerError)
147
151
  Sinatra.application.errors[Sinatra::ServerError].should.not.be.nil
148
152
  Sinatra.application.errors.should.include(Sinatra::NotFound)
149
153
  Sinatra.application.errors[Sinatra::NotFound].should.not.be.nil
150
154
  end
151
155
 
152
- specify "includes Static event" do
156
+ # Deprecated. No such thing as a Static event anymore.
157
+ xspecify "includes Static event" do
153
158
  assert Sinatra.application.events[:get].any? { |e| Sinatra::Static === e }
154
159
  end
155
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
File without changes
@@ -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
@@ -9,9 +9,19 @@ context "Simple Events" do
9
9
  })
10
10
  end
11
11
 
12
+ class MockResult < Struct.new(:block, :params)
13
+ end
14
+
12
15
  def invoke_simple(path, request_path, &b)
13
- event = Sinatra::Event.new(path, &b)
14
- event.invoke(simple_request_hash(:get, request_path))
16
+ params = nil
17
+ mock_app {
18
+ get path do
19
+ params = self.params
20
+ b.call if b
21
+ end
22
+ }
23
+ get_it request_path
24
+ MockResult.new(b, params)
15
25
  end
16
26
 
17
27
  specify "return last value" do
@@ -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,21 @@
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
+ class Test::Unit::TestCase
17
+ def setup
18
+ @app = lambda { |env| Sinatra::Application.call(env) }
19
+ end
20
+ include Sinatra::Test
21
+ end