sinatra-base 1.0

Sign up to get free protection for your applications and to get access to all the features.
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