sinatra 0.2.2 → 0.3.0

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 (109) hide show
  1. data/ChangeLog +64 -0
  2. data/LICENSE +1 -1
  3. data/README.rdoc +244 -141
  4. data/Rakefile +111 -0
  5. data/lib/sinatra.rb +942 -627
  6. data/{vendor/rack/lib → lib/sinatra}/rack/handler/mongrel.rb +10 -3
  7. data/lib/sinatra/test/methods.rb +56 -36
  8. data/lib/sinatra/test/rspec.rb +10 -0
  9. data/lib/sinatra/test/spec.rb +2 -2
  10. data/lib/sinatra/test/unit.rb +1 -1
  11. data/sinatra.gemspec +71 -43
  12. data/test/app_test.rb +181 -32
  13. data/test/application_test.rb +179 -36
  14. data/test/custom_error_test.rb +17 -22
  15. data/test/erb_test.rb +42 -22
  16. data/test/event_context_test.rb +3 -3
  17. data/test/events_test.rb +8 -11
  18. data/test/filter_test.rb +30 -0
  19. data/test/haml_test.rb +83 -31
  20. data/test/helper.rb +6 -3
  21. data/test/mapped_error_test.rb +32 -21
  22. data/test/pipeline_test.rb +66 -0
  23. data/test/sass_test.rb +7 -7
  24. data/test/sessions_test.rb +8 -9
  25. data/test/streaming_test.rb +10 -4
  26. data/test/sym_params_test.rb +1 -1
  27. data/test/template_test.rb +11 -11
  28. data/test/use_in_file_templates_test.rb +9 -10
  29. metadata +22 -101
  30. data/CHANGELOG +0 -3
  31. data/Manifest +0 -122
  32. data/index.html +0 -9
  33. data/test/diddy_test.rb +0 -41
  34. data/test/rest_test.rb +0 -16
  35. data/vendor/rack/AUTHORS +0 -7
  36. data/vendor/rack/COPYING +0 -18
  37. data/vendor/rack/KNOWN-ISSUES +0 -18
  38. data/vendor/rack/README +0 -242
  39. data/vendor/rack/Rakefile +0 -174
  40. data/vendor/rack/bin/rackup +0 -153
  41. data/vendor/rack/contrib/rack_logo.svg +0 -111
  42. data/vendor/rack/example/lobster.ru +0 -4
  43. data/vendor/rack/example/protectedlobster.rb +0 -14
  44. data/vendor/rack/example/protectedlobster.ru +0 -8
  45. data/vendor/rack/lib/rack.rb +0 -92
  46. data/vendor/rack/lib/rack/adapter/camping.rb +0 -22
  47. data/vendor/rack/lib/rack/auth/abstract/handler.rb +0 -28
  48. data/vendor/rack/lib/rack/auth/abstract/request.rb +0 -37
  49. data/vendor/rack/lib/rack/auth/basic.rb +0 -58
  50. data/vendor/rack/lib/rack/auth/digest/md5.rb +0 -124
  51. data/vendor/rack/lib/rack/auth/digest/nonce.rb +0 -51
  52. data/vendor/rack/lib/rack/auth/digest/params.rb +0 -55
  53. data/vendor/rack/lib/rack/auth/digest/request.rb +0 -40
  54. data/vendor/rack/lib/rack/auth/openid.rb +0 -116
  55. data/vendor/rack/lib/rack/builder.rb +0 -56
  56. data/vendor/rack/lib/rack/cascade.rb +0 -36
  57. data/vendor/rack/lib/rack/commonlogger.rb +0 -56
  58. data/vendor/rack/lib/rack/file.rb +0 -112
  59. data/vendor/rack/lib/rack/handler/cgi.rb +0 -57
  60. data/vendor/rack/lib/rack/handler/fastcgi.rb +0 -83
  61. data/vendor/rack/lib/rack/handler/lsws.rb +0 -52
  62. data/vendor/rack/lib/rack/handler/scgi.rb +0 -57
  63. data/vendor/rack/lib/rack/handler/webrick.rb +0 -57
  64. data/vendor/rack/lib/rack/lint.rb +0 -394
  65. data/vendor/rack/lib/rack/lobster.rb +0 -65
  66. data/vendor/rack/lib/rack/mock.rb +0 -160
  67. data/vendor/rack/lib/rack/recursive.rb +0 -57
  68. data/vendor/rack/lib/rack/reloader.rb +0 -64
  69. data/vendor/rack/lib/rack/request.rb +0 -197
  70. data/vendor/rack/lib/rack/response.rb +0 -166
  71. data/vendor/rack/lib/rack/session/abstract/id.rb +0 -126
  72. data/vendor/rack/lib/rack/session/cookie.rb +0 -71
  73. data/vendor/rack/lib/rack/session/memcache.rb +0 -83
  74. data/vendor/rack/lib/rack/session/pool.rb +0 -67
  75. data/vendor/rack/lib/rack/showexceptions.rb +0 -344
  76. data/vendor/rack/lib/rack/showstatus.rb +0 -103
  77. data/vendor/rack/lib/rack/static.rb +0 -38
  78. data/vendor/rack/lib/rack/urlmap.rb +0 -48
  79. data/vendor/rack/lib/rack/utils.rb +0 -240
  80. data/vendor/rack/test/cgi/lighttpd.conf +0 -20
  81. data/vendor/rack/test/cgi/test +0 -9
  82. data/vendor/rack/test/cgi/test.fcgi +0 -7
  83. data/vendor/rack/test/cgi/test.ru +0 -7
  84. data/vendor/rack/test/spec_rack_auth_basic.rb +0 -69
  85. data/vendor/rack/test/spec_rack_auth_digest.rb +0 -169
  86. data/vendor/rack/test/spec_rack_builder.rb +0 -50
  87. data/vendor/rack/test/spec_rack_camping.rb +0 -47
  88. data/vendor/rack/test/spec_rack_cascade.rb +0 -50
  89. data/vendor/rack/test/spec_rack_cgi.rb +0 -91
  90. data/vendor/rack/test/spec_rack_commonlogger.rb +0 -32
  91. data/vendor/rack/test/spec_rack_fastcgi.rb +0 -91
  92. data/vendor/rack/test/spec_rack_file.rb +0 -40
  93. data/vendor/rack/test/spec_rack_lint.rb +0 -317
  94. data/vendor/rack/test/spec_rack_lobster.rb +0 -45
  95. data/vendor/rack/test/spec_rack_mock.rb +0 -152
  96. data/vendor/rack/test/spec_rack_mongrel.rb +0 -165
  97. data/vendor/rack/test/spec_rack_recursive.rb +0 -77
  98. data/vendor/rack/test/spec_rack_request.rb +0 -384
  99. data/vendor/rack/test/spec_rack_response.rb +0 -167
  100. data/vendor/rack/test/spec_rack_session_cookie.rb +0 -49
  101. data/vendor/rack/test/spec_rack_session_memcache.rb +0 -100
  102. data/vendor/rack/test/spec_rack_session_pool.rb +0 -84
  103. data/vendor/rack/test/spec_rack_showexceptions.rb +0 -21
  104. data/vendor/rack/test/spec_rack_showstatus.rb +0 -71
  105. data/vendor/rack/test/spec_rack_static.rb +0 -37
  106. data/vendor/rack/test/spec_rack_urlmap.rb +0 -175
  107. data/vendor/rack/test/spec_rack_utils.rb +0 -57
  108. data/vendor/rack/test/spec_rack_webrick.rb +0 -106
  109. data/vendor/rack/test/testrequest.rb +0 -43
