darkhelmet-sinatra 0.9.1.1 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/AUTHORS +2 -0
  2. data/CHANGES +180 -0
  3. data/LICENSE +1 -1
  4. data/README.jp.rdoc +552 -0
  5. data/README.rdoc +177 -38
  6. data/Rakefile +18 -25
  7. data/lib/sinatra.rb +1 -2
  8. data/lib/sinatra/base.rb +405 -305
  9. data/lib/sinatra/main.rb +5 -24
  10. data/lib/sinatra/showexceptions.rb +303 -0
  11. data/lib/sinatra/tilt.rb +509 -0
  12. data/sinatra.gemspec +21 -51
  13. data/test/base_test.rb +123 -93
  14. data/test/builder_test.rb +2 -1
  15. data/test/contest.rb +64 -0
  16. data/test/erb_test.rb +1 -1
  17. data/test/erubis_test.rb +82 -0
  18. data/test/extensions_test.rb +24 -8
  19. data/test/filter_test.rb +99 -3
  20. data/test/haml_test.rb +25 -3
  21. data/test/helper.rb +43 -48
  22. data/test/helpers_test.rb +500 -424
  23. data/test/mapped_error_test.rb +163 -137
  24. data/test/middleware_test.rb +3 -3
  25. data/test/request_test.rb +16 -1
  26. data/test/response_test.rb +2 -2
  27. data/test/result_test.rb +1 -1
  28. data/test/route_added_hook_test.rb +59 -0
  29. data/test/routing_test.rb +170 -22
  30. data/test/sass_test.rb +44 -1
  31. data/test/server_test.rb +19 -13
  32. data/test/sinatra_test.rb +1 -1
  33. data/test/static_test.rb +9 -2
  34. data/test/templates_test.rb +78 -11
  35. data/test/views/error.builder +3 -0
  36. data/test/views/error.erb +3 -0
  37. data/test/views/error.erubis +3 -0
  38. data/test/views/error.haml +3 -0
  39. data/test/views/error.sass +2 -0
  40. data/test/views/foo/hello.test +1 -0
  41. data/test/views/hello.erubis +1 -0
  42. data/test/views/layout2.erubis +2 -0
  43. metadata +37 -55
  44. data/compat/app_test.rb +0 -282
  45. data/compat/application_test.rb +0 -262
  46. data/compat/builder_test.rb +0 -101
  47. data/compat/compat_test.rb +0 -12
  48. data/compat/custom_error_test.rb +0 -62
  49. data/compat/erb_test.rb +0 -136
  50. data/compat/events_test.rb +0 -78
  51. data/compat/filter_test.rb +0 -30
  52. data/compat/haml_test.rb +0 -233
  53. data/compat/helper.rb +0 -30
  54. data/compat/mapped_error_test.rb +0 -72
  55. data/compat/pipeline_test.rb +0 -45
  56. data/compat/public/foo.xml +0 -1
  57. data/compat/sass_test.rb +0 -57
  58. data/compat/sessions_test.rb +0 -42
  59. data/compat/streaming_test.rb +0 -133
  60. data/compat/sym_params_test.rb +0 -19
  61. data/compat/template_test.rb +0 -30
  62. data/compat/use_in_file_templates_test.rb +0 -47
  63. data/compat/views/foo.builder +0 -1
  64. data/compat/views/foo.erb +0 -1
  65. data/compat/views/foo.haml +0 -1
  66. data/compat/views/foo.sass +0 -2
  67. data/compat/views/foo_layout.erb +0 -2
  68. data/compat/views/foo_layout.haml +0 -2
  69. data/compat/views/layout_test/foo.builder +0 -1
  70. data/compat/views/layout_test/foo.erb +0 -1
  71. data/compat/views/layout_test/foo.haml +0 -1
  72. data/compat/views/layout_test/foo.sass +0 -2
  73. data/compat/views/layout_test/layout.builder +0 -3
  74. data/compat/views/layout_test/layout.erb +0 -1
  75. data/compat/views/layout_test/layout.haml +0 -1
  76. data/compat/views/layout_test/layout.sass +0 -2
  77. data/compat/views/no_layout/no_layout.builder +0 -1
  78. data/compat/views/no_layout/no_layout.haml +0 -1
  79. data/lib/sinatra/compat.rb +0 -250
  80. data/lib/sinatra/test.rb +0 -126
  81. data/lib/sinatra/test/bacon.rb +0 -19
  82. data/lib/sinatra/test/rspec.rb +0 -13
  83. data/lib/sinatra/test/spec.rb +0 -11
  84. data/lib/sinatra/test/unit.rb +0 -13
  85. data/test/data/reload_app_file.rb +0 -3
  86. data/test/options_test.rb +0 -374
  87. data/test/reload_test.rb +0 -68
  88. data/test/test_test.rb +0 -144
