merb-core 0.9.2 → 0.9.3
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/Rakefile +61 -11
- data/bin/merb +5 -1
- data/lib/merb-core.rb +202 -25
- data/lib/merb-core/autoload.rb +19 -17
- data/lib/merb-core/bootloader.rb +84 -71
- data/lib/merb-core/config.rb +19 -14
- data/lib/merb-core/controller/abstract_controller.rb +16 -17
- data/lib/merb-core/controller/exceptions.rb +115 -70
- data/lib/merb-core/controller/merb_controller.rb +62 -38
- data/lib/merb-core/controller/mime.rb +1 -1
- data/lib/merb-core/controller/mixins/authentication.rb +87 -0
- data/lib/merb-core/controller/mixins/controller.rb +16 -15
- data/lib/merb-core/controller/mixins/render.rb +113 -19
- data/lib/merb-core/controller/mixins/responder.rb +8 -2
- data/lib/merb-core/controller/template.rb +1 -1
- data/lib/merb-core/core_ext.rb +1 -0
- data/lib/merb-core/core_ext/class.rb +113 -6
- data/lib/merb-core/core_ext/hash.rb +43 -39
- data/lib/merb-core/core_ext/kernel.rb +75 -38
- data/lib/merb-core/core_ext/mash.rb +4 -4
- data/lib/merb-core/core_ext/object.rb +18 -7
- data/lib/merb-core/core_ext/set.rb +9 -4
- data/lib/merb-core/core_ext/string.rb +29 -9
- data/lib/merb-core/core_ext/time.rb +13 -0
- data/lib/merb-core/dispatch/cookies.rb +1 -2
- data/lib/merb-core/dispatch/dispatcher.rb +18 -10
- data/lib/merb-core/dispatch/exceptions.html.erb +1 -1
- data/lib/merb-core/dispatch/request.rb +3 -0
- data/lib/merb-core/dispatch/router.rb +10 -7
- data/lib/merb-core/dispatch/router/behavior.rb +36 -27
- data/lib/merb-core/dispatch/router/route.rb +7 -2
- data/lib/merb-core/dispatch/session/cookie.rb +4 -4
- data/lib/merb-core/dispatch/session/memcached.rb +17 -5
- data/lib/merb-core/logger.rb +2 -2
- data/lib/merb-core/plugins.rb +16 -4
- data/lib/merb-core/rack/adapter/ebb.rb +4 -1
- data/lib/merb-core/rack/adapter/evented_mongrel.rb +2 -0
- data/lib/merb-core/rack/adapter/fcgi.rb +1 -0
- data/lib/merb-core/rack/adapter/mongrel.rb +1 -0
- data/lib/merb-core/rack/adapter/runner.rb +1 -0
- data/lib/merb-core/rack/adapter/thin.rb +3 -1
- data/lib/merb-core/rack/adapter/webrick.rb +1 -0
- data/lib/merb-core/rack/application.rb +17 -1
- data/lib/merb-core/server.rb +78 -28
- data/lib/merb-core/test/helpers/multipart_request_helper.rb +3 -3
- data/lib/merb-core/test/helpers/request_helper.rb +81 -27
- data/lib/merb-core/test/helpers/view_helper.rb +1 -1
- data/lib/merb-core/test/matchers/controller_matchers.rb +55 -5
- data/lib/merb-core/test/matchers/route_matchers.rb +8 -17
- data/lib/merb-core/test/matchers/view_matchers.rb +53 -11
- data/lib/merb-core/test/run_specs.rb +22 -14
- data/lib/merb-core/test/tasks/spectasks.rb +54 -33
- data/lib/merb-core/vendor/facets/inflect.rb +91 -2
- data/lib/merb-core/version.rb +2 -2
- data/spec/private/config/config_spec.rb +54 -26
- data/spec/private/core_ext/class_spec.rb +22 -0
- data/spec/private/core_ext/hash_spec.rb +70 -54
- data/spec/private/core_ext/kernel_spec.rb +149 -14
- data/spec/private/core_ext/object_spec.rb +92 -10
- data/spec/private/core_ext/string_spec.rb +162 -4
- data/spec/private/core_ext/time_spec.rb +16 -0
- data/spec/private/dispatch/bootloader_spec.rb +24 -0
- data/spec/private/dispatch/fixture/app/views/exeptions/client_error.html.erb +1 -1
- data/spec/private/dispatch/fixture/app/views/exeptions/internal_server_error.html.erb +1 -1
- data/spec/private/dispatch/fixture/app/views/exeptions/not_acceptable.html.erb +1 -1
- data/spec/private/dispatch/fixture/app/views/exeptions/not_found.html.erb +1 -1
- data/spec/private/dispatch/fixture/config/black_hole.rb +12 -0
- data/spec/private/dispatch/fixture/log/merb_test.log +138 -0
- data/spec/private/plugins/plugin_spec.rb +79 -8
- data/spec/private/rack/application_spec.rb +1 -1
- data/spec/public/abstract_controller/controllers/filters.rb +26 -0
- data/spec/public/abstract_controller/controllers/helpers.rb +2 -2
- data/spec/public/abstract_controller/controllers/partial.rb +2 -2
- data/spec/public/abstract_controller/controllers/render.rb +16 -4
- data/spec/public/abstract_controller/filter_spec.rb +8 -0
- data/spec/public/abstract_controller/render_spec.rb +12 -0
- data/spec/public/controller/authentication_spec.rb +103 -0
- data/spec/public/controller/base_spec.rb +4 -3
- data/spec/public/controller/controllers/authentication.rb +47 -0
- data/spec/public/controller/controllers/base.rb +1 -0
- data/spec/public/controller/controllers/display.rb +30 -0
- data/spec/public/controller/controllers/views/layout/custom_arg.html.erb +1 -0
- data/spec/public/controller/controllers/views/merb/test/fixtures/controllers/display_with_template_argument/index.html.erb +1 -0
- data/spec/public/controller/display_spec.rb +17 -0
- data/spec/public/controller/spec_helper.rb +1 -0
- data/spec/public/controller/url_spec.rb +25 -7
- data/spec/public/core/merb_core_spec.rb +34 -0
- data/spec/public/directory_structure/directory/app/controllers/custom.rb +2 -2
- data/spec/public/directory_structure/directory/log/merb_test.log +48 -0
- data/spec/public/logger/logger_spec.rb +10 -4
- data/spec/public/reloading/directory/app/controllers/reload.rb +1 -1
- data/spec/public/reloading/directory/log/merb_test.log +13 -0
- data/spec/public/reloading/reload_spec.rb +23 -22
- data/spec/public/request/request_spec.rb +2 -0
- data/spec/public/router/nested_resources_spec.rb +7 -0
- data/spec/public/router/resources_spec.rb +46 -1
- data/spec/public/router/special_spec.rb +5 -1
- data/spec/public/test/controller_matchers_spec.rb +25 -1
- data/spec/public/test/controllers/spec_helper_controller.rb +8 -0
- data/spec/public/test/request_helper_spec.rb +52 -1
- data/spec/public/test/route_matchers_spec.rb +27 -25
- data/spec/public/test/view_helper_spec.rb +1 -1
- data/spec/public/test/view_matchers_spec.rb +148 -72
- metadata +23 -3
data/lib/merb-core/server.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'etc'
|
|
2
2
|
module Merb
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
# Server encapsulates the management of Merb daemons.
|
|
5
5
|
class Server
|
|
6
6
|
class << self
|
|
@@ -29,9 +29,9 @@ module Merb
|
|
|
29
29
|
else
|
|
30
30
|
raise "Merb is already running on port: #{port}"
|
|
31
31
|
end
|
|
32
|
-
end
|
|
32
|
+
end
|
|
33
33
|
elsif Merb::Config[:daemonize]
|
|
34
|
-
unless alive?(@port)
|
|
34
|
+
unless alive?(@port)
|
|
35
35
|
remove_pid_file(@port)
|
|
36
36
|
daemonize(@port)
|
|
37
37
|
else
|
|
@@ -39,6 +39,7 @@ module Merb
|
|
|
39
39
|
end
|
|
40
40
|
else
|
|
41
41
|
trap('TERM') { exit }
|
|
42
|
+
trap('INT') { puts "\nExiting"; exit }
|
|
42
43
|
BootLoader.run
|
|
43
44
|
Merb.adapter.start(Merb::Config.to_hash)
|
|
44
45
|
end
|
|
@@ -51,8 +52,8 @@ module Merb
|
|
|
51
52
|
# Boolean::
|
|
52
53
|
# True if Merb is running on the specified port.
|
|
53
54
|
def alive?(port)
|
|
54
|
-
|
|
55
|
-
pid = IO.read(
|
|
55
|
+
pidfile = pid_file(port)
|
|
56
|
+
pid = IO.read(pidfile).chomp.to_i
|
|
56
57
|
Process.kill(0, pid)
|
|
57
58
|
true
|
|
58
59
|
rescue
|
|
@@ -69,7 +70,10 @@ module Merb
|
|
|
69
70
|
def kill(port, sig=9)
|
|
70
71
|
Merb::BootLoader::BuildFramework.run
|
|
71
72
|
begin
|
|
72
|
-
|
|
73
|
+
pidfiles = port == "all" ?
|
|
74
|
+
pid_files : [ pid_file(port) ]
|
|
75
|
+
|
|
76
|
+
pidfiles.each do |f|
|
|
73
77
|
pid = IO.read(f).chomp.to_i
|
|
74
78
|
begin
|
|
75
79
|
Process.kill(sig, pid)
|
|
@@ -86,7 +90,7 @@ module Merb
|
|
|
86
90
|
puts "Failed to kill PID #{pid}: #{e.message}"
|
|
87
91
|
end
|
|
88
92
|
end
|
|
89
|
-
ensure
|
|
93
|
+
ensure
|
|
90
94
|
exit
|
|
91
95
|
end
|
|
92
96
|
end
|
|
@@ -105,19 +109,24 @@ module Merb
|
|
|
105
109
|
Dir.chdir Merb::Config[:merb_root]
|
|
106
110
|
at_exit { remove_pid_file(port) }
|
|
107
111
|
Merb::Config[:port] = port
|
|
108
|
-
if Merb::Config[:user]
|
|
109
|
-
if Merb::Config[:group]
|
|
110
|
-
change_privilege(Merb::Config[:user], Merb::Config[:group])
|
|
111
|
-
else
|
|
112
|
-
change_privilege(Merb::Config[:user])
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
112
|
BootLoader.run
|
|
116
113
|
Merb.adapter.start(Merb::Config.to_hash)
|
|
117
114
|
end
|
|
118
115
|
end
|
|
119
116
|
|
|
120
|
-
|
|
117
|
+
def change_privilege
|
|
118
|
+
if Merb::Config[:user]
|
|
119
|
+
if Merb::Config[:group]
|
|
120
|
+
_change_privilege(Merb::Config[:user], Merb::Config[:group])
|
|
121
|
+
else
|
|
122
|
+
_change_privilege(Merb::Config[:user])
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Removes a PID file used by the server from the filesystem.
|
|
128
|
+
# This uses :pid_file options from configuration when provided
|
|
129
|
+
# or merb.<port>.pid in log directory by default.
|
|
121
130
|
#
|
|
122
131
|
# ==== Parameters
|
|
123
132
|
# port<~to_s>::
|
|
@@ -127,15 +136,13 @@ module Merb
|
|
|
127
136
|
# If Merb::Config[:pid_file] has been specified, that will be used
|
|
128
137
|
# instead of the port based PID file.
|
|
129
138
|
def remove_pid_file(port)
|
|
130
|
-
|
|
131
|
-
pidfile = Merb::Config[:pid_file]
|
|
132
|
-
else
|
|
133
|
-
pidfile = Merb.log_path / "merb.#{port}.pid"
|
|
134
|
-
end
|
|
139
|
+
pidfile = pid_file(port)
|
|
135
140
|
FileUtils.rm(pidfile) if File.exist?(pidfile)
|
|
136
141
|
end
|
|
137
142
|
|
|
138
143
|
# Stores a PID file on the filesystem.
|
|
144
|
+
# This uses :pid_file options from configuration when provided
|
|
145
|
+
# or merb.<port>.pid in log directory by default.
|
|
139
146
|
#
|
|
140
147
|
# ==== Parameters
|
|
141
148
|
# port<~to_s>::
|
|
@@ -145,15 +152,58 @@ module Merb
|
|
|
145
152
|
# If Merb::Config[:pid_file] has been specified, that will be used
|
|
146
153
|
# instead of the port based PID file.
|
|
147
154
|
def store_pid(port)
|
|
148
|
-
|
|
155
|
+
pidfile = pid_file(port)
|
|
156
|
+
FileUtils.mkdir_p(File.dirname(pidfile)) unless File.directory?(File.dirname(pidfile))
|
|
157
|
+
File.open(pidfile, 'w'){ |f| f.write("#{Process.pid}") }
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Gets the pid file for the specified port.
|
|
161
|
+
#
|
|
162
|
+
# ==== Parameters
|
|
163
|
+
# port<~to_s>::
|
|
164
|
+
# The port of the Merb process to whom the the PID file belongs to.
|
|
165
|
+
#
|
|
166
|
+
# ==== Returns
|
|
167
|
+
# String::
|
|
168
|
+
# Location of pid file for specified port. If clustered and pid_file option
|
|
169
|
+
# is specified, it adds the port value to the path.
|
|
170
|
+
def pid_file(port)
|
|
149
171
|
if Merb::Config[:pid_file]
|
|
150
172
|
pidfile = Merb::Config[:pid_file]
|
|
173
|
+
if Merb::Config[:cluster]
|
|
174
|
+
ext = File.extname(Merb::Config[:pid_file])
|
|
175
|
+
base = File.basename(Merb::Config[:pid_file], ext)
|
|
176
|
+
dir = File.dirname(Merb::Config[:pid_file])
|
|
177
|
+
File.join(dir, "#{base}.#{port}#{ext}")
|
|
178
|
+
else
|
|
179
|
+
Merb::Config[:pid_file]
|
|
180
|
+
end
|
|
151
181
|
else
|
|
152
182
|
pidfile = Merb.log_path / "merb.#{port}.pid"
|
|
183
|
+
Merb.log_path / "merb.#{port}.pid"
|
|
153
184
|
end
|
|
154
|
-
File.open(pidfile, 'w'){ |f| f.write("#{Process.pid}") }
|
|
155
185
|
end
|
|
156
|
-
|
|
186
|
+
|
|
187
|
+
# Get a list of the pid files.
|
|
188
|
+
#
|
|
189
|
+
# ==== Returns
|
|
190
|
+
# Array::
|
|
191
|
+
# List of pid file paths. If not clustered, array contains a single path.
|
|
192
|
+
def pid_files
|
|
193
|
+
if Merb::Config[:pid_file]
|
|
194
|
+
if Merb::Config[:cluster]
|
|
195
|
+
ext = File.extname(Merb::Config[:pid_file])
|
|
196
|
+
base = File.basename(Merb::Config[:pid_file], ext)
|
|
197
|
+
dir = File.dirname(Merb::Config[:pid_file])
|
|
198
|
+
Dir[dir / "#{base}.*#{ext}"]
|
|
199
|
+
else
|
|
200
|
+
[ Merb::Config[:pid_file] ]
|
|
201
|
+
end
|
|
202
|
+
else
|
|
203
|
+
Dir[Merb.log_path / "merb.*.pid"]
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
157
207
|
# Change privileges of the process to the specified user and group.
|
|
158
208
|
#
|
|
159
209
|
# ==== Parameters
|
|
@@ -162,14 +212,14 @@ module Merb
|
|
|
162
212
|
#
|
|
163
213
|
# ==== Alternatives
|
|
164
214
|
# If group is left out, the user will be used as the group.
|
|
165
|
-
def
|
|
166
|
-
|
|
215
|
+
def _change_privilege(user, group=user)
|
|
216
|
+
|
|
167
217
|
puts "Changing privileges to #{user}:#{group}"
|
|
168
|
-
|
|
218
|
+
|
|
169
219
|
uid, gid = Process.euid, Process.egid
|
|
170
220
|
target_uid = Etc.getpwnam(user).uid
|
|
171
221
|
target_gid = Etc.getgrnam(group).gid
|
|
172
|
-
|
|
222
|
+
|
|
173
223
|
if uid != target_uid || gid != target_gid
|
|
174
224
|
# Change process ownership
|
|
175
225
|
Process.initgroups(user, target_gid)
|
|
@@ -181,4 +231,4 @@ module Merb
|
|
|
181
231
|
end
|
|
182
232
|
end
|
|
183
233
|
end
|
|
184
|
-
end
|
|
234
|
+
end
|
|
@@ -101,7 +101,7 @@ module Merb::Test::MultipartRequestHelper
|
|
|
101
101
|
# self.stub!(:current_user).and_return(@user)
|
|
102
102
|
# end
|
|
103
103
|
#
|
|
104
|
-
# ====
|
|
104
|
+
# ==== Notes
|
|
105
105
|
# Set your option to contain a file object to simulate file uploads.
|
|
106
106
|
#
|
|
107
107
|
# Does not use routes.
|
|
@@ -124,7 +124,7 @@ module Merb::Test::MultipartRequestHelper
|
|
|
124
124
|
# should go here (see +fake_request+).
|
|
125
125
|
# block<Proc>:: The block is executed in the context of the controller.
|
|
126
126
|
#
|
|
127
|
-
# ====
|
|
127
|
+
# ==== Notes
|
|
128
128
|
# To include an uploaded file, put a file object as a value in params.
|
|
129
129
|
def multipart_post(path, params = {}, env = {}, &block)
|
|
130
130
|
env[:request_method] = "POST"
|
|
@@ -144,7 +144,7 @@ module Merb::Test::MultipartRequestHelper
|
|
|
144
144
|
# should go here (see +fake_request+).
|
|
145
145
|
# block<Proc>:: The block is executed in the context of the controller.
|
|
146
146
|
#
|
|
147
|
-
# ====
|
|
147
|
+
# ==== Notes
|
|
148
148
|
# To include an uplaoded file, put a file object as a value in params.
|
|
149
149
|
def multipart_put(path, params = {}, env = {}, &block)
|
|
150
150
|
env[:request_method] = "PUT"
|
|
@@ -15,7 +15,7 @@ module Merb
|
|
|
15
15
|
env['rack.input'] = req
|
|
16
16
|
super(DEFAULT_ENV.merge(env))
|
|
17
17
|
end
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
private
|
|
20
20
|
DEFAULT_ENV = Mash.new({
|
|
21
21
|
'SERVER_NAME' => 'localhost',
|
|
@@ -38,7 +38,7 @@ module Merb
|
|
|
38
38
|
'GATEWAY_INTERFACE' => 'CGI/1.2',
|
|
39
39
|
'HTTP_ACCEPT' => 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
|
|
40
40
|
'HTTP_CONNECTION' => 'keep-alive',
|
|
41
|
-
'REQUEST_METHOD' => 'GET'
|
|
41
|
+
'REQUEST_METHOD' => 'GET'
|
|
42
42
|
}) unless defined?(DEFAULT_ENV)
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -50,11 +50,11 @@ module Merb
|
|
|
50
50
|
# :post_body<String>:: The post body for the request.
|
|
51
51
|
# :req<String>::
|
|
52
52
|
# The request string. This will only be used if :post_body is left out.
|
|
53
|
-
#
|
|
53
|
+
#
|
|
54
54
|
# ==== Returns
|
|
55
55
|
# FakeRequest:: A Request object that is built based on the parameters.
|
|
56
56
|
#
|
|
57
|
-
# ====
|
|
57
|
+
# ==== Notes
|
|
58
58
|
# If you pass a post body, the content-type will be set to URL-encoded.
|
|
59
59
|
#
|
|
60
60
|
#---
|
|
@@ -66,7 +66,7 @@ module Merb
|
|
|
66
66
|
else
|
|
67
67
|
req = opt[:req]
|
|
68
68
|
end
|
|
69
|
-
FakeRequest.new(env, StringIO.new(req || ''))
|
|
69
|
+
FakeRequest.new(env, StringIO.new(req || ''))
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
# Dispatches an action to the given class. This bypasses the router and is
|
|
@@ -91,7 +91,7 @@ module Merb
|
|
|
91
91
|
# self.stub!(:current_user).and_return(@user)
|
|
92
92
|
# end
|
|
93
93
|
#
|
|
94
|
-
# ====
|
|
94
|
+
# ==== Notes
|
|
95
95
|
# Does not use routes.
|
|
96
96
|
#
|
|
97
97
|
#---
|
|
@@ -104,7 +104,47 @@ module Merb
|
|
|
104
104
|
|
|
105
105
|
dispatch_request(request, controller_klass, action, &blk)
|
|
106
106
|
end
|
|
107
|
-
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# Dispatches an action to the given class and using HTTP Basic Authentication
|
|
110
|
+
# This bypasses the router and is suitable for unit testing of controllers.
|
|
111
|
+
#
|
|
112
|
+
# ==== Parameters
|
|
113
|
+
# controller_klass<Controller>::
|
|
114
|
+
# The controller class object that the action should be dispatched to.
|
|
115
|
+
# action<Symbol>:: The action name, as a symbol.
|
|
116
|
+
# username<String>:: The username.
|
|
117
|
+
# password<String>:: The password.
|
|
118
|
+
# params<Hash>::
|
|
119
|
+
# An optional hash that will end up as params in the controller instance.
|
|
120
|
+
# env<Hash>::
|
|
121
|
+
# An optional hash that is passed to the fake request. Any request options
|
|
122
|
+
# should go here (see +fake_request+), including :req or :post_body
|
|
123
|
+
# for setting the request body itself.
|
|
124
|
+
# &blk::
|
|
125
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
126
|
+
# the action being dispatched.
|
|
127
|
+
#
|
|
128
|
+
# ==== Example
|
|
129
|
+
# dispatch_with_basic_authentication_to(MyController, :create, 'Fred', 'secret', :name => 'Homer' ) do
|
|
130
|
+
# self.stub!(:current_user).and_return(@user)
|
|
131
|
+
# end
|
|
132
|
+
#
|
|
133
|
+
# ==== Notes
|
|
134
|
+
# Does not use routes.
|
|
135
|
+
#
|
|
136
|
+
#---
|
|
137
|
+
# @public
|
|
138
|
+
def dispatch_with_basic_authentication_to(controller_klass, action, username, password, params = {}, env = {}, &blk)
|
|
139
|
+
action = action.to_s
|
|
140
|
+
request_body = { :post_body => env[:post_body], :req => env[:req] }
|
|
141
|
+
env["X_HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{username}:#{password}")}"
|
|
142
|
+
request = fake_request(env.merge(
|
|
143
|
+
:query_string => Merb::Request.params_to_query_string(params)), request_body)
|
|
144
|
+
|
|
145
|
+
dispatch_request(request, controller_klass, action, &blk)
|
|
146
|
+
end
|
|
147
|
+
|
|
108
148
|
# An HTTP GET request that operates through the router.
|
|
109
149
|
#
|
|
110
150
|
# ==== Parameters
|
|
@@ -114,12 +154,14 @@ module Merb
|
|
|
114
154
|
# env<Hash>::
|
|
115
155
|
# An optional hash that is passed to the fake request. Any request options
|
|
116
156
|
# should go here (see +fake_request+).
|
|
117
|
-
# &
|
|
157
|
+
# &blk::
|
|
158
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
159
|
+
# the action being dispatched.
|
|
118
160
|
def get(path, params = {}, env = {}, &block)
|
|
119
161
|
env[:request_method] = "GET"
|
|
120
162
|
request(path, params, env, &block)
|
|
121
163
|
end
|
|
122
|
-
|
|
164
|
+
|
|
123
165
|
# An HTTP POST request that operates through the router.
|
|
124
166
|
#
|
|
125
167
|
# ==== Parameters
|
|
@@ -129,12 +171,14 @@ module Merb
|
|
|
129
171
|
# env<Hash>::
|
|
130
172
|
# An optional hash that is passed to the fake request. Any request options
|
|
131
173
|
# should go here (see fake_request).
|
|
132
|
-
# &
|
|
174
|
+
# &blk::
|
|
175
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
176
|
+
# the action being dispatched.
|
|
133
177
|
def post(path, params = {}, env = {}, &block)
|
|
134
178
|
env[:request_method] = "POST"
|
|
135
179
|
request(path, params, env, &block)
|
|
136
180
|
end
|
|
137
|
-
|
|
181
|
+
|
|
138
182
|
# An HTTP PUT request that operates through the router.
|
|
139
183
|
#
|
|
140
184
|
# ==== Parameters
|
|
@@ -144,12 +188,14 @@ module Merb
|
|
|
144
188
|
# env<Hash>::
|
|
145
189
|
# An optional hash that is passed to the fake request. Any request options
|
|
146
190
|
# should go here (see fake_request).
|
|
147
|
-
# &
|
|
191
|
+
# &blk::
|
|
192
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
193
|
+
# the action being dispatched.
|
|
148
194
|
def put(path, params = {}, env = {}, &block)
|
|
149
195
|
env[:request_method] = "PUT"
|
|
150
196
|
request(path, params, env, &block)
|
|
151
197
|
end
|
|
152
|
-
|
|
198
|
+
|
|
153
199
|
# An HTTP DELETE request that operates through the router
|
|
154
200
|
#
|
|
155
201
|
# ==== Parameters
|
|
@@ -159,7 +205,9 @@ module Merb
|
|
|
159
205
|
# env<Hash>::
|
|
160
206
|
# An optional hash that is passed to the fake request. Any request options
|
|
161
207
|
# should go here (see fake_request).
|
|
162
|
-
# &
|
|
208
|
+
# &blk::
|
|
209
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
210
|
+
# the action being dispatched.
|
|
163
211
|
def delete(path, params = {}, env = {}, &block)
|
|
164
212
|
env[:request_method] = "DELETE"
|
|
165
213
|
request(path, params, env, &block)
|
|
@@ -175,48 +223,54 @@ module Merb
|
|
|
175
223
|
# env<Hash>::
|
|
176
224
|
# An optional hash that is passed to the fake request. Any request options
|
|
177
225
|
# should go here (see +fake_request+).
|
|
178
|
-
# blk
|
|
226
|
+
# &blk::
|
|
227
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
228
|
+
# the action being dispatched.
|
|
179
229
|
#
|
|
180
230
|
# ==== Example
|
|
181
|
-
# request(path,
|
|
231
|
+
# request(path, { :name => 'Homer' }, { :request_method => "PUT" }) do
|
|
182
232
|
# self.stub!(:current_user).and_return(@user)
|
|
183
233
|
# end
|
|
184
234
|
#
|
|
185
|
-
# ====
|
|
235
|
+
# ==== Notes
|
|
186
236
|
# Uses Routes.
|
|
187
237
|
#
|
|
188
238
|
#---
|
|
189
|
-
# @semi-public
|
|
239
|
+
# @semi-public
|
|
190
240
|
def request(path, params = {}, env= {}, &block)
|
|
191
241
|
env[:request_method] ||= "GET"
|
|
192
242
|
env[:request_uri] = path
|
|
193
243
|
multipart = env.delete(:test_with_multipart)
|
|
194
|
-
|
|
244
|
+
|
|
195
245
|
request = fake_request(env)
|
|
196
|
-
|
|
246
|
+
|
|
197
247
|
opts = check_request_for_route(request) # Check that the request will be routed correctly
|
|
198
|
-
|
|
248
|
+
controller_name = (opts[:namespace] ? opts.delete(:namespace) + '/' : '') + opts.delete(:controller)
|
|
249
|
+
klass = Object.full_const_get(controller_name.snake_case.to_const_string)
|
|
250
|
+
|
|
199
251
|
action = opts.delete(:action).to_s
|
|
200
252
|
params.merge!(opts)
|
|
201
|
-
|
|
253
|
+
|
|
202
254
|
multipart.nil? ? dispatch_to(klass, action, params, env, &block) : dispatch_multipart_to(klass, action, params, env, &block)
|
|
203
255
|
end
|
|
204
256
|
|
|
205
257
|
|
|
206
258
|
# The workhorse for the dispatch*to helpers.
|
|
207
|
-
#
|
|
259
|
+
#
|
|
208
260
|
# ==== Parameters
|
|
209
261
|
# request<Merb::Test::FakeRequest, Merb::Request>::
|
|
210
262
|
# A request object that has been setup for testing.
|
|
211
263
|
# controller_klass<Merb::Controller>::
|
|
212
264
|
# The class object off the controller to dispatch the action to.
|
|
213
265
|
# action<Symbol>:: The action to dispatch the request to.
|
|
214
|
-
# blk
|
|
266
|
+
# &blk::
|
|
267
|
+
# The controller is yielded to the block provided for actions *prior* to
|
|
268
|
+
# the action being dispatched.
|
|
215
269
|
#
|
|
216
270
|
# ==== Returns
|
|
217
271
|
# An instance of +controller_klass+ based on the parameters.
|
|
218
272
|
#
|
|
219
|
-
# ====
|
|
273
|
+
# ==== Notes
|
|
220
274
|
# Does not use routes.
|
|
221
275
|
#
|
|
222
276
|
#---
|
|
@@ -233,7 +287,7 @@ module Merb
|
|
|
233
287
|
end
|
|
234
288
|
|
|
235
289
|
# Checks to see that a request is routable.
|
|
236
|
-
#
|
|
290
|
+
#
|
|
237
291
|
# ==== Parameters
|
|
238
292
|
# request<Merb::Test::FakeRequest, Merb::Request>::
|
|
239
293
|
# The request object to inspect.
|
|
@@ -254,4 +308,4 @@ module Merb
|
|
|
254
308
|
end
|
|
255
309
|
end
|
|
256
310
|
end
|
|
257
|
-
end
|
|
311
|
+
end
|