actionpack 2.3.18 → 3.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- data/CHANGELOG +15 -64
- data/README +39 -48
- data/lib/abstract_controller.rb +22 -0
- data/lib/abstract_controller/base.rb +191 -0
- data/lib/abstract_controller/callbacks.rb +113 -0
- data/lib/abstract_controller/collector.rb +30 -0
- data/lib/abstract_controller/compatibility.rb +18 -0
- data/lib/abstract_controller/helpers.rb +163 -0
- data/lib/abstract_controller/layouts.rb +413 -0
- data/lib/abstract_controller/localized_cache.rb +49 -0
- data/lib/abstract_controller/logger.rb +13 -0
- data/lib/abstract_controller/rendering.rb +238 -0
- data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
- data/lib/action_controller.rb +68 -102
- data/lib/action_controller/base.rb +77 -1409
- data/lib/action_controller/caching.rb +58 -45
- data/lib/action_controller/caching/actions.rb +100 -114
- data/lib/action_controller/caching/fragments.rb +17 -19
- data/lib/action_controller/caching/pages.rb +12 -6
- data/lib/action_controller/caching/sweeping.rb +42 -0
- data/lib/action_controller/deprecated.rb +5 -0
- data/lib/action_controller/deprecated/dispatcher.rb +28 -0
- data/lib/action_controller/deprecated/integration_test.rb +2 -0
- data/lib/action_controller/deprecated/performance_test.rb +1 -0
- data/lib/action_controller/metal.rb +125 -0
- data/lib/action_controller/metal/compatibility.rb +141 -0
- data/lib/action_controller/metal/conditional_get.rb +86 -0
- data/lib/action_controller/metal/configuration.rb +28 -0
- data/lib/action_controller/metal/cookies.rb +17 -0
- data/lib/action_controller/metal/exceptions.rb +46 -0
- data/lib/action_controller/metal/flash.rb +28 -0
- data/lib/action_controller/metal/head.rb +33 -0
- data/lib/action_controller/metal/helpers.rb +116 -0
- data/lib/action_controller/metal/hide_actions.rb +50 -0
- data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
- data/lib/action_controller/metal/instrumentation.rb +99 -0
- data/lib/action_controller/metal/mime_responds.rb +300 -0
- data/lib/action_controller/metal/rack_delegation.rb +35 -0
- data/lib/action_controller/metal/redirecting.rb +90 -0
- data/lib/action_controller/metal/renderers.rb +95 -0
- data/lib/action_controller/metal/rendering.rb +69 -0
- data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
- data/lib/action_controller/metal/rescue.rb +13 -0
- data/lib/action_controller/metal/responder.rb +220 -0
- data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
- data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
- data/lib/action_controller/metal/testing.rb +42 -0
- data/lib/action_controller/metal/url_for.rb +157 -0
- data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
- data/lib/action_controller/middleware.rb +38 -0
- data/lib/action_controller/polymorphic_routes.rb +20 -26
- data/lib/action_controller/railtie.rb +30 -0
- data/lib/action_controller/railties/subscriber.rb +63 -0
- data/lib/action_controller/record_identifier.rb +3 -16
- data/lib/action_controller/test_case.rb +156 -18
- data/lib/action_controller/url_rewriter.rb +47 -200
- data/lib/action_controller/vendor/html-scanner.rb +16 -12
- data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
- data/lib/action_dispatch.rb +88 -0
- data/lib/action_dispatch/http/cache.rb +123 -0
- data/lib/action_dispatch/http/filter_parameters.rb +98 -0
- data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
- data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
- data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
- data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
- data/lib/action_dispatch/http/parameters.rb +49 -0
- data/lib/action_dispatch/http/request.rb +223 -0
- data/lib/action_dispatch/http/response.rb +209 -0
- data/lib/action_dispatch/http/upload.rb +48 -0
- data/lib/action_dispatch/http/url.rb +129 -0
- data/lib/action_dispatch/middleware/callbacks.rb +50 -0
- data/lib/action_dispatch/middleware/cascade.rb +29 -0
- data/lib/action_dispatch/middleware/cookies.rb +216 -0
- data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
- data/lib/action_dispatch/middleware/head.rb +18 -0
- data/lib/action_dispatch/middleware/params_parser.rb +78 -0
- data/lib/action_dispatch/middleware/rescue.rb +26 -0
- data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
- data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
- data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
- data/lib/action_dispatch/middleware/static.rb +44 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
- data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
- data/lib/action_dispatch/railtie.rb +15 -0
- data/lib/action_dispatch/routing.rb +217 -0
- data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
- data/lib/action_dispatch/routing/mapper.rb +649 -0
- data/lib/action_dispatch/routing/route.rb +55 -0
- data/lib/action_dispatch/routing/route_set.rb +445 -0
- data/lib/action_dispatch/testing/assertions.rb +21 -0
- data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
- data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
- data/lib/action_dispatch/testing/assertions/response.rb +154 -0
- data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
- data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
- data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
- data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
- data/lib/action_dispatch/testing/performance_test.rb +17 -0
- data/lib/action_dispatch/testing/test_process.rb +42 -0
- data/lib/action_dispatch/testing/test_request.rb +83 -0
- data/lib/action_dispatch/testing/test_response.rb +136 -0
- data/lib/action_pack/version.rb +3 -3
- data/lib/action_view.rb +29 -26
- data/lib/action_view/base.rb +101 -148
- data/lib/action_view/context.rb +44 -0
- data/lib/action_view/helpers.rb +6 -4
- data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
- data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
- data/lib/action_view/helpers/cache_helper.rb +1 -1
- data/lib/action_view/helpers/capture_helper.rb +40 -8
- data/lib/action_view/helpers/csrf_helper.rb +2 -4
- data/lib/action_view/helpers/date_helper.rb +14 -15
- data/lib/action_view/helpers/form_helper.rb +121 -24
- data/lib/action_view/helpers/form_options_helper.rb +26 -25
- data/lib/action_view/helpers/form_tag_helper.rb +42 -33
- data/lib/action_view/helpers/javascript_helper.rb +1 -109
- data/lib/action_view/helpers/number_helper.rb +4 -1
- data/lib/action_view/helpers/prototype_helper.rb +75 -499
- data/lib/action_view/helpers/raw_output_helper.rb +1 -1
- data/lib/action_view/helpers/record_tag_helper.rb +3 -3
- data/lib/action_view/helpers/sanitize_helper.rb +3 -2
- data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
- data/lib/action_view/helpers/tag_helper.rb +12 -13
- data/lib/action_view/helpers/text_helper.rb +33 -38
- data/lib/action_view/helpers/translation_helper.rb +11 -35
- data/lib/action_view/helpers/url_helper.rb +140 -134
- data/lib/action_view/locale/en.yml +34 -28
- data/lib/action_view/paths.rb +27 -24
- data/lib/action_view/railtie.rb +17 -0
- data/lib/action_view/railties/subscriber.rb +24 -0
- data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
- data/lib/action_view/render/rendering.rb +117 -0
- data/lib/action_view/template.rb +88 -217
- data/lib/action_view/template/error.rb +105 -0
- data/lib/action_view/template/handler.rb +41 -0
- data/lib/action_view/template/handlers.rb +54 -0
- data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
- data/lib/action_view/template/handlers/erb.rb +58 -0
- data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
- data/lib/action_view/template/resolver.rb +164 -0
- data/lib/action_view/template/text.rb +40 -0
- data/lib/action_view/test_case.rb +18 -18
- metadata +165 -420
- data/RUNNING_UNIT_TESTS +0 -24
- data/Rakefile +0 -158
- data/install.rb +0 -30
- data/lib/action_controller/assertions/dom_assertions.rb +0 -55
- data/lib/action_controller/assertions/response_assertions.rb +0 -169
- data/lib/action_controller/benchmarking.rb +0 -107
- data/lib/action_controller/caching/sweeper.rb +0 -45
- data/lib/action_controller/cgi_ext.rb +0 -15
- data/lib/action_controller/cgi_ext/cookie.rb +0 -112
- data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
- data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
- data/lib/action_controller/cgi_process.rb +0 -77
- data/lib/action_controller/cookies.rb +0 -197
- data/lib/action_controller/dispatcher.rb +0 -133
- data/lib/action_controller/failsafe.rb +0 -87
- data/lib/action_controller/filters.rb +0 -680
- data/lib/action_controller/helpers.rb +0 -225
- data/lib/action_controller/layout.rb +0 -286
- data/lib/action_controller/middlewares.rb +0 -14
- data/lib/action_controller/mime_responds.rb +0 -193
- data/lib/action_controller/params_parser.rb +0 -77
- data/lib/action_controller/performance_test.rb +0 -15
- data/lib/action_controller/rack_lint_patch.rb +0 -36
- data/lib/action_controller/reloader.rb +0 -54
- data/lib/action_controller/request.rb +0 -518
- data/lib/action_controller/request_forgery_protection.rb +0 -116
- data/lib/action_controller/rescue.rb +0 -183
- data/lib/action_controller/resources.rb +0 -682
- data/lib/action_controller/response.rb +0 -237
- data/lib/action_controller/routing.rb +0 -388
- data/lib/action_controller/routing/builder.rb +0 -197
- data/lib/action_controller/routing/optimisations.rb +0 -130
- data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
- data/lib/action_controller/routing/route.rb +0 -265
- data/lib/action_controller/routing/route_set.rb +0 -503
- data/lib/action_controller/routing/routing_ext.rb +0 -49
- data/lib/action_controller/routing/segments.rb +0 -343
- data/lib/action_controller/session/abstract_store.rb +0 -276
- data/lib/action_controller/session/mem_cache_store.rb +0 -60
- data/lib/action_controller/status_codes.rb +0 -88
- data/lib/action_controller/string_coercion.rb +0 -29
- data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
- data/lib/action_controller/test_process.rb +0 -580
- data/lib/action_controller/uploaded_file.rb +0 -44
- data/lib/action_view/helpers/benchmark_helper.rb +0 -54
- data/lib/action_view/inline_template.rb +0 -19
- data/lib/action_view/reloadable_template.rb +0 -117
- data/lib/action_view/renderable.rb +0 -109
- data/lib/action_view/renderable_partial.rb +0 -53
- data/lib/action_view/template_error.rb +0 -99
- data/lib/action_view/template_handler.rb +0 -34
- data/lib/action_view/template_handlers.rb +0 -48
- data/lib/action_view/template_handlers/erb.rb +0 -25
- data/lib/actionpack.rb +0 -2
- data/test/abstract_unit.rb +0 -78
- data/test/active_record_unit.rb +0 -104
- data/test/activerecord/active_record_store_test.rb +0 -221
- data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
- data/test/adv_attr_test.rb +0 -20
- data/test/controller/action_pack_assertions_test.rb +0 -545
- data/test/controller/addresses_render_test.rb +0 -37
- data/test/controller/assert_select_test.rb +0 -735
- data/test/controller/base_test.rb +0 -217
- data/test/controller/benchmark_test.rb +0 -32
- data/test/controller/caching_test.rb +0 -743
- data/test/controller/capture_test.rb +0 -66
- data/test/controller/content_type_test.rb +0 -178
- data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
- data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
- data/test/controller/cookie_test.rb +0 -208
- data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
- data/test/controller/dispatcher_test.rb +0 -144
- data/test/controller/dom_assertions_test.rb +0 -53
- data/test/controller/failsafe_test.rb +0 -60
- data/test/controller/fake_controllers.rb +0 -33
- data/test/controller/fake_models.rb +0 -19
- data/test/controller/filter_params_test.rb +0 -52
- data/test/controller/filters_test.rb +0 -885
- data/test/controller/flash_test.rb +0 -174
- data/test/controller/header_test.rb +0 -14
- data/test/controller/helper_test.rb +0 -224
- data/test/controller/html-scanner/cdata_node_test.rb +0 -15
- data/test/controller/html-scanner/document_test.rb +0 -148
- data/test/controller/html-scanner/node_test.rb +0 -89
- data/test/controller/html-scanner/sanitizer_test.rb +0 -300
- data/test/controller/html-scanner/tag_node_test.rb +0 -238
- data/test/controller/html-scanner/text_node_test.rb +0 -50
- data/test/controller/html-scanner/tokenizer_test.rb +0 -131
- data/test/controller/http_basic_authentication_test.rb +0 -113
- data/test/controller/http_digest_authentication_test.rb +0 -254
- data/test/controller/integration_test.rb +0 -526
- data/test/controller/layout_test.rb +0 -215
- data/test/controller/localized_templates_test.rb +0 -24
- data/test/controller/logging_test.rb +0 -46
- data/test/controller/middleware_stack_test.rb +0 -90
- data/test/controller/mime_responds_test.rb +0 -536
- data/test/controller/mime_type_test.rb +0 -93
- data/test/controller/output_escaping_test.rb +0 -19
- data/test/controller/polymorphic_routes_test.rb +0 -297
- data/test/controller/rack_test.rb +0 -308
- data/test/controller/record_identifier_test.rb +0 -139
- data/test/controller/redirect_test.rb +0 -285
- data/test/controller/reloader_test.rb +0 -125
- data/test/controller/render_test.rb +0 -1783
- data/test/controller/request/json_params_parsing_test.rb +0 -65
- data/test/controller/request/multipart_params_parsing_test.rb +0 -177
- data/test/controller/request/query_string_parsing_test.rb +0 -129
- data/test/controller/request/test_request_test.rb +0 -35
- data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
- data/test/controller/request/xml_params_parsing_test.rb +0 -103
- data/test/controller/request_forgery_protection_test.rb +0 -233
- data/test/controller/request_test.rb +0 -398
- data/test/controller/rescue_test.rb +0 -541
- data/test/controller/resources_test.rb +0 -1393
- data/test/controller/routing_test.rb +0 -2592
- data/test/controller/selector_test.rb +0 -628
- data/test/controller/send_file_test.rb +0 -171
- data/test/controller/session/abstract_store_test.rb +0 -64
- data/test/controller/session/cookie_store_test.rb +0 -354
- data/test/controller/session/mem_cache_store_test.rb +0 -187
- data/test/controller/session/test_session_test.rb +0 -58
- data/test/controller/test_test.rb +0 -700
- data/test/controller/translation_test.rb +0 -26
- data/test/controller/url_rewriter_test.rb +0 -395
- data/test/controller/verification_test.rb +0 -270
- data/test/controller/view_paths_test.rb +0 -141
- data/test/controller/webservice_test.rb +0 -273
- data/test/fixtures/_top_level_partial.html.erb +0 -1
- data/test/fixtures/_top_level_partial_only.erb +0 -1
- data/test/fixtures/addresses/list.erb +0 -1
- data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
- data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
- data/test/fixtures/companies.yml +0 -24
- data/test/fixtures/company.rb +0 -10
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
- data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
- data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
- data/test/fixtures/customers/_customer.html.erb +0 -1
- data/test/fixtures/db_definitions/sqlite.sql +0 -49
- data/test/fixtures/developer.rb +0 -9
- data/test/fixtures/developers.yml +0 -21
- data/test/fixtures/developers/_developer.erb +0 -1
- data/test/fixtures/developers_projects.yml +0 -13
- data/test/fixtures/failsafe/500.html +0 -1
- data/test/fixtures/fun/games/_game.erb +0 -1
- data/test/fixtures/fun/games/hello_world.erb +0 -1
- data/test/fixtures/fun/serious/games/_game.erb +0 -1
- data/test/fixtures/functional_caching/_partial.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
- data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
- data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
- data/test/fixtures/helpers/abc_helper.rb +0 -5
- data/test/fixtures/helpers/fun/games_helper.rb +0 -3
- data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
- data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
- data/test/fixtures/layouts/_column.html.erb +0 -2
- data/test/fixtures/layouts/block_with_layout.erb +0 -3
- data/test/fixtures/layouts/builder.builder +0 -3
- data/test/fixtures/layouts/default_html.html.erb +0 -1
- data/test/fixtures/layouts/partial_with_layout.erb +0 -3
- data/test/fixtures/layouts/standard.erb +0 -1
- data/test/fixtures/layouts/talk_from_action.erb +0 -2
- data/test/fixtures/layouts/xhr.html.erb +0 -2
- data/test/fixtures/layouts/yield.erb +0 -2
- data/test/fixtures/localized/hello_world.de.html +0 -1
- data/test/fixtures/localized/hello_world.en.html +0 -1
- data/test/fixtures/mascot.rb +0 -3
- data/test/fixtures/mascots.yml +0 -4
- data/test/fixtures/mascots/_mascot.html.erb +0 -1
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +0 -10
- data/test/fixtures/multipart/bracketed_param +0 -5
- data/test/fixtures/multipart/empty +0 -10
- data/test/fixtures/multipart/hello.txt +0 -1
- data/test/fixtures/multipart/large_text_file +0 -10
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +0 -9
- data/test/fixtures/multipart/single_parameter +0 -5
- data/test/fixtures/multipart/text_file +0 -10
- data/test/fixtures/override/test/hello_world.erb +0 -1
- data/test/fixtures/override2/layouts/test/sub.erb +0 -1
- data/test/fixtures/post_test/layouts/post.html.erb +0 -1
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
- data/test/fixtures/post_test/post/index.html.erb +0 -1
- data/test/fixtures/post_test/post/index.iphone.erb +0 -1
- data/test/fixtures/post_test/super_post/index.html.erb +0 -1
- data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
- data/test/fixtures/project.rb +0 -3
- data/test/fixtures/projects.yml +0 -7
- data/test/fixtures/projects/_project.erb +0 -1
- data/test/fixtures/public/404.html +0 -1
- data/test/fixtures/public/500.da.html +0 -1
- data/test/fixtures/public/500.html +0 -1
- data/test/fixtures/public/absolute/test.css +0 -23
- data/test/fixtures/public/absolute/test.js +0 -63
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +0 -1
- data/test/fixtures/public/javascripts/bank.js +0 -1
- data/test/fixtures/public/javascripts/controls.js +0 -1
- data/test/fixtures/public/javascripts/dragdrop.js +0 -1
- data/test/fixtures/public/javascripts/effects.js +0 -1
- data/test/fixtures/public/javascripts/prototype.js +0 -1
- data/test/fixtures/public/javascripts/robber.js +0 -1
- data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
- data/test/fixtures/public/javascripts/version.1.0.js +0 -1
- data/test/fixtures/public/stylesheets/bank.css +0 -1
- data/test/fixtures/public/stylesheets/robber.css +0 -1
- data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
- data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
- data/test/fixtures/quiz/questions/_question.html.erb +0 -1
- data/test/fixtures/replies.yml +0 -15
- data/test/fixtures/replies/_reply.erb +0 -1
- data/test/fixtures/reply.rb +0 -7
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
- data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
- data/test/fixtures/scope/test/modgreet.erb +0 -1
- data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
- data/test/fixtures/shared.html.erb +0 -1
- data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
- data/test/fixtures/test/_counter.html.erb +0 -1
- data/test/fixtures/test/_customer.erb +0 -1
- data/test/fixtures/test/_customer_counter.erb +0 -1
- data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
- data/test/fixtures/test/_customer_greeting.erb +0 -1
- data/test/fixtures/test/_customer_with_var.erb +0 -1
- data/test/fixtures/test/_form.erb +0 -1
- data/test/fixtures/test/_from_helper.erb +0 -1
- data/test/fixtures/test/_hash_greeting.erb +0 -1
- data/test/fixtures/test/_hash_object.erb +0 -2
- data/test/fixtures/test/_hello.builder +0 -1
- data/test/fixtures/test/_labelling_form.erb +0 -1
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
- data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
- data/test/fixtures/test/_local_inspector.html.erb +0 -1
- data/test/fixtures/test/_one.html.erb +0 -1
- data/test/fixtures/test/_partial.erb +0 -1
- data/test/fixtures/test/_partial.html.erb +0 -1
- data/test/fixtures/test/_partial.js.erb +0 -1
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
- data/test/fixtures/test/_partial_only.erb +0 -1
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
- data/test/fixtures/test/_person.erb +0 -2
- data/test/fixtures/test/_raise.html.erb +0 -1
- data/test/fixtures/test/_two.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial.html.erb +0 -1
- data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
- data/test/fixtures/test/action_talk_to_layout.erb +0 -2
- data/test/fixtures/test/array_translation.erb +0 -1
- data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
- data/test/fixtures/test/capturing.erb +0 -4
- data/test/fixtures/test/content_for.erb +0 -2
- data/test/fixtures/test/content_for_concatenated.erb +0 -3
- data/test/fixtures/test/content_for_with_parameter.erb +0 -2
- data/test/fixtures/test/delete_with_js.rjs +0 -2
- data/test/fixtures/test/dont_pick_me +0 -1
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/enum_rjs_test.rjs +0 -6
- data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.builder +0 -1
- data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
- data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
- data/test/fixtures/test/greeting.erb +0 -1
- data/test/fixtures/test/greeting.js.rjs +0 -1
- data/test/fixtures/test/hello.builder +0 -4
- data/test/fixtures/test/hello_world.da.html.erb +0 -1
- data/test/fixtures/test/hello_world.erb +0 -1
- data/test/fixtures/test/hello_world.erb~ +0 -1
- data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
- data/test/fixtures/test/hello_world_container.builder +0 -3
- data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
- data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
- data/test/fixtures/test/hello_xml_world.builder +0 -11
- data/test/fixtures/test/hyphen-ated.erb +0 -1
- data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
- data/test/fixtures/test/list.erb +0 -1
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.erb~ +0 -1
- data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
- data/test/fixtures/test/nested_layout.erb +0 -3
- data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
- data/test/fixtures/test/potential_conflicts.erb +0 -4
- data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_file_from_template.html.erb +0 -1
- data/test/fixtures/test/render_file_with_ivar.erb +0 -1
- data/test/fixtures/test/render_file_with_locals.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
- data/test/fixtures/test/render_to_string_test.erb +0 -1
- data/test/fixtures/test/scoped_array_translation.erb +0 -1
- data/test/fixtures/test/sub_template_raise.html.erb +0 -1
- data/test/fixtures/test/template.erb +0 -1
- data/test/fixtures/test/translation.erb +0 -1
- data/test/fixtures/test/update_element_with_capture.erb +0 -9
- data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
- data/test/fixtures/test/utf8.html.erb +0 -4
- data/test/fixtures/test/utf8_magic.html.erb +0 -5
- data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
- data/test/fixtures/topic.rb +0 -3
- data/test/fixtures/topics.yml +0 -22
- data/test/fixtures/topics/_topic.html.erb +0 -1
- data/test/template/active_record_helper_i18n_test.rb +0 -51
- data/test/template/active_record_helper_test.rb +0 -302
- data/test/template/asset_tag_helper_test.rb +0 -770
- data/test/template/atom_feed_helper_test.rb +0 -315
- data/test/template/benchmark_helper_test.rb +0 -86
- data/test/template/compiled_templates_test.rb +0 -204
- data/test/template/date_helper_i18n_test.rb +0 -121
- data/test/template/date_helper_test.rb +0 -2603
- data/test/template/erb_util_test.rb +0 -36
- data/test/template/form_helper_test.rb +0 -1447
- data/test/template/form_options_helper_i18n_test.rb +0 -27
- data/test/template/form_options_helper_test.rb +0 -811
- data/test/template/form_tag_helper_test.rb +0 -356
- data/test/template/javascript_helper_test.rb +0 -106
- data/test/template/number_helper_i18n_test.rb +0 -69
- data/test/template/number_helper_test.rb +0 -132
- data/test/template/prototype_helper_test.rb +0 -639
- data/test/template/raw_output_helper_test.rb +0 -21
- data/test/template/record_tag_helper_test.rb +0 -58
- data/test/template/render_test.rb +0 -329
- data/test/template/sanitize_helper_test.rb +0 -57
- data/test/template/scriptaculous_helper_test.rb +0 -90
- data/test/template/tag_helper_test.rb +0 -98
- data/test/template/template_test.rb +0 -32
- data/test/template/test_test.rb +0 -54
- data/test/template/text_helper_test.rb +0 -601
- data/test/template/translation_helper_test.rb +0 -95
- data/test/template/url_helper_test.rb +0 -641
- data/test/testing_sandbox.rb +0 -15
- data/test/view/test_case_test.rb +0 -176
@@ -1,265 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
module Routing
|
3
|
-
class Route #:nodoc:
|
4
|
-
attr_accessor :segments, :requirements, :conditions, :optimise
|
5
|
-
|
6
|
-
def initialize(segments = [], requirements = {}, conditions = {})
|
7
|
-
@segments = segments
|
8
|
-
@requirements = requirements
|
9
|
-
@conditions = conditions
|
10
|
-
|
11
|
-
if !significant_keys.include?(:action) && !requirements[:action]
|
12
|
-
@requirements[:action] = "index"
|
13
|
-
@significant_keys << :action
|
14
|
-
end
|
15
|
-
|
16
|
-
# Routes cannot use the current string interpolation method
|
17
|
-
# if there are user-supplied <tt>:requirements</tt> as the interpolation
|
18
|
-
# code won't raise RoutingErrors when generating
|
19
|
-
has_requirements = @segments.detect { |segment| segment.respond_to?(:regexp) && segment.regexp }
|
20
|
-
if has_requirements || @requirements.keys.to_set != Routing::ALLOWED_REQUIREMENTS_FOR_OPTIMISATION
|
21
|
-
@optimise = false
|
22
|
-
else
|
23
|
-
@optimise = true
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
# Indicates whether the routes should be optimised with the string interpolation
|
28
|
-
# version of the named routes methods.
|
29
|
-
def optimise?
|
30
|
-
@optimise && ActionController::Base::optimise_named_routes
|
31
|
-
end
|
32
|
-
|
33
|
-
def segment_keys
|
34
|
-
segments.collect do |segment|
|
35
|
-
segment.key if segment.respond_to? :key
|
36
|
-
end.compact
|
37
|
-
end
|
38
|
-
|
39
|
-
def required_segment_keys
|
40
|
-
required_segments = segments.select {|seg| (!seg.optional? && !seg.is_a?(DividerSegment)) || seg.is_a?(PathSegment) }
|
41
|
-
required_segments.collect { |seg| seg.key if seg.respond_to?(:key)}.compact
|
42
|
-
end
|
43
|
-
|
44
|
-
# Build a query string from the keys of the given hash. If +only_keys+
|
45
|
-
# is given (as an array), only the keys indicated will be used to build
|
46
|
-
# the query string. The query string will correctly build array parameter
|
47
|
-
# values.
|
48
|
-
def build_query_string(hash, only_keys = nil)
|
49
|
-
elements = []
|
50
|
-
|
51
|
-
(only_keys || hash.keys).each do |key|
|
52
|
-
if value = hash[key]
|
53
|
-
elements << value.to_query(key)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
elements.empty? ? '' : "?#{elements.sort * '&'}"
|
58
|
-
end
|
59
|
-
|
60
|
-
# A route's parameter shell contains parameter values that are not in the
|
61
|
-
# route's path, but should be placed in the recognized hash.
|
62
|
-
#
|
63
|
-
# For example, +{:controller => 'pages', :action => 'show'} is the shell for the route:
|
64
|
-
#
|
65
|
-
# map.connect '/page/:id', :controller => 'pages', :action => 'show', :id => /\d+/
|
66
|
-
#
|
67
|
-
def parameter_shell
|
68
|
-
@parameter_shell ||= {}.tap do |shell|
|
69
|
-
requirements.each do |key, requirement|
|
70
|
-
shell[key] = requirement unless requirement.is_a? Regexp
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# Return an array containing all the keys that are used in this route. This
|
76
|
-
# includes keys that appear inside the path, and keys that have requirements
|
77
|
-
# placed upon them.
|
78
|
-
def significant_keys
|
79
|
-
@significant_keys ||= [].tap do |sk|
|
80
|
-
segments.each { |segment| sk << segment.key if segment.respond_to? :key }
|
81
|
-
sk.concat requirements.keys
|
82
|
-
sk.uniq!
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Return a hash of key/value pairs representing the keys in the route that
|
87
|
-
# have defaults, or which are specified by non-regexp requirements.
|
88
|
-
def defaults
|
89
|
-
@defaults ||= {}.tap do |hash|
|
90
|
-
segments.each do |segment|
|
91
|
-
next unless segment.respond_to? :default
|
92
|
-
hash[segment.key] = segment.default unless segment.default.nil?
|
93
|
-
end
|
94
|
-
requirements.each do |key,req|
|
95
|
-
next if Regexp === req || req.nil?
|
96
|
-
hash[key] = req
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def matches_controller_and_action?(controller, action)
|
102
|
-
prepare_matching!
|
103
|
-
(@controller_requirement.nil? || @controller_requirement === controller) &&
|
104
|
-
(@action_requirement.nil? || @action_requirement === action)
|
105
|
-
end
|
106
|
-
|
107
|
-
def to_s
|
108
|
-
@to_s ||= begin
|
109
|
-
segs = segments.inject("") { |str,s| str << s.to_s }
|
110
|
-
"%-6s %-40s %s" % [(conditions[:method] || :any).to_s.upcase, segs, requirements.inspect]
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# TODO: Route should be prepared and frozen on initialize
|
115
|
-
def freeze
|
116
|
-
unless frozen?
|
117
|
-
write_generation!
|
118
|
-
write_recognition!
|
119
|
-
prepare_matching!
|
120
|
-
|
121
|
-
parameter_shell
|
122
|
-
significant_keys
|
123
|
-
defaults
|
124
|
-
to_s
|
125
|
-
end
|
126
|
-
|
127
|
-
super
|
128
|
-
end
|
129
|
-
|
130
|
-
def generate(options, hash, expire_on = {})
|
131
|
-
path, hash = generate_raw(options, hash, expire_on)
|
132
|
-
append_query_string(path, hash, extra_keys(options))
|
133
|
-
end
|
134
|
-
|
135
|
-
def generate_extras(options, hash, expire_on = {})
|
136
|
-
path, hash = generate_raw(options, hash, expire_on)
|
137
|
-
[path, extra_keys(options)]
|
138
|
-
end
|
139
|
-
|
140
|
-
private
|
141
|
-
def requirement_for(key)
|
142
|
-
return requirements[key] if requirements.key? key
|
143
|
-
segments.each do |segment|
|
144
|
-
return segment.regexp if segment.respond_to?(:key) && segment.key == key
|
145
|
-
end
|
146
|
-
nil
|
147
|
-
end
|
148
|
-
|
149
|
-
# Write and compile a +generate+ method for this Route.
|
150
|
-
def write_generation!
|
151
|
-
# Build the main body of the generation
|
152
|
-
body = "expired = false\n#{generation_extraction}\n#{generation_structure}"
|
153
|
-
|
154
|
-
# If we have conditions that must be tested first, nest the body inside an if
|
155
|
-
body = "if #{generation_requirements}\n#{body}\nend" if generation_requirements
|
156
|
-
args = "options, hash, expire_on = {}"
|
157
|
-
|
158
|
-
# Nest the body inside of a def block, and then compile it.
|
159
|
-
raw_method = method_decl = "def generate_raw(#{args})\npath = begin\n#{body}\nend\n[path, hash]\nend"
|
160
|
-
instance_eval method_decl, "generated code (#{__FILE__}:#{__LINE__})"
|
161
|
-
|
162
|
-
# expire_on.keys == recall.keys; in other words, the keys in the expire_on hash
|
163
|
-
# are the same as the keys that were recalled from the previous request. Thus,
|
164
|
-
# we can use the expire_on.keys to determine which keys ought to be used to build
|
165
|
-
# the query string. (Never use keys from the recalled request when building the
|
166
|
-
# query string.)
|
167
|
-
|
168
|
-
raw_method
|
169
|
-
end
|
170
|
-
|
171
|
-
# Build several lines of code that extract values from the options hash. If any
|
172
|
-
# of the values are missing or rejected then a return will be executed.
|
173
|
-
def generation_extraction
|
174
|
-
segments.collect do |segment|
|
175
|
-
segment.extraction_code
|
176
|
-
end.compact * "\n"
|
177
|
-
end
|
178
|
-
|
179
|
-
# Produce a condition expression that will check the requirements of this route
|
180
|
-
# upon generation.
|
181
|
-
def generation_requirements
|
182
|
-
requirement_conditions = requirements.collect do |key, req|
|
183
|
-
if req.is_a? Regexp
|
184
|
-
value_regexp = Regexp.new "\\A#{req.to_s}\\Z"
|
185
|
-
"hash[:#{key}] && #{value_regexp.inspect} =~ options[:#{key}]"
|
186
|
-
else
|
187
|
-
"hash[:#{key}] == #{req.inspect}"
|
188
|
-
end
|
189
|
-
end
|
190
|
-
requirement_conditions * ' && ' unless requirement_conditions.empty?
|
191
|
-
end
|
192
|
-
|
193
|
-
def generation_structure
|
194
|
-
segments.last.string_structure segments[0..-2]
|
195
|
-
end
|
196
|
-
|
197
|
-
# Write and compile a +recognize+ method for this Route.
|
198
|
-
def write_recognition!
|
199
|
-
# Create an if structure to extract the params from a match if it occurs.
|
200
|
-
body = "params = parameter_shell.dup\n#{recognition_extraction * "\n"}\nparams"
|
201
|
-
body = "if #{recognition_conditions.join(" && ")}\n#{body}\nend"
|
202
|
-
|
203
|
-
# Build the method declaration and compile it
|
204
|
-
method_decl = "def recognize(path, env = {})\n#{body}\nend"
|
205
|
-
instance_eval method_decl, "generated code (#{__FILE__}:#{__LINE__})"
|
206
|
-
method_decl
|
207
|
-
end
|
208
|
-
|
209
|
-
# Plugins may override this method to add other conditions, like checks on
|
210
|
-
# host, subdomain, and so forth. Note that changes here only affect route
|
211
|
-
# recognition, not generation.
|
212
|
-
def recognition_conditions
|
213
|
-
result = ["(match = #{Regexp.new(recognition_pattern).inspect}.match(path))"]
|
214
|
-
result << "[conditions[:method]].flatten.include?(env[:method])" if conditions[:method]
|
215
|
-
result
|
216
|
-
end
|
217
|
-
|
218
|
-
# Build the regular expression pattern that will match this route.
|
219
|
-
def recognition_pattern(wrap = true)
|
220
|
-
pattern = ''
|
221
|
-
segments.reverse_each do |segment|
|
222
|
-
pattern = segment.build_pattern pattern
|
223
|
-
end
|
224
|
-
wrap ? ("\\A" + pattern + "\\Z") : pattern
|
225
|
-
end
|
226
|
-
|
227
|
-
# Write the code to extract the parameters from a matched route.
|
228
|
-
def recognition_extraction
|
229
|
-
next_capture = 1
|
230
|
-
extraction = segments.collect do |segment|
|
231
|
-
x = segment.match_extraction(next_capture)
|
232
|
-
next_capture += segment.number_of_captures
|
233
|
-
x
|
234
|
-
end
|
235
|
-
extraction.compact
|
236
|
-
end
|
237
|
-
|
238
|
-
# Generate the query string with any extra keys in the hash and append
|
239
|
-
# it to the given path, returning the new path.
|
240
|
-
def append_query_string(path, hash, query_keys = nil)
|
241
|
-
return nil unless path
|
242
|
-
query_keys ||= extra_keys(hash)
|
243
|
-
"#{path}#{build_query_string(hash, query_keys)}"
|
244
|
-
end
|
245
|
-
|
246
|
-
# Determine which keys in the given hash are "extra". Extra keys are
|
247
|
-
# those that were not used to generate a particular route. The extra
|
248
|
-
# keys also do not include those recalled from the prior request, nor
|
249
|
-
# do they include any keys that were implied in the route (like a
|
250
|
-
# <tt>:controller</tt> that is required, but not explicitly used in the
|
251
|
-
# text of the route.)
|
252
|
-
def extra_keys(hash, recall = {})
|
253
|
-
(hash || {}).keys.map { |k| k.to_sym } - (recall || {}).keys - significant_keys
|
254
|
-
end
|
255
|
-
|
256
|
-
def prepare_matching!
|
257
|
-
unless defined? @matching_prepared
|
258
|
-
@controller_requirement = requirement_for(:controller)
|
259
|
-
@action_requirement = requirement_for(:action)
|
260
|
-
@matching_prepared = true
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
@@ -1,503 +0,0 @@
|
|
1
|
-
module ActionController
|
2
|
-
module Routing
|
3
|
-
class RouteSet #:nodoc:
|
4
|
-
# Mapper instances are used to build routes. The object passed to the draw
|
5
|
-
# block in config/routes.rb is a Mapper instance.
|
6
|
-
#
|
7
|
-
# Mapper instances have relatively few instance methods, in order to avoid
|
8
|
-
# clashes with named routes.
|
9
|
-
class Mapper #:doc:
|
10
|
-
include ActionController::Resources
|
11
|
-
|
12
|
-
def initialize(set) #:nodoc:
|
13
|
-
@set = set
|
14
|
-
end
|
15
|
-
|
16
|
-
# Create an unnamed route with the provided +path+ and +options+. See
|
17
|
-
# ActionController::Routing for an introduction to routes.
|
18
|
-
def connect(path, options = {})
|
19
|
-
@set.add_route(path, options)
|
20
|
-
end
|
21
|
-
|
22
|
-
# Creates a named route called "root" for matching the root level request.
|
23
|
-
def root(options = {})
|
24
|
-
if options.is_a?(Symbol)
|
25
|
-
if source_route = @set.named_routes.routes[options]
|
26
|
-
options = source_route.defaults.merge({ :conditions => source_route.conditions })
|
27
|
-
end
|
28
|
-
end
|
29
|
-
named_route("root", '', options)
|
30
|
-
end
|
31
|
-
|
32
|
-
def named_route(name, path, options = {}) #:nodoc:
|
33
|
-
@set.add_named_route(name, path, options)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Enables the use of resources in a module by setting the name_prefix, path_prefix, and namespace for the model.
|
37
|
-
# Example:
|
38
|
-
#
|
39
|
-
# map.namespace(:admin) do |admin|
|
40
|
-
# admin.resources :products,
|
41
|
-
# :has_many => [ :tags, :images, :variants ]
|
42
|
-
# end
|
43
|
-
#
|
44
|
-
# This will create +admin_products_url+ pointing to "admin/products", which will look for an Admin::ProductsController.
|
45
|
-
# It'll also create +admin_product_tags_url+ pointing to "admin/products/#{product_id}/tags", which will look for
|
46
|
-
# Admin::TagsController.
|
47
|
-
def namespace(name, options = {}, &block)
|
48
|
-
if options[:namespace]
|
49
|
-
with_options({:path_prefix => "#{options.delete(:path_prefix)}/#{name}", :name_prefix => "#{options.delete(:name_prefix)}#{name}_", :namespace => "#{options.delete(:namespace)}#{name}/" }.merge(options), &block)
|
50
|
-
else
|
51
|
-
with_options({:path_prefix => name, :name_prefix => "#{name}_", :namespace => "#{name}/" }.merge(options), &block)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def method_missing(route_name, *args, &proc) #:nodoc:
|
56
|
-
super unless args.length >= 1 && proc.nil?
|
57
|
-
@set.add_named_route(route_name, *args)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# A NamedRouteCollection instance is a collection of named routes, and also
|
62
|
-
# maintains an anonymous module that can be used to install helpers for the
|
63
|
-
# named routes.
|
64
|
-
class NamedRouteCollection #:nodoc:
|
65
|
-
include Enumerable
|
66
|
-
include ActionController::Routing::Optimisation
|
67
|
-
attr_reader :routes, :helpers
|
68
|
-
|
69
|
-
def initialize
|
70
|
-
clear!
|
71
|
-
end
|
72
|
-
|
73
|
-
def clear!
|
74
|
-
@routes = {}
|
75
|
-
@helpers = []
|
76
|
-
|
77
|
-
@module ||= Module.new
|
78
|
-
@module.instance_methods.each do |selector|
|
79
|
-
@module.class_eval { remove_method selector }
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def add(name, route)
|
84
|
-
routes[name.to_sym] = route
|
85
|
-
define_named_route_methods(name, route)
|
86
|
-
end
|
87
|
-
|
88
|
-
def get(name)
|
89
|
-
routes[name.to_sym]
|
90
|
-
end
|
91
|
-
|
92
|
-
alias []= add
|
93
|
-
alias [] get
|
94
|
-
alias clear clear!
|
95
|
-
|
96
|
-
def each
|
97
|
-
routes.each { |name, route| yield name, route }
|
98
|
-
self
|
99
|
-
end
|
100
|
-
|
101
|
-
def names
|
102
|
-
routes.keys
|
103
|
-
end
|
104
|
-
|
105
|
-
def length
|
106
|
-
routes.length
|
107
|
-
end
|
108
|
-
|
109
|
-
def reset!
|
110
|
-
old_routes = routes.dup
|
111
|
-
clear!
|
112
|
-
old_routes.each do |name, route|
|
113
|
-
add(name, route)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def install(destinations = [ActionController::Base, ActionView::Base], regenerate = false)
|
118
|
-
reset! if regenerate
|
119
|
-
Array(destinations).each do |dest|
|
120
|
-
dest.__send__(:include, @module)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
private
|
125
|
-
def url_helper_name(name, kind = :url)
|
126
|
-
:"#{name}_#{kind}"
|
127
|
-
end
|
128
|
-
|
129
|
-
def hash_access_name(name, kind = :url)
|
130
|
-
:"hash_for_#{name}_#{kind}"
|
131
|
-
end
|
132
|
-
|
133
|
-
def define_named_route_methods(name, route)
|
134
|
-
{:url => {:only_path => false}, :path => {:only_path => true}}.each do |kind, opts|
|
135
|
-
hash = route.defaults.merge(:use_route => name).merge(opts)
|
136
|
-
define_hash_access route, name, kind, hash
|
137
|
-
define_url_helper route, name, kind, hash
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def named_helper_module_eval(code, *args)
|
142
|
-
@module.module_eval(code, *args)
|
143
|
-
end
|
144
|
-
|
145
|
-
def define_hash_access(route, name, kind, options)
|
146
|
-
selector = hash_access_name(name, kind)
|
147
|
-
named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
|
148
|
-
def #{selector}(options = nil) # def hash_for_users_url(options = nil)
|
149
|
-
options ? #{options.inspect}.merge(options) : #{options.inspect} # options ? {:only_path=>false}.merge(options) : {:only_path=>false}
|
150
|
-
end # end
|
151
|
-
protected :#{selector} # protected :hash_for_users_url
|
152
|
-
end_eval
|
153
|
-
helpers << selector
|
154
|
-
end
|
155
|
-
|
156
|
-
def define_url_helper(route, name, kind, options)
|
157
|
-
selector = url_helper_name(name, kind)
|
158
|
-
# The segment keys used for positional paramters
|
159
|
-
|
160
|
-
hash_access_method = hash_access_name(name, kind)
|
161
|
-
|
162
|
-
# allow ordered parameters to be associated with corresponding
|
163
|
-
# dynamic segments, so you can do
|
164
|
-
#
|
165
|
-
# foo_url(bar, baz, bang)
|
166
|
-
#
|
167
|
-
# instead of
|
168
|
-
#
|
169
|
-
# foo_url(:bar => bar, :baz => baz, :bang => bang)
|
170
|
-
#
|
171
|
-
# Also allow options hash, so you can do
|
172
|
-
#
|
173
|
-
# foo_url(bar, baz, bang, :sort_by => 'baz')
|
174
|
-
#
|
175
|
-
named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
|
176
|
-
def #{selector}(*args) # def users_url(*args)
|
177
|
-
args.compact! #
|
178
|
-
#
|
179
|
-
#{generate_optimisation_block(route, kind)} # #{generate_optimisation_block(route, kind)}
|
180
|
-
#
|
181
|
-
opts = if args.empty? || Hash === args.first # opts = if args.empty? || Hash === args.first
|
182
|
-
args.first || {} # args.first || {}
|
183
|
-
else # else
|
184
|
-
options = args.extract_options! # options = args.extract_options!
|
185
|
-
args = args.zip(#{route.segment_keys.inspect}).inject({}) do |h, (v, k)| # args = args.zip([]).inject({}) do |h, (v, k)|
|
186
|
-
h[k] = v # h[k] = v
|
187
|
-
h # h
|
188
|
-
end # end
|
189
|
-
options.merge(args) # options.merge(args)
|
190
|
-
end # end
|
191
|
-
#
|
192
|
-
url_for(#{hash_access_method}(opts)) # url_for(hash_for_users_url(opts))
|
193
|
-
#
|
194
|
-
end # end
|
195
|
-
#Add an alias to support the now deprecated formatted_* URL. # #Add an alias to support the now deprecated formatted_* URL.
|
196
|
-
def formatted_#{selector}(*args) # def formatted_users_url(*args)
|
197
|
-
ActiveSupport::Deprecation.warn( # ActiveSupport::Deprecation.warn(
|
198
|
-
"formatted_#{selector}() has been deprecated. " + # "formatted_users_url() has been deprecated. " +
|
199
|
-
"Please pass format to the standard " + # "Please pass format to the standard " +
|
200
|
-
"#{selector} method instead.", caller) # "users_url method instead.", caller)
|
201
|
-
#{selector}(*args) # users_url(*args)
|
202
|
-
end # end
|
203
|
-
protected :#{selector} # protected :users_url
|
204
|
-
end_eval
|
205
|
-
helpers << selector
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
attr_accessor :routes, :named_routes, :configuration_files
|
210
|
-
|
211
|
-
def initialize
|
212
|
-
self.configuration_files = []
|
213
|
-
|
214
|
-
self.routes = []
|
215
|
-
self.named_routes = NamedRouteCollection.new
|
216
|
-
|
217
|
-
clear_recognize_optimized!
|
218
|
-
end
|
219
|
-
|
220
|
-
# Subclasses and plugins may override this method to specify a different
|
221
|
-
# RouteBuilder instance, so that other route DSL's can be created.
|
222
|
-
def builder
|
223
|
-
@builder ||= RouteBuilder.new
|
224
|
-
end
|
225
|
-
|
226
|
-
def draw
|
227
|
-
yield Mapper.new(self)
|
228
|
-
install_helpers
|
229
|
-
end
|
230
|
-
|
231
|
-
def clear!
|
232
|
-
routes.clear
|
233
|
-
named_routes.clear
|
234
|
-
@combined_regexp = nil
|
235
|
-
@routes_by_controller = nil
|
236
|
-
# This will force routing/recognition_optimization.rb
|
237
|
-
# to refresh optimisations.
|
238
|
-
clear_recognize_optimized!
|
239
|
-
end
|
240
|
-
|
241
|
-
def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false)
|
242
|
-
Array(destinations).each { |d| d.module_eval { include Helpers } }
|
243
|
-
named_routes.install(destinations, regenerate_code)
|
244
|
-
end
|
245
|
-
|
246
|
-
def empty?
|
247
|
-
routes.empty?
|
248
|
-
end
|
249
|
-
|
250
|
-
def add_configuration_file(path)
|
251
|
-
self.configuration_files << path
|
252
|
-
end
|
253
|
-
|
254
|
-
# Deprecated accessor
|
255
|
-
def configuration_file=(path)
|
256
|
-
add_configuration_file(path)
|
257
|
-
end
|
258
|
-
|
259
|
-
# Deprecated accessor
|
260
|
-
def configuration_file
|
261
|
-
configuration_files
|
262
|
-
end
|
263
|
-
|
264
|
-
def load!
|
265
|
-
Routing.use_controllers!(nil) # Clear the controller cache so we may discover new ones
|
266
|
-
clear!
|
267
|
-
load_routes!
|
268
|
-
end
|
269
|
-
|
270
|
-
# reload! will always force a reload whereas load checks the timestamp first
|
271
|
-
alias reload! load!
|
272
|
-
|
273
|
-
def reload
|
274
|
-
if configuration_files.any? && @routes_last_modified
|
275
|
-
if routes_changed_at == @routes_last_modified
|
276
|
-
return # routes didn't change, don't reload
|
277
|
-
else
|
278
|
-
@routes_last_modified = routes_changed_at
|
279
|
-
end
|
280
|
-
end
|
281
|
-
|
282
|
-
load!
|
283
|
-
end
|
284
|
-
|
285
|
-
def load_routes!
|
286
|
-
if configuration_files.any?
|
287
|
-
configuration_files.each { |config| load(config) }
|
288
|
-
@routes_last_modified = routes_changed_at
|
289
|
-
else
|
290
|
-
add_route ":controller/:action/:id"
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
def routes_changed_at
|
295
|
-
routes_changed_at = nil
|
296
|
-
|
297
|
-
configuration_files.each do |config|
|
298
|
-
config_changed_at = File.stat(config).mtime
|
299
|
-
|
300
|
-
if routes_changed_at.nil? || config_changed_at > routes_changed_at
|
301
|
-
routes_changed_at = config_changed_at
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
|
-
routes_changed_at
|
306
|
-
end
|
307
|
-
|
308
|
-
def add_route(path, options = {})
|
309
|
-
options.each { |k, v| options[k] = v.to_s if [:controller, :action].include?(k) && v.is_a?(Symbol) }
|
310
|
-
route = builder.build(path, options)
|
311
|
-
routes << route
|
312
|
-
route
|
313
|
-
end
|
314
|
-
|
315
|
-
def add_named_route(name, path, options = {})
|
316
|
-
# TODO - is options EVER used?
|
317
|
-
name = options[:name_prefix] + name.to_s if options[:name_prefix]
|
318
|
-
named_routes[name.to_sym] = add_route(path, options)
|
319
|
-
end
|
320
|
-
|
321
|
-
def options_as_params(options)
|
322
|
-
# If an explicit :controller was given, always make :action explicit
|
323
|
-
# too, so that action expiry works as expected for things like
|
324
|
-
#
|
325
|
-
# generate({:controller => 'content'}, {:controller => 'content', :action => 'show'})
|
326
|
-
#
|
327
|
-
# (the above is from the unit tests). In the above case, because the
|
328
|
-
# controller was explicitly given, but no action, the action is implied to
|
329
|
-
# be "index", not the recalled action of "show".
|
330
|
-
#
|
331
|
-
# great fun, eh?
|
332
|
-
|
333
|
-
options_as_params = options.clone
|
334
|
-
options_as_params[:action] ||= 'index' if options[:controller]
|
335
|
-
options_as_params[:action] = options_as_params[:action].to_s if options_as_params[:action]
|
336
|
-
options_as_params
|
337
|
-
end
|
338
|
-
|
339
|
-
def build_expiry(options, recall)
|
340
|
-
recall.inject({}) do |expiry, (key, recalled_value)|
|
341
|
-
expiry[key] = (options.key?(key) && options[key].to_param != recalled_value.to_param)
|
342
|
-
expiry
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
# Generate the path indicated by the arguments, and return an array of
|
347
|
-
# the keys that were not used to generate it.
|
348
|
-
def extra_keys(options, recall={})
|
349
|
-
generate_extras(options, recall).last
|
350
|
-
end
|
351
|
-
|
352
|
-
def generate_extras(options, recall={})
|
353
|
-
generate(options, recall, :generate_extras)
|
354
|
-
end
|
355
|
-
|
356
|
-
def generate(options, recall = {}, method=:generate)
|
357
|
-
named_route_name = options.delete(:use_route)
|
358
|
-
generate_all = options.delete(:generate_all)
|
359
|
-
if named_route_name
|
360
|
-
named_route = named_routes[named_route_name]
|
361
|
-
options = named_route.parameter_shell.merge(options)
|
362
|
-
end
|
363
|
-
|
364
|
-
options = options_as_params(options)
|
365
|
-
expire_on = build_expiry(options, recall)
|
366
|
-
|
367
|
-
if options[:controller]
|
368
|
-
options[:controller] = options[:controller].to_s
|
369
|
-
end
|
370
|
-
# if the controller has changed, make sure it changes relative to the
|
371
|
-
# current controller module, if any. In other words, if we're currently
|
372
|
-
# on admin/get, and the new controller is 'set', the new controller
|
373
|
-
# should really be admin/set.
|
374
|
-
if !named_route && expire_on[:controller] && options[:controller] && options[:controller][0] != ?/
|
375
|
-
old_parts = recall[:controller].split('/')
|
376
|
-
new_parts = options[:controller].split('/')
|
377
|
-
parts = old_parts[0..-(new_parts.length + 1)] + new_parts
|
378
|
-
options[:controller] = parts.join('/')
|
379
|
-
end
|
380
|
-
|
381
|
-
# drop the leading '/' on the controller name
|
382
|
-
options[:controller] = options[:controller][1..-1] if options[:controller] && options[:controller][0] == ?/
|
383
|
-
merged = recall.merge(options)
|
384
|
-
|
385
|
-
if named_route
|
386
|
-
path = named_route.generate(options, merged, expire_on)
|
387
|
-
if path.nil?
|
388
|
-
raise_named_route_error(options, named_route, named_route_name)
|
389
|
-
else
|
390
|
-
return path
|
391
|
-
end
|
392
|
-
else
|
393
|
-
merged[:action] ||= 'index'
|
394
|
-
options[:action] ||= 'index'
|
395
|
-
|
396
|
-
controller = merged[:controller]
|
397
|
-
action = merged[:action]
|
398
|
-
|
399
|
-
raise RoutingError, "Need controller and action!" unless controller && action
|
400
|
-
|
401
|
-
if generate_all
|
402
|
-
# Used by caching to expire all paths for a resource
|
403
|
-
return routes.collect do |route|
|
404
|
-
route.__send__(method, options, merged, expire_on)
|
405
|
-
end.compact
|
406
|
-
end
|
407
|
-
|
408
|
-
# don't use the recalled keys when determining which routes to check
|
409
|
-
future_routes, deprecated_routes = routes_by_controller[controller][action][options.reject {|k,v| !v}.keys.sort_by { |x| x.object_id }]
|
410
|
-
routes = Routing.generate_best_match ? deprecated_routes : future_routes
|
411
|
-
|
412
|
-
routes.each_with_index do |route, index|
|
413
|
-
results = route.__send__(method, options, merged, expire_on)
|
414
|
-
if results && (!results.is_a?(Array) || results.first)
|
415
|
-
return results
|
416
|
-
end
|
417
|
-
end
|
418
|
-
end
|
419
|
-
|
420
|
-
raise RoutingError, "No route matches #{options.inspect}"
|
421
|
-
end
|
422
|
-
|
423
|
-
# try to give a helpful error message when named route generation fails
|
424
|
-
def raise_named_route_error(options, named_route, named_route_name)
|
425
|
-
diff = named_route.requirements.diff(options)
|
426
|
-
unless diff.empty?
|
427
|
-
raise RoutingError, "#{named_route_name}_url failed to generate from #{options.inspect}, expected: #{named_route.requirements.inspect}, diff: #{named_route.requirements.diff(options).inspect}"
|
428
|
-
else
|
429
|
-
required_segments = named_route.segments.select {|seg| (!seg.optional?) && (!seg.is_a?(DividerSegment)) }
|
430
|
-
required_keys_or_values = required_segments.map { |seg| seg.key rescue seg.value } # we want either the key or the value from the segment
|
431
|
-
raise RoutingError, "#{named_route_name}_url failed to generate from #{options.inspect} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: #{required_keys_or_values.inspect} - are they all satisfied?"
|
432
|
-
end
|
433
|
-
end
|
434
|
-
|
435
|
-
def call(env)
|
436
|
-
request = Request.new(env)
|
437
|
-
app = Routing::Routes.recognize(request)
|
438
|
-
app.call(env).to_a
|
439
|
-
end
|
440
|
-
|
441
|
-
def recognize(request)
|
442
|
-
params = recognize_path(request.path, extract_request_environment(request))
|
443
|
-
request.path_parameters = params.with_indifferent_access
|
444
|
-
"#{params[:controller].to_s.camelize}Controller".constantize
|
445
|
-
end
|
446
|
-
|
447
|
-
def recognize_path(path, environment={})
|
448
|
-
raise "Not optimized! Check that routing/recognition_optimisation overrides RouteSet#recognize_path."
|
449
|
-
end
|
450
|
-
|
451
|
-
def routes_by_controller
|
452
|
-
@routes_by_controller ||= Hash.new do |controller_hash, controller|
|
453
|
-
controller_hash[controller] = Hash.new do |action_hash, action|
|
454
|
-
action_hash[action] = Hash.new do |key_hash, keys|
|
455
|
-
key_hash[keys] = [
|
456
|
-
routes_for_controller_and_action_and_keys(controller, action, keys),
|
457
|
-
deprecated_routes_for_controller_and_action_and_keys(controller, action, keys)
|
458
|
-
]
|
459
|
-
end
|
460
|
-
end
|
461
|
-
end
|
462
|
-
end
|
463
|
-
|
464
|
-
def routes_for(options, merged, expire_on)
|
465
|
-
raise "Need controller and action!" unless controller && action
|
466
|
-
controller = merged[:controller]
|
467
|
-
merged = options if expire_on[:controller]
|
468
|
-
action = merged[:action] || 'index'
|
469
|
-
|
470
|
-
routes_by_controller[controller][action][merged.keys][1]
|
471
|
-
end
|
472
|
-
|
473
|
-
def routes_for_controller_and_action(controller, action)
|
474
|
-
ActiveSupport::Deprecation.warn "routes_for_controller_and_action() has been deprecated. Please use routes_for()"
|
475
|
-
selected = routes.select do |route|
|
476
|
-
route.matches_controller_and_action? controller, action
|
477
|
-
end
|
478
|
-
(selected.length == routes.length) ? routes : selected
|
479
|
-
end
|
480
|
-
|
481
|
-
def routes_for_controller_and_action_and_keys(controller, action, keys)
|
482
|
-
routes.select do |route|
|
483
|
-
route.matches_controller_and_action? controller, action
|
484
|
-
end
|
485
|
-
end
|
486
|
-
|
487
|
-
def deprecated_routes_for_controller_and_action_and_keys(controller, action, keys)
|
488
|
-
selected = routes.select do |route|
|
489
|
-
route.matches_controller_and_action? controller, action
|
490
|
-
end
|
491
|
-
selected.sort_by do |route|
|
492
|
-
(keys - route.significant_keys).length
|
493
|
-
end
|
494
|
-
end
|
495
|
-
|
496
|
-
# Subclasses and plugins may override this method to extract further attributes
|
497
|
-
# from the request, for use by route conditions and such.
|
498
|
-
def extract_request_environment(request)
|
499
|
-
{ :method => request.method }
|
500
|
-
end
|
501
|
-
end
|
502
|
-
end
|
503
|
-
end
|