@@ -3,13 +3,13 @@ require File.dirname(__FILE__) + '/helper'
3
3
  context "EventContext" do
4
4
 
5
5
  specify "DSLified setters" do
6
-
6
+
7
7
  cx = Sinatra::EventContext.new(stub_everything, Rack::Response.new, {})
8
8
  lambda {
9
9
  cx.status 404
10
10
  }.should.not.raise(ArgumentError)
11
-
11
+
12
12
  end
13
-
13
+
14
14
  end
15
15
 
@@ -1,7 +1,4 @@
1
- require File.dirname(__FILE__) + '/../lib/sinatra'
2
-
3
- require 'rubygems'
4
- require 'test/spec'
1
+ require File.dirname(__FILE__) + '/helper'
5
2
 
6
3
  context "Simple Events" do
7
4
 
@@ -16,7 +13,7 @@ context "Simple Events" do
16
13
  event = Sinatra::Event.new(path, &b)
17
14
  event.invoke(simple_request_hash(:get, request_path))
18
15
  end
19
-
16
+
20
17
  specify "return last value" do
21
18
  block = Proc.new { 'Simple' }
22
19
  result = invoke_simple('/', '/', &block)
@@ -24,27 +21,27 @@ context "Simple Events" do
24
21
  result.block.should.be block
25
22
  result.params.should.equal Hash.new
26
23
  end
27
-
24
+
28
25
  specify "takes params in path" do
29
26
  result = invoke_simple('/:foo/:bar', '/a/b')
30
27
  result.should.not.be.nil
31
28
  result.params.should.equal "foo" => 'a', "bar" => 'b'
32
-
29
+
33
30
  # unscapes
34
31
  result = invoke_simple('/:foo/:bar', '/a/blake%20mizerany')
35
32
  result.should.not.be.nil
36
33
  result.params.should.equal "foo" => 'a', "bar" => 'blake mizerany'
