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.
- data/AUTHORS +2 -0
- data/CHANGES +180 -0
- data/LICENSE +1 -1
- data/README.jp.rdoc +552 -0
- data/README.rdoc +177 -38
- data/Rakefile +18 -25
- data/lib/sinatra.rb +1 -2
- data/lib/sinatra/base.rb +405 -305
- data/lib/sinatra/main.rb +5 -24
- data/lib/sinatra/showexceptions.rb +303 -0
- data/lib/sinatra/tilt.rb +509 -0
- data/sinatra.gemspec +21 -51
- data/test/base_test.rb +123 -93
- data/test/builder_test.rb +2 -1
- data/test/contest.rb +64 -0
- data/test/erb_test.rb +1 -1
- data/test/erubis_test.rb +82 -0
- data/test/extensions_test.rb +24 -8
- data/test/filter_test.rb +99 -3
- data/test/haml_test.rb +25 -3
- data/test/helper.rb +43 -48
- data/test/helpers_test.rb +500 -424
- data/test/mapped_error_test.rb +163 -137
- data/test/middleware_test.rb +3 -3
- data/test/request_test.rb +16 -1
- data/test/response_test.rb +2 -2
- data/test/result_test.rb +1 -1
- data/test/route_added_hook_test.rb +59 -0
- data/test/routing_test.rb +170 -22
- data/test/sass_test.rb +44 -1
- data/test/server_test.rb +19 -13
- data/test/sinatra_test.rb +1 -1
- data/test/static_test.rb +9 -2
- data/test/templates_test.rb +78 -11
- data/test/views/error.builder +3 -0
- data/test/views/error.erb +3 -0
- data/test/views/error.erubis +3 -0
- data/test/views/error.haml +3 -0
- data/test/views/error.sass +2 -0
- data/test/views/foo/hello.test +1 -0
- data/test/views/hello.erubis +1 -0
- data/test/views/layout2.erubis +2 -0
- metadata +37 -55
- data/compat/app_test.rb +0 -282
- data/compat/application_test.rb +0 -262
- data/compat/builder_test.rb +0 -101
- data/compat/compat_test.rb +0 -12
- data/compat/custom_error_test.rb +0 -62
- data/compat/erb_test.rb +0 -136
- data/compat/events_test.rb +0 -78
- data/compat/filter_test.rb +0 -30
- data/compat/haml_test.rb +0 -233
- data/compat/helper.rb +0 -30
- data/compat/mapped_error_test.rb +0 -72
- data/compat/pipeline_test.rb +0 -45
- data/compat/public/foo.xml +0 -1
- data/compat/sass_test.rb +0 -57
- data/compat/sessions_test.rb +0 -42
- data/compat/streaming_test.rb +0 -133
- data/compat/sym_params_test.rb +0 -19
- data/compat/template_test.rb +0 -30
- data/compat/use_in_file_templates_test.rb +0 -47
- data/compat/views/foo.builder +0 -1
- data/compat/views/foo.erb +0 -1
- data/compat/views/foo.haml +0 -1
- data/compat/views/foo.sass +0 -2
- data/compat/views/foo_layout.erb +0 -2
- data/compat/views/foo_layout.haml +0 -2
- data/compat/views/layout_test/foo.builder +0 -1
- data/compat/views/layout_test/foo.erb +0 -1
- data/compat/views/layout_test/foo.haml +0 -1
- data/compat/views/layout_test/foo.sass +0 -2
- data/compat/views/layout_test/layout.builder +0 -3
- data/compat/views/layout_test/layout.erb +0 -1
- data/compat/views/layout_test/layout.haml +0 -1
- data/compat/views/layout_test/layout.sass +0 -2
- data/compat/views/no_layout/no_layout.builder +0 -1
- data/compat/views/no_layout/no_layout.haml +0 -1
- data/lib/sinatra/compat.rb +0 -250
- data/lib/sinatra/test.rb +0 -126
- data/lib/sinatra/test/bacon.rb +0 -19
- data/lib/sinatra/test/rspec.rb +0 -13
- data/lib/sinatra/test/spec.rb +0 -11
- data/lib/sinatra/test/unit.rb +0 -13
- data/test/data/reload_app_file.rb +0 -3
- data/test/options_test.rb +0 -374
- data/test/reload_test.rb +0 -68
- data/test/test_test.rb +0 -144
data/test/erb_test.rb
CHANGED
data/test/erubis_test.rb
ADDED
@@ -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
|
data/test/extensions_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
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::
|
33
|
-
assert Sinatra::
|
34
|
-
assert Sinatra::
|
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
|
46
|
-
Sinatra::
|
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::
|
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::
|
77
|
+
assert Sinatra::Application.respond_to?(:baz)
|
62
78
|
end
|
63
79
|
|
64
80
|
module BizzleExtension
|
data/test/filter_test.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
|
-
|
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 "
|
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
|
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
|
data/test/haml_test.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
|
+
require 'haml'
|
2
3
|
|
3
|
-
|
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
|
-
|
51
|
-
|
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
|
data/test/helper.rb
CHANGED
@@ -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 '
|
12
|
-
require '
|
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
|
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
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
-
|
66
|
-
|
67
|
-
|
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
|
-
|
78
|
-
|
79
|
-
ensure
|
80
|
-
|
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
|