merb 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +21 -14
- data/Rakefile +157 -108
- data/SVN_REVISION +1 -0
- data/app_generators/merb/templates/Rakefile +20 -4
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +1 -1
- data/app_generators/merb/templates/config/boot.rb +1 -1
- data/app_generators/merb/templates/config/dependencies.rb +3 -3
- data/app_generators/merb/templates/config/merb.yml +5 -0
- data/app_generators/merb/templates/config/merb_init.rb +3 -3
- data/app_generators/merb/templates/script/destroy +3 -0
- data/app_generators/merb/templates/script/generate +1 -1
- data/app_generators/merb/templates/spec/spec_helper.rb +2 -2
- data/app_generators/merb/templates/test/test_helper.rb +1 -1
- data/app_generators/merb_plugin/merb_plugin_generator.rb +4 -0
- data/bin/merb +1 -3
- data/lib/merb.rb +144 -76
- data/lib/merb/abstract_controller.rb +6 -5
- data/lib/merb/assets.rb +119 -0
- data/lib/merb/boot_loader.rb +217 -0
- data/lib/merb/caching.rb +1 -1
- data/lib/merb/caching/action_cache.rb +1 -1
- data/lib/merb/caching/fragment_cache.rb +1 -1
- data/lib/merb/caching/store/file_cache.rb +1 -1
- data/lib/merb/config.rb +290 -0
- data/lib/merb/controller.rb +5 -5
- data/lib/merb/core_ext/get_args.rb +1 -0
- data/lib/merb/core_ext/hash.rb +182 -169
- data/lib/merb/core_ext/kernel.rb +57 -26
- data/lib/merb/dispatcher.rb +6 -6
- data/lib/merb/drb_server.rb +1 -1
- data/lib/merb/generators/merb_generator_helpers.rb +7 -6
- data/lib/merb/logger.rb +1 -1
- data/lib/merb/mail_controller.rb +3 -4
- data/lib/merb/mailer.rb +2 -2
- data/lib/merb/mixins/basic_authentication.rb +2 -2
- data/lib/merb/mixins/controller.rb +1 -1
- data/lib/merb/mixins/general_controller.rb +13 -20
- data/lib/merb/mixins/inline_partial.rb +32 -0
- data/lib/merb/mixins/render.rb +3 -3
- data/lib/merb/mixins/responder.rb +1 -1
- data/lib/merb/mixins/view_context.rb +159 -33
- data/lib/merb/mongrel_handler.rb +9 -9
- data/lib/merb/plugins.rb +1 -1
- data/lib/merb/request.rb +25 -1
- data/lib/merb/router.rb +264 -226
- data/lib/merb/server.rb +66 -560
- data/lib/merb/session/cookie_store.rb +14 -13
- data/lib/merb/session/mem_cache_session.rb +20 -10
- data/lib/merb/session/memory_session.rb +21 -11
- data/lib/merb/template.rb +2 -2
- data/lib/merb/template/erubis.rb +3 -33
- data/lib/merb/template/haml.rb +8 -3
- data/lib/merb/test/fake_request.rb +8 -3
- data/lib/merb/test/helper.rb +66 -22
- data/lib/merb/test/rspec.rb +9 -155
- data/lib/merb/test/rspec_matchers/controller_matchers.rb +117 -0
- data/lib/merb/test/rspec_matchers/markup_matchers.rb +98 -0
- data/lib/merb/upload_handler.rb +2 -1
- data/lib/merb/version.rb +38 -3
- data/lib/merb/view_context.rb +1 -2
- data/lib/tasks/merb.rake +11 -11
- data/merb_generators/part_controller/USAGE +5 -0
- data/merb_generators/part_controller/part_controller_generator.rb +27 -0
- data/merb_generators/part_controller/templates/controller.rb +8 -0
- data/merb_generators/part_controller/templates/helper.rb +5 -0
- data/merb_generators/part_controller/templates/index.html.erb +3 -0
- data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +1 -1
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/fixtures/controllers/dispatch_spec_controllers.rb +9 -1
- data/spec/fixtures/controllers/render_spec_controllers.rb +5 -5
- data/spec/fixtures/models/router_spec_models.rb +10 -0
- data/spec/merb/abstract_controller_spec.rb +2 -2
- data/spec/merb/assets_spec.rb +207 -0
- data/spec/merb/caching_spec.rb +2 -2
- data/spec/merb/controller_spec.rb +7 -2
- data/spec/merb/cookie_store_spec.rb +1 -1
- data/spec/merb/core_ext/class_spec.rb +97 -0
- data/spec/merb/core_ext/enumerable_spec.rb +27 -0
- data/spec/merb/core_ext/hash_spec.rb +251 -0
- data/spec/merb/core_ext/inflector_spec.rb +34 -0
- data/spec/merb/core_ext/kernel_spec.rb +25 -0
- data/spec/merb/core_ext/numeric_spec.rb +26 -0
- data/spec/merb/core_ext/object_spec.rb +47 -0
- data/spec/merb/core_ext/string_spec.rb +22 -0
- data/spec/merb/core_ext/symbol_spec.rb +7 -0
- data/spec/merb/dependency_spec.rb +22 -0
- data/spec/merb/dispatch_spec.rb +23 -12
- data/spec/merb/fake_request_spec.rb +8 -0
- data/spec/merb/generator_spec.rb +140 -21
- data/spec/merb/handler_spec.rb +5 -5
- data/spec/merb/mail_controller_spec.rb +3 -3
- data/spec/merb/render_spec.rb +1 -1
- data/spec/merb/responder_spec.rb +3 -3
- data/spec/merb/router_spec.rb +260 -191
- data/spec/merb/server_spec.rb +5 -5
- data/spec/merb/upload_handler_spec.rb +7 -0
- data/spec/merb/version_spec.rb +33 -0
- data/spec/merb/view_context_spec.rb +217 -59
- data/spec/spec_generator_helper.rb +15 -0
- data/spec/spec_helper.rb +5 -3
- data/spec/spec_helpers/url_shared_behaviour.rb +5 -7
- metadata +32 -7
- data/lib/merb/caching/store/memcache.rb +0 -20
- data/lib/merb/mixins/form_control.rb +0 -332
- data/lib/patch +0 -69
- data/spec/merb/core_ext_spec.rb +0 -464
- data/spec/merb/form_control_mixin_spec.rb +0 -431
data/spec/merb/handler_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe MerbHandler, "process" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def log_info_with( with_param )
|
10
|
-
|
10
|
+
Merb.logger.should_receive(:info).with( with_param )
|
11
11
|
end
|
12
12
|
|
13
13
|
before(:each) do
|
@@ -36,7 +36,7 @@ describe MerbHandler, "process" do
|
|
36
36
|
@action = "ACTION"
|
37
37
|
Merb::Dispatcher.stub!( :handle ).and_return( [@controller, @action] )
|
38
38
|
|
39
|
-
|
39
|
+
Merb.logger.stub!(:info)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should return nil if the socket is closed" do
|
@@ -44,7 +44,7 @@ describe MerbHandler, "process" do
|
|
44
44
|
do_process.should be_nil
|
45
45
|
end
|
46
46
|
|
47
|
-
it "should log the request URI to the
|
47
|
+
it "should log the request URI to the Merb.logger.info" do
|
48
48
|
log_info_with( /REQUEST_URI/ )
|
49
49
|
do_process
|
50
50
|
end
|
@@ -66,7 +66,7 @@ describe MerbHandler, "process" do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
it "should ask the Dispatcher for the controller and action" do
|
69
|
-
Merb::Dispatcher.should_receive( :handle ).with( @request, @response )
|
69
|
+
Merb::Dispatcher.should_receive( :handle ).with( @request, @response ).and_return( [@controller, @action] )
|
70
70
|
do_process
|
71
71
|
end
|
72
72
|
|
@@ -75,7 +75,7 @@ describe MerbHandler, "process" do
|
|
75
75
|
@head = {}
|
76
76
|
Merb::Dispatcher.should_receive( :handle ).and_raise( Exception )
|
77
77
|
@response.should_receive( :send_status ).with( 500 )
|
78
|
-
|
78
|
+
Merb.logger.should_receive(:error)
|
79
79
|
do_process
|
80
80
|
end
|
81
81
|
|
@@ -5,8 +5,8 @@ module Merb
|
|
5
5
|
self._template_root = File.expand_path(File.join(File.dirname(__FILE__), '..', "fixtures/mailers/views"))
|
6
6
|
end
|
7
7
|
end
|
8
|
-
Merb::
|
9
|
-
Merb::
|
8
|
+
Merb::BootLoader.load_controller_template_path_cache
|
9
|
+
Merb::BootLoader.load_inline_helpers
|
10
10
|
|
11
11
|
class Merb::Mailer
|
12
12
|
self.delivery_method = :test_send
|
@@ -138,7 +138,7 @@ describe "A Merb Mail controller" do
|
|
138
138
|
end
|
139
139
|
|
140
140
|
it "should log an error if there are no templates available" do
|
141
|
-
|
141
|
+
Merb.logger.should_receive(:error).once
|
142
142
|
deliver :tenth
|
143
143
|
end
|
144
144
|
|
data/spec/merb/render_spec.rb
CHANGED
@@ -152,7 +152,7 @@ describe "rendering engines except XMLBuilder", :shared => true do
|
|
152
152
|
end
|
153
153
|
|
154
154
|
[true, false].each do |cache|
|
155
|
-
Merb::
|
155
|
+
Merb::Config[:cache_templates] = cache
|
156
156
|
|
157
157
|
describe "Merb rendering in general#{" (caching enabled)" if cache}" do
|
158
158
|
it "should render inline with Erubis" do
|
data/spec/merb/responder_spec.rb
CHANGED
@@ -242,9 +242,9 @@ class CrazyResponderSpecController < Merb::Controller
|
|
242
242
|
end
|
243
243
|
end
|
244
244
|
|
245
|
-
Merb::
|
246
|
-
Merb::
|
247
|
-
Merb::
|
245
|
+
Merb::BootLoader.load_action_arguments
|
246
|
+
Merb::BootLoader.load_controller_template_path_cache
|
247
|
+
Merb::BootLoader.load_inline_helpers
|
248
248
|
|
249
249
|
describe "A Merb Responder's Content Negotiation" do
|
250
250
|
|
data/spec/merb/router_spec.rb
CHANGED
@@ -3,11 +3,24 @@ require 'benchmark'
|
|
3
3
|
include Benchmark
|
4
4
|
|
5
5
|
require FIXTURES / 'models/router_spec_models'
|
6
|
-
$TESTING = true
|
7
6
|
|
8
|
-
# OpenStruct fails to return
|
7
|
+
# OpenStruct fails to return :method correctly,
|
8
|
+
# which we require for our Request object.
|
9
9
|
class SimpleRequest < OpenStruct
|
10
|
-
def method
|
10
|
+
def method
|
11
|
+
@table[:method]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def generate(*args)
|
16
|
+
Merb::Router.generate *args
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'generate helper' do
|
20
|
+
it 'should reference Merb::Router method of the same name' do
|
21
|
+
Merb::Router.should_receive(:generate).with(:test)
|
22
|
+
generate :test
|
23
|
+
end
|
11
24
|
end
|
12
25
|
|
13
26
|
describe Merb::Router::CachedProc do
|
@@ -16,7 +29,7 @@ describe Merb::Router::CachedProc do
|
|
16
29
|
cc = Merb::Router::CachedProc.new(regexp)
|
17
30
|
Merb::Router::CachedProc[cc.index].cache.should == regexp
|
18
31
|
end
|
19
|
-
|
32
|
+
|
20
33
|
it "should register a proc" do
|
21
34
|
testproc = proc { puts 'test' }
|
22
35
|
cc = Merb::Router::CachedProc.new(testproc)
|
@@ -74,14 +87,14 @@ describe Merb::Router do
|
|
74
87
|
end
|
75
88
|
|
76
89
|
it "should have a spec helper to match routes" do
|
77
|
-
Merb::Router.prepare{ |r| r.default_routes }
|
78
|
-
with_route(
|
79
|
-
params[:controller].should ==
|
80
|
-
params[:action].should ==
|
81
|
-
params[:id].should ==
|
82
|
-
end
|
90
|
+
Merb::Router.prepare { |r| r.default_routes }
|
91
|
+
with_route('/pages/show/1', 'GET') do |params|
|
92
|
+
params[:controller].should == 'pages'
|
93
|
+
params[:action].should == 'show'
|
94
|
+
params[:id].should == '1'
|
95
|
+
end
|
83
96
|
end
|
84
|
-
|
97
|
+
|
85
98
|
# it "should be fast" do
|
86
99
|
# Merb::Router.prepare do |r|
|
87
100
|
# r.resource :icon
|
@@ -121,10 +134,10 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
121
134
|
Set.new(hash.keys).should == Set.new(keys)
|
122
135
|
end
|
123
136
|
|
124
|
-
before
|
137
|
+
before :all do
|
125
138
|
Merb::Router.prepare do |r|
|
126
|
-
# A simple route match, sends "/contact" to Info#contact
|
127
|
-
#
|
139
|
+
# A simple route match, sends "/contact" to Info#contact,
|
140
|
+
# i.e. the 'contact' method inside the 'Info' controller
|
128
141
|
r.match("/contact").
|
129
142
|
to(:controller => "info", :action => "contact")
|
130
143
|
|
@@ -166,7 +179,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
166
179
|
# Use square-bracket notation to replace param results with captures from the path
|
167
180
|
r.match(%r[^/movies/(\d+)-(\d+)-(\d+)$]).
|
168
181
|
to(:controller => "movies", :movie_id => "[1][2][3]", :action => "show")
|
169
|
-
|
182
|
+
|
170
183
|
# Use the second optional argument of 'match' to be more specific about the request;
|
171
184
|
# in this case, only accept the POST method for the /movies/create action
|
172
185
|
r.match("/movies/create", :method => "post").
|
@@ -176,12 +189,12 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
176
189
|
# e.g. :user_agent[1] will be replaced with either 'MSIE' or 'Gecko' in the following case:
|
177
190
|
r.match(%r[^/movies/(.+)], :user_agent => /(MSIE|Gecko)/).
|
178
191
|
to(:controller => "movies", :title => "[1]", :action => "show", :agent => ":user_agent[1]")
|
179
|
-
|
192
|
+
|
180
193
|
# The 'match' method can also be called without the path string or regexp.
|
181
194
|
# In this example, direct all insecure traffic to a Insecure#index
|
182
195
|
r.match(:protocol => "http://").
|
183
196
|
to(:controller => "insecure", :action => "index")
|
184
|
-
|
197
|
+
|
185
198
|
# Use anonymous placeholders in place of the ugly-looking pattern, /([^\/.,;?]+)/
|
186
199
|
r.match("/::/users/::").
|
187
200
|
to(:controller => "users", :action => "[2]", :id => "[1]")
|
@@ -193,6 +206,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
193
206
|
r.match('/admin').to(:namespace => 'admin') do |foo|
|
194
207
|
foo.match('/foo').to(:controller => 'foo')
|
195
208
|
end
|
209
|
+
|
196
210
|
r.match('/foo').to(:controller => 'foo')
|
197
211
|
|
198
212
|
# Putting it all together, and adding the requirement that we use an "admin" prefix on the
|
@@ -204,12 +218,12 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
204
218
|
end.to(:controller => "users", :action => "default")
|
205
219
|
# Note that the last line above sends all traffic in the "admin" subdomain to the
|
206
220
|
# Admin::Users#default action if no other route is matched.
|
207
|
-
|
221
|
+
|
208
222
|
# Create a deferred route. In this case, the decision of whether or not the route
|
209
223
|
# is a match is made via the .xhr? call. Note that it's ok to put the hash in a
|
210
224
|
# conditional because if the "if" statement is false, ruby returns nil (i.e. no match).
|
211
225
|
r.match(%r[^/deferred]).defer_to do |request, params|
|
212
|
-
{:controller => "ajax", :action => "index"} if request.xhr?
|
226
|
+
{ :controller => "ajax", :action => "index" } if request.xhr?
|
213
227
|
end
|
214
228
|
|
215
229
|
# Use the placeholders in a the deferred route
|
@@ -218,14 +232,14 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
218
232
|
end
|
219
233
|
end
|
220
234
|
end
|
221
|
-
|
235
|
+
|
222
236
|
it "should connect '/contact' to Info#contact" do
|
223
237
|
index, route = Merb::Router.match(SimpleRequest.new(:protocol => "http://", :path => '/contact'), {})
|
224
238
|
route[:controller].should == "info"
|
225
239
|
route[:action].should == "contact"
|
226
240
|
should_only_have_keys(route, :controller, :action)
|
227
241
|
end
|
228
|
-
|
242
|
+
|
229
243
|
it "should use placeholders in the match and pass them along to the params" do
|
230
244
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/books/12/show'), {})
|
231
245
|
route[:controller].should == "books"
|
@@ -233,7 +247,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
233
247
|
route[:book_id].should == "12"
|
234
248
|
should_only_have_keys(route, :controller, :action, :book_id)
|
235
249
|
end
|
236
|
-
|
250
|
+
|
237
251
|
it "should allow placeholders to be used in the params to construct results from matches" do
|
238
252
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/admin/accounts/users/index'), {})
|
239
253
|
route[:controller].should == "accounts/users"
|
@@ -246,7 +260,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
246
260
|
route[:id].should == "4"
|
247
261
|
should_only_have_keys(route, :module, :controller, :action, :id)
|
248
262
|
end
|
249
|
-
|
263
|
+
|
250
264
|
it "should allow 'match' to use a block to factor out repetitive parts, merging the path as it goes" do
|
251
265
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/accounts/overview'), {})
|
252
266
|
route[:controller].should == "accounts"
|
@@ -266,7 +280,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
266
280
|
route[:controller].should == "accounts"
|
267
281
|
route[:action].should == "reports"
|
268
282
|
should_only_have_keys(route, :controller, :action)
|
269
|
-
|
283
|
+
|
270
284
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/slideshow/2'), {})
|
271
285
|
route[:controller].should == "accounts"
|
272
286
|
route[:action].should == "slideshow"
|
@@ -281,7 +295,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
281
295
|
route[:id].should == "5"
|
282
296
|
should_only_have_keys(route, :controller, :action, :id)
|
283
297
|
end
|
284
|
-
|
298
|
+
|
285
299
|
it "should be able to use square bracket notation to replace param results with captures from the path" do
|
286
300
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/123-1-9999'), {})
|
287
301
|
route[:controller].should == "movies"
|
@@ -295,13 +309,13 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
295
309
|
route[:controller].should be_nil
|
296
310
|
route[:action].should be_nil
|
297
311
|
should_only_have_keys(route)
|
298
|
-
|
312
|
+
|
299
313
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/create', :method => "post"), {})
|
300
314
|
route[:controller].should == "movies"
|
301
315
|
route[:action].should == "create"
|
302
316
|
should_only_have_keys(route, :controller, :action)
|
303
317
|
end
|
304
|
-
|
318
|
+
|
305
319
|
it "should use variables from the 'match' as a result sent to the controller in the params hash" do
|
306
320
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/harry-potter-3', :user_agent => "Internet Explorer (MSIE)"), {})
|
307
321
|
route[:controller].should == "movies"
|
@@ -322,7 +336,7 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
322
336
|
route[:action].should == "index"
|
323
337
|
should_only_have_keys(route, :controller, :action)
|
324
338
|
end
|
325
|
-
|
339
|
+
|
326
340
|
it "should use anonymous placeholders" do
|
327
341
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/5/users/show', :protocol => "https://"), {})
|
328
342
|
route[:controller].should == "users"
|
@@ -335,8 +349,8 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
335
349
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/bar', :method => :get), {})
|
336
350
|
route[:namespace].should == 'foo'
|
337
351
|
route[:controller].should == 'bar'
|
338
|
-
route[:action].should == 'index'
|
339
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
352
|
+
route[:action].should == 'index'
|
353
|
+
should_only_have_keys(route, :namespace, :controller, :action)
|
340
354
|
end
|
341
355
|
|
342
356
|
it "should have namespace 'admin' if path is '/admin/foo'" do
|
@@ -344,14 +358,14 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
344
358
|
route[:namespace].should == 'admin'
|
345
359
|
route[:controller].should == 'foo'
|
346
360
|
route[:action].should == 'index'
|
347
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
361
|
+
should_only_have_keys(route, :namespace, :controller, :action)
|
348
362
|
end
|
349
363
|
|
350
364
|
it "should not have namespace if path is just '/foo'" do
|
351
365
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/foo', :method => :get), {})
|
352
366
|
route[:controller].should == 'foo'
|
353
367
|
route[:action].should == 'index'
|
354
|
-
should_only_have_keys(route, :controller, :action)
|
368
|
+
should_only_have_keys(route, :controller, :action)
|
355
369
|
end
|
356
370
|
|
357
371
|
it "should send all admin.* domains to the 'admin/users' controller, and 'default' action" do
|
@@ -394,106 +408,105 @@ describe Merb::Router, "when doing route matching with a big set of example rout
|
|
394
408
|
end
|
395
409
|
|
396
410
|
describe Merb::Router, "with a single resource, 'blogposts' with 'comments'" do
|
397
|
-
before
|
411
|
+
before :each do
|
398
412
|
Merb::Router.prepare do |r|
|
399
|
-
r.resources :blogposts do |
|
400
|
-
|
401
|
-
end
|
413
|
+
r.resources :blogposts do |b|
|
414
|
+
b.resources :comments
|
415
|
+
end
|
402
416
|
end
|
403
417
|
end
|
404
|
-
|
418
|
+
|
405
419
|
it "should match /blogposts" do
|
406
420
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts', :method => :get), {})
|
407
421
|
route[:controller].should == 'blogposts'
|
408
422
|
route[:action].should == 'index'
|
409
|
-
|
423
|
+
|
410
424
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts', :method => :post), {})
|
411
425
|
route[:controller].should == 'blogposts'
|
412
426
|
route[:action].should == 'create'
|
413
427
|
end
|
414
|
-
|
428
|
+
|
415
429
|
it "should match /blogposts/new" do
|
416
430
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/new', :method => :get), {})
|
417
431
|
route[:controller].should == 'blogposts'
|
418
432
|
route[:action].should == 'new'
|
419
|
-
end
|
420
|
-
|
433
|
+
end
|
434
|
+
|
421
435
|
it "should match /blogposts/1" do
|
422
436
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :get), {})
|
423
437
|
route[:controller].should == 'blogposts'
|
424
438
|
route[:action].should == 'show'
|
425
439
|
route[:id].should == '1'
|
426
|
-
|
440
|
+
|
427
441
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :put), {})
|
428
442
|
route[:controller].should == 'blogposts'
|
429
443
|
route[:action].should == 'update'
|
430
444
|
route[:id].should == '1'
|
431
|
-
|
445
|
+
|
432
446
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :delete), {})
|
433
447
|
route[:controller].should == 'blogposts'
|
434
448
|
route[:action].should == 'destroy'
|
435
449
|
route[:id].should == '1'
|
436
450
|
end
|
437
|
-
|
451
|
+
|
438
452
|
it "should match /blogposts/1;edit" do
|
439
453
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1;edit', :method => :get), {})
|
440
454
|
route[:controller].should == 'blogposts'
|
441
455
|
route[:action].should == 'edit'
|
442
456
|
route[:id].should == '1'
|
443
|
-
|
457
|
+
|
444
458
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1;edit', :method => :put), {})
|
445
459
|
route[:controller].should be_nil
|
446
460
|
route[:action].should be_nil
|
447
461
|
end
|
448
|
-
|
462
|
+
|
449
463
|
it "should match /blogposts/1/edit" do
|
450
464
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1/edit', :method => :get), {})
|
451
465
|
route[:controller].should == 'blogposts'
|
452
466
|
route[:action].should == 'edit'
|
453
467
|
route[:id].should == '1'
|
454
|
-
|
468
|
+
|
455
469
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1/edit', :method => :put), {})
|
456
470
|
route[:controller].should be_nil
|
457
471
|
route[:action].should be_nil
|
458
472
|
end
|
459
|
-
|
473
|
+
|
460
474
|
it "should generate blogposts path" do
|
461
|
-
|
475
|
+
generate(:blogposts).should == '/blogposts'
|
462
476
|
end
|
463
|
-
|
477
|
+
|
464
478
|
it "should generate blogpost path" do
|
465
|
-
|
479
|
+
generate(:blogpost, :id => 1).should == '/blogposts/1'
|
466
480
|
b = Blogposts.new
|
467
|
-
|
468
|
-
|
481
|
+
generate(:blogpost, b).should == '/blogposts/42'
|
482
|
+
generate(:blogpost, :id => b).should == '/blogposts/42'
|
469
483
|
end
|
470
|
-
|
484
|
+
|
471
485
|
it "should generate new_blogpost path" do
|
472
|
-
|
486
|
+
generate(:new_blogpost).should == '/blogposts/new'
|
473
487
|
end
|
474
|
-
|
488
|
+
|
475
489
|
it "should generate edit_blogpost path" do
|
476
|
-
|
490
|
+
generate(:edit_blogpost, {:id => 1}).should == '/blogposts/1/edit'
|
477
491
|
end
|
478
|
-
|
492
|
+
|
479
493
|
it "should generate comments path" do
|
480
|
-
c = Comment.new
|
481
|
-
|
494
|
+
c = Comment.new
|
495
|
+
generate(:comments, c).should == '/blogposts/42/comments'
|
482
496
|
end
|
483
497
|
|
484
498
|
it "should generate comment path" do
|
485
499
|
c = Comment.new
|
486
|
-
|
500
|
+
generate(:comment, c).should == '/blogposts/42/comments/24'
|
487
501
|
end
|
488
|
-
|
489
502
|
end
|
490
503
|
|
491
504
|
|
492
505
|
describe Merb::Router, "with resources using name_prefix, 'oranges' and 'ape'" do
|
493
|
-
before
|
506
|
+
before :each do
|
494
507
|
Merb::Router.prepare do |r|
|
495
508
|
r.resources :oranges, :name_prefix => "florida_"
|
496
|
-
r.resource
|
509
|
+
r.resource :ape, :name_prefix => "grape_"
|
497
510
|
end
|
498
511
|
end
|
499
512
|
|
@@ -502,96 +515,147 @@ describe Merb::Router, "with resources using name_prefix, 'oranges' and 'ape'" d
|
|
502
515
|
route[:controller].should == 'oranges'
|
503
516
|
route[:action].should == 'index'
|
504
517
|
end
|
505
|
-
|
518
|
+
|
506
519
|
it "should generate florida_oranges path" do
|
507
|
-
|
520
|
+
generate(:florida_oranges).should == '/oranges'
|
508
521
|
end
|
509
|
-
|
522
|
+
|
510
523
|
it "should generate florida_orange path" do
|
511
|
-
|
524
|
+
generate(:florida_orange, :id => 1).should == '/oranges/1'
|
512
525
|
b = Blogposts.new
|
513
|
-
|
514
|
-
|
526
|
+
generate(:florida_orange, b).should == '/oranges/42'
|
527
|
+
generate(:florida_orange, :id => b).should == '/oranges/42'
|
515
528
|
end
|
516
529
|
|
517
530
|
it "should generate new_florida_orange path" do
|
518
|
-
|
531
|
+
generate(:new_florida_orange).should == '/oranges/new'
|
519
532
|
end
|
520
533
|
|
521
534
|
it "should generate edit_florida_orange path" do
|
522
|
-
|
523
|
-
end
|
535
|
+
generate(:edit_florida_orange, {:id => 1}).should == '/oranges/1/edit'
|
536
|
+
end
|
524
537
|
|
525
538
|
it "should match /ape" do
|
526
539
|
index, route = Merb::Router.match(SimpleRequest.new(:path => '/ape', :method => :get), {})
|
527
540
|
route[:controller].should == 'ape'
|
528
541
|
route[:action].should == 'show'
|
529
542
|
end
|
530
|
-
|
543
|
+
|
531
544
|
it "should generate grape_ape path" do
|
532
|
-
|
545
|
+
generate(:grape_ape).should == '/ape'
|
533
546
|
end
|
534
|
-
|
547
|
+
|
535
548
|
it "should generate new_grape_ape path" do
|
536
|
-
|
549
|
+
generate(:new_grape_ape).should == '/ape/new'
|
537
550
|
end
|
538
551
|
|
539
552
|
it "should generate edit_grape_ape path" do
|
540
|
-
|
541
|
-
end
|
553
|
+
generate(:edit_grape_ape).should == '/ape/edit'
|
554
|
+
end
|
542
555
|
end
|
543
556
|
|
544
557
|
describe Merb::Router, "with resources using a collection action" do
|
545
|
-
before
|
558
|
+
before :each do
|
546
559
|
Merb::Router.prepare do |r|
|
547
560
|
r.resources :flowers, :collection => { :random => [:get] }
|
548
561
|
end
|
549
562
|
end
|
550
|
-
|
563
|
+
|
551
564
|
it "should generate random_flowers path" do
|
552
|
-
|
565
|
+
generate(:random_flowers).should == '/flowers/random'
|
566
|
+
end
|
567
|
+
|
568
|
+
it "should match GET to /flowers/random" do
|
569
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/random', :method => :get), {})
|
570
|
+
route[:controller].should == 'flowers'
|
571
|
+
route[:action].should == 'random'
|
572
|
+
end
|
573
|
+
|
574
|
+
it "should match GET to /flowers/random.xml" do
|
575
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/random.xml', :method => :get), {})
|
576
|
+
route[:controller].should == 'flowers'
|
577
|
+
route[:action].should == 'random'
|
578
|
+
route[:format].should == 'xml'
|
553
579
|
end
|
580
|
+
|
554
581
|
end
|
555
582
|
|
556
|
-
describe Merb::Router, "with resources using a member action" do
|
557
|
-
before
|
583
|
+
describe Merb::Router, "with resources using a member action { :pick => [:get] }" do
|
584
|
+
before :each do
|
558
585
|
Merb::Router.prepare do |r|
|
559
586
|
r.resources :flowers, :member => { :pick => [:get] }
|
560
587
|
end
|
561
588
|
end
|
562
|
-
|
589
|
+
|
563
590
|
it 'should generate pick_flower path' do
|
564
|
-
|
591
|
+
generate(:pick_flower, :id => 1).should == '/flowers/1/pick'
|
592
|
+
end
|
593
|
+
|
594
|
+
it "should match GET to /flowers/2/pick" do
|
595
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/2/pick', :method => :get), {})
|
596
|
+
route[:controller].should == 'flowers'
|
597
|
+
route[:action].should == 'pick'
|
598
|
+
route[:id].should == '2'
|
599
|
+
end
|
600
|
+
|
601
|
+
it "should not match POST to /flowers/2/pick" do
|
602
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/2/pick', :method => :post), {})
|
603
|
+
route[:controller].should_not == 'flowers'
|
604
|
+
route[:action].should_not == 'pick'
|
605
|
+
route[:id].should_not == '2'
|
565
606
|
end
|
607
|
+
|
608
|
+
it "should not match PUT to /flowers/2/pick" do
|
609
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/2/pick', :method => :put), {})
|
610
|
+
route[:controller].should_not == 'flowers'
|
611
|
+
route[:action].should_not == 'pick'
|
612
|
+
route[:id].should_not == '2'
|
613
|
+
end
|
614
|
+
|
615
|
+
it "should not match DELETE to /flowers/2/pick" do
|
616
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/2/pick', :method => :delete), {})
|
617
|
+
route[:controller].should_not == 'flowers'
|
618
|
+
route[:action].should_not == 'pick'
|
619
|
+
route[:id].should_not == '2'
|
620
|
+
end
|
621
|
+
|
622
|
+
it "should match GET to /flowers/2/pick.xml" do
|
623
|
+
index, route = Merb::Router.match(SimpleRequest.new(:path => '/flowers/2/pick.xml', :method => :get), {})
|
624
|
+
route[:controller].should == 'flowers'
|
625
|
+
route[:action].should == 'pick'
|
626
|
+
route[:id].should == '2'
|
627
|
+
route[:format].should == 'xml'
|
628
|
+
end
|
629
|
+
|
566
630
|
end
|
567
631
|
|
568
632
|
describe Merb::Router::Behavior do
|
569
|
-
before
|
633
|
+
before :all do
|
570
634
|
@behavior = Merb::Router::Behavior
|
571
635
|
end
|
572
636
|
|
573
637
|
it "should leave strings as strings and add ^...$ in the @conditions hash" do
|
574
|
-
@behavior.new(
|
638
|
+
@behavior.new(:path => '/one/two').conditions[:path].should == '^/one/two$'
|
575
639
|
end
|
576
|
-
|
640
|
+
|
577
641
|
it "should replace special characters in strings with their escaped equivalents" do
|
578
|
-
@behavior.new(
|
642
|
+
@behavior.new(:path => 'test.xml').conditions[:path].should == '^test\\.xml$'
|
579
643
|
end
|
580
644
|
|
581
645
|
it "should convert symbols to strings and add ^...$ in the @conditions hash" do
|
582
|
-
@behavior.new(
|
646
|
+
@behavior.new(:method => :get).conditions[:method].should == '^get$'
|
583
647
|
end
|
584
648
|
|
585
649
|
it "should convert regular expressions to strings in the @conditions hash" do
|
586
|
-
@behavior.new(
|
650
|
+
@behavior.new(:protocol => /https?/).conditions[:protocol].should == 'https?'
|
587
651
|
end
|
588
|
-
|
652
|
+
|
589
653
|
it "should deduce placeholders from the @conditions hash" do
|
590
|
-
ph = @behavior.new(
|
654
|
+
ph = @behavior.new(:path => '/:controller/:action').placeholders
|
591
655
|
ph[:controller].should == [:path, 1]
|
592
656
|
ph[:action].should == [:path, 2]
|
593
657
|
end
|
594
|
-
|
658
|
+
|
595
659
|
it "should deduce placeholders from the @conditions hash, even when they contain numbers" do
|
596
660
|
ph = @behavior.new({:path => "/:part1/:part2"}).placeholders
|
597
661
|
ph[:part1].should == [:path, 1]
|
@@ -599,40 +663,40 @@ describe Merb::Router::Behavior do
|
|
599
663
|
end
|
600
664
|
|
601
665
|
it "should deduce placeholders within regular expressions that contain prefixed captures" do
|
602
|
-
ph = @behavior.new(
|
666
|
+
ph = @behavior.new(:path => %r[/(\d+)/:controller/:action]).placeholders
|
603
667
|
ph[:controller].should == [:path, 2]
|
604
668
|
ph[:action].should == [:path, 3]
|
605
|
-
|
606
|
-
ph = @behavior.new(
|
669
|
+
|
670
|
+
ph = @behavior.new(:path => %r[/:controller/:action/(\d+)]).placeholders
|
607
671
|
ph[:controller].should == [:path, 1]
|
608
672
|
ph[:action].should == [:path, 2]
|
609
673
|
end
|
610
674
|
|
611
675
|
it "should deduce placeholder positions in nested captures" do
|
612
|
-
ph = @behavior.new(
|
676
|
+
ph = @behavior.new(:path => %r[(/(\d+)/:controller)/:action]).placeholders
|
613
677
|
ph[:controller].should == [:path, 3]
|
614
678
|
ph[:action].should == [:path, 4]
|
615
|
-
|
616
|
-
ph = @behavior.new(
|
679
|
+
|
680
|
+
ph = @behavior.new(:path => %r[/(\d+)/(:controller)/:action]).placeholders
|
617
681
|
ph[:controller].should == [:path, 3]
|
618
682
|
ph[:action].should == [:path, 4]
|
619
|
-
|
620
|
-
ph = @behavior.new(
|
683
|
+
|
684
|
+
ph = @behavior.new(:path => %r[/(\d+)/:controller/(:action)]).placeholders
|
621
685
|
ph[:controller].should == [:path, 2]
|
622
686
|
ph[:action].should == [:path, 4]
|
623
|
-
|
624
|
-
ph = @behavior.new(
|
687
|
+
|
688
|
+
ph = @behavior.new(:path => %r[(/(\d+)/(:controller/((:action))))]).placeholders
|
625
689
|
ph[:controller].should == [:path, 4]
|
626
690
|
ph[:action].should == [:path, 7]
|
627
691
|
end
|
628
692
|
|
629
693
|
it "should replace any placeholders found within @conditions strings with segment regular expressions" do
|
630
|
-
m = @behavior.new(
|
694
|
+
m = @behavior.new(:path => "/:my/:place:holders/:here").conditions
|
631
695
|
m[:path].should == "^/([^/.,;?]+)/([^/.,;?]+)([^/.,;?]+)/([^/.,;?]+)$"
|
632
696
|
end
|
633
697
|
|
634
698
|
it "should set default values for params that came from placeholders" do
|
635
|
-
p = @behavior.new(
|
699
|
+
p = @behavior.new(:path => "/:my/:place:holders/:here").params
|
636
700
|
p[:my].should == ":my"
|
637
701
|
p[:place].should == ":place"
|
638
702
|
p[:holders].should == ":holders"
|
@@ -640,11 +704,11 @@ describe Merb::Router::Behavior do
|
|
640
704
|
end
|
641
705
|
|
642
706
|
it "should merge params with its ancestors" do
|
643
|
-
b = @behavior.new({}, {:controller => "my_controller", :action => "index"})
|
644
|
-
c = @behavior.new({}, {:action => "show"}, b)
|
645
|
-
c.merged_params.should == {:controller => "my_controller", :action => "show"}
|
707
|
+
b = @behavior.new({}, { :controller => "my_controller", :action => "index" })
|
708
|
+
c = @behavior.new({}, { :action => "show" }, b)
|
709
|
+
c.merged_params.should == { :controller => "my_controller", :action => "show" }
|
646
710
|
end
|
647
|
-
|
711
|
+
|
648
712
|
# it "should have a default action and controller for merged params" do
|
649
713
|
# a = @behavior.new
|
650
714
|
# a.merged_params.should == {:controller => "application", :action => "index"}
|
@@ -655,37 +719,37 @@ describe Merb::Router::Behavior do
|
|
655
719
|
# c = @behavior.new({}, {:action => "show"})
|
656
720
|
# c.merged_params.should == {:controller => "application", :action => "show"}
|
657
721
|
# end
|
658
|
-
|
722
|
+
|
659
723
|
it "should merge conditions with its ancestors" do
|
660
|
-
b = @behavior.new({:method => "get", :protocol => "http"})
|
661
|
-
c = @behavior.new({:method => "put"}, {}, b)
|
662
|
-
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$"}
|
724
|
+
b = @behavior.new({ :method => "get", :protocol => "http" })
|
725
|
+
c = @behavior.new({ :method => "put" }, {}, b)
|
726
|
+
c.merged_conditions.should == { :method => "^put$", :protocol => "^http$" }
|
663
727
|
end
|
664
728
|
|
665
729
|
it "should merge placeholders with its ancestors" do
|
666
|
-
b = @behavior.new({:method => "get", :protocol => ":ssl"}, {:action => ":method"})
|
667
|
-
c = @behavior.new({:method => "put"}, {:action => ":ssl"}, b)
|
668
|
-
c.merged_placeholders.should == {:ssl => [:protocol, 1]}
|
730
|
+
b = @behavior.new({ :method => "get", :protocol => ":ssl" }, { :action => ":method" })
|
731
|
+
c = @behavior.new({ :method => "put" }, { :action => ":ssl" }, b)
|
732
|
+
c.merged_placeholders.should == { :ssl => [:protocol, 1] }
|
669
733
|
end
|
670
734
|
|
671
735
|
it "should add the number of path captures in the ancestors' paths to placeholders that hold a place for :path captures" do
|
672
|
-
b = @behavior.new(
|
673
|
-
b.placeholders.should == {:controller => [:path, 1], :action => [:path, 2]}
|
674
|
-
c = @behavior.new({:path => "/:id"}, {}, b)
|
675
|
-
c.placeholders.should == {:id => [:path, 1]}
|
736
|
+
b = @behavior.new(:path => "/:controller/:action")
|
737
|
+
b.placeholders.should == { :controller => [:path, 1], :action => [:path, 2] }
|
738
|
+
c = @behavior.new({ :path => "/:id" }, {}, b)
|
739
|
+
c.placeholders.should == { :id => [:path, 1] }
|
676
740
|
|
677
|
-
c.merged_placeholders.should == {:controller => [:path, 1], :action => [:path, 2], :id => [:path, 3]}
|
741
|
+
c.merged_placeholders.should == { :controller => [:path, 1], :action => [:path, 2], :id => [:path, 3] }
|
678
742
|
end
|
679
743
|
|
680
744
|
it "should merge the :path differently than other @conditions keys -- it should concatenate" do
|
681
745
|
b = @behavior.new({:method => "get", :protocol => "http"})
|
682
746
|
c = @behavior.new({:path => "/test", :method => "put"}, {}, b)
|
683
747
|
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/test$"}
|
684
|
-
|
748
|
+
|
685
749
|
b = @behavior.new({:path => "/test", :method => "get", :protocol => "http"})
|
686
750
|
c = @behavior.new({:method => "put"}, {}, b)
|
687
751
|
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/test$"}
|
688
|
-
|
752
|
+
|
689
753
|
b = @behavior.new({:path => "/admin", :method => "get", :protocol => "http"})
|
690
754
|
c = @behavior.new({:path => "/test", :method => "put"}, {}, b)
|
691
755
|
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/admin/test$"}
|
@@ -696,7 +760,7 @@ describe Merb::Router::Behavior do
|
|
696
760
|
cp = b.send(:compiled_params)
|
697
761
|
cp[:controller].should == "path1"
|
698
762
|
cp[:action].should == "path2"
|
699
|
-
|
763
|
+
|
700
764
|
b = @behavior.new(
|
701
765
|
{:path => "/admin/:controller/:action/:postfix", :method => "get"},
|
702
766
|
{:controller => "/admin/:controller", :action => "neat_o_:action:postfix"})
|
@@ -704,7 +768,7 @@ describe Merb::Router::Behavior do
|
|
704
768
|
cp[:controller].should == "\"/admin/\" + path1"
|
705
769
|
cp[:action].should == "\"neat_o_\" + path2 + path3"
|
706
770
|
end
|
707
|
-
|
771
|
+
|
708
772
|
it "should allow a bracketed number such as [3] to compile to path3" do
|
709
773
|
b = @behavior.new(
|
710
774
|
{:path => "/admin/:controller/:action/(.+)", :method => "get"},
|
@@ -712,7 +776,7 @@ describe Merb::Router::Behavior do
|
|
712
776
|
cp = b.send(:compiled_params)
|
713
777
|
cp[:catchall].should == "path3"
|
714
778
|
end
|
715
|
-
|
779
|
+
|
716
780
|
it "should allow a backslash to escape an underscore in the compiled params" do
|
717
781
|
b = @behavior.new(
|
718
782
|
{:path => "/admin/:controller/:action", :method => "get"},
|
@@ -731,101 +795,106 @@ describe Merb::Router::Behavior do
|
|
731
795
|
end
|
732
796
|
|
733
797
|
it "should allow for conditional blocks using the 'defer_to' method" do
|
734
|
-
b = @behavior.new(
|
735
|
-
route = b.defer_to { |request| {:controller =>
|
798
|
+
b = @behavior.new(:path => '/admin')
|
799
|
+
route = b.defer_to { |request| { :controller => 'late_bound', :action => 'place' } }
|
736
800
|
route.conditional_block.should be_an_instance_of(Proc)
|
737
801
|
route.compile.should match(/block_result/m)
|
738
802
|
end
|
739
803
|
end
|
740
804
|
|
741
805
|
describe Merb::Router::Behavior, "class methods" do
|
742
|
-
before
|
806
|
+
before :all do
|
743
807
|
@b = Merb::Router::Behavior
|
744
808
|
end
|
745
809
|
|
746
|
-
it
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
810
|
+
it 'should count opening parentheses' do
|
811
|
+
[[' ( )', 1, 1],
|
812
|
+
[' ( )', 50, 1],
|
813
|
+
[' (() )', 1, 1],
|
814
|
+
[' (() )', 2, 2]].each do |parens,limit,expected|
|
815
|
+
@b.count_parens_up_to(parens, limit).should == expected
|
816
|
+
end
|
817
|
+
|
751
818
|
# TODO: skip escaped open parens
|
752
819
|
end
|
753
820
|
|
754
|
-
it
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
821
|
+
it 'should concatenate strings without endcaps' do
|
822
|
+
[[nil, nil, nil],
|
823
|
+
[nil, '^test', '^test'],
|
824
|
+
['my$', nil, 'my$'],
|
825
|
+
['my', 'test', 'mytest'],
|
826
|
+
['my$', 'test', 'mytest'],
|
827
|
+
['my^', 'test', 'my^test'],
|
828
|
+
['my$', '^test', 'mytest'],
|
829
|
+
['^my$', '^test$', '^mytest$']].each do |str1, str2, expected|
|
830
|
+
@b.concat_without_endcaps(str1, str2).should == expected
|
831
|
+
end
|
763
832
|
end
|
764
833
|
|
765
|
-
it
|
766
|
-
|
767
|
-
|
768
|
-
|
834
|
+
it 'should compile arrays with strings and symbols into code' do
|
835
|
+
[[[:var, 'this string'], %{var + "this string"}],
|
836
|
+
[['one string'], %{"one string"}],
|
837
|
+
[["string", :var, :var2, "other"], %{"string" + var + var2 + "other"}]].each do |array, expected|
|
838
|
+
@b.array_to_code(array).should == expected
|
839
|
+
end
|
769
840
|
end
|
770
841
|
end
|
771
842
|
|
772
|
-
describe
|
773
|
-
before
|
774
|
-
Merb::Router.prepare
|
775
|
-
r.default_routes
|
776
|
-
end
|
843
|
+
describe Merb::Router::Route, 'rendered as a string' do
|
844
|
+
before :all do
|
845
|
+
Merb::Router.prepare { |r| r.default_routes }
|
777
846
|
@routes = Merb::Router.routes
|
778
847
|
end
|
779
848
|
|
780
|
-
it
|
849
|
+
it 'should show the default route' do
|
781
850
|
@routes.last.to_s.should == "/:controller(/:action(/:id)?)?(\\.:format)?"
|
782
851
|
end
|
783
852
|
end
|
784
853
|
|
785
|
-
describe Merb::Router,
|
786
|
-
before
|
854
|
+
describe Merb::Router, 'using namespaces' do
|
855
|
+
before :each do
|
787
856
|
Merb::Router.prepare do |r|
|
788
|
-
|
789
|
-
|
790
|
-
|
857
|
+
r.namespace :admin do |a|
|
858
|
+
a.resources :namespace_block_resources
|
859
|
+
a.resource :namespace_block_resource
|
860
|
+
end
|
861
|
+
|
862
|
+
r.match :namespace => 'admin' do |a|
|
863
|
+
a.resources :match_block_resources
|
864
|
+
a.resource :match_block_resource
|
791
865
|
end
|
792
|
-
|
793
|
-
r.resources :
|
794
|
-
|
795
|
-
|
796
|
-
r.
|
866
|
+
|
867
|
+
r.resources :namespace_option_resources, :namespace => 'admin'
|
868
|
+
r.resource :namespace_option_resource, :namespace => 'admin'
|
869
|
+
|
870
|
+
r.resources :resources, :namespace => 'admin'
|
871
|
+
r.resource :resource, :namespace => 'admin'
|
872
|
+
r.resources :resources
|
873
|
+
r.resource :resource
|
874
|
+
|
875
|
+
r.resources :path_namespace_resources, :namespace => 'admin/supersecret'
|
876
|
+
r.resources :path_namespace_resource, :namespace => 'admin/supersecret'
|
797
877
|
end
|
798
878
|
end
|
799
879
|
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
Merb::Router.generate(:admin_orange, b).should == '/oranges/42'
|
808
|
-
Merb::Router.generate(:admin_orange, :id => b).should == '/oranges/42'
|
880
|
+
# Several ways to define a namespace. Perhaps too many?
|
881
|
+
%w( namespace_block match_block namespace_option ).each do |context|
|
882
|
+
%w( resources resource ).each do |r|
|
883
|
+
it "defines :#{r} in a :#{context} context" do
|
884
|
+
generate("admin_#{context}_#{r}").should == "/admin/#{context}_#{r}"
|
885
|
+
end
|
886
|
+
end
|
809
887
|
end
|
810
888
|
|
811
|
-
it
|
812
|
-
|
889
|
+
it 'defines namespaces with path fragments' do
|
890
|
+
generate(:admin_supersecret_path_namespace_resources).should ==
|
891
|
+
'/admin/supersecret/path_namespace_resources'
|
813
892
|
end
|
814
893
|
|
815
|
-
it
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
Merb::Router.generate(:admin_ape).should == '/ape'
|
821
|
-
end
|
822
|
-
|
823
|
-
it "should generate new_admin_ape path" do
|
824
|
-
Merb::Router.generate(:new_admin_ape).should == '/ape/new'
|
894
|
+
it 'allows resources of the same name in different namespaces' do
|
895
|
+
%w( resources resource ).each do |r|
|
896
|
+
generate("admin_#{r}").should == "/admin/#{r}"
|
897
|
+
generate(r).should == "/#{r}"
|
898
|
+
end
|
825
899
|
end
|
826
|
-
|
827
|
-
it "should generate edit_admin_ape path" do
|
828
|
-
Merb::Router.generate(:edit_admin_ape).should == '/ape/edit'
|
829
|
-
end
|
830
|
-
|
831
900
|
end
|