sinatra-base 1.0

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 (58) hide show
  1. data/AUTHORS +43 -0
  2. data/CHANGES +511 -0
  3. data/LICENSE +22 -0
  4. data/README.jp.rdoc +552 -0
  5. data/README.rdoc +636 -0
  6. data/Rakefile +116 -0
  7. data/lib/sinatra.rb +7 -0
  8. data/lib/sinatra/base.rb +1167 -0
  9. data/lib/sinatra/images/404.png +0 -0
  10. data/lib/sinatra/images/500.png +0 -0
  11. data/lib/sinatra/main.rb +28 -0
  12. data/lib/sinatra/showexceptions.rb +307 -0
  13. data/lib/sinatra/tilt.rb +746 -0
  14. data/sinatra-base.gemspec +94 -0
  15. data/test/base_test.rb +160 -0
  16. data/test/builder_test.rb +65 -0
  17. data/test/contest.rb +64 -0
  18. data/test/erb_test.rb +81 -0
  19. data/test/erubis_test.rb +82 -0
  20. data/test/extensions_test.rb +100 -0
  21. data/test/filter_test.rb +221 -0
  22. data/test/haml_test.rb +95 -0
  23. data/test/helper.rb +76 -0
  24. data/test/helpers_test.rb +582 -0
  25. data/test/less_test.rb +37 -0
  26. data/test/mapped_error_test.rb +197 -0
  27. data/test/middleware_test.rb +68 -0
  28. data/test/public/favicon.ico +0 -0
  29. data/test/request_test.rb +33 -0
  30. data/test/response_test.rb +42 -0
  31. data/test/result_test.rb +98 -0
  32. data/test/route_added_hook_test.rb +59 -0
  33. data/test/routing_test.rb +860 -0
  34. data/test/sass_test.rb +85 -0
  35. data/test/server_test.rb +47 -0
  36. data/test/settings_test.rb +368 -0
  37. data/test/sinatra_test.rb +13 -0
  38. data/test/static_test.rb +93 -0
  39. data/test/templates_test.rb +159 -0
  40. data/test/views/error.builder +3 -0
  41. data/test/views/error.erb +3 -0
  42. data/test/views/error.erubis +3 -0
  43. data/test/views/error.haml +3 -0
  44. data/test/views/error.sass +2 -0
  45. data/test/views/foo/hello.test +1 -0
  46. data/test/views/hello.builder +1 -0
  47. data/test/views/hello.erb +1 -0
  48. data/test/views/hello.erubis +1 -0
  49. data/test/views/hello.haml +1 -0
  50. data/test/views/hello.less +5 -0
  51. data/test/views/hello.sass +2 -0
  52. data/test/views/hello.test +1 -0
  53. data/test/views/layout2.builder +3 -0
  54. data/test/views/layout2.erb +2 -0
  55. data/test/views/layout2.erubis +2 -0
  56. data/test/views/layout2.haml +2 -0
  57. data/test/views/layout2.test +1 -0
  58. metadata +257 -0
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class SinatraTest < Test::Unit::TestCase
4
+ it 'creates a new Sinatra::Base subclass on new' do
5
+ app =
6
+ Sinatra.new do
7
+ get '/' do
8
+ 'Hello World'
9
+ end
10
+ end
11
+ assert_same Sinatra::Base, app.superclass
12
+ end
13
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class StaticTest < Test::Unit::TestCase
4
+ setup do
5
+ mock_app {
6
+ set :static, true
7
+ set :public, File.dirname(__FILE__)
8
+ }
9
+ end
10
+
11
+ it 'serves GET requests for files in the public directory' do
12
+ get "/#{File.basename(__FILE__)}"
13
+ assert ok?
14
+ assert_equal File.read(__FILE__), body
15
+ assert_equal File.size(__FILE__).to_s, response['Content-Length']
16
+ assert response.headers.include?('Last-Modified')
17
+ end
18
+
19
+ it 'produces a body that can be iterated over multiple times' do
20
+ env = Rack::MockRequest.env_for("/#{File.basename(__FILE__)}")
21
+ status, headers, body = @app.call(env)
22
+ buf1, buf2 = [], []
23
+ body.each { |part| buf1 << part }
24
+ body.each { |part| buf2 << part }
25
+ assert_equal buf1.join, buf2.join
26
+ assert_equal File.read(__FILE__), buf1.join
27
+ end
28
+
29
+ it 'sets the sinatra.static_file env variable if served' do
30
+ env = Rack::MockRequest.env_for("/#{File.basename(__FILE__)}")
31
+ status, headers, body = @app.call(env)
32
+ assert_equal File.expand_path(__FILE__), env['sinatra.static_file']
33
+ end
34
+
35
+ it 'serves HEAD requests for files in the public directory' do
36
+ head "/#{File.basename(__FILE__)}"
37
+ assert ok?
38
+ assert_equal '', body
39
+ assert_equal File.size(__FILE__).to_s, response['Content-Length']
40
+ assert response.headers.include?('Last-Modified')
41
+ end
42
+
43
+ %w[POST PUT DELETE].each do |verb|
44
+ it "does not serve #{verb} requests" do
45
+ send verb.downcase, "/#{File.basename(__FILE__)}"
46
+ assert_equal 404, status
47
+ end
48
+ end
49
+
50
+ it 'serves files in preference to custom routes' do
51
+ @app.get("/#{File.basename(__FILE__)}") { 'Hello World' }
52
+ get "/#{File.basename(__FILE__)}"
53
+ assert ok?
54
+ assert body != 'Hello World'
55
+ end
56
+
57
+ it 'does not serve directories' do
58
+ get "/"
59
+ assert not_found?
60
+ end
61
+
62
+ it 'passes to the next handler when the static option is disabled' do
63
+ @app.set :static, false
64
+ get "/#{File.basename(__FILE__)}"
65
+ assert not_found?
66
+ end
67
+
68
+ it 'passes to the next handler when the public option is nil' do
69
+ @app.set :public, nil
70
+ get "/#{File.basename(__FILE__)}"
71
+ assert not_found?
72
+ end
73
+
74
+ it '404s when a file is not found' do
75
+ get "/foobarbaz.txt"
76
+ assert not_found?
77
+ end
78
+
79
+ it 'serves files when .. path traverses within public directory' do
80
+ get "/data/../#{File.basename(__FILE__)}"
81
+ assert ok?
82
+ assert_equal File.read(__FILE__), body
83
+ end
84
+
85
+ it '404s when .. path traverses outside of public directory' do
86
+ mock_app {
87
+ set :static, true
88
+ set :public, File.dirname(__FILE__) + '/data'
89
+ }
90
+ get "/../#{File.basename(__FILE__)}"
91
+ assert not_found?
92
+ end
93
+ end
@@ -0,0 +1,159 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class TestTemplate < Tilt::Template
4
+ def prepare
5
+ end
6
+ alias compile! prepare # for tilt < 0.7
7
+
8
+ def evaluate(scope, locals={}, &block)
9
+ inner = block ? block.call : ''
10
+ data + inner
11
+ end
12
+
13
+ Tilt.register 'test', self
14
+ end
15
+
16
+ class TemplatesTest < Test::Unit::TestCase
17
+ def render_app(base=Sinatra::Base, &block)
18
+ mock_app(base) {
19
+ set :views, File.dirname(__FILE__) + '/views'
20
+ get '/', &block
21
+ template(:layout3) { "Layout 3!\n" }
22
+ }
23
+ get '/'
24
+ end
25
+
26
+ def with_default_layout
27
+ layout = File.dirname(__FILE__) + '/views/layout.test'
28
+ File.open(layout, 'wb') { |io| io.write "Layout!\n" }
29
+ yield
30
+ ensure
31
+ File.unlink(layout) rescue nil
32
+ end
33
+
34
+ it 'renders String templates directly' do
35
+ render_app { render :test, 'Hello World' }
36
+ assert ok?
37
+ assert_equal 'Hello World', body
38
+ end
39
+
40
+ it 'renders Proc templates using the call result' do
41
+ render_app { render :test, Proc.new {'Hello World'} }
42
+ assert ok?
43
+ assert_equal 'Hello World', body
44
+ end
45
+
46
+ it 'looks up Symbol templates in views directory' do
47
+ render_app { render :test, :hello }
48
+ assert ok?
49
+ assert_equal "Hello World!\n", body
50
+ end
51
+
52
+ it 'uses the default layout template if not explicitly overridden' do
53
+ with_default_layout do
54
+ render_app { render :test, :hello }
55
+ assert ok?
56
+ assert_equal "Layout!\nHello World!\n", body
57
+ end
58
+ end
59
+
60
+ it 'uses the default layout template if not really overriden' do
61
+ with_default_layout do
62
+ render_app { render :test, :hello, :layout => true }
63
+ assert ok?
64
+ assert_equal "Layout!\nHello World!\n", body
65
+ end
66
+ end
67
+
68
+ it 'uses the layout template specified' do
69
+ render_app { render :test, :hello, :layout => :layout2 }
70
+ assert ok?
71
+ assert_equal "Layout 2!\nHello World!\n", body
72
+ end
73
+
74
+ it 'uses layout templates defined with the #template method' do
75
+ render_app { render :test, :hello, :layout => :layout3 }
76
+ assert ok?
77
+ assert_equal "Layout 3!\nHello World!\n", body
78
+ end
79
+
80
+ it 'loads templates from source file' do
81
+ mock_app { enable :inline_templates }
82
+ assert_equal "this is foo\n\n", @app.templates[:foo][0]
83
+ assert_equal "X\n= yield\nX\n", @app.templates[:layout][0]
84
+ end
85
+
86
+ it 'loads templates from given source file' do
87
+ mock_app { set :inline_templates, __FILE__ }
88
+ assert_equal "this is foo\n\n", @app.templates[:foo][0]
89
+ end
90
+
91
+ test 'inline_templates ignores IO errors' do
92
+ assert_nothing_raised {
93
+ mock_app {
94
+ set :inline_templates, '/foo/bar'
95
+ }
96
+ }
97
+
98
+ assert @app.templates.empty?
99
+ end
100
+
101
+ it 'loads templates from specified views directory' do
102
+ render_app { render :test, :hello, :views => options.views + '/foo' }
103
+
104
+ assert_equal "from another views directory\n", body
105
+ end
106
+
107
+ it 'passes locals to the layout' do
108
+ mock_app {
109
+ template :my_layout do
110
+ 'Hello <%= name %>!<%= yield %>'
111
+ end
112
+
113
+ get '/' do
114
+ erb '<p>content</p>', { :layout => :my_layout }, { :name => 'Mike'}
115
+ end
116
+ }
117
+
118
+ get '/'
119
+ assert ok?
120
+ assert_equal 'Hello Mike!<p>content</p>', body
121
+ end
122
+
123
+ it 'loads templates defined in subclasses' do
124
+ base = Class.new(Sinatra::Base)
125
+ base.template(:foo) { 'bar' }
126
+ render_app(base) { render :test, :foo }
127
+ assert ok?
128
+ assert_equal 'bar', body
129
+ end
130
+
131
+ it 'uses templates in superclasses before subclasses' do
132
+ base = Class.new(Sinatra::Base)
133
+ base.template(:foo) { 'template in superclass' }
134
+ assert_equal 'template in superclass', base.templates[:foo].first.call
135
+
136
+ mock_app(base) {
137
+ set :views, File.dirname(__FILE__) + '/views'
138
+ template(:foo) { 'template in subclass' }
139
+ get('/') { render :test, :foo }
140
+ }
141
+ assert_equal 'template in subclass', @app.templates[:foo].first.call
142
+
143
+ get '/'
144
+ assert ok?
145
+ assert_equal 'template in subclass', body
146
+ end
147
+ end
148
+
149
+ # __END__ : this is not the real end of the script.
150
+
151
+ __END__
152
+
153
+ @@ foo
154
+ this is foo
155
+
156
+ @@ layout
157
+ X
158
+ = yield
159
+ X
@@ -0,0 +1,3 @@
1
+ xml.error do
2
+ raise "goodbye"
3
+ end
@@ -0,0 +1,3 @@
1
+ Hello <%= 'World' %>
2
+ <% raise 'Goodbye' unless defined?(french) && french %>
3
+ <% raise 'Au revoir' if defined?(french) && french %>
@@ -0,0 +1,3 @@
1
+ Hello <%= 'World' %>
2
+ <% raise 'Goodbye' unless defined?(french) && french %>
3
+ <% raise 'Au revoir' if defined?(french) && french %>
@@ -0,0 +1,3 @@
1
+ %h1 Hello From Haml
2
+ = raise 'goodbye' unless defined?(french) && french
3
+ = raise 'au revoir' if defined?(french) && french
@@ -0,0 +1,2 @@
1
+ #sass
2
+ +argle-bargle
@@ -0,0 +1 @@
1
+ from another views directory
@@ -0,0 +1 @@
1
+ xml.exclaim "You're my boy, #{@name}!"
@@ -0,0 +1 @@
1
+ Hello <%= 'World' %>
@@ -0,0 +1 @@
1
+ Hello <%= 'World' %>
@@ -0,0 +1 @@
1
+ %h1 Hello From Haml
@@ -0,0 +1,5 @@
1
+ @white_colour: #fff;
2
+
3
+ #main {
4
+ background-color: @white_colour;
5
+ }
@@ -0,0 +1,2 @@
1
+ #sass
2
+ :background-color #FFF
@@ -0,0 +1 @@
1
+ Hello World!
@@ -0,0 +1,3 @@
1
+ xml.layout do
2
+ xml << yield
3
+ end
@@ -0,0 +1,2 @@
1
+ ERB Layout!
2
+ <%= yield %>
@@ -0,0 +1,2 @@
1
+ ERubis Layout!
2
+ <%= yield %>
@@ -0,0 +1,2 @@
1
+ %h1 HAML Layout!
2
+ %p= yield
@@ -0,0 +1 @@
1
+ Layout 2!
metadata ADDED
@@ -0,0 +1,257 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-base
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ version: "1.0"
10
+ platform: ruby
11
+ authors:
12
+ - Blake Mizerany
13
+ - Ryan Tomayko
14
+ - Simon Rozet
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-03-23 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rack
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 15
30
+ segments:
31
+ - 1
32
+ - 0
33
+ version: "1.0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: shotgun
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 7
45
+ segments:
46
+ - 0
47
+ - 6
48
+ version: "0.6"
49
+ - - <
50
+ - !ruby/object:Gem::Version
51
+ hash: 15
52
+ segments:
53
+ - 1
54
+ - 0
55
+ version: "1.0"
56
+ type: :development
57
+ version_requirements: *id002
58
+ - !ruby/object:Gem::Dependency
59
+ name: rack-test
60
+ prerelease: false
61
+ requirement: &id003 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 19
67
+ segments:
68
+ - 0
69
+ - 3
70
+ - 0
71
+ version: 0.3.0
72
+ type: :development
73
+ version_requirements: *id003
74
+ - !ruby/object:Gem::Dependency
75
+ name: haml
76
+ prerelease: false
77
+ requirement: &id004 !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ hash: 3
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ type: :development
87
+ version_requirements: *id004
88
+ - !ruby/object:Gem::Dependency
89
+ name: builder
90
+ prerelease: false
91
+ requirement: &id005 !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ type: :development
101
+ version_requirements: *id005
102
+ - !ruby/object:Gem::Dependency
103
+ name: erubis
104
+ prerelease: false
105
+ requirement: &id006 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ type: :development
115
+ version_requirements: *id006
116
+ - !ruby/object:Gem::Dependency
117
+ name: less
118
+ prerelease: false
119
+ requirement: &id007 !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ hash: 3
125
+ segments:
126
+ - 0
127
+ version: "0"
128
+ type: :development
129
+ version_requirements: *id007
130
+ description: Classy web-development dressed in a DSL
131
+ email: sinatrarb@googlegroups.com
132
+ executables: []
133
+
134
+ extensions: []
135
+
136
+ extra_rdoc_files:
137
+ - README.rdoc
138
+ - LICENSE
139
+ files:
140
+ - AUTHORS
141
+ - CHANGES
142
+ - LICENSE
143
+ - README.jp.rdoc
144
+ - README.rdoc
145
+ - Rakefile
146
+ - lib/sinatra.rb
147
+ - lib/sinatra/base.rb
148
+ - lib/sinatra/images/404.png
149
+ - lib/sinatra/images/500.png
150
+ - lib/sinatra/main.rb
151
+ - lib/sinatra/showexceptions.rb
152
+ - lib/sinatra/tilt.rb
153
+ - sinatra-base.gemspec
154
+ - test/base_test.rb
155
+ - test/builder_test.rb
156
+ - test/contest.rb
157
+ - test/erb_test.rb
158
+ - test/erubis_test.rb
159
+ - test/extensions_test.rb
160
+ - test/filter_test.rb
161
+ - test/haml_test.rb
162
+ - test/helper.rb
163
+ - test/helpers_test.rb
164
+ - test/less_test.rb
165
+ - test/mapped_error_test.rb
166
+ - test/middleware_test.rb
167
+ - test/public/favicon.ico
168
+ - test/request_test.rb
169
+ - test/response_test.rb
170
+ - test/result_test.rb
171
+ - test/route_added_hook_test.rb
172
+ - test/routing_test.rb
173
+ - test/sass_test.rb
174
+ - test/server_test.rb
175
+ - test/settings_test.rb
176
+ - test/sinatra_test.rb
177
+ - test/static_test.rb
178
+ - test/templates_test.rb
179
+ - test/views/error.builder
180
+ - test/views/error.erb
181
+ - test/views/error.erubis
182
+ - test/views/error.haml
183
+ - test/views/error.sass
184
+ - test/views/foo/hello.test
185
+ - test/views/hello.builder
186
+ - test/views/hello.erb
187
+ - test/views/hello.erubis
188
+ - test/views/hello.haml
189
+ - test/views/hello.less
190
+ - test/views/hello.sass
191
+ - test/views/hello.test
192
+ - test/views/layout2.builder
193
+ - test/views/layout2.erb
194
+ - test/views/layout2.erubis
195
+ - test/views/layout2.haml
196
+ - test/views/layout2.test
197
+ homepage: http://sinatra.rubyforge.org
198
+ licenses: []
199
+
200
+ post_install_message:
201
+ rdoc_options:
202
+ - --line-numbers
203
+ - --inline-source
204
+ - --title
205
+ - Sinatra
206
+ - --main
207
+ - README.rdoc
208
+ require_paths:
209
+ - lib
210
+ required_ruby_version: !ruby/object:Gem::Requirement
211
+ none: false
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ hash: 3
216
+ segments:
217
+ - 0
218
+ version: "0"
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ none: false
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ hash: 3
225
+ segments:
226
+ - 0
227
+ version: "0"
228
+ requirements: []
229
+
230
+ rubyforge_project: sinatra
231
+ rubygems_version: 1.8.18
232
+ signing_key:
233
+ specification_version: 2
234
+ summary: Classy web-development dressed in a DSL
235
+ test_files:
236
+ - test/base_test.rb
237
+ - test/builder_test.rb
238
+ - test/erb_test.rb
239
+ - test/erubis_test.rb
240
+ - test/extensions_test.rb
241
+ - test/filter_test.rb
242
+ - test/haml_test.rb
243
+ - test/helpers_test.rb
244
+ - test/less_test.rb
245
+ - test/mapped_error_test.rb
246
+ - test/middleware_test.rb
247
+ - test/request_test.rb
248
+ - test/response_test.rb
249
+ - test/result_test.rb
250
+ - test/route_added_hook_test.rb
251
+ - test/routing_test.rb
252
+ - test/sass_test.rb
253
+ - test/server_test.rb
254
+ - test/settings_test.rb
255
+ - test/sinatra_test.rb
256
+ - test/static_test.rb
257
+ - test/templates_test.rb