darkhelmet-sinatra 0.9.1.1 → 0.10.1

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 (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
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
- describe "ERB Templates" do
3
+ class ERBTest < Test::Unit::TestCase
4
4
  def erb_app(&block)
5
5
  mock_app {
6
6
  set :views, File.dirname(__FILE__) + '/views'
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require 'erubis'
3
+
4
+ class ERubisTest < Test::Unit::TestCase
5
+ def erubis_app(&block)
6
+ mock_app {
7
+ set :views, File.dirname(__FILE__) + '/views'
8
+ get '/', &block
9
+ }
10
+ get '/'
11
+ end
12
+
13
+ it 'renders inline ERubis strings' do
14
+ erubis_app { erubis '<%= 1 + 1 %>' }
15
+ assert ok?
16
+ assert_equal '2', body
17
+ end
18
+
19
+ it 'renders .erubis files in views path' do
20
+ erubis_app { erubis :hello }
21
+ assert ok?
22
+ assert_equal "Hello World\n", body
23
+ end
24
+
25
+ it 'takes a :locals option' do
26
+ erubis_app {
27
+ locals = {:foo => 'Bar'}
28
+ erubis '<%= foo %>', :locals => locals
29
+ }
30
+ assert ok?
31
+ assert_equal 'Bar', body
32
+ end
33
+
34
+ it "renders with inline layouts" do
35
+ mock_app {
36
+ layout { 'THIS. IS. <%= yield.upcase %>!' }
37
+ get('/') { erubis 'Sparta' }
38
+ }
39
+ get '/'
40
+ assert ok?
41
+ assert_equal 'THIS. IS. SPARTA!', body
42
+ end
43
+
44
+ it "renders with file layouts" do
45
+ erubis_app {
46
+ erubis 'Hello World', :layout => :layout2
47
+ }
48
+ assert ok?
49
+ assert_equal "ERubis Layout!\nHello World\n", body
50
+ end
51
+
52
+ it "renders erubis with blocks" do
53
+ mock_app {
54
+ def container
55
+ @_out_buf << "THIS."
56
+ yield
57
+ @_out_buf << "SPARTA!"
58
+ end
59
+ def is; "IS." end
60
+ get '/' do
61
+ erubis '<% container do %> <%= is %> <% end %>'
62
+ end
63
+ }
64
+ get '/'
65
+ assert ok?
66
+ assert_equal 'THIS. IS. SPARTA!', body
67
+ end
68
+
69
+ it "can be used in a nested fashion for partials and whatnot" do
70
+ mock_app {
71
+ template(:inner) { "<inner><%= 'hi' %></inner>" }
72
+ template(:outer) { "<outer><%= erubis :inner %></outer>" }
73
+ get '/' do
74
+ erubis :outer
75
+ end
76
+ }
77
+
78
+ get '/'
79
+ assert ok?
80
+ assert_equal '<outer><inner>hi</inner></outer>', body
81
+ end
82
+ end
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
- describe 'Registering extensions' do
3
+ class ExtensionsTest < Test::Unit::TestCase
4
4
  module FooExtensions
5
5
  def foo
6
6
  end
@@ -25,13 +25,19 @@ describe 'Registering extensions' do
25
25
  end
26
26
  end
27
27
 
28
+ module PainExtensions
29
+ def foo=(name); end
30
+ def bar?(name); end
31
+ def fizz!(name); end
32
+ end
33
+
28
34
  it 'will add the methods to the DSL for the class in which you register them and its subclasses' do
29
35
  Sinatra::Base.register FooExtensions
30
36
  assert Sinatra::Base.respond_to?(:foo)
31
37
 
32
- Sinatra::Default.register BarExtensions
33
- assert Sinatra::Default.respond_to?(:bar)
34
- assert Sinatra::Default.respond_to?(:foo)
38
+ Sinatra::Application.register BarExtensions
39
+ assert Sinatra::Application.respond_to?(:bar)
40
+ assert Sinatra::Application.respond_to?(:foo)
35
41
  assert !Sinatra::Base.respond_to?(:bar)
36
42
  end
37
43
 
@@ -42,23 +48,33 @@ describe 'Registering extensions' do
42
48
  assert Sinatra::Base.respond_to?(:im_in_ur_anonymous_module)
43
49
  end
44
50
 
45
- it 'will make sure any public methods added via Default#register are delegated to Sinatra::Delegator' do
46
- Sinatra::Default.register FooExtensions
51
+ it 'will make sure any public methods added via Application#register are delegated to Sinatra::Delegator' do
52
+ Sinatra::Application.register FooExtensions
47
53
  assert Sinatra::Delegator.private_instance_methods.
48
54
  map { |m| m.to_sym }.include?(:foo)
49
55
  assert !Sinatra::Delegator.private_instance_methods.
50
56
  map { |m| m.to_sym }.include?(:im_hiding_in_ur_foos)
51
57
  end
52
58
 
59
+ it 'will handle special method names' do
60
+ Sinatra::Application.register PainExtensions
61
+ assert Sinatra::Delegator.private_instance_methods.
62
+ map { |m| m.to_sym }.include?(:foo=)
63
+ assert Sinatra::Delegator.private_instance_methods.
64
+ map { |m| m.to_sym }.include?(:bar?)
65
+ assert Sinatra::Delegator.private_instance_methods.
66
+ map { |m| m.to_sym }.include?(:fizz!)
67
+ end
68
+
53
69
  it 'will not delegate methods on Base#register' do
54
70
  Sinatra::Base.register QuuxExtensions
55
71
  assert !Sinatra::Delegator.private_instance_methods.include?("quux")
56
72
  end
57
73
 
58
- it 'will extend the Sinatra::Default application by default' do
74
+ it 'will extend the Sinatra::Application application by default' do
59
75
  Sinatra.register BazExtensions
60
76
  assert !Sinatra::Base.respond_to?(:baz)
61
- assert Sinatra::Default.respond_to?(:baz)
77
+ assert Sinatra::Application.respond_to?(:baz)
62
78
  end
63
79
 
64
80
  module BizzleExtension
@@ -1,6 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
 
3
- describe "Filters" do
3
+ class BeforeFilterTest < Test::Unit::TestCase
4
4
  it "executes filters in the order defined" do
5
5
  count = 0
6
6
  mock_app do
@@ -21,7 +21,7 @@ describe "Filters" do
21
21
  assert_equal 'Hello World', body
22
22
  end
23
23
 
24
- it "allows filters to modify the request" do
24
+ it "can modify the request" do
25
25
  mock_app {
26
26
  get('/foo') { 'foo' }
27
27
  get('/bar') { 'bar' }
@@ -44,7 +44,7 @@ describe "Filters" do
44
44
  assert_equal 'bar', body
45
45
  end
46
46
 
47
- it "allows redirects in filters" do
47
+ it "allows redirects" do
48
48
  mock_app {
49
49
  before { redirect '/bar' }
50
50
  get('/foo') do
@@ -96,4 +96,100 @@ describe "Filters" do
96
96
  assert ok?
97
97
  assert_equal 'cool', body
98
98
  end
99
+
100
+ it "runs filters defined in superclasses" do
101
+ base = Class.new(Sinatra::Base)
102
+ base.before { @foo = 'hello from superclass' }
103
+
104
+ mock_app(base) {
105
+ get('/foo') { @foo }
106
+ }
107
+
108
+ get '/foo'
109
+ assert_equal 'hello from superclass', body
110
+ end
111
+ end
112
+
113
+ class AfterFilterTest < Test::Unit::TestCase
114
+ it "executes filters in the order defined" do
115
+ invoked = 0
116
+ mock_app do
117
+ before { invoked = 2 }
118
+ get('/') { invoked += 2 }
119
+ after { invoked *= 2 }
120
+ end
121
+
122
+ get '/'
123
+ assert ok?
124
+
125
+ assert_equal 8, invoked
126
+ end
127
+
128
+ it "executes filters in the order defined" do
129
+ count = 0
130
+ mock_app do
131
+ get('/') { 'Hello World' }
132
+ after {
133
+ assert_equal 0, count
134
+ count = 1
135
+ }
136
+ after {
137
+ assert_equal 1, count
138
+ count = 2
139
+ }
140
+ end
141
+
142
+ get '/'
143
+ assert ok?
144
+ assert_equal 2, count
145
+ assert_equal 'Hello World', body
146
+ end
147
+
148
+ it "allows redirects" do
149
+ mock_app {
150
+ get('/foo') { 'ORLY' }
151
+ after { redirect '/bar' }
152
+ }
153
+
154
+ get '/foo'
155
+ assert redirect?
156
+ assert_equal '/bar', response['Location']
157
+ assert_equal '', body
158
+ end
159
+
160
+ it "does not modify the response with its return value" do
161
+ mock_app {
162
+ get('/foo') { 'cool' }
163
+ after { 'Hello World!' }
164
+ }
165
+
166
+ get '/foo'
167
+ assert ok?
168
+ assert_equal 'cool', body
169
+ end
170
+
171
+ it "does modify the response with halt" do
172
+ mock_app {
173
+ get '/foo' do
174
+ "should not be returned"
175
+ end
176
+ after { halt 302, 'Hi' }
177
+ }
178
+
179
+ get '/foo'
180
+ assert_equal 302, response.status
181
+ assert_equal 'Hi', body
182
+ end
183
+
184
+ it "runs filters defined in superclasses" do
185
+ count = 2
186
+ base = Class.new(Sinatra::Base)
187
+ base.after { count *= 2 }
188
+ mock_app(base) {
189
+ get('/foo') { count += 2 }
190
+ }
191
+
192
+ get '/foo'
193
+ assert_equal 8, count
194
+ end
99
195
  end
@@ -1,6 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
+ require 'haml'
2
3
 
3
- describe "HAML Templates" do
4
+ class HAMLTest < Test::Unit::TestCase
4
5
  def haml_app(&block)
5
6
  mock_app {
6
7
  set :views, File.dirname(__FILE__) + '/views'
@@ -47,9 +48,12 @@ describe "HAML Templates" do
47
48
  end
48
49
 
49
50
  it "passes HAML options to the Haml engine" do
50
- haml_app {
51
- haml "!!!\n%h1 Hello World", :options => {:format => :html5}
51
+ mock_app {
52
+ get '/' do
53
+ haml "!!!\n%h1 Hello World", :format => :html5
54
+ end
52
55
  }
56
+ get '/'
53
57
  assert ok?
54
58
  assert_equal "<!DOCTYPE html>\n<h1>Hello World</h1>\n", body
55
59
  end
@@ -65,4 +69,22 @@ describe "HAML Templates" do
65
69
  assert ok?
66
70
  assert_equal "<!DOCTYPE html>\n<h1>Hello World</h1>\n", body
67
71
  end
72
+
73
+ it "merges the default HAML options with the overrides and passes them to the Haml engine" do
74
+ mock_app {
75
+ set :haml, {:format => :html5, :attr_wrapper => '"'} # default HAML attr are <tag attr='single-quoted'>
76
+ get '/' do
77
+ haml "!!!\n%h1{:class => :header} Hello World"
78
+ end
79
+ get '/html4' do
80
+ haml "!!!\n%h1{:class => 'header'} Hello World", :format => :html4
81
+ end
82
+ }
83
+ get '/'
84
+ assert ok?
85
+ assert_equal "<!DOCTYPE html>\n<h1 class=\"header\">Hello World</h1>\n", body
86
+ get '/html4'
87
+ assert ok?
88
+ assert_match(/^<!DOCTYPE html PUBLIC (.*) HTML 4.01/, body)
89
+ end
68
90
  end
@@ -1,3 +1,5 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+
1
3
  begin
2
4
  require 'rack'
3
5
  rescue LoadError
@@ -5,19 +7,35 @@ rescue LoadError
5
7
  require 'rack'
6
8
  end
7
9
 
10
+ testdir = File.dirname(__FILE__)
11
+ $LOAD_PATH.unshift testdir unless $LOAD_PATH.include?(testdir)
12
+
8
13
  libdir = File.dirname(File.dirname(__FILE__)) + '/lib'
9
14
  $LOAD_PATH.unshift libdir unless $LOAD_PATH.include?(libdir)
10
15
 
11
- require 'test/unit'
12
- require 'sinatra/test'
16
+ require 'contest'
17
+ require 'rack/test'
18
+ require 'sinatra/base'
13
19
 
14
20
  class Sinatra::Base
15
21
  # Allow assertions in request context
16
22
  include Test::Unit::Assertions
17
23
  end
18
24
 
25
+ Sinatra::Base.set :environment, :test
26
+
19
27
  class Test::Unit::TestCase
20
- include Sinatra::Test
28
+ include Rack::Test::Methods
29
+
30
+ class << self
31
+ alias_method :it, :test
32
+ end
33
+
34
+ alias_method :response, :last_response
35
+
36
+ setup do
37
+ Sinatra::Base.set :environment, :test
38
+ end
21
39
 
22
40
  # Sets up a Sinatra::Base subclass defined with the block
23
41
  # given. Used in setup or individual spec methods to establish
@@ -26,56 +44,33 @@ class Test::Unit::TestCase
26
44
  @app = Sinatra.new(base, &block)
27
45
  end
28
46
 
29
- def restore_default_options
30
- Sinatra::Default.set(
31
- :environment => :development,
32
- :raise_errors => Proc.new { test? },
33
- :dump_errors => true,
34
- :sessions => false,
35
- :logging => Proc.new { ! test? },
36
- :methodoverride => true,
37
- :static => true,
38
- :run => Proc.new { ! test? }
39
- )
47
+ def app
48
+ Rack::Lint.new(@app)
49
+ end
50
+
51
+ def body
52
+ response.body.to_s
40
53
  end
41
- end
42
54
 
43
- ##
44
- # test/spec/mini
45
- # http://pastie.caboo.se/158871
46
- # chris@ozmm.org
47
- #
48
- def describe(*args, &block)
49
- return super unless (name = args.first.capitalize) && block
50
- name = "#{name.gsub(/\W/, '')}Test"
51
- Object.send :const_set, name, Class.new(Test::Unit::TestCase)
52
- klass = Object.const_get(name)
53
- klass.class_eval do
54
- def self.it(name, &block)
55
- define_method("test_#{name.gsub(/\W/,'_').downcase}", &block)
55
+ # Delegate other missing methods to response.
56
+ def method_missing(name, *args, &block)
57
+ if response && response.respond_to?(name)
58
+ response.send(name, *args, &block)
59
+ else
60
+ super
56
61
  end
57
- def self.xspecify(*args) end
58
- def self.before(&block) define_method(:setup, &block) end
59
- def self.after(&block) define_method(:teardown, &block) end
60
62
  end
61
- klass.class_eval &block
62
- klass
63
- end
64
63
 
65
- def describe_option(name, &block)
66
- klass = describe("Option #{name}", &block)
67
- klass.before do
68
- restore_default_options
69
- @base = Sinatra.new
70
- @default = Class.new(Sinatra::Default)
64
+ # Also check response since we delegate there.
65
+ def respond_to?(symbol, include_private=false)
66
+ super || (response && response.respond_to?(symbol, include_private))
71
67
  end
72
- klass
73
- end
74
68
 
75
- # Do not output warnings for the duration of the block.
76
- def silence_warnings
77
- $VERBOSE, v = nil, $VERBOSE
78
- yield
79
- ensure
80
- $VERBOSE = v
69
+ # Do not output warnings for the duration of the block.
70
+ def silence_warnings
71
+ $VERBOSE, v = nil, $VERBOSE
72
+ yield
73
+ ensure
74
+ $VERBOSE = v
75
+ end
81
76
  end