@@ -2,14 +2,14 @@ Gem::Specification.new do |s|
2
2
  s.specification_version = 2 if s.respond_to? :specification_version=
3
3
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
4
 
5
- s.name = 'sinatra'
6
- s.version = '0.9.1.1'
7
- s.date = '2009-03-09'
5
+ s.name = 'darkhelmet-sinatra'
6
+ s.version = '0.10.1'
7
+ s.date = '2009-12-13'
8
8
 
9
9
  s.description = "Classy web-development dressed in a DSL"
10
10
  s.summary = "Classy web-development dressed in a DSL"
11
11
 
12
- s.authors = ["Blake Mizerany"]
12
+ s.authors = ["Blake Mizerany", "Ryan Tomayko", "Simon Rozet"]
13
13
  s.email = "sinatrarb@googlegroups.com"
14
14
 
15
15
  # = MANIFEST =
@@ -17,59 +17,22 @@ Gem::Specification.new do |s|
17
17
  AUTHORS
18
18
  CHANGES
19
19
  LICENSE
20
+ README.jp.rdoc
20
21
  README.rdoc
21
22
  Rakefile
22
- compat/app_test.rb
23
- compat/application_test.rb
24
- compat/builder_test.rb
25
- compat/compat_test.rb
26
- compat/custom_error_test.rb
27
- compat/erb_test.rb
28
- compat/events_test.rb
29
- compat/filter_test.rb
30
- compat/haml_test.rb
31
- compat/helper.rb
32
- compat/mapped_error_test.rb
33
- compat/pipeline_test.rb
34
- compat/public/foo.xml
35
- compat/sass_test.rb
36
- compat/sessions_test.rb
37
- compat/streaming_test.rb
38
- compat/sym_params_test.rb
39
- compat/template_test.rb
40
- compat/use_in_file_templates_test.rb
41
- compat/views/foo.builder
42
- compat/views/foo.erb
43
- compat/views/foo.haml
44
- compat/views/foo.sass
45
- compat/views/foo_layout.erb
46
- compat/views/foo_layout.haml
47
- compat/views/layout_test/foo.builder
48
- compat/views/layout_test/foo.erb
49
- compat/views/layout_test/foo.haml
50
- compat/views/layout_test/foo.sass
51
- compat/views/layout_test/layout.builder
52
- compat/views/layout_test/layout.erb
53
- compat/views/layout_test/layout.haml
54
- compat/views/layout_test/layout.sass
55
- compat/views/no_layout/no_layout.builder
56
- compat/views/no_layout/no_layout.haml
57
23
  lib/sinatra.rb
58
24
  lib/sinatra/base.rb
59
- lib/sinatra/compat.rb
60
25
  lib/sinatra/images/404.png
61
26
  lib/sinatra/images/500.png
62
27
  lib/sinatra/main.rb
63
- lib/sinatra/test.rb
64
- lib/sinatra/test/bacon.rb
65
- lib/sinatra/test/rspec.rb
66
- lib/sinatra/test/spec.rb
67
- lib/sinatra/test/unit.rb
28
+ lib/sinatra/showexceptions.rb
29
+ lib/sinatra/tilt.rb
68
30
  sinatra.gemspec
69
31
  test/base_test.rb
70
32
  test/builder_test.rb
71
- test/data/reload_app_file.rb
33
+ test/contest.rb
72
34
  test/erb_test.rb
35
+ test/erubis_test.rb
73
36
  test/extensions_test.rb
74
37
  test/filter_test.rb
75
38
  test/haml_test.rb
@@ -77,25 +40,31 @@ Gem::Specification.new do |s|
77
40
  test/helpers_test.rb
78
41
  test/mapped_error_test.rb
79
42
  test/middleware_test.rb
80
- test/options_test.rb
81
- test/reload_test.rb
82
43
  test/request_test.rb
83
44
  test/response_test.rb
84
45
  test/result_test.rb
46
+ test/route_added_hook_test.rb
85
47
  test/routing_test.rb
86
48
  test/sass_test.rb
