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
@@ -50,6 +50,7 @@ module ActionController
|
|
50
50
|
# polymorphic_url([blog, post]) # => "http://example.com/blogs/1/posts/1"
|
51
51
|
# polymorphic_url([:admin, blog, post]) # => "http://example.com/admin/blogs/1/posts/1"
|
52
52
|
# polymorphic_url([user, :blog, post]) # => "http://example.com/users/1/blog/posts/1"
|
53
|
+
# polymorphic_url(Comment) # => "http://example.com/comments"
|
53
54
|
#
|
54
55
|
# ==== Options
|
55
56
|
#
|
@@ -70,6 +71,9 @@ module ActionController
|
|
70
71
|
# record = Comment.new
|
71
72
|
# polymorphic_url(record) # same as comments_url()
|
72
73
|
#
|
74
|
+
# # the class of a record will also map to the collection
|
75
|
+
# polymorphic_url(Comment) # same as comments_url()
|
76
|
+
#
|
73
77
|
def polymorphic_url(record_or_hash_or_array, options = {})
|
74
78
|
if record_or_hash_or_array.kind_of?(Array)
|
75
79
|
record_or_hash_or_array = record_or_hash_or_array.compact
|
@@ -77,6 +81,7 @@ module ActionController
|
|
77
81
|
end
|
78
82
|
|
79
83
|
record = extract_record(record_or_hash_or_array)
|
84
|
+
record = record.to_model if record.respond_to?(:to_model)
|
80
85
|
|
81
86
|
args = case record_or_hash_or_array
|
82
87
|
when Hash; [ record_or_hash_or_array ]
|
@@ -84,17 +89,19 @@ module ActionController
|
|
84
89
|
else [ record_or_hash_or_array ]
|
85
90
|
end
|
86
91
|
|
87
|
-
inflection =
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
92
|
+
inflection = if options[:action].to_s == "new"
|
93
|
+
args.pop
|
94
|
+
:singular
|
95
|
+
elsif (record.respond_to?(:new_record?) && record.new_record?) ||
|
96
|
+
(record.respond_to?(:destroyed?) && record.destroyed?)
|
97
|
+
args.pop
|
98
|
+
:plural
|
99
|
+
elsif record.is_a?(Class)
|
100
|
+
args.pop
|
101
|
+
:plural
|
102
|
+
else
|
103
|
+
:singular
|
104
|
+
end
|
98
105
|
|
99
106
|
args.delete_if {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
|
100
107
|
named_route = build_named_route_call(record_or_hash_or_array, inflection, options)
|
@@ -110,12 +117,11 @@ module ActionController
|
|
110
117
|
# Returns the path component of a URL for the given record. It uses
|
111
118
|
# <tt>polymorphic_url</tt> with <tt>:routing_type => :path</tt>.
|
112
119
|
def polymorphic_path(record_or_hash_or_array, options = {})
|
113
|
-
options
|
114
|
-
polymorphic_url(record_or_hash_or_array, options)
|
120
|
+
polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path))
|
115
121
|
end
|
116
122
|
|
117
123
|
%w(edit new).each do |action|
|
118
|
-
module_eval <<-EOT, __FILE__, __LINE__
|
124
|
+
module_eval <<-EOT, __FILE__, __LINE__
|
119
125
|
def #{action}_polymorphic_url(record_or_hash, options = {}) # def edit_polymorphic_url(record_or_hash, options = {})
|
120
126
|
polymorphic_url( # polymorphic_url(
|
121
127
|
record_or_hash, # record_or_hash,
|
@@ -130,18 +136,6 @@ module ActionController
|
|
130
136
|
EOT
|
131
137
|
end
|
132
138
|
|
133
|
-
def formatted_polymorphic_url(record_or_hash, options = {})
|
134
|
-
ActiveSupport::Deprecation.warn("formatted_polymorphic_url has been deprecated. Please pass :format to the polymorphic_url method instead", caller)
|
135
|
-
options[:format] = record_or_hash.pop if Array === record_or_hash
|
136
|
-
polymorphic_url(record_or_hash, options)
|
137
|
-
end
|
138
|
-
|
139
|
-
def formatted_polymorphic_path(record_or_hash, options = {})
|
140
|
-
ActiveSupport::Deprecation.warn("formatted_polymorphic_path has been deprecated. Please pass :format to the polymorphic_path method instead", caller)
|
141
|
-
options[:format] = record_or_hash.pop if record_or_hash === Array
|
142
|
-
polymorphic_url(record_or_hash, options.merge(:routing_type => :path))
|
143
|
-
end
|
144
|
-
|
145
139
|
private
|
146
140
|
def action_prefix(options)
|
147
141
|
options[:action] ? "#{options[:action]}_" : ''
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "action_controller"
|
2
|
+
require "rails"
|
3
|
+
require "action_view/railtie"
|
4
|
+
|
5
|
+
module ActionController
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
railtie_name :action_controller
|
8
|
+
|
9
|
+
require "action_controller/railties/subscriber"
|
10
|
+
subscriber ActionController::Railties::Subscriber.new
|
11
|
+
|
12
|
+
initializer "action_controller.logger" do
|
13
|
+
ActionController::Base.logger ||= Rails.logger
|
14
|
+
end
|
15
|
+
|
16
|
+
initializer "action_controller.set_configs" do |app|
|
17
|
+
app.config.action_controller.each do |k,v|
|
18
|
+
ActionController::Base.send "#{k}=", v
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
initializer "action_controller.initialize_framework_caches" do
|
23
|
+
ActionController::Base.cache_store ||= RAILS_CACHE
|
24
|
+
end
|
25
|
+
|
26
|
+
initializer "action_controller.set_helpers_path" do |app|
|
27
|
+
ActionController::Base.helpers_path = app.config.paths.app.helpers.to_a
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ActionController
|
2
|
+
module Railties
|
3
|
+
class Subscriber < Rails::Subscriber
|
4
|
+
INTERNAL_PARAMS = %w(controller action format _method only_path)
|
5
|
+
|
6
|
+
def start_processing(event)
|
7
|
+
payload = event.payload
|
8
|
+
params = payload[:params].except(*INTERNAL_PARAMS)
|
9
|
+
|
10
|
+
info " Processing by #{payload[:controller]}##{payload[:action]} as #{payload[:formats].first.to_s.upcase}"
|
11
|
+
info " Parameters: #{params.inspect}" unless params.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
def process_action(event)
|
15
|
+
payload = event.payload
|
16
|
+
additions = ActionController::Base.log_process_action(payload)
|
17
|
+
|
18
|
+
message = "Completed in %.0fms" % event.duration
|
19
|
+
message << " (#{additions.join(" | ")})" unless additions.blank?
|
20
|
+
message << " with #{payload[:status]}"
|
21
|
+
|
22
|
+
info(message)
|
23
|
+
end
|
24
|
+
|
25
|
+
def send_file(event)
|
26
|
+
message = if event.payload[:x_sendfile]
|
27
|
+
header = ActionController::Streaming::X_SENDFILE_HEADER
|
28
|
+
"Sent #{header} header %s"
|
29
|
+
elsif event.payload[:stream]
|
30
|
+
"Streamed file %s"
|
31
|
+
else
|
32
|
+
"Sent file %s"
|
33
|
+
end
|
34
|
+
|
35
|
+
message << " (%.1fms)"
|
36
|
+
info(message % [event.payload[:path], event.duration])
|
37
|
+
end
|
38
|
+
|
39
|
+
def redirect_to(event)
|
40
|
+
info "Redirected to #{event.payload[:location]}"
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_data(event)
|
44
|
+
info("Sent data %s (%.1fms)" % [event.payload[:filename], event.duration])
|
45
|
+
end
|
46
|
+
|
47
|
+
%w(write_fragment read_fragment exist_fragment?
|
48
|
+
expire_fragment expire_page write_page).each do |method|
|
49
|
+
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
50
|
+
def #{method}(event)
|
51
|
+
key_or_path = event.payload[:key] || event.payload[:path]
|
52
|
+
human_name = #{method.to_s.humanize.inspect}
|
53
|
+
info("\#{human_name} \#{key_or_path} (%.1fms)" % event.duration)
|
54
|
+
end
|
55
|
+
METHOD
|
56
|
+
end
|
57
|
+
|
58
|
+
def logger
|
59
|
+
ActionController::Base.logger
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -1,4 +1,6 @@
|
|
1
|
-
module
|
1
|
+
require 'active_support/core_ext/module'
|
2
|
+
|
3
|
+
module ActionController
|
2
4
|
# The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or
|
3
5
|
# Active Resources or pretty much any other model type that has an id. These patterns are then used to try elevate
|
4
6
|
# the view actions to a higher logical level. Example:
|
@@ -34,21 +36,6 @@ module ActionController
|
|
34
36
|
JOIN = '_'.freeze
|
35
37
|
NEW = 'new'.freeze
|
36
38
|
|
37
|
-
# Returns plural/singular for a record or class. Example:
|
38
|
-
#
|
39
|
-
# partial_path(post) # => "posts/post"
|
40
|
-
# partial_path(Person) # => "people/person"
|
41
|
-
# partial_path(Person, "admin/games") # => "admin/people/person"
|
42
|
-
def partial_path(record_or_class, controller_path = nil)
|
43
|
-
name = model_name_from_record_or_class(record_or_class)
|
44
|
-
|
45
|
-
if controller_path && controller_path.include?("/")
|
46
|
-
"#{File.dirname(controller_path)}/#{name.partial_path}"
|
47
|
-
else
|
48
|
-
name.partial_path
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
39
|
# The DOM class convention is to use the singular form of an object or class. Examples:
|
53
40
|
#
|
54
41
|
# dom_class(post) # => "post"
|
@@ -1,7 +1,84 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
1
|
+
require 'rack/session/abstract/id'
|
2
|
+
require 'action_view/test_case'
|
3
3
|
|
4
4
|
module ActionController
|
5
|
+
class TestRequest < ActionDispatch::TestRequest #:nodoc:
|
6
|
+
def initialize(env = {})
|
7
|
+
super
|
8
|
+
|
9
|
+
self.session = TestSession.new
|
10
|
+
self.session_options = TestSession::DEFAULT_OPTIONS.merge(:id => ActiveSupport::SecureRandom.hex(16))
|
11
|
+
end
|
12
|
+
|
13
|
+
class Result < ::Array #:nodoc:
|
14
|
+
def to_s() join '/' end
|
15
|
+
def self.new_escaped(strings)
|
16
|
+
new strings.collect {|str| URI.unescape str}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def assign_parameters(controller_path, action, parameters = {})
|
21
|
+
parameters = parameters.symbolize_keys.merge(:controller => controller_path, :action => action)
|
22
|
+
extra_keys = ActionController::Routing::Routes.extra_keys(parameters)
|
23
|
+
non_path_parameters = get? ? query_parameters : request_parameters
|
24
|
+
parameters.each do |key, value|
|
25
|
+
if value.is_a? Fixnum
|
26
|
+
value = value.to_s
|
27
|
+
elsif value.is_a? Array
|
28
|
+
value = Result.new(value)
|
29
|
+
end
|
30
|
+
|
31
|
+
if extra_keys.include?(key.to_sym)
|
32
|
+
non_path_parameters[key] = value
|
33
|
+
else
|
34
|
+
path_parameters[key.to_s] = value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
params = self.request_parameters.dup
|
39
|
+
|
40
|
+
%w(controller action only_path).each do |k|
|
41
|
+
params.delete(k)
|
42
|
+
params.delete(k.to_sym)
|
43
|
+
end
|
44
|
+
|
45
|
+
data = params.to_query
|
46
|
+
@env['CONTENT_LENGTH'] = data.length.to_s
|
47
|
+
@env['rack.input'] = StringIO.new(data)
|
48
|
+
end
|
49
|
+
|
50
|
+
def recycle!
|
51
|
+
@formats = nil
|
52
|
+
@env.delete_if { |k, v| k =~ /^(action_dispatch|rack)\.request/ }
|
53
|
+
@env.delete_if { |k, v| k =~ /^action_dispatch\.rescue/ }
|
54
|
+
@env['action_dispatch.request.query_parameters'] = {}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class TestResponse < ActionDispatch::TestResponse
|
59
|
+
def recycle!
|
60
|
+
@status = 200
|
61
|
+
@header = {}
|
62
|
+
@writer = lambda { |x| @body << x }
|
63
|
+
@block = nil
|
64
|
+
@length = 0
|
65
|
+
@body = []
|
66
|
+
@charset = nil
|
67
|
+
@content_type = nil
|
68
|
+
|
69
|
+
@request = @template = nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class TestSession < ActionDispatch::Session::AbstractStore::SessionHash #:nodoc:
|
74
|
+
DEFAULT_OPTIONS = ActionDispatch::Session::AbstractStore::DEFAULT_OPTIONS
|
75
|
+
|
76
|
+
def initialize(session = {})
|
77
|
+
replace(session.stringify_keys)
|
78
|
+
@loaded = true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
5
82
|
# Superclass for ActionController functional tests. Functional tests allow you to
|
6
83
|
# test a single controller action per test method. This should not be confused with
|
7
84
|
# integration tests (see ActionController::IntegrationTest), which are more like
|
@@ -56,7 +133,7 @@ module ActionController
|
|
56
133
|
#
|
57
134
|
# ActionController::TestCase will automatically infer the controller under test
|
58
135
|
# from the test class name. If the controller cannot be inferred from the test
|
59
|
-
# class name, you can
|
136
|
+
# class name, you can explicitly set it with +tests+.
|
60
137
|
#
|
61
138
|
# class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
|
62
139
|
# tests WidgetController
|
@@ -103,27 +180,78 @@ module ActionController
|
|
103
180
|
#
|
104
181
|
# assert_redirected_to page_url(:title => 'foo')
|
105
182
|
class TestCase < ActiveSupport::TestCase
|
106
|
-
include TestProcess
|
183
|
+
include ActionDispatch::TestProcess
|
107
184
|
|
108
|
-
|
109
|
-
|
110
|
-
|
185
|
+
# Executes a request simulating GET HTTP method and set/volley the response
|
186
|
+
def get(action, parameters = nil, session = nil, flash = nil)
|
187
|
+
process(action, parameters, session, flash, "GET")
|
188
|
+
end
|
189
|
+
|
190
|
+
# Executes a request simulating POST HTTP method and set/volley the response
|
191
|
+
def post(action, parameters = nil, session = nil, flash = nil)
|
192
|
+
process(action, parameters, session, flash, "POST")
|
193
|
+
end
|
194
|
+
|
195
|
+
# Executes a request simulating PUT HTTP method and set/volley the response
|
196
|
+
def put(action, parameters = nil, session = nil, flash = nil)
|
197
|
+
process(action, parameters, session, flash, "PUT")
|
198
|
+
end
|
199
|
+
|
200
|
+
# Executes a request simulating DELETE HTTP method and set/volley the response
|
201
|
+
def delete(action, parameters = nil, session = nil, flash = nil)
|
202
|
+
process(action, parameters, session, flash, "DELETE")
|
203
|
+
end
|
204
|
+
|
205
|
+
# Executes a request simulating HEAD HTTP method and set/volley the response
|
206
|
+
def head(action, parameters = nil, session = nil, flash = nil)
|
207
|
+
process(action, parameters, session, flash, "HEAD")
|
111
208
|
end
|
112
209
|
|
113
|
-
|
114
|
-
|
115
|
-
|
210
|
+
def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil)
|
211
|
+
@request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
|
212
|
+
@request.env['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
|
213
|
+
returning __send__(request_method, action, parameters, session, flash) do
|
214
|
+
@request.env.delete 'HTTP_X_REQUESTED_WITH'
|
215
|
+
@request.env.delete 'HTTP_ACCEPT'
|
116
216
|
end
|
217
|
+
end
|
218
|
+
alias xhr :xml_http_request
|
117
219
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
220
|
+
def process(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
|
221
|
+
# Sanity check for required instance variables so we can give an
|
222
|
+
# understandable error message.
|
223
|
+
%w(@controller @request @response).each do |iv_name|
|
224
|
+
if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil?
|
225
|
+
raise "#{iv_name} is nil: make sure you set it in your test's setup method."
|
226
|
+
end
|
124
227
|
end
|
228
|
+
|
229
|
+
@request.recycle!
|
230
|
+
@response.recycle!
|
231
|
+
@controller.response_body = nil
|
232
|
+
@controller.formats = nil
|
233
|
+
@controller.params = nil
|
234
|
+
|
235
|
+
@html_document = nil
|
236
|
+
@request.env['REQUEST_METHOD'] = http_method
|
237
|
+
|
238
|
+
parameters ||= {}
|
239
|
+
@request.assign_parameters(@controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters)
|
240
|
+
|
241
|
+
@request.session = ActionController::TestSession.new(session) unless session.nil?
|
242
|
+
@request.session["flash"] = @request.flash.update(flash || {})
|
243
|
+
@request.session["flash"].sweep
|
244
|
+
|
245
|
+
@controller.request = @request
|
246
|
+
@controller.params.merge!(parameters)
|
247
|
+
build_request_uri(action, parameters)
|
248
|
+
Base.class_eval { include Testing }
|
249
|
+
@controller.process_with_new_base_test(@request, @response)
|
250
|
+
@request.session.delete('flash') if @request.session['flash'].blank?
|
251
|
+
@response
|
125
252
|
end
|
126
|
-
|
253
|
+
|
254
|
+
include ActionDispatch::Assertions
|
127
255
|
|
128
256
|
# When the request.remote_addr remains the default for testing, which is 0.0.0.0, the exception is simply raised inline
|
129
257
|
# (bystepping the regular exception handling from rescue_action). If the request.remote_addr is anything else, the regular
|
@@ -197,7 +325,6 @@ module ActionController
|
|
197
325
|
if @controller
|
198
326
|
@controller.request = @request
|
199
327
|
@controller.params = {}
|
200
|
-
@controller.send(:initialize_current_url)
|
201
328
|
end
|
202
329
|
end
|
203
330
|
|
@@ -205,5 +332,16 @@ module ActionController
|
|
205
332
|
def rescue_action_in_public!
|
206
333
|
@request.remote_addr = '208.77.188.166' # example.com
|
207
334
|
end
|
335
|
+
|
336
|
+
private
|
337
|
+
def build_request_uri(action, parameters)
|
338
|
+
unless @request.env['REQUEST_URI']
|
339
|
+
options = @controller.__send__(:rewrite_options, parameters)
|
340
|
+
options.update(:only_path => true, :action => action)
|
341
|
+
|
342
|
+
url = ActionController::UrlRewriter.new(@request, parameters)
|
343
|
+
@request.request_uri = url.rewrite(options)
|
344
|
+
end
|
345
|
+
end
|
208
346
|
end
|
209
347
|
end
|
@@ -1,178 +1,21 @@
|
|
1
|
-
require '
|
1
|
+
require 'active_support/core_ext/hash/except'
|
2
2
|
|
3
3
|
module ActionController
|
4
|
-
# In <b>routes.rb</b> one defines URL-to-controller mappings, but the reverse
|
5
|
-
# is also possible: an URL can be generated from one of your routing definitions.
|
6
|
-
# URL generation functionality is centralized in this module.
|
7
|
-
#
|
8
|
-
# See ActionController::Routing and ActionController::Resources for general
|
9
|
-
# information about routing and routes.rb.
|
10
|
-
#
|
11
|
-
# <b>Tip:</b> If you need to generate URLs from your models or some other place,
|
12
|
-
# then ActionController::UrlWriter is what you're looking for. Read on for
|
13
|
-
# an introduction.
|
14
|
-
#
|
15
|
-
# == URL generation from parameters
|
16
|
-
#
|
17
|
-
# As you may know, some functions - such as ActionController::Base#url_for
|
18
|
-
# and ActionView::Helpers::UrlHelper#link_to, can generate URLs given a set
|
19
|
-
# of parameters. For example, you've probably had the chance to write code
|
20
|
-
# like this in one of your views:
|
21
|
-
#
|
22
|
-
# <%= link_to('Click here', :controller => 'users',
|
23
|
-
# :action => 'new', :message => 'Welcome!') %>
|
24
|
-
#
|
25
|
-
# #=> Generates a link to: /users/new?message=Welcome%21
|
26
|
-
#
|
27
|
-
# link_to, and all other functions that require URL generation functionality,
|
28
|
-
# actually use ActionController::UrlWriter under the hood. And in particular,
|
29
|
-
# they use the ActionController::UrlWriter#url_for method. One can generate
|
30
|
-
# the same path as the above example by using the following code:
|
31
|
-
#
|
32
|
-
# include UrlWriter
|
33
|
-
# url_for(:controller => 'users',
|
34
|
-
# :action => 'new',
|
35
|
-
# :message => 'Welcome!',
|
36
|
-
# :only_path => true)
|
37
|
-
# # => "/users/new?message=Welcome%21"
|
38
|
-
#
|
39
|
-
# Notice the <tt>:only_path => true</tt> part. This is because UrlWriter has no
|
40
|
-
# information about the website hostname that your Rails app is serving. So if you
|
41
|
-
# want to include the hostname as well, then you must also pass the <tt>:host</tt>
|
42
|
-
# argument:
|
43
|
-
#
|
44
|
-
# include UrlWriter
|
45
|
-
# url_for(:controller => 'users',
|
46
|
-
# :action => 'new',
|
47
|
-
# :message => 'Welcome!',
|
48
|
-
# :host => 'www.example.com') # Changed this.
|
49
|
-
# # => "http://www.example.com/users/new?message=Welcome%21"
|
50
|
-
#
|
51
|
-
# By default, all controllers and views have access to a special version of url_for,
|
52
|
-
# that already knows what the current hostname is. So if you use url_for in your
|
53
|
-
# controllers or your views, then you don't need to explicitly pass the <tt>:host</tt>
|
54
|
-
# argument.
|
55
|
-
#
|
56
|
-
# For convenience reasons, mailers provide a shortcut for ActionController::UrlWriter#url_for.
|
57
|
-
# So within mailers, you only have to type 'url_for' instead of 'ActionController::UrlWriter#url_for'
|
58
|
-
# in full. However, mailers don't have hostname information, and what's why you'll still
|
59
|
-
# have to specify the <tt>:host</tt> argument when generating URLs in mailers.
|
60
|
-
#
|
61
|
-
#
|
62
|
-
# == URL generation for named routes
|
63
|
-
#
|
64
|
-
# UrlWriter also allows one to access methods that have been auto-generated from
|
65
|
-
# named routes. For example, suppose that you have a 'users' resource in your
|
66
|
-
# <b>routes.rb</b>:
|
67
|
-
#
|
68
|
-
# map.resources :users
|
69
|
-
#
|
70
|
-
# This generates, among other things, the method <tt>users_path</tt>. By default,
|
71
|
-
# this method is accessible from your controllers, views and mailers. If you need
|
72
|
-
# to access this auto-generated method from other places (such as a model), then
|
73
|
-
# you can do that in two ways.
|
74
|
-
#
|
75
|
-
# The first way is to include ActionController::UrlWriter in your class:
|
76
|
-
#
|
77
|
-
# class User < ActiveRecord::Base
|
78
|
-
# include ActionController::UrlWriter # !!!
|
79
|
-
#
|
80
|
-
# def name=(value)
|
81
|
-
# write_attribute('name', value)
|
82
|
-
# write_attribute('base_uri', users_path) # !!!
|
83
|
-
# end
|
84
|
-
# end
|
85
|
-
#
|
86
|
-
# The second way is to access them through ActionController::UrlWriter.
|
87
|
-
# The autogenerated named routes methods are available as class methods:
|
88
|
-
#
|
89
|
-
# class User < ActiveRecord::Base
|
90
|
-
# def name=(value)
|
91
|
-
# write_attribute('name', value)
|
92
|
-
# path = ActionController::UrlWriter.users_path # !!!
|
93
|
-
# write_attribute('base_uri', path) # !!!
|
94
|
-
# end
|
95
|
-
# end
|
96
|
-
module UrlWriter
|
97
|
-
RESERVED_PCHAR = ':@&=+$,;%'
|
98
|
-
SAFE_PCHAR = "#{URI::REGEXP::PATTERN::UNRESERVED}#{RESERVED_PCHAR}"
|
99
|
-
if RUBY_VERSION >= '1.9'
|
100
|
-
UNSAFE_PCHAR = Regexp.new("[^#{SAFE_PCHAR}]", false).freeze
|
101
|
-
else
|
102
|
-
UNSAFE_PCHAR = Regexp.new("[^#{SAFE_PCHAR}]", false, 'N').freeze
|
103
|
-
end
|
104
|
-
|
105
|
-
def self.included(base) #:nodoc:
|
106
|
-
ActionController::Routing::Routes.install_helpers(base)
|
107
|
-
base.mattr_accessor :default_url_options
|
108
|
-
|
109
|
-
# The default options for urls written by this writer. Typically a <tt>:host</tt> pair is provided.
|
110
|
-
base.default_url_options ||= {}
|
111
|
-
end
|
112
|
-
|
113
|
-
# Generate a url based on the options provided, default_url_options and the
|
114
|
-
# routes defined in routes.rb. The following options are supported:
|
115
|
-
#
|
116
|
-
# * <tt>:only_path</tt> - If true, the relative url is returned. Defaults to +false+.
|
117
|
-
# * <tt>:protocol</tt> - The protocol to connect to. Defaults to 'http'.
|
118
|
-
# * <tt>:host</tt> - Specifies the host the link should be targetted at.
|
119
|
-
# If <tt>:only_path</tt> is false, this option must be
|
120
|
-
# provided either explicitly, or via +default_url_options+.
|
121
|
-
# * <tt>:port</tt> - Optionally specify the port to connect to.
|
122
|
-
# * <tt>:anchor</tt> - An anchor name to be appended to the path.
|
123
|
-
# * <tt>:skip_relative_url_root</tt> - If true, the url is not constructed using the
|
124
|
-
# +relative_url_root+ set in ActionController::Base.relative_url_root.
|
125
|
-
# * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2009/"
|
126
|
-
#
|
127
|
-
# Any other key (<tt>:controller</tt>, <tt>:action</tt>, etc.) given to
|
128
|
-
# +url_for+ is forwarded to the Routes module.
|
129
|
-
#
|
130
|
-
# Examples:
|
131
|
-
#
|
132
|
-
# url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :port=>'8080' # => 'http://somehost.org:8080/tasks/testing'
|
133
|
-
# url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :anchor => 'ok', :only_path => true # => '/tasks/testing#ok'
|
134
|
-
# url_for :controller => 'tasks', :action => 'testing', :trailing_slash=>true # => 'http://somehost.org/tasks/testing/'
|
135
|
-
# url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :number => '33' # => 'http://somehost.org/tasks/testing?number=33'
|
136
|
-
def url_for(options)
|
137
|
-
options = self.class.default_url_options.merge(options)
|
138
|
-
|
139
|
-
url = ''
|
140
|
-
|
141
|
-
unless options.delete(:only_path)
|
142
|
-
url << (options.delete(:protocol) || 'http')
|
143
|
-
url << '://' unless url.match("://")
|
144
|
-
|
145
|
-
raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
|
146
|
-
|
147
|
-
url << options.delete(:host)
|
148
|
-
url << ":#{options.delete(:port)}" if options.key?(:port)
|
149
|
-
else
|
150
|
-
# Delete the unused options to prevent their appearance in the query string.
|
151
|
-
[:protocol, :host, :port, :skip_relative_url_root].each { |k| options.delete(k) }
|
152
|
-
end
|
153
|
-
trailing_slash = options.delete(:trailing_slash) if options.key?(:trailing_slash)
|
154
|
-
url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
|
155
|
-
anchor = "##{URI.escape(options.delete(:anchor).to_param.to_s, UNSAFE_PCHAR)}" if options[:anchor]
|
156
|
-
generated = Routing::Routes.generate(options, {})
|
157
|
-
url << (trailing_slash ? generated.sub(/\?|\z/) { "/" + $& } : generated)
|
158
|
-
url << anchor if anchor
|
159
|
-
|
160
|
-
url
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
4
|
# Rewrites URLs for Base.redirect_to and Base.url_for in the controller.
|
165
5
|
class UrlRewriter #:nodoc:
|
166
6
|
RESERVED_OPTIONS = [:anchor, :params, :only_path, :host, :protocol, :port, :trailing_slash, :skip_relative_url_root]
|
7
|
+
|
167
8
|
def initialize(request, parameters)
|
168
9
|
@request, @parameters = request, parameters
|
169
10
|
end
|
170
11
|
|
171
12
|
def rewrite(options = {})
|
172
|
-
|
173
|
-
|
13
|
+
options[:host] ||= @request.host_with_port
|
14
|
+
options[:protocol] ||= @request.protocol
|
15
|
+
|
16
|
+
self.class.rewrite(options, @request.symbolized_path_parameters) do |options|
|
17
|
+
process_path_options(options)
|
174
18
|
end
|
175
|
-
rewrite_url(options)
|
176
19
|
end
|
177
20
|
|
178
21
|
def to_str
|
@@ -181,49 +24,53 @@ module ActionController
|
|
181
24
|
|
182
25
|
alias_method :to_s, :to_str
|
183
26
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
unless
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
path = rewrite_path(options)
|
198
|
-
rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
|
199
|
-
rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
|
200
|
-
rewritten_url << "##{CGI.escape(options[:anchor].to_param.to_s)}" if options[:anchor]
|
201
|
-
|
202
|
-
rewritten_url
|
27
|
+
def self.rewrite(options, path_segments=nil)
|
28
|
+
rewritten_url = ""
|
29
|
+
|
30
|
+
unless options[:only_path]
|
31
|
+
rewritten_url << (options[:protocol] || "http")
|
32
|
+
rewritten_url << "://" unless rewritten_url.match("://")
|
33
|
+
rewritten_url << rewrite_authentication(options)
|
34
|
+
|
35
|
+
raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
|
36
|
+
|
37
|
+
rewritten_url << options[:host]
|
38
|
+
rewritten_url << ":#{options.delete(:port)}" if options.key?(:port)
|
203
39
|
end
|
204
40
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
41
|
+
path_options = options.except(*RESERVED_OPTIONS)
|
42
|
+
path_options = yield(path_options) if block_given?
|
43
|
+
path = Routing::Routes.generate(path_options, path_segments || {})
|
44
|
+
|
45
|
+
rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
|
46
|
+
rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
|
47
|
+
rewritten_url << "##{Rack::Utils.escape(options[:anchor].to_param.to_s)}" if options[:anchor]
|
209
48
|
|
210
|
-
|
211
|
-
|
212
|
-
options.update(overwrite.symbolize_keys)
|
213
|
-
end
|
49
|
+
rewritten_url
|
50
|
+
end
|
214
51
|
|
215
|
-
|
52
|
+
protected
|
216
53
|
|
217
|
-
|
218
|
-
|
54
|
+
def self.rewrite_authentication(options)
|
55
|
+
if options[:user] && options[:password]
|
56
|
+
"#{Rack::Utils.escape(options.delete(:user))}:#{Rack::Utils.escape(options.delete(:password))}@"
|
57
|
+
else
|
58
|
+
""
|
219
59
|
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Given a Hash of options, generates a route
|
63
|
+
def process_path_options(options)
|
64
|
+
options = options.symbolize_keys
|
65
|
+
options.update(options[:params].symbolize_keys) if options[:params]
|
220
66
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
else
|
225
|
-
""
|
226
|
-
end
|
67
|
+
if (overwrite = options.delete(:overwrite_params))
|
68
|
+
options.update(@parameters.symbolize_keys)
|
69
|
+
options.update(overwrite.symbolize_keys)
|
227
70
|
end
|
71
|
+
|
72
|
+
options
|
73
|
+
end
|
74
|
+
|
228
75
|
end
|
229
76
|
end
|