37
34
  end
38
-
35
+
39
36
  specify "ignores to many /'s" do
40
37
  result = invoke_simple('/x/y', '/x//y')
41
38
  result.should.not.be.nil
42
39
  end
43
-
40
+
44
41
  specify "understands splat" do
45
42
  invoke_simple('/foo/*', '/foo/bar').should.not.be.nil
46
43
  invoke_simple('/foo/*', '/foo/bar/baz').should.not.be.nil
47
44
  invoke_simple('/foo/*', '/foo/baz').should.not.be.nil
48
- end
49
-
45
+ end
46
+
50
47
  end
@@ -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
@@ -5,95 +5,95 @@ context "Haml" do
5
5
  setup do
6
6
  Sinatra.application = nil
7
7
  end
8
-
8
+
9
9
  context "without layouts" do
10
-
10
+
11
11
  setup do
12
12
  Sinatra.application = nil
13
13
  end
14
-
14
+
15
15
  specify "should render" do
16
-
16
+
17
17
  get '/no_layout' do
18
18
  haml '== #{1+1}'
19
19
  end
20
-
20
+
21
21
  get_it '/no_layout'
22
22
  should.be.ok
23
23
  body.should == "2\n"
24
24
 
25
25
  end
26
26
  end
27
-
27
+
28
28
  context "with layouts" do
29
29
 
30
30
  setup do
31
31
  Sinatra.application = nil
32
32
  end
33
-
33
+
34
34
  specify "can be inline" do
35
-
35
+
36
36
  layout do
37
37
  '== This is #{yield}!'
38
38
  end
39
-
39
+
40
40
  get '/lay' do
41
41
  haml 'Blake'
42
42
  end
43
-
43
+
44
44
  get_it '/lay'
45
45
  should.be.ok
46
46
  body.should.equal "This is Blake\n!\n"
47
47
 
48
48
  end
49
-
49
+
50
50
  specify "can use named layouts" do
51
-
51
+
52
52
  layout :pretty do
53
53
  '%h1== #{yield}'
54
54
  end
55
-
55
+
56
56
  get '/pretty' do
57
57
  haml 'Foo', :layout => :pretty
58
58
  end
59
-
59
+
60
60
  get '/not_pretty' do
61
61
  haml 'Bar'
62
62
  end
63
-
63
+
64
64
  get_it '/pretty'
65
65
  body.should.equal "<h1>Foo</h1>\n"
66
-
66
+
67
67
  get_it '/not_pretty'
68
68
  body.should.equal "Bar\n"
69
-
69
+
70
70
  end
71
-
71
+
72
72
  specify "can be read from a file if they're not inlined" do
73
-
73
+
74
74
  get '/foo' do
75
75
  @title = 'Welcome to the Hello Program'
76
76
  haml 'Blake', :layout => :foo_layout,
77
77
  :views_directory => File.dirname(__FILE__) + "/views"
78
78
  end
79
-
79
+
80
80
  get_it '/foo'
81
81
  body.should.equal "Welcome to the Hello Program\nHi Blake\n"
82
-
82
+
83
83
  end
84
-
84
+
85
85
  specify "can be read from file and layout from text" do
86
86
  get '/foo' do
87
87
  haml 'Test', :layout => '== Foo #{yield}'
88
88
  end
89
-
89
+
90
90
  get_it '/foo'
91
-
91
+
92
92
  body.should.equal "Foo Test\n"
93
93
  end
94
94
 
95
95
  end
96
-
96
+
97
97
  context "Templates (in general)" do
98
98
 
99
99
  setup do
@@ -136,21 +136,21 @@ context "Haml" do
136
136
  body.should.equal "<h1>No Layout!</h1>\n"
137
137
 
138
138
  end
139
-
139
+
140
140
  specify "can render with no layout" do
141
141
  layout do
142
142
  "X\n= yield\nX"
143
143
  end
144
-
144
+
145
145
  get '/' do
146
146
  haml 'blake', :layout => false
147
147
  end
148
-
148
+
149
149
  get_it '/'
150
-
150
+
151
151
  body.should.equal "blake\n"
152
152
  end
153
-
153
+
154
154
  specify "raises error if template not found" do
155
155
  get '/' do
156
156
  haml :not_found
@@ -175,7 +175,59 @@ context "Haml" do
175
175
  body.should.equal "asdf\n"
176
176
 
177
177
  end
178
-
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
+
179
231
  end
180
232
 
181
233
  end
@@ -1,4 +1,7 @@
1
- require File.dirname(__FILE__) + "/../lib/sinatra"
2
- require File.dirname(__FILE__) + "/../lib/sinatra/test/spec"
1
+ require 'rubygems'
2
+ require 'mocha'
3
3
 
