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.
- data/ChangeLog +64 -0
- data/LICENSE +1 -1
- data/README.rdoc +244 -141
- data/Rakefile +111 -0
- data/lib/sinatra.rb +942 -627
- data/{vendor/rack/lib → lib/sinatra}/rack/handler/mongrel.rb +10 -3
- data/lib/sinatra/test/methods.rb +56 -36
- data/lib/sinatra/test/rspec.rb +10 -0
- data/lib/sinatra/test/spec.rb +2 -2
- data/lib/sinatra/test/unit.rb +1 -1
- data/sinatra.gemspec +71 -43
- data/test/app_test.rb +181 -32
- data/test/application_test.rb +179 -36
- data/test/custom_error_test.rb +17 -22
- data/test/erb_test.rb +42 -22
- data/test/event_context_test.rb +3 -3
- data/test/events_test.rb +8 -11
- data/test/filter_test.rb +30 -0
- data/test/haml_test.rb +83 -31
- data/test/helper.rb +6 -3
- data/test/mapped_error_test.rb +32 -21
- data/test/pipeline_test.rb +66 -0
- data/test/sass_test.rb +7 -7
- data/test/sessions_test.rb +8 -9
- data/test/streaming_test.rb +10 -4
- data/test/sym_params_test.rb +1 -1
- data/test/template_test.rb +11 -11
- data/test/use_in_file_templates_test.rb +9 -10
- metadata +22 -101
- data/CHANGELOG +0 -3
- data/Manifest +0 -122
- data/index.html +0 -9
- data/test/diddy_test.rb +0 -41
- data/test/rest_test.rb +0 -16
- data/vendor/rack/AUTHORS +0 -7
- data/vendor/rack/COPYING +0 -18
- data/vendor/rack/KNOWN-ISSUES +0 -18
- data/vendor/rack/README +0 -242
- data/vendor/rack/Rakefile +0 -174
- data/vendor/rack/bin/rackup +0 -153
- data/vendor/rack/contrib/rack_logo.svg +0 -111
- data/vendor/rack/example/lobster.ru +0 -4
- data/vendor/rack/example/protectedlobster.rb +0 -14
- data/vendor/rack/example/protectedlobster.ru +0 -8
- data/vendor/rack/lib/rack.rb +0 -92
- data/vendor/rack/lib/rack/adapter/camping.rb +0 -22
- data/vendor/rack/lib/rack/auth/abstract/handler.rb +0 -28
- data/vendor/rack/lib/rack/auth/abstract/request.rb +0 -37
- data/vendor/rack/lib/rack/auth/basic.rb +0 -58
- data/vendor/rack/lib/rack/auth/digest/md5.rb +0 -124
- data/vendor/rack/lib/rack/auth/digest/nonce.rb +0 -51
- data/vendor/rack/lib/rack/auth/digest/params.rb +0 -55
- data/vendor/rack/lib/rack/auth/digest/request.rb +0 -40
- data/vendor/rack/lib/rack/auth/openid.rb +0 -116
- data/vendor/rack/lib/rack/builder.rb +0 -56
- data/vendor/rack/lib/rack/cascade.rb +0 -36
- data/vendor/rack/lib/rack/commonlogger.rb +0 -56
- data/vendor/rack/lib/rack/file.rb +0 -112
- data/vendor/rack/lib/rack/handler/cgi.rb +0 -57
- data/vendor/rack/lib/rack/handler/fastcgi.rb +0 -83
- data/vendor/rack/lib/rack/handler/lsws.rb +0 -52
- data/vendor/rack/lib/rack/handler/scgi.rb +0 -57
- data/vendor/rack/lib/rack/handler/webrick.rb +0 -57
- data/vendor/rack/lib/rack/lint.rb +0 -394
- data/vendor/rack/lib/rack/lobster.rb +0 -65
- data/vendor/rack/lib/rack/mock.rb +0 -160
- data/vendor/rack/lib/rack/recursive.rb +0 -57
- data/vendor/rack/lib/rack/reloader.rb +0 -64
- data/vendor/rack/lib/rack/request.rb +0 -197
- data/vendor/rack/lib/rack/response.rb +0 -166
- data/vendor/rack/lib/rack/session/abstract/id.rb +0 -126
- data/vendor/rack/lib/rack/session/cookie.rb +0 -71
- data/vendor/rack/lib/rack/session/memcache.rb +0 -83
- data/vendor/rack/lib/rack/session/pool.rb +0 -67
- data/vendor/rack/lib/rack/showexceptions.rb +0 -344
- data/vendor/rack/lib/rack/showstatus.rb +0 -103
- data/vendor/rack/lib/rack/static.rb +0 -38
- data/vendor/rack/lib/rack/urlmap.rb +0 -48
- data/vendor/rack/lib/rack/utils.rb +0 -240
- data/vendor/rack/test/cgi/lighttpd.conf +0 -20
- data/vendor/rack/test/cgi/test +0 -9
- data/vendor/rack/test/cgi/test.fcgi +0 -7
- data/vendor/rack/test/cgi/test.ru +0 -7
- data/vendor/rack/test/spec_rack_auth_basic.rb +0 -69
- data/vendor/rack/test/spec_rack_auth_digest.rb +0 -169
- data/vendor/rack/test/spec_rack_builder.rb +0 -50
- data/vendor/rack/test/spec_rack_camping.rb +0 -47
- data/vendor/rack/test/spec_rack_cascade.rb +0 -50
- data/vendor/rack/test/spec_rack_cgi.rb +0 -91
- data/vendor/rack/test/spec_rack_commonlogger.rb +0 -32
- data/vendor/rack/test/spec_rack_fastcgi.rb +0 -91
- data/vendor/rack/test/spec_rack_file.rb +0 -40
- data/vendor/rack/test/spec_rack_lint.rb +0 -317
- data/vendor/rack/test/spec_rack_lobster.rb +0 -45
- data/vendor/rack/test/spec_rack_mock.rb +0 -152
- data/vendor/rack/test/spec_rack_mongrel.rb +0 -165
- data/vendor/rack/test/spec_rack_recursive.rb +0 -77
- data/vendor/rack/test/spec_rack_request.rb +0 -384
- data/vendor/rack/test/spec_rack_response.rb +0 -167
- data/vendor/rack/test/spec_rack_session_cookie.rb +0 -49
- data/vendor/rack/test/spec_rack_session_memcache.rb +0 -100
- data/vendor/rack/test/spec_rack_session_pool.rb +0 -84
- data/vendor/rack/test/spec_rack_showexceptions.rb +0 -21
- data/vendor/rack/test/spec_rack_showstatus.rb +0 -71
- data/vendor/rack/test/spec_rack_static.rb +0 -37
- data/vendor/rack/test/spec_rack_urlmap.rb +0 -175
- data/vendor/rack/test/spec_rack_utils.rb +0 -57
- data/vendor/rack/test/spec_rack_webrick.rb +0 -106
- data/vendor/rack/test/testrequest.rb +0 -43
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'mongrel'
|
2
2
|
require 'stringio'
|
3
3
|
|
4
|
+
|
4
5
|
module Rack
|
5
6
|
module Handler
|
6
7
|
class Mongrel < ::Mongrel::HttpHandler
|
@@ -65,9 +66,15 @@ module Rack
|
|
65
66
|
response.header[k] = v
|
66
67
|
}
|
67
68
|
}
|
68
|
-
|
69
|
-
|
70
|
-
|
69
|
+
# taken from Merb until we have a better solution that conforms
|
70
|
+
# to the Rack::Standard
|
71
|
+
if Proc === body
|
72
|
+
body.call(response)
|
73
|
+
else
|
74
|
+
body.each { |part|
|
75
|
+
response.body << part
|
76
|
+
}
|
77
|
+
end
|
71
78
|
response.finished
|
72
79
|
ensure
|
73
80
|
body.close if body.respond_to? :close
|
data/lib/sinatra/test/methods.rb
CHANGED
@@ -1,56 +1,76 @@
|
|
1
|
-
class Rack::MockRequest
|
2
|
-
class << self
|
3
|
-
alias :env_for_without_env :env_for
|
4
|
-
def env_for(uri = "", opts = {})
|
5
|
-
env = { 'HTTP_USER_AGENT' => opts.delete(:agent) }
|
6
|
-
env_for_without_env(uri, opts).merge(env)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
1
|
module Sinatra
|
12
|
-
|
2
|
+
|
13
3
|
module Test
|
14
|
-
|
4
|
+
|
15
5
|
module Methods
|
6
|
+
include Rack::Utils
|
7
|
+
|
8
|
+
ENV_KEY_NAMES = {
|
9
|
+
:accept => "HTTP_ACCEPT",
|
10
|
+
:agent => "HTTP_USER_AGENT",
|
11
|
+
:host => "HTTP_HOST",
|
12
|
+
:session => "HTTP_COOKIE",
|
13
|
+
:cookies => "HTTP_COOKIE",
|
14
|
+
:content_type => "CONTENT_TYPE"
|
15
|
+
}
|
16
16
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
:agent => 'HTTP_AGENT',
|
21
|
-
:host => 'HTTP_POST'
|
22
|
-
}
|
17
|
+
def session(data, key = 'rack.session')
|
18
|
+
data = data.from_params if data.respond_to?(:from_params)
|
19
|
+
"#{escape(key)}=#{[Marshal.dump(data)].pack("m*")}"
|
23
20
|
end
|
24
|
-
|
25
|
-
def
|
26
|
-
|
27
|
-
|
21
|
+
|
22
|
+
def normalize_rack_environment(env)
|
23
|
+
env.inject({}) do |hash,(k,v)|
|
24
|
+
hash[ENV_KEY_NAMES[k] || k] = v
|
25
|
+
hash
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
29
|
+
def hash_to_param_string(hash)
|
30
|
+
hash.map { |pair| pair.map{|v|escape(v)}.join('=') }.join('&')
|
31
|
+
end
|
32
|
+
|
33
|
+
%w(get head post put delete).each do |verb|
|
34
|
+
http_method = verb.upcase
|
35
|
+
define_method("#{verb}_it") do |path, *args|
|
36
|
+
@request = Rack::MockRequest.new(Sinatra.build_application)
|
37
|
+
opts, input =
|
38
|
+
case args.size
|
39
|
+
when 2 # input, env
|
40
|
+
input, env = args
|
41
|
+
[env, input]
|
42
|
+
when 1 # params
|
43
|
+
if (data = args.first).kind_of?(Hash)
|
44
|
+
env = (data.delete(:env) || {})
|
45
|
+
[env, hash_to_param_string(data)]
|
46
|
+
else
|
47
|
+
[{}, data]
|
48
|
+
end
|
49
|
+
when 0
|
50
|
+
[{}, '']
|
51
|
+
else
|
52
|
+
raise ArgumentError, "zero, one, or two arguments expected"
|
53
|
+
end
|
54
|
+
opts = normalize_rack_environment(opts)
|
55
|
+
opts[:input] ||= input
|
56
|
+
@response = @request.request(http_method, path, opts)
|
41
57
|
end
|
42
58
|
end
|
43
|
-
|
59
|
+
|
44
60
|
def follow!
|
45
61
|
get_it(@response.location)
|
46
62
|
end
|
47
63
|
|
48
64
|
def method_missing(name, *args)
|
49
|
-
@response.
|
65
|
+
if @response.respond_to?(name)
|
66
|
+
@response.send(name, *args)
|
67
|
+
else
|
68
|
+
super
|
69
|
+
end
|
50
70
|
end
|
51
|
-
|
71
|
+
|
52
72
|
end
|
53
73
|
|
54
74
|
end
|
55
|
-
|
75
|
+
|
56
76
|
end
|
data/lib/sinatra/test/spec.rb
CHANGED
data/lib/sinatra/test/unit.rb
CHANGED
data/sinatra.gemspec
CHANGED
@@ -1,50 +1,78 @@
|
|
1
|
-
|
2
|
-
# Gem::Specification for Sinatra-0.2.2
|
3
|
-
# Originally generated by Echoe
|
4
|
-
|
5
1
|
Gem::Specification.new do |s|
|
6
|
-
s.name = %q{sinatra}
|
7
|
-
s.version = "0.2.2"
|
8
|
-
|
9
2
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
|
-
|
11
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
|
+
|
5
|
+
s.name = 'sinatra'
|
6
|
+
s.version = '0.3.0'
|
7
|
+
s.date = "2008-08-31"
|
8
|
+
|
9
|
+
s.description = "Classy web-development dressed in a DSL"
|
10
|
+
s.summary = "Classy web-development dressed in a DSL"
|
11
|
+
|
12
12
|
s.authors = ["Blake Mizerany"]
|
13
|
-
s.date = %q{2008-04-15}
|
14
|
-
s.description = %q{Classy web-development dressed in a DSL}
|
15
|
-
s.email = %q{}
|
16
|
-
s.extra_rdoc_files = ["CHANGELOG", "lib/sinatra/test/methods.rb", "lib/sinatra/test/spec.rb", "lib/sinatra/test/unit.rb", "lib/sinatra.rb", "LICENSE", "README.rdoc"]
|
17
|
-
s.files = ["CHANGELOG", "images/404.png", "images/500.png", "index.html", "lib/sinatra/test/methods.rb", "lib/sinatra/test/spec.rb", "lib/sinatra/test/unit.rb", "lib/sinatra.rb", "LICENSE", "Manifest", "README.rdoc", "test/app_test.rb", "test/application_test.rb", "test/builder_test.rb", "test/custom_error_test.rb", "test/diddy_test.rb", "test/erb_test.rb", "test/event_context_test.rb", "test/events_test.rb", "test/haml_test.rb", "test/helper.rb", "test/mapped_error_test.rb", "test/public/foo.xml", "test/rest_test.rb", "test/sass_test.rb", "test/sessions_test.rb", "test/streaming_test.rb", "test/sym_params_test.rb", "test/template_test.rb", "test/use_in_file_templates_test.rb", "test/views/foo.builder", "test/views/foo.erb", "test/views/foo.haml", "test/views/foo.sass", "test/views/foo_layout.erb", "test/views/foo_layout.haml", "test/views/layout_test/foo.builder", "test/views/layout_test/foo.erb", "test/views/layout_test/foo.haml", "test/views/layout_test/foo.sass", "test/views/layout_test/layout.builder", "test/views/layout_test/layout.erb", "test/views/layout_test/layout.haml", "test/views/layout_test/layout.sass", "test/views/no_layout/no_layout.builder", "test/views/no_layout/no_layout.haml", "vendor/rack/AUTHORS", "vendor/rack/bin/rackup", "vendor/rack/contrib/rack_logo.svg", "vendor/rack/COPYING", "vendor/rack/example/lobster.ru", "vendor/rack/example/protectedlobster.rb", "vendor/rack/example/protectedlobster.ru", "vendor/rack/KNOWN-ISSUES", "vendor/rack/lib/rack/adapter/camping.rb", "vendor/rack/lib/rack/auth/abstract/handler.rb", "vendor/rack/lib/rack/auth/abstract/request.rb", "vendor/rack/lib/rack/auth/basic.rb", "vendor/rack/lib/rack/auth/digest/md5.rb", "vendor/rack/lib/rack/auth/digest/nonce.rb", "vendor/rack/lib/rack/auth/digest/params.rb", "vendor/rack/lib/rack/auth/digest/request.rb", "vendor/rack/lib/rack/auth/openid.rb", "vendor/rack/lib/rack/builder.rb", "vendor/rack/lib/rack/cascade.rb", "vendor/rack/lib/rack/commonlogger.rb", "vendor/rack/lib/rack/file.rb", "vendor/rack/lib/rack/handler/cgi.rb", "vendor/rack/lib/rack/handler/fastcgi.rb", "vendor/rack/lib/rack/handler/lsws.rb", "vendor/rack/lib/rack/handler/mongrel.rb", "vendor/rack/lib/rack/handler/scgi.rb", "vendor/rack/lib/rack/handler/webrick.rb", "vendor/rack/lib/rack/lint.rb", "vendor/rack/lib/rack/lobster.rb", "vendor/rack/lib/rack/mock.rb", "vendor/rack/lib/rack/recursive.rb", "vendor/rack/lib/rack/reloader.rb", "vendor/rack/lib/rack/request.rb", "vendor/rack/lib/rack/response.rb", "vendor/rack/lib/rack/session/abstract/id.rb", "vendor/rack/lib/rack/session/cookie.rb", "vendor/rack/lib/rack/session/memcache.rb", "vendor/rack/lib/rack/session/pool.rb", "vendor/rack/lib/rack/showexceptions.rb", "vendor/rack/lib/rack/showstatus.rb", "vendor/rack/lib/rack/static.rb", "vendor/rack/lib/rack/urlmap.rb", "vendor/rack/lib/rack/utils.rb", "vendor/rack/lib/rack.rb", "vendor/rack/Rakefile", "vendor/rack/README", "vendor/rack/test/cgi/lighttpd.conf", "vendor/rack/test/cgi/test", "vendor/rack/test/cgi/test.fcgi", "vendor/rack/test/cgi/test.ru", "vendor/rack/test/spec_rack_auth_basic.rb", "vendor/rack/test/spec_rack_auth_digest.rb", "vendor/rack/test/spec_rack_builder.rb", "vendor/rack/test/spec_rack_camping.rb", "vendor/rack/test/spec_rack_cascade.rb", "vendor/rack/test/spec_rack_cgi.rb", "vendor/rack/test/spec_rack_commonlogger.rb", "vendor/rack/test/spec_rack_fastcgi.rb", "vendor/rack/test/spec_rack_file.rb", "vendor/rack/test/spec_rack_lint.rb", "vendor/rack/test/spec_rack_lobster.rb", "vendor/rack/test/spec_rack_mock.rb", "vendor/rack/test/spec_rack_mongrel.rb", "vendor/rack/test/spec_rack_recursive.rb", "vendor/rack/test/spec_rack_request.rb", "vendor/rack/test/spec_rack_response.rb", "vendor/rack/test/spec_rack_session_cookie.rb", "vendor/rack/test/spec_rack_session_memcache.rb", "vendor/rack/test/spec_rack_session_pool.rb", "vendor/rack/test/spec_rack_showexceptions.rb", "vendor/rack/test/spec_rack_showstatus.rb", "vendor/rack/test/spec_rack_static.rb", "vendor/rack/test/spec_rack_urlmap.rb", "vendor/rack/test/spec_rack_utils.rb", "vendor/rack/test/spec_rack_webrick.rb", "vendor/rack/test/testrequest.rb", "sinatra.gemspec"]
|
18
|
-
s.has_rdoc = true
|
19
|
-
s.homepage = %q{http://www.sinatrarb.com}
|
20
|
-
s.post_install_message = %q{*** Be sure to checkout http://sinatrarb.com for helpful tips!***}
|
21
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
|
22
|
-
s.require_paths = ["lib"]
|
23
|
-
s.rubyforge_project = %q{sinatra}
|
24
|
-
s.rubygems_version = %q{1.0.1}
|
25
|
-
s.summary = %q{Classy web-development dressed in a DSL}
|
26
|
-
s.test_files = ["test/app_test.rb", "test/application_test.rb", "test/builder_test.rb", "test/custom_error_test.rb", "test/diddy_test.rb", "test/erb_test.rb", "test/event_context_test.rb", "test/events_test.rb", "test/haml_test.rb", "test/mapped_error_test.rb", "test/rest_test.rb", "test/sass_test.rb", "test/sessions_test.rb", "test/streaming_test.rb", "test/sym_params_test.rb", "test/template_test.rb", "test/use_in_file_templates_test.rb"]
|
27
13
|
|
28
|
-
|
29
|
-
|
14
|
+
# = MANIFEST =
|
15
|
+
s.files = %w[
|
16
|
+
ChangeLog
|
17
|
+
LICENSE
|
18
|
+
README.rdoc
|
19
|
+
Rakefile
|
20
|
+
images/404.png
|
21
|
+
images/500.png
|
22
|
+
lib/sinatra.rb
|
23
|
+
lib/sinatra/rack/handler/mongrel.rb
|
24
|
+
lib/sinatra/test/methods.rb
|
25
|
+
lib/sinatra/test/rspec.rb
|
26
|
+
lib/sinatra/test/spec.rb
|
27
|
+
lib/sinatra/test/unit.rb
|
28
|
+
sinatra.gemspec
|
29
|
+
test/app_test.rb
|
30
|
+
test/application_test.rb
|
31
|
+
test/builder_test.rb
|
32
|
+
test/custom_error_test.rb
|
33
|
+
test/erb_test.rb
|
34
|
+
test/event_context_test.rb
|
35
|
+
test/events_test.rb
|
36
|
+
test/filter_test.rb
|
37
|
+
test/haml_test.rb
|
38
|
+
test/helper.rb
|
39
|
+
test/mapped_error_test.rb
|
40
|
+
test/pipeline_test.rb
|
41
|
+
test/public/foo.xml
|
42
|
+
test/sass_test.rb
|
43
|
+
test/sessions_test.rb
|
44
|
+
test/streaming_test.rb
|
45
|
+
test/sym_params_test.rb
|
46
|
+
test/template_test.rb
|
47
|
+
test/use_in_file_templates_test.rb
|
48
|
+
test/views/foo.builder
|
49
|
+
test/views/foo.erb
|
50
|
+
test/views/foo.haml
|
51
|
+
test/views/foo.sass
|
52
|
+
test/views/foo_layout.erb
|
53
|
+
test/views/foo_layout.haml
|
54
|
+
test/views/layout_test/foo.builder
|
55
|
+
test/views/layout_test/foo.erb
|
56
|
+
test/views/layout_test/foo.haml
|
57
|
+
test/views/layout_test/foo.sass
|
58
|
+
test/views/layout_test/layout.builder
|
59
|
+
test/views/layout_test/layout.erb
|
60
|
+
test/views/layout_test/layout.haml
|
61
|
+
test/views/layout_test/layout.sass
|
62
|
+
test/views/no_layout/no_layout.builder
|
63
|
+
test/views/no_layout/no_layout.haml
|
64
|
+
]
|
65
|
+
# = MANIFEST =
|
66
|
+
|
67
|
+
s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/}
|
30
68
|
|
69
|
+
s.extra_rdoc_files = %w[README.rdoc LICENSE]
|
70
|
+
s.add_dependency 'rack', '>= 0.4.0'
|
31
71
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
# task :default => :test
|
40
|
-
#
|
41
|
-
# Echoe.new("sinatra") do |p|
|
42
|
-
# p.files = Dir[File.dirname(__FILE__) + "/{lib,vendor}/**/*"]
|
43
|
-
# p.author = "Blake Mizerany"
|
44
|
-
# p.summary = "Classy web-development dressed in a DSL"
|
45
|
-
# p.url = "http://www.sinatrarb.com"
|
46
|
-
# p.docs_host = "sinatrarb.com:/var/www/blakemizerany.com/public/docs/"
|
47
|
-
# p.dependencies = ["mongrel >=1.0.1"]
|
48
|
-
# p.install_message = "*** Be sure to checkout http://sinatrarb.com for helpful tips!***"
|
49
|
-
# end
|
50
|
-
#
|
72
|
+
s.has_rdoc = true
|
73
|
+
s.homepage = "http://sinatrarb.com"
|
74
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Sinatra", "--main", "README.rdoc"]
|
75
|
+
s.require_paths = %w[lib]
|
76
|
+
s.rubyforge_project = 'sinatra'
|
77
|
+
s.rubygems_version = '1.1.1'
|
78
|
+
end
|
data/test/app_test.rb
CHANGED
@@ -1,50 +1,112 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
3
|
context "Sinatra" do
|
4
|
-
|
4
|
+
|
5
5
|
setup do
|
6
6
|
Sinatra.application = nil
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
|
+
specify "should put all DSL methods on (main)" do
|
10
|
+
object = Object.new
|
11
|
+
Sinatra::Application::FORWARD_METHODS.each do |method|
|
12
|
+
object.private_methods.should.include(method)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
9
16
|
specify "should handle result of nil" do
|
10
17
|
get '/' do
|
11
18
|
nil
|
12
19
|
end
|
13
|
-
|
20
|
+
|
14
21
|
get_it '/'
|
15
22
|
should.be.ok
|
16
23
|
body.should == ''
|
17
24
|
end
|
18
|
-
|
25
|
+
|
19
26
|
specify "handles events" do
|
20
27
|
get '/:name' do
|
21
28
|
'Hello ' + params["name"]
|
22
29
|
end
|
23
|
-
|
30
|
+
|
24
31
|
get_it '/Blake'
|
25
|
-
|
32
|
+
|
26
33
|
should.be.ok
|
27
34
|
body.should.equal 'Hello Blake'
|
28
35
|
end
|
29
|
-
|
36
|
+
|
37
|
+
|
38
|
+
specify "handles splats" do
|
39
|
+
get '/hi/*' do
|
40
|
+
params["splat"].kind_of?(Array).should.equal true
|
41
|
+
params["splat"].first
|
42
|
+
end
|
43
|
+
|
44
|
+
get_it '/hi/Blake'
|
45
|
+
|
46
|
+
should.be.ok
|
47
|
+
body.should.equal 'Blake'
|
48
|
+
end
|
49
|
+
|
50
|
+
specify "handles multiple splats" do
|
51
|
+
get '/say/*/to/*' do
|
52
|
+
params["splat"].join(' ')
|
53
|
+
end
|
54
|
+
|
55
|
+
get_it '/say/hello/to/world'
|
56
|
+
|
57
|
+
should.be.ok
|
58
|
+
body.should.equal 'hello world'
|
59
|
+
end
|
60
|
+
|
61
|
+
specify "allow empty splats" do
|
62
|
+
get '/say/*/to*/*' do
|
63
|
+
params["splat"].join(' ')
|
64
|
+
end
|
65
|
+
|
66
|
+
get_it '/say/hello/to/world'
|
67
|
+
|
68
|
+
should.be.ok
|
69
|
+
body.should.equal 'hello world' # second splat is empty
|
70
|
+
|
71
|
+
get_it '/say/hello/tomy/world'
|
72
|
+
|
73
|
+
should.be.ok
|
74
|
+
body.should.equal 'hello my world'
|
75
|
+
end
|
76
|
+
|
77
|
+
specify "gives access to underlying response header Hash" do
|
78
|
+
get '/' do
|
79
|
+
header['X-Test'] = 'Is this thing on?'
|
80
|
+
headers 'X-Test2' => 'Foo', 'X-Test3' => 'Bar'
|
81
|
+
''
|
82
|
+
end
|
83
|
+
|
84
|
+
get_it '/'
|
85
|
+
should.be.ok
|
86
|
+
headers.should.include 'X-Test'
|
87
|
+
headers['X-Test'].should.equal 'Is this thing on?'
|
88
|
+
headers.should.include 'X-Test3'
|
89
|
+
headers['X-Test3'].should.equal 'Bar'
|
90
|
+
end
|
91
|
+
|
30
92
|
specify "follows redirects" do
|
31
93
|
get '/' do
|
32
94
|
redirect '/blake'
|
33
95
|
end
|
34
|
-
|
96
|
+
|
35
97
|
get '/blake' do
|
36
98
|
'Mizerany'
|
37
99
|
end
|
38
|
-
|
100
|
+
|
39
101
|
get_it '/'
|
40
102
|
should.be.redirection
|
41
103
|
body.should.equal ''
|
42
|
-
|
104
|
+
|
43
105
|
follow!
|
44
106
|
should.be.ok
|
45
107
|
body.should.equal 'Mizerany'
|
46
108
|
end
|
47
|
-
|
109
|
+
|
48
110
|
specify "renders a body with a redirect" do
|
49
111
|
Sinatra::EventContext.any_instance.expects(:foo).returns('blah')
|
50
112
|
get "/" do
|
@@ -55,36 +117,111 @@ context "Sinatra" do
|
|
55
117
|
headers['Location'].should.equal 'foo'
|
56
118
|
body.should.equal 'blah'
|
57
119
|
end
|
58
|
-
|
59
|
-
specify "
|
60
|
-
|
120
|
+
|
121
|
+
specify "redirects permanently with 301 status code" do
|
122
|
+
get "/" do
|
123
|
+
redirect 'foo', 301
|
124
|
+
end
|
125
|
+
get_it '/'
|
126
|
+
should.be.redirection
|
127
|
+
headers['Location'].should.equal 'foo'
|
128
|
+
status.should.equal 301
|
129
|
+
body.should.be.empty
|
130
|
+
end
|
131
|
+
|
132
|
+
specify "stop sets content and ends event" do
|
133
|
+
|
61
134
|
Sinatra::EventContext.any_instance.expects(:foo).never
|
62
|
-
|
135
|
+
|
63
136
|
get '/set_body' do
|
64
137
|
stop 'Hello!'
|
65
138
|
stop 'World!'
|
66
139
|
foo
|
67
140
|
end
|
68
|
-
|
141
|
+
|
69
142
|
get_it '/set_body'
|
70
|
-
|
143
|
+
|
71
144
|
should.be.ok
|
72
145
|
body.should.equal 'Hello!'
|
73
|
-
|
146
|
+
|
74
147
|
end
|
75
|
-
|
148
|
+
|
76
149
|
specify "should set status then call helper with a var" do
|
77
150
|
Sinatra::EventContext.any_instance.expects(:foo).once.with(1).returns('bah!')
|
78
|
-
|
151
|
+
|
79
152
|
get '/set_body' do
|
80
153
|
stop [404, [:foo, 1]]
|
81
154
|
end
|
82
|
-
|
155
|
+
|
83
156
|
get_it '/set_body'
|
84
|
-
|
157
|
+
|
85
158
|
should.be.not_found
|
86
159
|
body.should.equal 'bah!'
|
87
|
-
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
specify "should easily set response Content-Type" do
|
164
|
+
get '/foo.html' do
|
165
|
+
content_type 'text/html', :charset => 'utf-8'
|
166
|
+
"<h1>Hello, World</h1>"
|
167
|
+
end
|
168
|
+
|
169
|
+
get_it '/foo.html'
|
170
|
+
should.be.ok
|
171
|
+
headers['Content-Type'].should.equal 'text/html;charset=utf-8'
|
172
|
+
body.should.equal '<h1>Hello, World</h1>'
|
173
|
+
|
174
|
+
get '/foo_test.xml' do
|
175
|
+
content_type :xml
|
176
|
+
"<feed></feed>"
|
177
|
+
end
|
178
|
+
|
179
|
+
get_it '/foo_test.xml'
|
180
|
+
should.be.ok
|
181
|
+
headers['Content-Type'].should.equal 'application/xml'
|
182
|
+
body.should.equal '<feed></feed>'
|
183
|
+
end
|
184
|
+
|
185
|
+
specify "supports conditional GETs with last_modified" do
|
186
|
+
modified_at = Time.now
|
187
|
+
get '/maybe' do
|
188
|
+
last_modified modified_at
|
189
|
+
'response body, maybe'
|
190
|
+
end
|
191
|
+
|
192
|
+
get_it '/maybe'
|
193
|
+
should.be.ok
|
194
|
+
body.should.equal 'response body, maybe'
|
195
|
+
|
196
|
+
get_it '/maybe', :env => { 'HTTP_IF_MODIFIED_SINCE' => modified_at.httpdate }
|
197
|
+
status.should.equal 304
|
198
|
+
body.should.equal ''
|
199
|
+
end
|
200
|
+
|
201
|
+
specify "supports conditional GETs with entity_tag" do
|
202
|
+
get '/strong' do
|
203
|
+
entity_tag 'FOO'
|
204
|
+
'foo response'
|
205
|
+
end
|
206
|
+
|
207
|
+
get_it '/strong'
|
208
|
+
should.be.ok
|
209
|
+
body.should.equal 'foo response'
|
210
|
+
|
211
|
+
get_it '/strong', {},
|
212
|
+
'HTTP_IF_NONE_MATCH' => '"BAR"'
|
213
|
+
should.be.ok
|
214
|
+
body.should.equal 'foo response'
|
215
|
+
|
216
|
+
get_it '/strong', {},
|
217
|
+
'HTTP_IF_NONE_MATCH' => '"FOO"'
|
218
|
+
status.should.equal 304
|
219
|
+
body.should.equal ''
|
220
|
+
|
221
|
+
get_it '/strong', {},
|
222
|
+
'HTTP_IF_NONE_MATCH' => '"BAR", *'
|
223
|
+
status.should.equal 304
|
224
|
+
body.should.equal ''
|
88
225
|
end
|
89
226
|
|
90
227
|
specify "delegates HEAD requests to GET handlers" do
|
@@ -98,26 +235,26 @@ context "Sinatra" do
|
|
98
235
|
body.should.equal ''
|
99
236
|
end
|
100
237
|
|
101
|
-
|
102
|
-
specify "
|
238
|
+
|
239
|
+
specify "supports PUT" do
|
103
240
|
put '/' do
|
104
241
|
'puted'
|
105
242
|
end
|
106
|
-
|
243
|
+
put_it '/'
|
107
244
|
assert_equal 'puted', body
|
108
245
|
end
|
109
246
|
|
110
|
-
specify "
|
247
|
+
specify "rewrites POSTs with _method param to PUT" do
|
111
248
|
put '/' do
|
112
249
|
'puted'
|
113
250
|
end
|
114
|
-
|
251
|
+
post_it '/', :_method => 'PUT'
|
115
252
|
assert_equal 'puted', body
|
116
253
|
end
|
117
254
|
|
118
|
-
# Some Ajax libraries downcase the _method parameter value. Make
|
255
|
+
# Some Ajax libraries downcase the _method parameter value. Make
|
119
256
|
# sure we can handle that.
|
120
|
-
specify "
|
257
|
+
specify "rewrites POSTs with lowercase _method param to PUT" do
|
121
258
|
put '/' do
|
122
259
|
'puted'
|
123
260
|
end
|
@@ -126,7 +263,7 @@ context "Sinatra" do
|
|
126
263
|
end
|
127
264
|
|
128
265
|
# Ignore any _method parameters specified in GET requests or on the query string in POST requests.
|
129
|
-
specify "not
|
266
|
+
specify "does not rewrite GETs with _method param to PUT" do
|
130
267
|
get '/' do
|
131
268
|
'getted'
|
132
269
|
end
|
@@ -135,7 +272,7 @@ context "Sinatra" do
|
|
135
272
|
body.should.equal 'getted'
|
136
273
|
end
|
137
274
|
|
138
|
-
specify "_method query string parameter
|
275
|
+
specify "ignores _method query string parameter on non-POST requests" do
|
139
276
|
post '/' do
|
140
277
|
'posted'
|
141
278
|
end
|
@@ -147,4 +284,16 @@ context "Sinatra" do
|
|
147
284
|
body.should.equal 'posted'
|
148
285
|
end
|
149
286
|
|
287
|
+
specify "does not read body if content type is not url encoded" do
|
288
|
+
post '/foo.xml' do
|
289
|
+
request.env['CONTENT_TYPE'].should.be == 'application/xml'
|
290
|
+
request.content_type.should.be == 'application/xml'
|
291
|
+
request.body.read
|
292
|
+
end
|
293
|
+
|
294
|
+
post_it '/foo.xml', '<foo></foo>', :content_type => 'application/xml'
|
295
|
+
@response.should.be.ok
|
296
|
+
@response.body.should.be == '<foo></foo>'
|
297
|
+
end
|
298
|
+
|
150
299
|
end
|