87
49
  test/server_test.rb
88
50
  test/sinatra_test.rb
89
51
  test/static_test.rb
90
52
  test/templates_test.rb
91
- test/test_test.rb
53
+ test/views/error.builder
54
+ test/views/error.erb
55
+ test/views/error.erubis
56
+ test/views/error.haml
57
+ test/views/error.sass
58
+ test/views/foo/hello.test
92
59
  test/views/hello.builder
93
60
  test/views/hello.erb
61
+ test/views/hello.erubis
94
62
  test/views/hello.haml
95
63
  test/views/hello.sass
96
64
  test/views/hello.test
97
65
  test/views/layout2.builder
98
66
  test/views/layout2.erb
67
+ test/views/layout2.erubis
99
68
  test/views/layout2.haml
100
69
  test/views/layout2.test
101
70
  ]
@@ -104,8 +73,9 @@ Gem::Specification.new do |s|
104
73
  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
105
74
 
106
75
  s.extra_rdoc_files = %w[README.rdoc LICENSE]
107
- s.add_dependency 'rack', '>= 0.9.1'
108
- s.add_dependency 'rack', '>= 0.9.1', '< 1.0'
76
+ s.add_dependency 'rack', '>= 1.0'
77
+ s.add_development_dependency 'shotgun', '>= 0.3', '< 1.0'
78
+ s.add_development_dependency 'rack-test', '>= 0.3.0'
109
79
 
110
80
  s.has_rdoc = true
111
81
  s.homepage = "http://sinatra.rubyforge.org"
@@ -1,130 +1,160 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
- describe 'Sinatra::Base subclasses' do
3
+ class BaseTest < Test::Unit::TestCase
4
+ def test_default
5
+ assert true
6
+ end
4
7
 
5
- class TestApp < Sinatra::Base
6
- get '/' do
7
- 'Hello World'
8
+ describe 'Sinatra::Base subclasses' do
9
+ class TestApp < Sinatra::Base
10
+ get '/' do
11
+ 'Hello World'
12
+ end
8
13
  end
9
- end
10
14
 
11
- it 'include Rack::Utils' do
12
- assert TestApp.included_modules.include?(Rack::Utils)
13
- end
15
+ it 'include Rack::Utils' do
16
+ assert TestApp.included_modules.include?(Rack::Utils)
17
+ end
14
18
 
15
- it 'processes requests with #call' do
16
- assert TestApp.respond_to?(:call)
19
+ it 'processes requests with #call' do
20
+ assert TestApp.respond_to?(:call)
17
21
 
18
- request = Rack::MockRequest.new(TestApp)
19
- response = request.get('/')
20
- assert response.ok?
21
- assert_equal 'Hello World', response.body
22
- end
22
+ request = Rack::MockRequest.new(TestApp)
23
+ response = request.get('/')
24
+ assert response.ok?
25
+ assert_equal 'Hello World', response.body
26
+ end
23
27
 
24
- class TestApp < Sinatra::Base
25
- get '/state' do
26
- body = "Foo: #{@foo}"
27
- @foo = 'discard'
28
- body
28
+ class TestApp < Sinatra::Base
29
+ get '/state' do
30
+ @foo ||= "new"
31
+ body = "Foo: #{@foo}"
32
+ @foo = 'discard'
33
+ body
34
+ end
29
35
  end
30
- end
31
36
 
32
- it 'does not maintain state between requests' do
33
- request = Rack::MockRequest.new(TestApp)
34
- 2.times do
35
- response = request.get('/state')
36
- assert response.ok?
37
- assert_equal 'Foo: ', response.body
37
+ it 'does not maintain state between requests' do
38
+ request = Rack::MockRequest.new(TestApp)
39
+ 2.times do
40
+ response = request.get('/state')
41
+ assert response.ok?
42
+ assert_equal 'Foo: new', response.body
43
+ end
44
+ end
45
+
46
+ it "passes the subclass to configure blocks" do
47
+ ref = nil
48
+ TestApp.configure { |app| ref = app }
49
+ assert_equal TestApp, ref
50
+ end
51
+
52
+ it "allows the configure block arg to be omitted and does not change context" do
53
+ context = nil
54
+ TestApp.configure { context = self }
55
+ assert_equal self, context
38
56
  end
39
57
  end
40
- end
41
58
 