4
- require "mocha"
4
+ $:.unshift File.dirname(File.dirname(__FILE__)) + "/lib"
5
+
6
+ require 'sinatra'
7
+ require 'sinatra/test/spec'
@@ -3,59 +3,70 @@ require File.dirname(__FILE__) + '/helper'
3
3
  class FooError < RuntimeError; end
4
4
 
5
5
  context "Mapped errors" do
6
-
6
+
7
7
  setup do
8
8
  Sinatra.application = nil
9
+ Sinatra.application.options.raise_errors = false
9
10
  end
10
-
11
+
11
12
  specify "are rescued and run in context" do
12
-
13
+
13
14
  error FooError do
14
15
  'MAPPED ERROR!'
15
16
  end
16
-
17
+
17
18
  get '/' do
18
- raise FooError.new
19
+ raise FooError
19
20
  end
20
-
21
+
21
22
  get_it '/'
22
-
23
+
23
24
  should.be.server_error
24
25
  body.should.equal 'MAPPED ERROR!'
25
-
26
+
26
27
  end
27
28
 
28
29
  specify "renders empty if no each method on result" do
29
-
30
+
30
31
  error FooError do
31
32
  nil
32
33
  end
33
-
34
+
34
35
  get '/' do
35
- raise FooError.new
36
+ raise FooError
36
37
  end
37
-
38
+
38
39
  get_it '/'
39
-
40
+
40
41
  should.be.server_error
41
42
  body.should.be.empty
42
-
43
+
43
44
  end
44
45
 
45
46
  specify "doesn't override status if set" do
46
-
47
+
47
48
  error FooError do
48
49
  status(200)
49
50
  end
50
-
51
+
51
52
  get '/' do
52
- raise FooError.new
53
+ raise FooError
53
54
  end
54
-
55
+
55
56
  get_it '/'
56
-
57
+
57
58
  should.be.ok
58
-
59
+
60
+ end
61
+
62
+ specify "raises errors when the raise_errors option is set" do
63
+ Sinatra.application.options.raise_errors = true
64
+ error FooError do
65
+ end
66
+ get '/' do
67
+ raise FooError
68
+ end
69
+ assert_raises(FooError) { get_it('/') }
59
70
  end
60
-
71
+
61
72
  end
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class UpcaseMiddleware
4
+ def initialize(app, *args, &block)
5
+ @app = app
6
+ @args = args
7
+ @block = block
8
+ end
9
+ def call(env)
10
+ env['PATH_INFO'] = env['PATH_INFO'].to_s.upcase
11
+ @app.call(env)
12
+ end
13
+ end
14
+
15
+ context "Middleware Pipelines" do
16
+
17
+ setup do
18
+ Sinatra.application = nil
19
+ @app = Sinatra.application
20
+ end
21
+
22
+ teardown do
23
+ Sinatra.application = nil
24
+ end
25
+
26
+ specify "includes default middleware with options set" do
27
+ @app.set_options :sessions => true, :logging => true
28
+ @app.send(:optional_middleware).should.include([Rack::Session::Cookie, [], nil])
29
+ @app.send(:optional_middleware).should.include([Rack::CommonLogger, [], nil])
30
+ end
31
+
32
+ specify "does not include default middleware with options unset" do
33
+ @app.set_options :sessions => false, :logging => false
34
+ @app.send(:optional_middleware).should.not.include([Rack::Session::Cookie, [], nil])
35
+ @app.send(:optional_middleware).should.not.include([Rack::CommonLogger, [], nil])
36
+ end
37
+
38
+ specify "includes only optional middleware when no explicit middleware added" do
39
+ @app.set_options :sessions => true, :logging => true
40
+ @app.send(:middleware).should.equal @app.send(:optional_middleware)
41
+ end
42
+
43
+ specify "should clear middleware before reload" do
44
+ @app.clearables.should.include(@app.send(:explicit_middleware))
45
+ end
46
+
47
+ specify "should add middleware with use" do
48
+ block = Proc.new { |env| }
49
+ @app.use UpcaseMiddleware
50
+ @app.use UpcaseMiddleware, "foo", "bar"
51
+ @app.use UpcaseMiddleware, "foo", "bar", &block
52
+ @app.send(:middleware).should.include([UpcaseMiddleware, [], nil])
53
+ @app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], nil])
54
+ @app.send(:middleware).should.include([UpcaseMiddleware, ["foo", "bar"], block])
55
+ end
56
+
57
+ specify "should run middleware added with use" do
58
+ get('/foo') { "FAIL!" }
59
+ get('/FOO') { "PASS!" }
60
+ use UpcaseMiddleware
61
+ get_it '/foo'
62
+ should.be.ok
63
+ body.should.equal "PASS!"
64
+ end
65
+
66
+ end