merb 0.5.3 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +0 -20
- data/README +0 -277
- data/Rakefile +80 -199
- data/TODO +0 -3
- metadata +19 -438
- data/SVN_REVISION +0 -1
- data/app_generators/merb/USAGE +0 -5
- data/app_generators/merb/merb_generator.rb +0 -108
- data/app_generators/merb/templates/Rakefile +0 -124
- data/app_generators/merb/templates/app/controllers/application.rb +0 -3
- data/app_generators/merb/templates/app/controllers/exceptions.rb +0 -13
- data/app_generators/merb/templates/app/helpers/global_helper.rb +0 -5
- data/app_generators/merb/templates/app/mailers/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/mailers/views/layout/application.text.erb +0 -1
- data/app_generators/merb/templates/app/parts/views/layout/application.html.erb +0 -1
- data/app_generators/merb/templates/app/views/exceptions/internal_server_error.html.erb +0 -216
- data/app_generators/merb/templates/app/views/exceptions/not_acceptable.html.erb +0 -38
- data/app_generators/merb/templates/app/views/exceptions/not_found.html.erb +0 -40
- data/app_generators/merb/templates/app/views/layout/application.html.erb +0 -11
- data/app_generators/merb/templates/config/boot.rb +0 -11
- data/app_generators/merb/templates/config/dependencies.rb +0 -41
- data/app_generators/merb/templates/config/environments/development.rb +0 -1
- data/app_generators/merb/templates/config/environments/production.rb +0 -1
- data/app_generators/merb/templates/config/environments/test.rb +0 -1
- data/app_generators/merb/templates/config/merb.yml +0 -82
- data/app_generators/merb/templates/config/merb_init.rb +0 -17
- data/app_generators/merb/templates/config/plugins.yml +0 -1
- data/app_generators/merb/templates/config/router.rb +0 -35
- data/app_generators/merb/templates/config/upload.conf +0 -0
- data/app_generators/merb/templates/public/images/merb.jpg +0 -0
- data/app_generators/merb/templates/public/merb.fcgi +0 -6
- data/app_generators/merb/templates/public/stylesheets/master.css +0 -119
- data/app_generators/merb/templates/script/destroy +0 -32
- data/app_generators/merb/templates/script/generate +0 -32
- data/app_generators/merb/templates/script/stop_merb +0 -13
- data/app_generators/merb/templates/script/win_script.cmd +0 -1
- data/app_generators/merb/templates/spec/spec.opts +0 -6
- data/app_generators/merb/templates/spec/spec_helper.rb +0 -15
- data/app_generators/merb/templates/test/test_helper.rb +0 -14
- data/app_generators/merb_plugin/USAGE +0 -5
- data/app_generators/merb_plugin/merb_plugin_generator.rb +0 -68
- data/app_generators/merb_plugin/templates/LICENSE +0 -20
- data/app_generators/merb_plugin/templates/README +0 -4
- data/app_generators/merb_plugin/templates/Rakefile +0 -35
- data/app_generators/merb_plugin/templates/TODO +0 -5
- data/app_generators/merb_plugin/templates/merbtasks.rb +0 -6
- data/app_generators/merb_plugin/templates/sampleplugin.rb +0 -10
- data/app_generators/merb_plugin/templates/sampleplugin_spec.rb +0 -7
- data/app_generators/merb_plugin/templates/spec_helper.rb +0 -2
- data/bin/merb +0 -4
- data/lib/autotest/discover.rb +0 -3
- data/lib/autotest/merb_rspec.rb +0 -80
- data/lib/merb.rb +0 -188
- data/lib/merb/abstract_controller.rb +0 -399
- data/lib/merb/assets.rb +0 -160
- data/lib/merb/assets.rb.orig +0 -119
- data/lib/merb/boot_loader.rb +0 -286
- data/lib/merb/boot_loader.rb.orig +0 -235
- data/lib/merb/caching.rb +0 -5
- data/lib/merb/caching/action_cache.rb +0 -92
- data/lib/merb/caching/fragment_cache.rb +0 -39
- data/lib/merb/caching/store/file_cache.rb +0 -90
- data/lib/merb/caching/store/memory_cache.rb +0 -85
- data/lib/merb/config.rb +0 -290
- data/lib/merb/constants.rb +0 -50
- data/lib/merb/controller.rb +0 -220
- data/lib/merb/cookies.rb +0 -95
- data/lib/merb/core_ext.rb +0 -15
- data/lib/merb/core_ext/array.rb +0 -0
- data/lib/merb/core_ext/class.rb +0 -180
- data/lib/merb/core_ext/enumerable.rb +0 -49
- data/lib/merb/core_ext/get_args.rb +0 -76
- data/lib/merb/core_ext/hash.rb +0 -306
- data/lib/merb/core_ext/inflections.rb +0 -112
- data/lib/merb/core_ext/inflector.rb +0 -275
- data/lib/merb/core_ext/kernel.rb +0 -242
- data/lib/merb/core_ext/mash.rb +0 -88
- data/lib/merb/core_ext/module.rb +0 -67
- data/lib/merb/core_ext/numeric.rb +0 -72
- data/lib/merb/core_ext/object.rb +0 -183
- data/lib/merb/core_ext/string.rb +0 -53
- data/lib/merb/core_ext/symbol.rb +0 -6
- data/lib/merb/dispatcher.rb +0 -109
- data/lib/merb/drb_server.rb +0 -19
- data/lib/merb/erubis_ext.rb +0 -10
- data/lib/merb/exceptions.rb +0 -192
- data/lib/merb/generators/merb_app/merb_app.rb +0 -22
- data/lib/merb/generators/merb_generator_helpers.rb +0 -318
- data/lib/merb/generators/merb_plugin.rb +0 -22
- data/lib/merb/logger.rb +0 -78
- data/lib/merb/mail_controller.rb +0 -268
- data/lib/merb/mailer.rb +0 -87
- data/lib/merb/mixins/basic_authentication.rb +0 -35
- data/lib/merb/mixins/controller.rb +0 -160
- data/lib/merb/mixins/erubis_capture.rb +0 -68
- data/lib/merb/mixins/general_controller.rb +0 -253
- data/lib/merb/mixins/inline_partial.rb +0 -32
- data/lib/merb/mixins/render.rb +0 -465
- data/lib/merb/mixins/responder.rb +0 -449
- data/lib/merb/mixins/view_context.rb +0 -558
- data/lib/merb/mixins/web_controller.rb +0 -36
- data/lib/merb/mongrel_handler.rb +0 -168
- data/lib/merb/part_controller.rb +0 -29
- data/lib/merb/plugins.rb +0 -16
- data/lib/merb/rack_adapter.rb +0 -37
- data/lib/merb/request.rb +0 -465
- data/lib/merb/router.rb +0 -646
- data/lib/merb/server.rb +0 -169
- data/lib/merb/session.rb +0 -23
- data/lib/merb/session/cookie_store.rb +0 -118
- data/lib/merb/session/mem_cache_session.rb +0 -131
- data/lib/merb/session/memory_session.rb +0 -176
- data/lib/merb/template.rb +0 -37
- data/lib/merb/template/erubis.rb +0 -68
- data/lib/merb/template/haml.rb +0 -87
- data/lib/merb/template/markaby.rb +0 -59
- data/lib/merb/template/xml_builder.rb +0 -50
- data/lib/merb/test/fake_request.rb +0 -74
- data/lib/merb/test/helper.rb +0 -260
- data/lib/merb/test/hpricot.rb +0 -136
- data/lib/merb/test/multipart.rb +0 -66
- data/lib/merb/test/rspec.rb +0 -18
- data/lib/merb/test/rspec_matchers/controller_matchers.rb +0 -117
- data/lib/merb/test/rspec_matchers/markup_matchers.rb +0 -98
- data/lib/merb/upload_handler.rb +0 -80
- data/lib/merb/upload_progress.rb +0 -48
- data/lib/merb/version.rb +0 -49
- data/lib/merb/view_context.rb +0 -79
- data/lib/tasks.rb +0 -7
- data/lib/tasks/merb.rake +0 -54
- data/merb_default_generators/model/USAGE +0 -0
- data/merb_default_generators/model/model_generator.rb +0 -16
- data/merb_default_generators/model/templates/new_model_template.erb +0 -5
- data/merb_default_generators/resource_controller/USAGE +0 -0
- data/merb_default_generators/resource_controller/resource_controller_generator.rb +0 -26
- data/merb_default_generators/resource_controller/templates/controller.rb +0 -30
- data/merb_default_generators/resource_controller/templates/edit.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/helper.rb +0 -5
- data/merb_default_generators/resource_controller/templates/index.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/new.html.erb +0 -1
- data/merb_default_generators/resource_controller/templates/show.html.erb +0 -1
- data/merb_generators/controller/USAGE +0 -5
- data/merb_generators/controller/controller_generator.rb +0 -16
- data/merb_generators/controller/templates/controller.rb +0 -8
- data/merb_generators/controller/templates/helper.rb +0 -5
- data/merb_generators/controller/templates/index.html.erb +0 -3
- data/merb_generators/part_controller/USAGE +0 -5
- data/merb_generators/part_controller/part_controller_generator.rb +0 -27
- data/merb_generators/part_controller/templates/controller.rb +0 -8
- data/merb_generators/part_controller/templates/helper.rb +0 -5
- data/merb_generators/part_controller/templates/index.html.erb +0 -3
- data/merb_generators/resource/USAGE +0 -0
- data/merb_generators/resource/resource_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/merb_controller_test_generator.rb +0 -67
- data/rspec_generators/merb_controller_test/templates/controller_spec.rb +0 -8
- data/rspec_generators/merb_controller_test/templates/edit_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/helper_spec.rb +0 -5
- data/rspec_generators/merb_controller_test/templates/index_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/new_spec.rb +0 -12
- data/rspec_generators/merb_controller_test/templates/show_spec.rb +0 -5
- data/rspec_generators/merb_model_test/merb_model_test_generator.rb +0 -26
- data/rspec_generators/merb_model_test/templates/model_spec_template.erb +0 -7
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/spec/fixtures/config/environments/environment_config_test.yml +0 -1
- data/spec/fixtures/config/merb.yml +0 -18
- data/spec/fixtures/controllers/dispatch_spec_controllers.rb +0 -235
- data/spec/fixtures/controllers/render_spec_controllers.rb +0 -184
- data/spec/fixtures/foo.rb +0 -3
- data/spec/fixtures/mailers/views/layout/application.html.erb +0 -3
- data/spec/fixtures/mailers/views/layout/application.text.erb +0 -3
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/eighth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/first.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.html.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/ninth.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/second.text.erb +0 -1
- data/spec/fixtures/mailers/views/test_mail_controller/third.html.erb +0 -1
- data/spec/fixtures/models/router_spec_models.rb +0 -30
- data/spec/fixtures/parts/views/layout/todo_part.html.erb +0 -3
- data/spec/fixtures/parts/views/layout/todo_part.xml.erb +0 -3
- data/spec/fixtures/parts/views/todo_part/formatted_output.html.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.js.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/formatted_output.xml.erb +0 -1
- data/spec/fixtures/parts/views/todo_part/list.html.erb +0 -3
- data/spec/fixtures/sample.txt +0 -1
- data/spec/fixtures/views/erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_erubis.html.erb +0 -1
- data/spec/fixtures/views/examples/_haml.html.haml +0 -1
- data/spec/fixtures/views/examples/_markaby.html.mab +0 -1
- data/spec/fixtures/views/examples/_throw_content.html.erb +0 -6
- data/spec/fixtures/views/examples/hello.xml.builder +0 -1
- data/spec/fixtures/views/examples/js.js.erb +0 -1
- data/spec/fixtures/views/examples/template_catch_content.html.erb +0 -15
- data/spec/fixtures/views/examples/template_catch_content_from_partial.html.erb +0 -6
- data/spec/fixtures/views/examples/template_throw_content.html.erb +0 -10
- data/spec/fixtures/views/examples/template_throw_content_without_block.html.erb +0 -3
- data/spec/fixtures/views/exceptions/admin_access_required.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/_render_partial_multiple_times.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.html.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.rhtml +0 -1
- data/spec/fixtures/views/extension_template_controller/erubis_templates.xml.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_index.html.haml +0 -0
- data/spec/fixtures/views/extension_template_controller/haml_templates.html.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.js.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/haml_templates.xml.haml +0 -1
- data/spec/fixtures/views/extension_template_controller/index.html.erb +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_index.html.mab +0 -0
- data/spec/fixtures/views/extension_template_controller/markaby_templates.html.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.js.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/markaby_templates.xml.mab +0 -1
- data/spec/fixtures/views/extension_template_controller/render_multiple_partials.html.erb +0 -4
- data/spec/fixtures/views/extension_template_controller/render_nested_js.js.erb +0 -1
- data/spec/fixtures/views/extension_template_controller/render_nested_xml.xml.erb +0 -1
- data/spec/fixtures/views/haml.html.haml +0 -1
- data/spec/fixtures/views/haml.xml.haml +0 -2
- data/spec/fixtures/views/layout/application.html.erb +0 -1
- data/spec/fixtures/views/layout/application.xml.erb +0 -1
- data/spec/fixtures/views/layout/nested/example.html.erb +0 -1
- data/spec/fixtures/views/markaby.html.mab +0 -1
- data/spec/fixtures/views/nested/example/test.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_collection_with_locals.html.erb +0 -1
- data/spec/fixtures/views/partials/_erubis_new.html.erb +0 -1
- data/spec/fixtures/views/partials/_haml.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_collection_with_locals.html.haml +0 -1
- data/spec/fixtures/views/partials/_haml_new.html.haml +0 -1
- data/spec/fixtures/views/partials/_markaby.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_collection_with_locals.html.mab +0 -1
- data/spec/fixtures/views/partials/_markaby_new.html.mab +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.html.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.js.erb +0 -1
- data/spec/fixtures/views/render_object_controller/render_object_with_template.xml.erb +0 -1
- data/spec/fixtures/views/template_views/interface__buffer_erubis.html.erb +0 -4
- data/spec/fixtures/views/template_views/interface__buffer_haml.html.haml +0 -7
- data/spec/fixtures/views/template_views/interface__buffer_markaby.html.mab +0 -7
- data/spec/fixtures/views/template_views/interface_capture_erubis.html.erb +0 -15
- data/spec/fixtures/views/template_views/interface_capture_haml.html.haml +0 -15
- data/spec/fixtures/views/template_views/interface_capture_markaby.html.mab +0 -4
- data/spec/fixtures/views/template_views/interface_concat_erubis.html.erb +0 -12
- data/spec/fixtures/views/template_views/interface_concat_haml.html.haml +0 -11
- data/spec/fixtures/views/template_views/interface_concat_markaby.html.mab +0 -14
- data/spec/fixtures/views/test.dir/the_template.html.erb +0 -1
- data/spec/merb/abstract_controller_spec.rb +0 -38
- data/spec/merb/assets_spec.rb +0 -207
- data/spec/merb/caching_spec.rb +0 -102
- data/spec/merb/config_spec.rb +0 -29
- data/spec/merb/controller_filters_spec.rb +0 -253
- data/spec/merb/controller_spec.rb +0 -126
- data/spec/merb/cookie_store_spec.rb +0 -72
- data/spec/merb/cookies_spec.rb +0 -96
- data/spec/merb/core_ext/class_spec.rb +0 -97
- data/spec/merb/core_ext/enumerable_spec.rb +0 -27
- data/spec/merb/core_ext/hash_spec.rb +0 -251
- data/spec/merb/core_ext/inflector_spec.rb +0 -34
- data/spec/merb/core_ext/kernel_spec.rb +0 -25
- data/spec/merb/core_ext/numeric_spec.rb +0 -26
- data/spec/merb/core_ext/object_spec.rb +0 -47
- data/spec/merb/core_ext/string_spec.rb +0 -22
- data/spec/merb/core_ext/symbol_spec.rb +0 -7
- data/spec/merb/dependency_spec.rb +0 -22
- data/spec/merb/dispatch_spec.rb +0 -528
- data/spec/merb/fake_request_spec.rb +0 -80
- data/spec/merb/generator_spec.rb +0 -248
- data/spec/merb/handler_spec.rb +0 -169
- data/spec/merb/mail_controller_spec.rb +0 -177
- data/spec/merb/mailer_spec.rb +0 -87
- data/spec/merb/multipart_spec.rb +0 -50
- data/spec/merb/part_controller_spec.rb +0 -124
- data/spec/merb/plugins_spec.rb +0 -80
- data/spec/merb/render_spec.rb +0 -469
- data/spec/merb/request_spec.rb +0 -287
- data/spec/merb/responder_spec.rb +0 -562
- data/spec/merb/router_spec.rb +0 -900
- data/spec/merb/server_spec.rb +0 -19
- data/spec/merb/template_spec.rb +0 -41
- data/spec/merb/upload_handler_spec.rb +0 -108
- data/spec/merb/version_spec.rb +0 -33
- data/spec/merb/view_context_spec.rb +0 -366
- data/spec/spec_generator_helper.rb +0 -34
- data/spec/spec_helper.rb +0 -101
- data/spec/spec_helpers/url_shared_behaviour.rb +0 -112
- data/test_unit_generators/merb_controller_test/merb_controller_test_generator.rb +0 -53
- data/test_unit_generators/merb_controller_test/templates/functional_test.rb +0 -17
- data/test_unit_generators/merb_controller_test/templates/helper_test.rb +0 -9
- data/test_unit_generators/merb_model_test/merb_model_test_generator.rb +0 -29
- data/test_unit_generators/merb_model_test/templates/model_test_unit_template.erb +0 -9
data/spec/merb/router_spec.rb
DELETED
@@ -1,900 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
-
require 'benchmark'
|
3
|
-
include Benchmark
|
4
|
-
|
5
|
-
require FIXTURES / 'models/router_spec_models'
|
6
|
-
|
7
|
-
# OpenStruct fails to return :method correctly,
|
8
|
-
# which we require for our Request object.
|
9
|
-
class SimpleRequest < OpenStruct
|
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
|
24
|
-
end
|
25
|
-
|
26
|
-
describe Merb::Router::CachedProc do
|
27
|
-
it "should register a regular expression" do
|
28
|
-
regexp = /t.*e.*s.*t/
|
29
|
-
cc = Merb::Router::CachedProc.new(regexp)
|
30
|
-
Merb::Router::CachedProc[cc.index].cache.should == regexp
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should register a proc" do
|
34
|
-
testproc = proc { puts 'test' }
|
35
|
-
cc = Merb::Router::CachedProc.new(testproc)
|
36
|
-
Merb::Router::CachedProc[cc.index].cache.should == testproc
|
37
|
-
end
|
38
|
-
|
39
|
-
it "should return ruby code as an evaluatable string" do
|
40
|
-
testproc = proc { 'test proc' }
|
41
|
-
cc = Merb::Router::CachedProc.new(testproc)
|
42
|
-
"#{cc}".should == "CachedProc[#{cc.index}].cache"
|
43
|
-
eval("Merb::Router::#{cc}.call").should == "test proc"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe Merb::Router do
|
48
|
-
it "should compile to an if / elsif statement" do
|
49
|
-
lambda {
|
50
|
-
Merb::Router.prepare do |r|
|
51
|
-
r.match('/:controller/:action').to_resources(:controller => '/admin/:controller')
|
52
|
-
end
|
53
|
-
Merb::Router.compiled_statement.should match(/^\s*if/m)
|
54
|
-
}.should_not raise_error
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should match against requests" do
|
58
|
-
Merb::Router.prepare do |r|
|
59
|
-
r.match('/:controller/:action').to_resources(:controller => '/admin/:controller')
|
60
|
-
end
|
61
|
-
request = Merb::Test::FakeRequest.new(:request_uri => "/test/request")
|
62
|
-
result = Merb::Router.match(request, {})
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should be able to prepend routes to the @@routes list" do
|
66
|
-
r1, r2 = nil, nil
|
67
|
-
Merb::Router.prepare do |r|
|
68
|
-
r1 = r.match('/:controller/:action').to(:controller => '/admin/:controller')
|
69
|
-
end
|
70
|
-
Merb::Router.prepend do |r|
|
71
|
-
r2 = r.match('/:controller/:action').to(:controller => '/admin/:controller')
|
72
|
-
end
|
73
|
-
Merb::Router.routes[0].should == r2
|
74
|
-
Merb::Router.routes[1].should == r1
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should be able to append routes to the @@routes list" do
|
78
|
-
r1, r2 = nil, nil
|
79
|
-
Merb::Router.prepare do |r|
|
80
|
-
r1 = r.match('/:controller/:action').to(:controller => '/admin/:controller')
|
81
|
-
end
|
82
|
-
Merb::Router.append do |r|
|
83
|
-
r2 = r.match('/:controller/:action').to(:controller => '/admin/:controller')
|
84
|
-
end
|
85
|
-
Merb::Router.routes[0].should == r1
|
86
|
-
Merb::Router.routes[1].should == r2
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should have a spec helper to match routes" do
|
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
|
96
|
-
end
|
97
|
-
|
98
|
-
# it "should be fast" do
|
99
|
-
# Merb::Router.prepare do |r|
|
100
|
-
# r.resource :icon
|
101
|
-
# r.resources :posts, :member => {:stats => [:get, :put]},
|
102
|
-
# :collection => {:filter => [:get]} do |post|
|
103
|
-
# post.resources :comments, :member => {:stats => [:get, :put]}
|
104
|
-
# post.resource :profile
|
105
|
-
# end
|
106
|
-
# r.resources :as do |a|
|
107
|
-
# a.resources :bs do |b|
|
108
|
-
# b.resources :cs
|
109
|
-
# end
|
110
|
-
# end
|
111
|
-
# r.match("/admin") do |admin|
|
112
|
-
# admin.resources :tags
|
113
|
-
# end
|
114
|
-
# r.default_routes
|
115
|
-
# end
|
116
|
-
# request = Merb::Test::FakeRequest.new(:request_uri => "/test/request")
|
117
|
-
#
|
118
|
-
# bm(12) do |test|
|
119
|
-
# # user system total real
|
120
|
-
# # with CachedCode 4.510000 0.050000 4.560000 ( 5.244656)
|
121
|
-
# # with in-place regexps 2.130000 0.030000 2.160000 ( 2.272443)
|
122
|
-
# test.report("with in-place regexps") do
|
123
|
-
# 20_000.times do
|
124
|
-
# Merb::Router.match(request)
|
125
|
-
# end
|
126
|
-
# end
|
127
|
-
# end
|
128
|
-
# end
|
129
|
-
end
|
130
|
-
|
131
|
-
describe Merb::Router, "when doing route matching with a big set of example routes" do
|
132
|
-
require 'set'
|
133
|
-
def should_only_have_keys(hash, *keys)
|
134
|
-
Set.new(hash.keys).should == Set.new(keys)
|
135
|
-
end
|
136
|
-
|
137
|
-
before :all do
|
138
|
-
Merb::Router.prepare do |r|
|
139
|
-
# A simple route match, sends "/contact" to Info#contact,
|
140
|
-
# i.e. the 'contact' method inside the 'Info' controller
|
141
|
-
r.match("/contact").
|
142
|
-
to(:controller => "info", :action => "contact")
|
143
|
-
|
144
|
-
# Use placeholders (e.g. :book_id) in the match, and they will be passed along to params
|
145
|
-
r.match("/books/:book_id/:action").
|
146
|
-
to(:controller => "books")
|
147
|
-
|
148
|
-
# Use placeholders in the "to" results for more complicated routing, e.g. for modules
|
149
|
-
r.match("/admin/:module/:controller/:action").
|
150
|
-
to(:controller => ":module/:controller")
|
151
|
-
r.match("/admin/:module/:controller/:action/:id").
|
152
|
-
to(:controller => ":module/:controller")
|
153
|
-
|
154
|
-
# Use a 'match' block to factor out repetitive 'match' parts
|
155
|
-
r.match("/accounts") do |a|
|
156
|
-
# The following will match "/accounts/overview" and route to Accounts#overview
|
157
|
-
a.match("/overview").
|
158
|
-
to(:controller => "accounts", :action => "overview")
|
159
|
-
a.match("/:id/:action").
|
160
|
-
to(:controller => "accounts")
|
161
|
-
a.match("/:id/:action.:format").
|
162
|
-
to(:controller => "accounts")
|
163
|
-
end
|
164
|
-
|
165
|
-
# Use a 'to' block to factor out repetitive 'to' parts
|
166
|
-
r.to(:controller => "accounts") do |a|
|
167
|
-
$r = a.match("/reports").
|
168
|
-
to(:action => "reports") # maps to Accounts#reports
|
169
|
-
|
170
|
-
a.match("/slideshow/:id").
|
171
|
-
to(:action => "slideshow") # maps to Accounts#slideshow
|
172
|
-
end
|
173
|
-
|
174
|
-
# Use a regular expression as the path matcher. Note that you must specify the
|
175
|
-
# ^ (beginning of line) and $ (end of line) boundaries if you desire them.
|
176
|
-
r.match(%r{^/movies/:id/movie-[a-z][a-zA-Z\-]+$}).
|
177
|
-
to(:controller => "movies", :action => "search_engine_optimizer")
|
178
|
-
|
179
|
-
# Use square-bracket notation to replace param results with captures from the path
|
180
|
-
r.match(%r[^/movies/(\d+)-(\d+)-(\d+)$]).
|
181
|
-
to(:controller => "movies", :movie_id => "[1][2][3]", :action => "show")
|
182
|
-
|
183
|
-
# Use the second optional argument of 'match' to be more specific about the request;
|
184
|
-
# in this case, only accept the POST method for the /movies/create action
|
185
|
-
r.match("/movies/create", :method => "post").
|
186
|
-
to(:controller => "movies", :action => "create")
|
187
|
-
|
188
|
-
# Use variables from the 'match' as results sent to the controller in the params hash,
|
189
|
-
# e.g. :user_agent[1] will be replaced with either 'MSIE' or 'Gecko' in the following case:
|
190
|
-
r.match(%r[^/movies/(.+)], :user_agent => /(MSIE|Gecko)/).
|
191
|
-
to(:controller => "movies", :title => "[1]", :action => "show", :agent => ":user_agent[1]")
|
192
|
-
|
193
|
-
# The 'match' method can also be called without the path string or regexp.
|
194
|
-
# In this example, direct all insecure traffic to a Insecure#index
|
195
|
-
r.match(:protocol => "http://").
|
196
|
-
to(:controller => "insecure", :action => "index")
|
197
|
-
|
198
|
-
# Use anonymous placeholders in place of the ugly-looking pattern, /([^\/.,;?]+)/
|
199
|
-
r.match("/::/users/::").
|
200
|
-
to(:controller => "users", :action => "[2]", :id => "[1]")
|
201
|
-
|
202
|
-
# Namespace can be used to specify the module
|
203
|
-
r.match('/bar').to(:controller => 'bar', :namespace => 'foo')
|
204
|
-
|
205
|
-
# Namespace can be used to provide path prefix
|
206
|
-
r.match('/admin').to(:namespace => 'admin') do |foo|
|
207
|
-
foo.match('/foo').to(:controller => 'foo')
|
208
|
-
end
|
209
|
-
|
210
|
-
r.match('/foo').to(:controller => 'foo')
|
211
|
-
|
212
|
-
# Putting it all together, and adding the requirement that we use an "admin" prefix on the
|
213
|
-
# host (e.g. admin.mysite.com), do some interesting stuff:
|
214
|
-
r.match(:host => /^admin\b/).to(:namespace => 'admin') do |admin|
|
215
|
-
admin.match(%r[/([A-Z]\w+)\+([A-Z]\w+)/::]).
|
216
|
-
to(:controller => "users", :action => ":path[3]",
|
217
|
-
:first_name => ":path[1]", :last_name => ":path[2]")
|
218
|
-
end.to(:controller => "users", :action => "default")
|
219
|
-
# Note that the last line above sends all traffic in the "admin" subdomain to the
|
220
|
-
# Admin::Users#default action if no other route is matched.
|
221
|
-
|
222
|
-
# Create a deferred route. In this case, the decision of whether or not the route
|
223
|
-
# is a match is made via the .xhr? call. Note that it's ok to put the hash in a
|
224
|
-
# conditional because if the "if" statement is false, ruby returns nil (i.e. no match).
|
225
|
-
r.match(%r[^/deferred]).defer_to do |request, params|
|
226
|
-
{ :controller => "ajax", :action => "index" } if request.xhr?
|
227
|
-
end
|
228
|
-
|
229
|
-
# Use the placeholders in a the deferred route
|
230
|
-
r.match("/deferred/:action").defer_to do |request, params|
|
231
|
-
params.merge(:controller => "deferred")
|
232
|
-
end
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
it "should connect '/contact' to Info#contact" do
|
237
|
-
index, route = Merb::Router.match(SimpleRequest.new(:protocol => "http://", :path => '/contact'), {})
|
238
|
-
route[:controller].should == "info"
|
239
|
-
route[:action].should == "contact"
|
240
|
-
should_only_have_keys(route, :controller, :action)
|
241
|
-
end
|
242
|
-
|
243
|
-
it "should use placeholders in the match and pass them along to the params" do
|
244
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/books/12/show'), {})
|
245
|
-
route[:controller].should == "books"
|
246
|
-
route[:action].should == "show"
|
247
|
-
route[:book_id].should == "12"
|
248
|
-
should_only_have_keys(route, :controller, :action, :book_id)
|
249
|
-
end
|
250
|
-
|
251
|
-
it "should allow placeholders to be used in the params to construct results from matches" do
|
252
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/admin/accounts/users/index'), {})
|
253
|
-
route[:controller].should == "accounts/users"
|
254
|
-
route[:action].should == "index"
|
255
|
-
should_only_have_keys(route, :module, :controller, :action)
|
256
|
-
|
257
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/admin/payment/processors/edit/4'), {})
|
258
|
-
route[:controller].should == "payment/processors"
|
259
|
-
route[:action].should == "edit"
|
260
|
-
route[:id].should == "4"
|
261
|
-
should_only_have_keys(route, :module, :controller, :action, :id)
|
262
|
-
end
|
263
|
-
|
264
|
-
it "should allow 'match' to use a block to factor out repetitive parts, merging the path as it goes" do
|
265
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/accounts/overview'), {})
|
266
|
-
route[:controller].should == "accounts"
|
267
|
-
route[:action].should == "overview"
|
268
|
-
should_only_have_keys(route, :controller, :action)
|
269
|
-
|
270
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/accounts/12/show.xml'), {})
|
271
|
-
route[:controller].should == "accounts"
|
272
|
-
route[:action].should == "show"
|
273
|
-
route[:id].should == "12"
|
274
|
-
route[:format].should == "xml"
|
275
|
-
should_only_have_keys(route, :controller, :action, :id, :format)
|
276
|
-
end
|
277
|
-
|
278
|
-
it "should allow 'to' to use a block to factor out repetitive params" do
|
279
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/reports'), {})
|
280
|
-
route[:controller].should == "accounts"
|
281
|
-
route[:action].should == "reports"
|
282
|
-
should_only_have_keys(route, :controller, :action)
|
283
|
-
|
284
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/slideshow/2'), {})
|
285
|
-
route[:controller].should == "accounts"
|
286
|
-
route[:action].should == "slideshow"
|
287
|
-
route[:id].should == "2"
|
288
|
-
should_only_have_keys(route, :controller, :action, :id)
|
289
|
-
end
|
290
|
-
|
291
|
-
it "should be able to use a regular expression instead of a string as the path-matcher" do
|
292
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/5/movie-an-adventure-in-wonderland'), {})
|
293
|
-
route[:controller].should == "movies"
|
294
|
-
route[:action].should == "search_engine_optimizer"
|
295
|
-
route[:id].should == "5"
|
296
|
-
should_only_have_keys(route, :controller, :action, :id)
|
297
|
-
end
|
298
|
-
|
299
|
-
it "should be able to use square bracket notation to replace param results with captures from the path" do
|
300
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/123-1-9999'), {})
|
301
|
-
route[:controller].should == "movies"
|
302
|
-
route[:action].should == "show"
|
303
|
-
route[:movie_id].should == "12319999"
|
304
|
-
should_only_have_keys(route, :controller, :action, :movie_id)
|
305
|
-
end
|
306
|
-
|
307
|
-
it "should only allow the POST method to '/movies/create'" do
|
308
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/create', :method => "get"), {})
|
309
|
-
route[:controller].should be_nil
|
310
|
-
route[:action].should be_nil
|
311
|
-
should_only_have_keys(route)
|
312
|
-
|
313
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/create', :method => "post"), {})
|
314
|
-
route[:controller].should == "movies"
|
315
|
-
route[:action].should == "create"
|
316
|
-
should_only_have_keys(route, :controller, :action)
|
317
|
-
end
|
318
|
-
|
319
|
-
it "should use variables from the 'match' as a result sent to the controller in the params hash" do
|
320
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/movies/harry-potter-3', :user_agent => "Internet Explorer (MSIE)"), {})
|
321
|
-
route[:controller].should == "movies"
|
322
|
-
route[:action].should == "show"
|
323
|
-
route[:title].should == "harry-potter-3"
|
324
|
-
route[:agent].should == "MSIE"
|
325
|
-
should_only_have_keys(route, :controller, :action, :title, :agent)
|
326
|
-
end
|
327
|
-
|
328
|
-
it "should be able to match without the use of a path, sending all HTTP traffic to 'insecure' controller" do
|
329
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/visit', :protocol => "http://"), {})
|
330
|
-
route[:controller].should == "insecure"
|
331
|
-
route[:action].should == "index"
|
332
|
-
should_only_have_keys(route, :controller, :action)
|
333
|
-
|
334
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/3/users/show', :protocol => "http://"), {})
|
335
|
-
route[:controller].should == "insecure"
|
336
|
-
route[:action].should == "index"
|
337
|
-
should_only_have_keys(route, :controller, :action)
|
338
|
-
end
|
339
|
-
|
340
|
-
it "should use anonymous placeholders" do
|
341
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/5/users/show', :protocol => "https://"), {})
|
342
|
-
route[:controller].should == "users"
|
343
|
-
route[:action].should == "show"
|
344
|
-
route[:id].should == "5"
|
345
|
-
should_only_have_keys(route, :controller, :action, :id)
|
346
|
-
end
|
347
|
-
|
348
|
-
it "should use namespace" do
|
349
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/bar', :method => :get), {})
|
350
|
-
route[:namespace].should == 'foo'
|
351
|
-
route[:controller].should == 'bar'
|
352
|
-
route[:action].should == 'index'
|
353
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
354
|
-
end
|
355
|
-
|
356
|
-
it "should have namespace 'admin' if path is '/admin/foo'" do
|
357
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/admin/foo', :method => :get), {})
|
358
|
-
route[:namespace].should == 'admin'
|
359
|
-
route[:controller].should == 'foo'
|
360
|
-
route[:action].should == 'index'
|
361
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
362
|
-
end
|
363
|
-
|
364
|
-
it "should not have namespace if path is just '/foo'" do
|
365
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/foo', :method => :get), {})
|
366
|
-
route[:controller].should == 'foo'
|
367
|
-
route[:action].should == 'index'
|
368
|
-
should_only_have_keys(route, :controller, :action)
|
369
|
-
end
|
370
|
-
|
371
|
-
it "should send all admin.* domains to the 'admin/users' controller, and 'default' action" do
|
372
|
-
index, route = Merb::Router.match(SimpleRequest.new(:host => "admin.mysite.com", :path => '/welcome', :protocol => "https://"), {})
|
373
|
-
route[:namespace].should == "admin"
|
374
|
-
route[:controller].should == "users"
|
375
|
-
route[:action].should == "default"
|
376
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
377
|
-
|
378
|
-
index, route = Merb::Router.match(SimpleRequest.new(:host => "admin.another-site.com", :path => '/go/somewhere/else', :protocol => "https://"), {})
|
379
|
-
route[:namespace].should == "admin"
|
380
|
-
route[:controller].should == "users"
|
381
|
-
route[:action].should == "default"
|
382
|
-
should_only_have_keys(route, :namespace, :controller, :action)
|
383
|
-
end
|
384
|
-
|
385
|
-
it "should decipher the first-name / last-name pairs on an admin.* domain" do
|
386
|
-
index, route = Merb::Router.match(SimpleRequest.new(:host => "admin.mysite.com", :path => '/Duane+Johnson/edit', :protocol => "https://"), {})
|
387
|
-
route[:namespace].should == "admin"
|
388
|
-
route[:controller].should == "users"
|
389
|
-
route[:action].should == "edit"
|
390
|
-
route[:first_name].should == "Duane"
|
391
|
-
route[:last_name].should == "Johnson"
|
392
|
-
should_only_have_keys(route, :namespace, :controller, :action, :first_name, :last_name)
|
393
|
-
end
|
394
|
-
|
395
|
-
it "should defer to the Ajax controller for xhr requests" do
|
396
|
-
index, route = Merb::Router.match(SimpleRequest.new(:xhr? => true, :path => '/deferred/to/somewhere', :protocol => "https://"), {})
|
397
|
-
route[:controller].should == "ajax"
|
398
|
-
route[:action].should == "index"
|
399
|
-
should_only_have_keys(route, :controller, :action)
|
400
|
-
end
|
401
|
-
|
402
|
-
it "should let a deferred block use the path's MatchData" do
|
403
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/deferred/elsewhere', :protocol => "https://"), {})
|
404
|
-
route[:controller].should == "deferred"
|
405
|
-
route[:action].should == "elsewhere"
|
406
|
-
should_only_have_keys(route, :controller, :action)
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
describe Merb::Router, "with a single resource, 'blogposts' with 'comments'" do
|
411
|
-
before :each do
|
412
|
-
Merb::Router.prepare do |r|
|
413
|
-
r.resources :blogposts do |b|
|
414
|
-
b.resources :comments
|
415
|
-
end
|
416
|
-
end
|
417
|
-
end
|
418
|
-
|
419
|
-
it "should match /blogposts" do
|
420
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts', :method => :get), {})
|
421
|
-
route[:controller].should == 'blogposts'
|
422
|
-
route[:action].should == 'index'
|
423
|
-
|
424
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts', :method => :post), {})
|
425
|
-
route[:controller].should == 'blogposts'
|
426
|
-
route[:action].should == 'create'
|
427
|
-
end
|
428
|
-
|
429
|
-
it "should match /blogposts/new" do
|
430
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/new', :method => :get), {})
|
431
|
-
route[:controller].should == 'blogposts'
|
432
|
-
route[:action].should == 'new'
|
433
|
-
end
|
434
|
-
|
435
|
-
it "should match /blogposts/1" do
|
436
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :get), {})
|
437
|
-
route[:controller].should == 'blogposts'
|
438
|
-
route[:action].should == 'show'
|
439
|
-
route[:id].should == '1'
|
440
|
-
|
441
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :put), {})
|
442
|
-
route[:controller].should == 'blogposts'
|
443
|
-
route[:action].should == 'update'
|
444
|
-
route[:id].should == '1'
|
445
|
-
|
446
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1', :method => :delete), {})
|
447
|
-
route[:controller].should == 'blogposts'
|
448
|
-
route[:action].should == 'destroy'
|
449
|
-
route[:id].should == '1'
|
450
|
-
end
|
451
|
-
|
452
|
-
it "should match /blogposts/1;edit" do
|
453
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1;edit', :method => :get), {})
|
454
|
-
route[:controller].should == 'blogposts'
|
455
|
-
route[:action].should == 'edit'
|
456
|
-
route[:id].should == '1'
|
457
|
-
|
458
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1;edit', :method => :put), {})
|
459
|
-
route[:controller].should be_nil
|
460
|
-
route[:action].should be_nil
|
461
|
-
end
|
462
|
-
|
463
|
-
it "should match /blogposts/1/edit" do
|
464
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1/edit', :method => :get), {})
|
465
|
-
route[:controller].should == 'blogposts'
|
466
|
-
route[:action].should == 'edit'
|
467
|
-
route[:id].should == '1'
|
468
|
-
|
469
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/blogposts/1/edit', :method => :put), {})
|
470
|
-
route[:controller].should be_nil
|
471
|
-
route[:action].should be_nil
|
472
|
-
end
|
473
|
-
|
474
|
-
it "should generate blogposts path" do
|
475
|
-
generate(:blogposts).should == '/blogposts'
|
476
|
-
end
|
477
|
-
|
478
|
-
it "should generate blogpost path" do
|
479
|
-
generate(:blogpost, :id => 1).should == '/blogposts/1'
|
480
|
-
b = Blogposts.new
|
481
|
-
generate(:blogpost, b).should == '/blogposts/42'
|
482
|
-
generate(:blogpost, :id => b).should == '/blogposts/42'
|
483
|
-
end
|
484
|
-
|
485
|
-
it "should generate new_blogpost path" do
|
486
|
-
generate(:new_blogpost).should == '/blogposts/new'
|
487
|
-
end
|
488
|
-
|
489
|
-
it "should generate edit_blogpost path" do
|
490
|
-
generate(:edit_blogpost, {:id => 1}).should == '/blogposts/1/edit'
|
491
|
-
end
|
492
|
-
|
493
|
-
it "should generate comments path" do
|
494
|
-
c = Comment.new
|
495
|
-
generate(:comments, c).should == '/blogposts/42/comments'
|
496
|
-
end
|
497
|
-
|
498
|
-
it "should generate comment path" do
|
499
|
-
c = Comment.new
|
500
|
-
generate(:comment, c).should == '/blogposts/42/comments/24'
|
501
|
-
end
|
502
|
-
end
|
503
|
-
|
504
|
-
|
505
|
-
describe Merb::Router, "with resources using name_prefix, 'oranges' and 'ape'" do
|
506
|
-
before :each do
|
507
|
-
Merb::Router.prepare do |r|
|
508
|
-
r.resources :oranges, :name_prefix => "florida_"
|
509
|
-
r.resource :ape, :name_prefix => "grape_"
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
it "should match /oranges" do
|
514
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/oranges', :method => :get), {})
|
515
|
-
route[:controller].should == 'oranges'
|
516
|
-
route[:action].should == 'index'
|
517
|
-
end
|
518
|
-
|
519
|
-
it "should generate florida_oranges path" do
|
520
|
-
generate(:florida_oranges).should == '/oranges'
|
521
|
-
end
|
522
|
-
|
523
|
-
it "should generate florida_orange path" do
|
524
|
-
generate(:florida_orange, :id => 1).should == '/oranges/1'
|
525
|
-
b = Blogposts.new
|
526
|
-
generate(:florida_orange, b).should == '/oranges/42'
|
527
|
-
generate(:florida_orange, :id => b).should == '/oranges/42'
|
528
|
-
end
|
529
|
-
|
530
|
-
it "should generate new_florida_orange path" do
|
531
|
-
generate(:new_florida_orange).should == '/oranges/new'
|
532
|
-
end
|
533
|
-
|
534
|
-
it "should generate edit_florida_orange path" do
|
535
|
-
generate(:edit_florida_orange, {:id => 1}).should == '/oranges/1/edit'
|
536
|
-
end
|
537
|
-
|
538
|
-
it "should match /ape" do
|
539
|
-
index, route = Merb::Router.match(SimpleRequest.new(:path => '/ape', :method => :get), {})
|
540
|
-
route[:controller].should == 'ape'
|
541
|
-
route[:action].should == 'show'
|
542
|
-
end
|
543
|
-
|
544
|
-
it "should generate grape_ape path" do
|
545
|
-
generate(:grape_ape).should == '/ape'
|
546
|
-
end
|
547
|
-
|
548
|
-
it "should generate new_grape_ape path" do
|
549
|
-
generate(:new_grape_ape).should == '/ape/new'
|
550
|
-
end
|
551
|
-
|
552
|
-
it "should generate edit_grape_ape path" do
|
553
|
-
generate(:edit_grape_ape).should == '/ape/edit'
|
554
|
-
end
|
555
|
-
end
|
556
|
-
|
557
|
-
describe Merb::Router, "with resources using a collection action" do
|
558
|
-
before :each do
|
559
|
-
Merb::Router.prepare do |r|
|
560
|
-
r.resources :flowers, :collection => { :random => [:get] }
|
561
|
-
end
|
562
|
-
end
|
563
|
-
|
564
|
-
it "should generate random_flowers path" do
|
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'
|
579
|
-
end
|
580
|
-
|
581
|
-
end
|
582
|
-
|
583
|
-
describe Merb::Router, "with resources using a member action { :pick => [:get] }" do
|
584
|
-
before :each do
|
585
|
-
Merb::Router.prepare do |r|
|
586
|
-
r.resources :flowers, :member => { :pick => [:get] }
|
587
|
-
end
|
588
|
-
end
|
589
|
-
|
590
|
-
it 'should generate pick_flower path' do
|
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'
|
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
|
-
|
630
|
-
end
|
631
|
-
|
632
|
-
describe Merb::Router::Behavior do
|
633
|
-
before :all do
|
634
|
-
@behavior = Merb::Router::Behavior
|
635
|
-
end
|
636
|
-
|
637
|
-
it "should leave strings as strings and add ^...$ in the @conditions hash" do
|
638
|
-
@behavior.new(:path => '/one/two').conditions[:path].should == '^/one/two$'
|
639
|
-
end
|
640
|
-
|
641
|
-
it "should replace special characters in strings with their escaped equivalents" do
|
642
|
-
@behavior.new(:path => 'test.xml').conditions[:path].should == '^test\\.xml$'
|
643
|
-
end
|
644
|
-
|
645
|
-
it "should convert symbols to strings and add ^...$ in the @conditions hash" do
|
646
|
-
@behavior.new(:method => :get).conditions[:method].should == '^get$'
|
647
|
-
end
|
648
|
-
|
649
|
-
it "should convert regular expressions to strings in the @conditions hash" do
|
650
|
-
@behavior.new(:protocol => /https?/).conditions[:protocol].should == 'https?'
|
651
|
-
end
|
652
|
-
|
653
|
-
it "should deduce placeholders from the @conditions hash" do
|
654
|
-
ph = @behavior.new(:path => '/:controller/:action').placeholders
|
655
|
-
ph[:controller].should == [:path, 1]
|
656
|
-
ph[:action].should == [:path, 2]
|
657
|
-
end
|
658
|
-
|
659
|
-
it "should deduce placeholders from the @conditions hash, even when they contain numbers" do
|
660
|
-
ph = @behavior.new({:path => "/:part1/:part2"}).placeholders
|
661
|
-
ph[:part1].should == [:path, 1]
|
662
|
-
ph[:part2].should == [:path, 2]
|
663
|
-
end
|
664
|
-
|
665
|
-
it "should deduce placeholders within regular expressions that contain prefixed captures" do
|
666
|
-
ph = @behavior.new(:path => %r[/(\d+)/:controller/:action]).placeholders
|
667
|
-
ph[:controller].should == [:path, 2]
|
668
|
-
ph[:action].should == [:path, 3]
|
669
|
-
|
670
|
-
ph = @behavior.new(:path => %r[/:controller/:action/(\d+)]).placeholders
|
671
|
-
ph[:controller].should == [:path, 1]
|
672
|
-
ph[:action].should == [:path, 2]
|
673
|
-
end
|
674
|
-
|
675
|
-
it "should deduce placeholder positions in nested captures" do
|
676
|
-
ph = @behavior.new(:path => %r[(/(\d+)/:controller)/:action]).placeholders
|
677
|
-
ph[:controller].should == [:path, 3]
|
678
|
-
ph[:action].should == [:path, 4]
|
679
|
-
|
680
|
-
ph = @behavior.new(:path => %r[/(\d+)/(:controller)/:action]).placeholders
|
681
|
-
ph[:controller].should == [:path, 3]
|
682
|
-
ph[:action].should == [:path, 4]
|
683
|
-
|
684
|
-
ph = @behavior.new(:path => %r[/(\d+)/:controller/(:action)]).placeholders
|
685
|
-
ph[:controller].should == [:path, 2]
|
686
|
-
ph[:action].should == [:path, 4]
|
687
|
-
|
688
|
-
ph = @behavior.new(:path => %r[(/(\d+)/(:controller/((:action))))]).placeholders
|
689
|
-
ph[:controller].should == [:path, 4]
|
690
|
-
ph[:action].should == [:path, 7]
|
691
|
-
end
|
692
|
-
|
693
|
-
it "should replace any placeholders found within @conditions strings with segment regular expressions" do
|
694
|
-
m = @behavior.new(:path => "/:my/:place:holders/:here").conditions
|
695
|
-
m[:path].should == "^/([^/.,;?]+)/([^/.,;?]+)([^/.,;?]+)/([^/.,;?]+)$"
|
696
|
-
end
|
697
|
-
|
698
|
-
it "should set default values for params that came from placeholders" do
|
699
|
-
p = @behavior.new(:path => "/:my/:place:holders/:here").params
|
700
|
-
p[:my].should == ":my"
|
701
|
-
p[:place].should == ":place"
|
702
|
-
p[:holders].should == ":holders"
|
703
|
-
p[:here].should == ":here"
|
704
|
-
end
|
705
|
-
|
706
|
-
it "should merge params with its ancestors" do
|
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" }
|
710
|
-
end
|
711
|
-
|
712
|
-
# it "should have a default action and controller for merged params" do
|
713
|
-
# a = @behavior.new
|
714
|
-
# a.merged_params.should == {:controller => "application", :action => "index"}
|
715
|
-
#
|
716
|
-
# b = @behavior.new({}, {:controller => "admin"})
|
717
|
-
# b.merged_params.should == {:controller => "admin", :action => "index"}
|
718
|
-
#
|
719
|
-
# c = @behavior.new({}, {:action => "show"})
|
720
|
-
# c.merged_params.should == {:controller => "application", :action => "show"}
|
721
|
-
# end
|
722
|
-
|
723
|
-
it "should merge conditions with its ancestors" do
|
724
|
-
b = @behavior.new({ :method => "get", :protocol => "http" })
|
725
|
-
c = @behavior.new({ :method => "put" }, {}, b)
|
726
|
-
c.merged_conditions.should == { :method => "^put$", :protocol => "^http$" }
|
727
|
-
end
|
728
|
-
|
729
|
-
it "should merge placeholders with its ancestors" do
|
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] }
|
733
|
-
end
|
734
|
-
|
735
|
-
it "should add the number of path captures in the ancestors' paths to placeholders that hold a place for :path captures" do
|
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] }
|
740
|
-
|
741
|
-
c.merged_placeholders.should == { :controller => [:path, 1], :action => [:path, 2], :id => [:path, 3] }
|
742
|
-
end
|
743
|
-
|
744
|
-
it "should merge the :path differently than other @conditions keys -- it should concatenate" do
|
745
|
-
b = @behavior.new({:method => "get", :protocol => "http"})
|
746
|
-
c = @behavior.new({:path => "/test", :method => "put"}, {}, b)
|
747
|
-
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/test$"}
|
748
|
-
|
749
|
-
b = @behavior.new({:path => "/test", :method => "get", :protocol => "http"})
|
750
|
-
c = @behavior.new({:method => "put"}, {}, b)
|
751
|
-
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/test$"}
|
752
|
-
|
753
|
-
b = @behavior.new({:path => "/admin", :method => "get", :protocol => "http"})
|
754
|
-
c = @behavior.new({:path => "/test", :method => "put"}, {}, b)
|
755
|
-
c.merged_conditions.should == {:method => "^put$", :protocol => "^http$", :path => "^/admin/test$"}
|
756
|
-
end
|
757
|
-
|
758
|
-
it "should be able to compile the @params to strings and request matches" do
|
759
|
-
b = @behavior.new({:path => "/admin/:controller/:action", :method => "get"})
|
760
|
-
cp = b.send(:compiled_params)
|
761
|
-
cp[:controller].should == "path1"
|
762
|
-
cp[:action].should == "path2"
|
763
|
-
|
764
|
-
b = @behavior.new(
|
765
|
-
{:path => "/admin/:controller/:action/:postfix", :method => "get"},
|
766
|
-
{:controller => "/admin/:controller", :action => "neat_o_:action:postfix"})
|
767
|
-
cp = b.send(:compiled_params)
|
768
|
-
cp[:controller].should == "\"/admin/\" + path1"
|
769
|
-
cp[:action].should == "\"neat_o_\" + path2 + path3"
|
770
|
-
end
|
771
|
-
|
772
|
-
it "should allow a bracketed number such as [3] to compile to path3" do
|
773
|
-
b = @behavior.new(
|
774
|
-
{:path => "/admin/:controller/:action/(.+)", :method => "get"},
|
775
|
-
{:catchall => "[3]"})
|
776
|
-
cp = b.send(:compiled_params)
|
777
|
-
cp[:catchall].should == "path3"
|
778
|
-
end
|
779
|
-
|
780
|
-
it "should allow a backslash to escape an underscore in the compiled params" do
|
781
|
-
b = @behavior.new(
|
782
|
-
{:path => "/admin/:controller/:action", :method => "get"},
|
783
|
-
{:action => "some_prefix_:action\\_other"})
|
784
|
-
cp = b.send(:compiled_params)
|
785
|
-
cp[:action].should == "\"some_prefix_\" + path2 + \"_other\""
|
786
|
-
end
|
787
|
-
|
788
|
-
it "should return a Route object containing compiled conditions and params when .to is called" do
|
789
|
-
a = @behavior.new({:path => "/admin"})
|
790
|
-
b = a.match("/:controller/:action", :method => "get")
|
791
|
-
route = b.to(:controller => "/admin/:controller")
|
792
|
-
route.conditions[:path].to_s.should == /^\/admin\/([^\/.,;?]+)\/([^\/.,;?]+)$/.to_s
|
793
|
-
route.conditions[:method].should == /^get$/
|
794
|
-
route.params.should == {:controller => "\"/admin/\" + path1", :action => "path2"}
|
795
|
-
end
|
796
|
-
|
797
|
-
it "should allow for conditional blocks using the 'defer_to' method" do
|
798
|
-
b = @behavior.new(:path => '/admin')
|
799
|
-
route = b.defer_to { |request| { :controller => 'late_bound', :action => 'place' } }
|
800
|
-
route.conditional_block.should be_an_instance_of(Proc)
|
801
|
-
route.compile.should match(/block_result/m)
|
802
|
-
end
|
803
|
-
end
|
804
|
-
|
805
|
-
describe Merb::Router::Behavior, "class methods" do
|
806
|
-
before :all do
|
807
|
-
@b = Merb::Router::Behavior
|
808
|
-
end
|
809
|
-
|
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
|
-
|
818
|
-
# TODO: skip escaped open parens
|
819
|
-
end
|
820
|
-
|
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
|
832
|
-
end
|
833
|
-
|
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
|
840
|
-
end
|
841
|
-
end
|
842
|
-
|
843
|
-
describe Merb::Router::Route, 'rendered as a string' do
|
844
|
-
before :all do
|
845
|
-
Merb::Router.prepare { |r| r.default_routes }
|
846
|
-
@routes = Merb::Router.routes
|
847
|
-
end
|
848
|
-
|
849
|
-
it 'should show the default route' do
|
850
|
-
@routes.last.to_s.should == "/:controller(/:action(/:id)?)?(\\.:format)?"
|
851
|
-
end
|
852
|
-
end
|
853
|
-
|
854
|
-
describe Merb::Router, 'using namespaces' do
|
855
|
-
before :each do
|
856
|
-
Merb::Router.prepare do |r|
|
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
|
865
|
-
end
|
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'
|
877
|
-
end
|
878
|
-
end
|
879
|
-
|
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
|
887
|
-
end
|
888
|
-
|
889
|
-
it 'defines namespaces with path fragments' do
|
890
|
-
generate(:admin_supersecret_path_namespace_resources).should ==
|
891
|
-
'/admin/supersecret/path_namespace_resources'
|
892
|
-
end
|
893
|
-
|
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
|
899
|
-
end
|
900
|
-
end
|