42
- describe "Sinatra::Base as Rack middleware" do
59
+ describe "Sinatra::Base as Rack middleware" do
60
+ app = lambda { |env|
61
+ headers = {'X-Downstream' => 'true'}
62
+ headers['X-Route-Missing'] = env['sinatra.route-missing'] || ''
63
+ [210, headers, ['Hello from downstream']] }
43
64
 
44
- app = lambda { |env|
45
- [210, {'X-Downstream' => 'true'}, ['Hello from downstream']] }
65
+ class TestMiddleware < Sinatra::Base
66
+ end
46
67
 
47
- class TestMiddleware < Sinatra::Base
48
- end
68
+ it 'creates a middleware that responds to #call with .new' do
69
+ middleware = TestMiddleware.new(app)
70
+ assert middleware.respond_to?(:call)
71
+ end
49
72
 
50
- it 'creates a middleware that responds to #call with .new' do
51
- middleware = TestMiddleware.new(app)
52
- assert middleware.respond_to?(:call)
53
- end
73
+ it 'exposes the downstream app' do
74
+ middleware = TestMiddleware.new(app)
75
+ assert_same app, middleware.app
76
+ end
77
+
78
+ class TestMiddleware < Sinatra::Base
79
+ def route_missing
80
+ env['sinatra.route-missing'] = '1'
81
+ super
82
+ end
83
+
84
+ get '/' do
85
+ 'Hello from middleware'
86
+ end
87
+ end
54
88
 
55
- it 'exposes the downstream app' do
56
89
  middleware = TestMiddleware.new(app)
57
- assert_same app, middleware.app
58
- end
90
+ request = Rack::MockRequest.new(middleware)
59
91
 
60
- class TestMiddleware < Sinatra::Base
61
- get '/' do
62
- 'Hello from middleware'
92
+ it 'intercepts requests' do
93
+ response = request.get('/')
94
+ assert response.ok?
95
+ assert_equal 'Hello from middleware', response.body
63
96
  end
64
- end
65
97
 
66
- middleware = TestMiddleware.new(app)
67
- request = Rack::MockRequest.new(middleware)
98
+ it 'automatically forwards requests downstream when no matching route found' do
99
+ response = request.get('/missing')
100
+ assert_equal 210, response.status
101
+ assert_equal 'Hello from downstream', response.body
102
+ end
68
103
 
69
- it 'intercepts requests' do
70
- response = request.get('/')
71
- assert response.ok?
72
- assert_equal 'Hello from middleware', response.body
73
- end
104
+ it 'calls #route_missing before forwarding downstream' do
105
+ response = request.get('/missing')
106
+ assert_equal '1', response['X-Route-Missing']
107
+ end
74
108
 
75
- it 'automatically forwards requests downstream when no matching route found' do
76
- response = request.get('/missing')
77
- assert_equal 210, response.status
78
- assert_equal 'Hello from downstream', response.body
79
- end
109
+ class TestMiddleware < Sinatra::Base
110
+ get '/low-level-forward' do
111
+ app.call(env)
112
+ end
113
+ end
80
114
 
81
- class TestMiddleware < Sinatra::Base
82
- get '/low-level-forward' do
83
- app.call(env)
115
+ it 'can call the downstream app directly and return result' do
116
+ response = request.get('/low-level-forward')
117
+ assert_equal 210, response.status
118
+ assert_equal 'true', response['X-Downstream']
119
+ assert_equal 'Hello from downstream', response.body
84
120
  end
85
- end
86
121
 
87
- it 'can call the downstream app directly and return result' do
88
- response = request.get('/low-level-forward')
89
- assert_equal 210, response.status
90
- assert_equal 'true', response['X-Downstream']
91
- assert_equal 'Hello from downstream', response.body
92
- end
122
+ class TestMiddleware < Sinatra::Base
123
+ get '/explicit-forward' do
124
+ response['X-Middleware'] = 'true'
125
+ res = forward
126
+ assert_nil res
127
+ assert_equal 210, response.status
128
+ assert_equal 'true', response['X-Downstream']
129
+ assert_equal ['Hello from downstream'], response.body
130
+ 'Hello after explicit forward'
131
+ end
132
+ end
93
133
 
94
- class TestMiddleware < Sinatra::Base
95
- get '/explicit-forward' do
96
- response['X-Middleware'] = 'true'
97
- res = forward
98
- assert_nil res
134
+ it 'forwards the request downstream and integrates the response into the current context' do
135
+ response = request.get('/explicit-forward')
99
136
  assert_equal 210, response.status
100
137
  assert_equal 'true', response['X-Downstream']
101
- assert_equal ['Hello from downstream'], response.body
102
- 'Hello after explicit forward'
138
+ assert_equal 'Hello after explicit forward', response.body
139
+ assert_equal '28', response['Content-Length']
103
140
  end
104
- end
105
141
 
106
- it 'forwards the request downstream and integrates the response into the current context' do
107
- response = request.get('/explicit-forward')
108
- assert_equal 210, response.status
109
- assert_equal 'true', response['X-Downstream']
110
- assert_equal 'Hello after explicit forward', response.body
111
- assert_equal '28', response['Content-Length']
112
- end
142
+ app_content_length = lambda {|env|
143
+ [200, {'Content-Length' => '16'}, 'From downstream!']}
113
144
 
114
- app_content_length = lambda {|env|
115
- [200, {'Content-Length' => '16'}, 'From downstream!']}
116
- class TestMiddlewareContentLength < Sinatra::Base
117
- get '/forward' do
118
- res = forward
119
- 'From after explicit forward!'
145
+ class TestMiddlewareContentLength < Sinatra::Base
146
+ get '/forward' do
147
+ res = forward
148
+ 'From after explicit forward!'
149
+ end
120
150
  end
121
- end
122
151
 
123
- middleware_content_length = TestMiddlewareContentLength.new(app_content_length)
124
- request_content_length = Rack::MockRequest.new(middleware_content_length)
152
+ middleware_content_length = TestMiddlewareContentLength.new(app_content_length)
153
+ request_content_length = Rack::MockRequest.new(middleware_content_length)
125
154
 
126
- it "sets content length for last response" do
127
- response = request_content_length.get('/forward')
128
- assert_equal '28', response['Content-Length']
155
+ it "sets content length for last response" do
156
+ response = request_content_length.get('/forward')
157
+ assert_equal '28', response['Content-Length']
158
+ end
129
159
  end
130
160
  end
@@ -1,6 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
+ require 'builder'
2
3
 
3
- describe "Builder Templates" do
4
+ class BuilderTest < Test::Unit::TestCase
4
5
  def builder_app(&block)
5
6
  mock_app {
6
7
  set :views, File.dirname(__FILE__) + '/views'
@@ -0,0 +1,64 @@
1
+ require "test/unit"
2
+
3
+ # Test::Unit loads a default test if the suite is empty, and the only
4
+ # purpose of that test is to fail. As having empty contexts is a common
5
+ # practice, we decided to overwrite TestSuite#empty? in order to
6
+ # allow them. Having a failure when no tests have been defined seems
7
+ # counter-intuitive.
8
+ class Test::Unit::TestSuite
9
+ unless method_defined?(:empty?)
10
+ def empty?
11
+ false
12
+ end
13
+ end
14
+ end
15
+
16
+ # We added setup, test and context as class methods, and the instance
17
+ # method setup now iterates on the setup blocks. Note that all setup
18
+ # blocks must be defined with the block syntax. Adding a setup instance
19
+ # method defeats the purpose of this library.
20
+ class Test::Unit::TestCase
21
+ def self.setup(&block)
22
+ setup_blocks << block
23
+ end
24
+
25
+ def setup
26
+ self.class.setup_blocks.each do |block|
27
+ instance_eval(&block)
28
+ end
29
+ end
30
+
31
+ def self.context(name, &block)
32
+ subclass = Class.new(self.superclass)
33
+ subclass.setup_blocks.unshift(*setup_blocks)
34
+ subclass.class_eval(&block)
35
+ const_set(context_name(name), subclass)
36
+ end
37
+
38
+ def self.test(name, &block)
39
+ define_method(test_name(name), &block)
40
+ end
41
+
42
+ class << self
43
+ alias_method :should, :test
44
+ alias_method :describe, :context
45
+ end
46
+
47
+ private
48
+
49
+ def self.setup_blocks
50
+ @setup_blocks ||= []
51
+ end
52
+
53
+ def self.context_name(name)
54
+ "Test#{sanitize_name(name).gsub(/(^| )(\w)/) { $2.upcase }}".to_sym
55
+ end
56
+
57
+ def self.test_name(name)
58
+ "test_#{sanitize_name(name).gsub(/\s+/,'_')}".to_sym
59
+ end
60
+
61
+ def self.sanitize_name(name)
62
+ name.gsub(/\W+/, ' ').strip
63
+ end
64
+ end