actionpack_csi 2.3.5.p6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +5184 -0
- data/MIT-LICENSE +21 -0
- data/README +409 -0
- data/RUNNING_UNIT_TESTS +24 -0
- data/Rakefile +160 -0
- data/install.rb +30 -0
- data/lib/action_controller/assertions/dom_assertions.rb +55 -0
- data/lib/action_controller/assertions/model_assertions.rb +21 -0
- data/lib/action_controller/assertions/response_assertions.rb +160 -0
- data/lib/action_controller/assertions/routing_assertions.rb +146 -0
- data/lib/action_controller/assertions/selector_assertions.rb +638 -0
- data/lib/action_controller/assertions/tag_assertions.rb +127 -0
- data/lib/action_controller/base.rb +1423 -0
- data/lib/action_controller/benchmarking.rb +107 -0
- data/lib/action_controller/caching/actions.rb +177 -0
- data/lib/action_controller/caching/fragments.rb +120 -0
- data/lib/action_controller/caching/pages.rb +152 -0
- data/lib/action_controller/caching/sweeper.rb +45 -0
- data/lib/action_controller/caching/sweeping.rb +55 -0
- data/lib/action_controller/caching.rb +71 -0
- data/lib/action_controller/cgi_ext/cookie.rb +112 -0
- data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
- data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
- data/lib/action_controller/cgi_ext.rb +15 -0
- data/lib/action_controller/cgi_process.rb +77 -0
- data/lib/action_controller/cookies.rb +95 -0
- data/lib/action_controller/dispatcher.rb +133 -0
- data/lib/action_controller/failsafe.rb +86 -0
- data/lib/action_controller/filters.rb +680 -0
- data/lib/action_controller/flash.rb +171 -0
- data/lib/action_controller/headers.rb +33 -0
- data/lib/action_controller/helpers.rb +225 -0
- data/lib/action_controller/http_authentication.rb +309 -0
- data/lib/action_controller/integration.rb +692 -0
- data/lib/action_controller/layout.rb +286 -0
- data/lib/action_controller/middleware_stack.rb +119 -0
- data/lib/action_controller/middlewares.rb +14 -0
- data/lib/action_controller/mime_responds.rb +193 -0
- data/lib/action_controller/mime_type.rb +212 -0
- data/lib/action_controller/mime_types.rb +21 -0
- data/lib/action_controller/params_parser.rb +77 -0
- data/lib/action_controller/performance_test.rb +15 -0
- data/lib/action_controller/polymorphic_routes.rb +189 -0
- data/lib/action_controller/rack_lint_patch.rb +36 -0
- data/lib/action_controller/record_identifier.rb +104 -0
- data/lib/action_controller/reloader.rb +54 -0
- data/lib/action_controller/request.rb +493 -0
- data/lib/action_controller/request_forgery_protection.rb +113 -0
- data/lib/action_controller/rescue.rb +183 -0
- data/lib/action_controller/resources.rb +682 -0
- data/lib/action_controller/response.rb +239 -0
- data/lib/action_controller/routing/builder.rb +197 -0
- data/lib/action_controller/routing/optimisations.rb +130 -0
- data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
- data/lib/action_controller/routing/route.rb +265 -0
- data/lib/action_controller/routing/route_set.rb +502 -0
- data/lib/action_controller/routing/routing_ext.rb +49 -0
- data/lib/action_controller/routing/segments.rb +343 -0
- data/lib/action_controller/routing.rb +388 -0
- data/lib/action_controller/session/abstract_store.rb +181 -0
- data/lib/action_controller/session/cookie_store.rb +221 -0
- data/lib/action_controller/session/mem_cache_store.rb +51 -0
- data/lib/action_controller/session_management.rb +54 -0
- data/lib/action_controller/status_codes.rb +88 -0
- data/lib/action_controller/streaming.rb +181 -0
- data/lib/action_controller/string_coercion.rb +29 -0
- data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
- data/lib/action_controller/templates/rescues/_trace.erb +26 -0
- data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
- data/lib/action_controller/templates/rescues/layout.erb +29 -0
- data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
- data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
- data/lib/action_controller/templates/rescues/template_error.erb +21 -0
- data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
- data/lib/action_controller/test_case.rb +209 -0
- data/lib/action_controller/test_process.rb +580 -0
- data/lib/action_controller/translation.rb +13 -0
- data/lib/action_controller/uploaded_file.rb +44 -0
- data/lib/action_controller/url_rewriter.rb +216 -0
- data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
- data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
- data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
- data/lib/action_controller/vendor/html-scanner.rb +16 -0
- data/lib/action_controller/verification.rb +130 -0
- data/lib/action_controller.rb +113 -0
- data/lib/action_pack/version.rb +9 -0
- data/lib/action_pack.rb +24 -0
- data/lib/action_view/base.rb +362 -0
- data/lib/action_view/erb/util.rb +44 -0
- data/lib/action_view/helpers/active_record_helper.rb +305 -0
- data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
- data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
- data/lib/action_view/helpers/benchmark_helper.rb +54 -0
- data/lib/action_view/helpers/cache_helper.rb +39 -0
- data/lib/action_view/helpers/capture_helper.rb +136 -0
- data/lib/action_view/helpers/date_helper.rb +988 -0
- data/lib/action_view/helpers/debug_helper.rb +38 -0
- data/lib/action_view/helpers/form_helper.rb +1074 -0
- data/lib/action_view/helpers/form_options_helper.rb +600 -0
- data/lib/action_view/helpers/form_tag_helper.rb +487 -0
- data/lib/action_view/helpers/javascript_helper.rb +208 -0
- data/lib/action_view/helpers/number_helper.rb +308 -0
- data/lib/action_view/helpers/prototype_helper.rb +1305 -0
- data/lib/action_view/helpers/raw_output_helper.rb +9 -0
- data/lib/action_view/helpers/record_identification_helper.rb +20 -0
- data/lib/action_view/helpers/record_tag_helper.rb +58 -0
- data/lib/action_view/helpers/sanitize_helper.rb +259 -0
- data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
- data/lib/action_view/helpers/tag_helper.rb +150 -0
- data/lib/action_view/helpers/text_helper.rb +587 -0
- data/lib/action_view/helpers/translation_helper.rb +39 -0
- data/lib/action_view/helpers/url_helper.rb +639 -0
- data/lib/action_view/helpers.rb +59 -0
- data/lib/action_view/inline_template.rb +19 -0
- data/lib/action_view/locale/en.yml +117 -0
- data/lib/action_view/partials.rb +240 -0
- data/lib/action_view/paths.rb +69 -0
- data/lib/action_view/reloadable_template.rb +117 -0
- data/lib/action_view/renderable.rb +95 -0
- data/lib/action_view/renderable_partial.rb +47 -0
- data/lib/action_view/safe_buffer.rb +28 -0
- data/lib/action_view/template.rb +252 -0
- data/lib/action_view/template_error.rb +99 -0
- data/lib/action_view/template_handler.rb +34 -0
- data/lib/action_view/template_handlers/builder.rb +17 -0
- data/lib/action_view/template_handlers/erb.rb +22 -0
- data/lib/action_view/template_handlers/rjs.rb +13 -0
- data/lib/action_view/template_handlers.rb +48 -0
- data/lib/action_view/test_case.rb +162 -0
- data/lib/action_view.rb +58 -0
- data/lib/actionpack.rb +2 -0
- data/test/abstract_unit.rb +61 -0
- data/test/active_record_unit.rb +104 -0
- data/test/activerecord/active_record_store_test.rb +174 -0
- data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
- data/test/adv_attr_test.rb +20 -0
- data/test/controller/action_pack_assertions_test.rb +543 -0
- data/test/controller/addresses_render_test.rb +37 -0
- data/test/controller/assert_select_test.rb +734 -0
- data/test/controller/base_test.rb +217 -0
- data/test/controller/benchmark_test.rb +32 -0
- data/test/controller/caching_test.rb +729 -0
- data/test/controller/capture_test.rb +66 -0
- data/test/controller/content_type_test.rb +168 -0
- 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 +134 -0
- data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
- data/test/controller/dispatcher_test.rb +144 -0
- data/test/controller/dom_assertions_test.rb +53 -0
- data/test/controller/failsafe_test.rb +60 -0
- data/test/controller/fake_controllers.rb +33 -0
- data/test/controller/fake_models.rb +19 -0
- data/test/controller/filter_params_test.rb +52 -0
- data/test/controller/filters_test.rb +885 -0
- data/test/controller/flash_test.rb +147 -0
- data/test/controller/header_test.rb +14 -0
- data/test/controller/helper_test.rb +224 -0
- data/test/controller/html-scanner/cdata_node_test.rb +15 -0
- data/test/controller/html-scanner/document_test.rb +148 -0
- data/test/controller/html-scanner/node_test.rb +89 -0
- data/test/controller/html-scanner/sanitizer_test.rb +274 -0
- data/test/controller/html-scanner/tag_node_test.rb +238 -0
- data/test/controller/html-scanner/text_node_test.rb +50 -0
- data/test/controller/html-scanner/tokenizer_test.rb +131 -0
- data/test/controller/http_basic_authentication_test.rb +113 -0
- data/test/controller/http_digest_authentication_test.rb +254 -0
- data/test/controller/integration_test.rb +483 -0
- data/test/controller/layout_test.rb +215 -0
- data/test/controller/logging_test.rb +46 -0
- data/test/controller/middleware_stack_test.rb +90 -0
- data/test/controller/mime_responds_test.rb +536 -0
- data/test/controller/mime_type_test.rb +93 -0
- data/test/controller/polymorphic_routes_test.rb +297 -0
- data/test/controller/rack_test.rb +311 -0
- data/test/controller/record_identifier_test.rb +139 -0
- data/test/controller/redirect_test.rb +285 -0
- data/test/controller/reloader_test.rb +124 -0
- data/test/controller/render_test.rb +1762 -0
- data/test/controller/request/json_params_parsing_test.rb +65 -0
- data/test/controller/request/multipart_params_parsing_test.rb +162 -0
- data/test/controller/request/query_string_parsing_test.rb +120 -0
- data/test/controller/request/test_request_test.rb +35 -0
- data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
- data/test/controller/request/xml_params_parsing_test.rb +103 -0
- data/test/controller/request_forgery_protection_test.rb +265 -0
- data/test/controller/request_test.rb +395 -0
- data/test/controller/rescue_test.rb +536 -0
- data/test/controller/resources_test.rb +1393 -0
- data/test/controller/routing_test.rb +2591 -0
- data/test/controller/selector_test.rb +628 -0
- data/test/controller/send_file_test.rb +171 -0
- data/test/controller/session/cookie_store_test.rb +216 -0
- data/test/controller/session/mem_cache_store_test.rb +127 -0
- data/test/controller/session/test_session_test.rb +58 -0
- data/test/controller/test_test.rb +700 -0
- data/test/controller/translation_test.rb +26 -0
- data/test/controller/url_rewriter_test.rb +385 -0
- data/test/controller/verification_test.rb +270 -0
- data/test/controller/view_paths_test.rb +141 -0
- data/test/controller/webservice_test.rb +273 -0
- data/test/fixtures/_top_level_partial.html.erb +1 -0
- data/test/fixtures/_top_level_partial_only.erb +1 -0
- data/test/fixtures/addresses/list.erb +1 -0
- data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
- data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
- data/test/fixtures/companies.yml +24 -0
- data/test/fixtures/company.rb +10 -0
- data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
- data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
- data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
- data/test/fixtures/customers/_customer.html.erb +1 -0
- data/test/fixtures/db_definitions/sqlite.sql +49 -0
- data/test/fixtures/developer.rb +9 -0
- data/test/fixtures/developers/_developer.erb +1 -0
- data/test/fixtures/developers.yml +21 -0
- data/test/fixtures/developers_projects.yml +13 -0
- data/test/fixtures/failsafe/500.html +1 -0
- data/test/fixtures/fun/games/_game.erb +1 -0
- data/test/fixtures/fun/games/hello_world.erb +1 -0
- data/test/fixtures/fun/serious/games/_game.erb +1 -0
- data/test/fixtures/functional_caching/_partial.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
- data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
- data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
- data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
- data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
- data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
- data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
- data/test/fixtures/helpers/abc_helper.rb +5 -0
- data/test/fixtures/helpers/fun/games_helper.rb +3 -0
- data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
- data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
- data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
- data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
- data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
- data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
- data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
- data/test/fixtures/layouts/_column.html.erb +2 -0
- data/test/fixtures/layouts/block_with_layout.erb +3 -0
- data/test/fixtures/layouts/builder.builder +3 -0
- data/test/fixtures/layouts/default_html.html.erb +1 -0
- data/test/fixtures/layouts/partial_with_layout.erb +3 -0
- data/test/fixtures/layouts/standard.erb +1 -0
- data/test/fixtures/layouts/talk_from_action.erb +2 -0
- data/test/fixtures/layouts/xhr.html.erb +2 -0
- data/test/fixtures/layouts/yield.erb +2 -0
- data/test/fixtures/mascot.rb +3 -0
- data/test/fixtures/mascots/_mascot.html.erb +1 -0
- data/test/fixtures/mascots.yml +4 -0
- data/test/fixtures/multipart/binary_file +0 -0
- data/test/fixtures/multipart/boundary_problem_file +10 -0
- data/test/fixtures/multipart/bracketed_param +5 -0
- data/test/fixtures/multipart/empty +10 -0
- data/test/fixtures/multipart/hello.txt +1 -0
- data/test/fixtures/multipart/large_text_file +10 -0
- data/test/fixtures/multipart/mixed_files +0 -0
- data/test/fixtures/multipart/mona_lisa.jpg +0 -0
- data/test/fixtures/multipart/none +9 -0
- data/test/fixtures/multipart/single_parameter +5 -0
- data/test/fixtures/multipart/text_file +10 -0
- data/test/fixtures/override/test/hello_world.erb +1 -0
- data/test/fixtures/override2/layouts/test/sub.erb +1 -0
- data/test/fixtures/post_test/layouts/post.html.erb +1 -0
- data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
- data/test/fixtures/post_test/post/index.html.erb +1 -0
- data/test/fixtures/post_test/post/index.iphone.erb +1 -0
- data/test/fixtures/post_test/super_post/index.html.erb +1 -0
- data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
- data/test/fixtures/project.rb +3 -0
- data/test/fixtures/projects/_project.erb +1 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/public/404.html +1 -0
- data/test/fixtures/public/500.da.html +1 -0
- data/test/fixtures/public/500.html +1 -0
- data/test/fixtures/public/absolute/test.css +23 -0
- data/test/fixtures/public/absolute/test.js +63 -0
- data/test/fixtures/public/images/rails.png +0 -0
- data/test/fixtures/public/javascripts/application.js +1 -0
- data/test/fixtures/public/javascripts/bank.js +1 -0
- data/test/fixtures/public/javascripts/controls.js +1 -0
- data/test/fixtures/public/javascripts/dragdrop.js +1 -0
- data/test/fixtures/public/javascripts/effects.js +1 -0
- data/test/fixtures/public/javascripts/prototype.js +1 -0
- data/test/fixtures/public/javascripts/robber.js +1 -0
- data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
- data/test/fixtures/public/javascripts/version.1.0.js +1 -0
- data/test/fixtures/public/stylesheets/bank.css +1 -0
- data/test/fixtures/public/stylesheets/robber.css +1 -0
- data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
- data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
- data/test/fixtures/quiz/questions/_question.html.erb +1 -0
- data/test/fixtures/replies/_reply.erb +1 -0
- data/test/fixtures/replies.yml +15 -0
- data/test/fixtures/reply.rb +7 -0
- data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
- data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
- data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
- data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
- data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
- data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
- data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
- data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
- data/test/fixtures/scope/test/modgreet.erb +1 -0
- data/test/fixtures/shared.html.erb +1 -0
- data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
- data/test/fixtures/test/_counter.html.erb +1 -0
- data/test/fixtures/test/_customer.erb +1 -0
- data/test/fixtures/test/_customer_counter.erb +1 -0
- data/test/fixtures/test/_customer_greeting.erb +1 -0
- data/test/fixtures/test/_customer_with_var.erb +1 -0
- data/test/fixtures/test/_form.erb +1 -0
- data/test/fixtures/test/_from_helper.erb +1 -0
- data/test/fixtures/test/_hash_greeting.erb +1 -0
- data/test/fixtures/test/_hash_object.erb +2 -0
- data/test/fixtures/test/_hello.builder +1 -0
- data/test/fixtures/test/_labelling_form.erb +1 -0
- data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
- data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
- data/test/fixtures/test/_local_inspector.html.erb +1 -0
- data/test/fixtures/test/_one.html.erb +1 -0
- data/test/fixtures/test/_partial.erb +1 -0
- data/test/fixtures/test/_partial.html.erb +1 -0
- data/test/fixtures/test/_partial.js.erb +1 -0
- data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
- data/test/fixtures/test/_partial_only.erb +1 -0
- data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
- data/test/fixtures/test/_person.erb +2 -0
- data/test/fixtures/test/_raise.html.erb +1 -0
- data/test/fixtures/test/_two.html.erb +1 -0
- data/test/fixtures/test/action_talk_to_layout.erb +2 -0
- data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
- data/test/fixtures/test/capturing.erb +4 -0
- data/test/fixtures/test/content_for.erb +2 -0
- data/test/fixtures/test/content_for_concatenated.erb +3 -0
- data/test/fixtures/test/content_for_with_parameter.erb +2 -0
- data/test/fixtures/test/delete_with_js.rjs +2 -0
- data/test/fixtures/test/dont_pick_me +1 -0
- data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/enum_rjs_test.rjs +6 -0
- data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.builder +1 -0
- data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
- data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
- data/test/fixtures/test/greeting.erb +1 -0
- data/test/fixtures/test/greeting.js.rjs +1 -0
- data/test/fixtures/test/hello.builder +4 -0
- data/test/fixtures/test/hello_world.da.html.erb +1 -0
- data/test/fixtures/test/hello_world.erb +1 -0
- data/test/fixtures/test/hello_world.erb~ +1 -0
- data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
- data/test/fixtures/test/hello_world_container.builder +3 -0
- data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
- data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
- data/test/fixtures/test/hello_xml_world.builder +11 -0
- data/test/fixtures/test/hyphen-ated.erb +1 -0
- data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
- data/test/fixtures/test/list.erb +1 -0
- data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.erb~ +1 -0
- data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
- data/test/fixtures/test/nested_layout.erb +3 -0
- data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
- data/test/fixtures/test/potential_conflicts.erb +4 -0
- data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
- data/test/fixtures/test/render_file_from_template.html.erb +1 -0
- data/test/fixtures/test/render_file_with_ivar.erb +1 -0
- data/test/fixtures/test/render_file_with_locals.erb +1 -0
- data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
- data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
- data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
- data/test/fixtures/test/render_to_string_test.erb +1 -0
- data/test/fixtures/test/sub_template_raise.html.erb +1 -0
- data/test/fixtures/test/template.erb +1 -0
- data/test/fixtures/test/update_element_with_capture.erb +9 -0
- data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
- data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
- data/test/fixtures/test/utf8.html.erb +2 -0
- data/test/fixtures/topic.rb +3 -0
- data/test/fixtures/topics/_topic.html.erb +1 -0
- data/test/fixtures/topics.yml +22 -0
- data/test/template/active_record_helper_i18n_test.rb +44 -0
- data/test/template/active_record_helper_test.rb +302 -0
- data/test/template/asset_tag_helper_test.rb +771 -0
- data/test/template/atom_feed_helper_test.rb +315 -0
- data/test/template/benchmark_helper_test.rb +86 -0
- data/test/template/compiled_templates_test.rb +204 -0
- data/test/template/date_helper_i18n_test.rb +121 -0
- data/test/template/date_helper_test.rb +2485 -0
- data/test/template/erb_util_test.rb +24 -0
- data/test/template/form_helper_test.rb +1393 -0
- data/test/template/form_options_helper_i18n_test.rb +27 -0
- data/test/template/form_options_helper_test.rb +807 -0
- data/test/template/form_tag_helper_test.rb +344 -0
- data/test/template/javascript_helper_test.rb +106 -0
- data/test/template/number_helper_i18n_test.rb +69 -0
- data/test/template/number_helper_test.rb +132 -0
- data/test/template/prototype_helper_test.rb +639 -0
- data/test/template/raw_output_helper_test.rb +21 -0
- data/test/template/record_tag_helper_test.rb +58 -0
- data/test/template/render_test.rb +290 -0
- data/test/template/sanitize_helper_test.rb +57 -0
- data/test/template/scriptaculous_helper_test.rb +90 -0
- data/test/template/tag_helper_test.rb +98 -0
- data/test/template/template_test.rb +32 -0
- data/test/template/test_test.rb +54 -0
- data/test/template/text_helper_test.rb +543 -0
- data/test/template/translation_helper_test.rb +32 -0
- data/test/template/url_helper_test.rb +622 -0
- data/test/testing_sandbox.rb +15 -0
- data/test/view/safe_buffer_test.rb +36 -0
- data/test/view/test_case_test.rb +176 -0
- metadata +531 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module ActionView
|
|
4
|
+
# NOTE: The template that this mixin is being included into is frozen
|
|
5
|
+
# so you cannot set or modify any instance variables
|
|
6
|
+
module Renderable #:nodoc:
|
|
7
|
+
extend ActiveSupport::Memoizable
|
|
8
|
+
|
|
9
|
+
def filename
|
|
10
|
+
'compiled-template'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def handler
|
|
14
|
+
Template.handler_class_for_extension(extension)
|
|
15
|
+
end
|
|
16
|
+
memoize :handler
|
|
17
|
+
|
|
18
|
+
def compiled_source
|
|
19
|
+
handler.call(self)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def method_name_without_locals
|
|
23
|
+
['_run', extension, method_segment].compact.join('_')
|
|
24
|
+
end
|
|
25
|
+
memoize :method_name_without_locals
|
|
26
|
+
|
|
27
|
+
def render(view, local_assigns = {})
|
|
28
|
+
compile(local_assigns)
|
|
29
|
+
|
|
30
|
+
view.with_template self do
|
|
31
|
+
view.send(:_evaluate_assigns_and_ivars)
|
|
32
|
+
view.send(:_set_controller_content_type, mime_type) if respond_to?(:mime_type)
|
|
33
|
+
|
|
34
|
+
view.send(method_name(local_assigns), local_assigns) do |*names|
|
|
35
|
+
ivar = :@_proc_for_layout
|
|
36
|
+
if !view.instance_variable_defined?(:"@content_for_#{names.first}") && view.instance_variable_defined?(ivar) && (proc = view.instance_variable_get(ivar))
|
|
37
|
+
view.capture(*names, &proc)
|
|
38
|
+
elsif view.instance_variable_defined?(ivar = :"@content_for_#{names.first || :layout}")
|
|
39
|
+
view.instance_variable_get(ivar)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def method_name(local_assigns)
|
|
46
|
+
if local_assigns && local_assigns.any?
|
|
47
|
+
method_name = method_name_without_locals.dup
|
|
48
|
+
method_name << "_locals_#{local_assigns.keys.map { |k| k.to_s }.sort.join('_')}"
|
|
49
|
+
else
|
|
50
|
+
method_name = method_name_without_locals
|
|
51
|
+
end
|
|
52
|
+
method_name.to_sym
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
# Compile and evaluate the template's code (if necessary)
|
|
57
|
+
def compile(local_assigns)
|
|
58
|
+
render_symbol = method_name(local_assigns)
|
|
59
|
+
|
|
60
|
+
if !Base::CompiledTemplates.method_defined?(render_symbol) || recompile?
|
|
61
|
+
compile!(render_symbol, local_assigns)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def compile!(render_symbol, local_assigns)
|
|
66
|
+
locals_code = local_assigns.keys.map { |key| "#{key} = local_assigns[:#{key}];" }.join
|
|
67
|
+
|
|
68
|
+
source = <<-end_src
|
|
69
|
+
def #{render_symbol}(local_assigns)
|
|
70
|
+
old_output_buffer = output_buffer;#{locals_code};#{compiled_source}
|
|
71
|
+
ensure
|
|
72
|
+
self.output_buffer = old_output_buffer
|
|
73
|
+
end
|
|
74
|
+
end_src
|
|
75
|
+
|
|
76
|
+
begin
|
|
77
|
+
ActionView::Base::CompiledTemplates.module_eval(source, filename, 0)
|
|
78
|
+
rescue Errno::ENOENT => e
|
|
79
|
+
raise e # Missing template file, re-raise for Base to rescue
|
|
80
|
+
rescue Exception => e # errors from template code
|
|
81
|
+
if logger = defined?(ActionController) && Base.logger
|
|
82
|
+
logger.debug "ERROR: compiling #{render_symbol} RAISED #{e}"
|
|
83
|
+
logger.debug "Function body: #{source}"
|
|
84
|
+
logger.debug "Backtrace: #{e.backtrace.join("\n")}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
raise ActionView::TemplateError.new(self, {}, e)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def recompile?
|
|
92
|
+
false
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
# NOTE: The template that this mixin is being included into is frozen
|
|
3
|
+
# so you cannot set or modify any instance variables
|
|
4
|
+
module RenderablePartial #:nodoc:
|
|
5
|
+
extend ActiveSupport::Memoizable
|
|
6
|
+
|
|
7
|
+
def variable_name
|
|
8
|
+
name.sub(/\A_/, '').to_sym
|
|
9
|
+
end
|
|
10
|
+
memoize :variable_name
|
|
11
|
+
|
|
12
|
+
def counter_name
|
|
13
|
+
"#{variable_name}_counter".to_sym
|
|
14
|
+
end
|
|
15
|
+
memoize :counter_name
|
|
16
|
+
|
|
17
|
+
def render(view, local_assigns = {})
|
|
18
|
+
if defined? ActionController
|
|
19
|
+
ActionController::Base.benchmark("Rendered #{path_without_format_and_extension}", Logger::DEBUG, false) do
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
else
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def render_partial(view, object = nil, local_assigns = {}, as = nil)
|
|
28
|
+
object ||= local_assigns[:object] || local_assigns[variable_name]
|
|
29
|
+
|
|
30
|
+
if object.nil? && view.respond_to?(:controller)
|
|
31
|
+
ivar = :"@#{variable_name}"
|
|
32
|
+
object =
|
|
33
|
+
if view.controller.instance_variable_defined?(ivar)
|
|
34
|
+
ActiveSupport::Deprecation::DeprecatedObjectProxy.new(
|
|
35
|
+
view.controller.instance_variable_get(ivar),
|
|
36
|
+
"#{ivar} will no longer be implicitly assigned to #{variable_name}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Ensure correct object is reassigned to other accessors
|
|
41
|
+
local_assigns[:object] = local_assigns[variable_name] = object
|
|
42
|
+
local_assigns[as] = object if as
|
|
43
|
+
|
|
44
|
+
render_template(view, local_assigns)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
module ActionView #:nodoc:
|
|
3
|
+
class SafeBuffer < String
|
|
4
|
+
def <<(value)
|
|
5
|
+
if value.html_safe?
|
|
6
|
+
super(value)
|
|
7
|
+
else
|
|
8
|
+
super(ERB::Util.h(value))
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def concat(value)
|
|
13
|
+
self << value
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def html_safe?
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def html_safe!
|
|
21
|
+
self
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_s
|
|
25
|
+
self
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
module ActionView #:nodoc:
|
|
2
|
+
class Template
|
|
3
|
+
class Path
|
|
4
|
+
attr_reader :path, :paths
|
|
5
|
+
delegate :hash, :inspect, :to => :path
|
|
6
|
+
|
|
7
|
+
def initialize(path)
|
|
8
|
+
raise ArgumentError, "path already is a Path class" if path.is_a?(Path)
|
|
9
|
+
@path = (path.ends_with?(File::SEPARATOR) ? path.to(-2) : path).freeze
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_s
|
|
13
|
+
if defined?(RAILS_ROOT)
|
|
14
|
+
path.to_s.sub(/^#{Regexp.escape(File.expand_path(RAILS_ROOT))}\//, '')
|
|
15
|
+
else
|
|
16
|
+
path.to_s
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_str
|
|
21
|
+
path.to_str
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def ==(path)
|
|
25
|
+
to_str == path.to_str
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def eql?(path)
|
|
29
|
+
to_str == path.to_str
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Returns a ActionView::Template object for the given path string. The
|
|
33
|
+
# input path should be relative to the view path directory,
|
|
34
|
+
# +hello/index.html.erb+. This method also has a special exception to
|
|
35
|
+
# match partial file names without a handler extension. So
|
|
36
|
+
# +hello/index.html+ will match the first template it finds with a
|
|
37
|
+
# known template extension, +hello/index.html.erb+. Template extensions
|
|
38
|
+
# should not be confused with format extensions +html+, +js+, +xml+,
|
|
39
|
+
# etc. A format must be supplied to match a formated file. +hello/index+
|
|
40
|
+
# will never match +hello/index.html.erb+.
|
|
41
|
+
def [](path)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def load!
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.new_and_loaded(path)
|
|
48
|
+
returning new(path) do |path|
|
|
49
|
+
path.load!
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
def relative_path_for_template_file(full_file_path)
|
|
55
|
+
full_file_path.split("#{@path}/").last
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class EagerPath < Path
|
|
60
|
+
def initialize(path)
|
|
61
|
+
super
|
|
62
|
+
@loaded = false
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def load!
|
|
66
|
+
return if @loaded
|
|
67
|
+
|
|
68
|
+
@paths = {}
|
|
69
|
+
templates_in_path do |template|
|
|
70
|
+
template.load!
|
|
71
|
+
template.accessible_paths.each do |path|
|
|
72
|
+
@paths[path] = template
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
@paths.freeze
|
|
76
|
+
@loaded = true
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def [](path)
|
|
80
|
+
load! unless @loaded
|
|
81
|
+
@paths[path]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
private
|
|
85
|
+
def templates_in_path
|
|
86
|
+
(Dir.glob("#{@path}/**/*/**") | Dir.glob("#{@path}/**")).each do |file|
|
|
87
|
+
yield create_template(file) unless File.directory?(file)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def create_template(file)
|
|
92
|
+
Template.new(relative_path_for_template_file(file), self)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
extend TemplateHandlers
|
|
97
|
+
extend ActiveSupport::Memoizable
|
|
98
|
+
include Renderable
|
|
99
|
+
|
|
100
|
+
# Templates that are exempt from layouts
|
|
101
|
+
@@exempt_from_layout = Set.new([/\.rjs$/])
|
|
102
|
+
|
|
103
|
+
# Don't render layouts for templates with the given extensions.
|
|
104
|
+
def self.exempt_from_layout(*extensions)
|
|
105
|
+
regexps = extensions.collect do |extension|
|
|
106
|
+
extension.is_a?(Regexp) ? extension : /\.#{Regexp.escape(extension.to_s)}$/
|
|
107
|
+
end
|
|
108
|
+
@@exempt_from_layout.merge(regexps)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
attr_accessor :template_path, :load_path, :base_path
|
|
112
|
+
attr_accessor :locale, :name, :format, :extension
|
|
113
|
+
attr_writer :filename
|
|
114
|
+
delegate :to_s, :to => :path
|
|
115
|
+
|
|
116
|
+
def initialize(template_path, load_path = nil)
|
|
117
|
+
@template_path, @load_path = template_path.dup, load_path
|
|
118
|
+
@base_path, @name, @locale, @format, @extension = split(template_path)
|
|
119
|
+
@base_path.to_s.gsub!(/\/$/, '') # Push to split method
|
|
120
|
+
|
|
121
|
+
# Extend with partial super powers
|
|
122
|
+
extend RenderablePartial if @name =~ /^_/
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def accessible_paths
|
|
126
|
+
paths = []
|
|
127
|
+
|
|
128
|
+
if valid_extension?(extension)
|
|
129
|
+
paths << path
|
|
130
|
+
paths << path_without_extension
|
|
131
|
+
if multipart?
|
|
132
|
+
formats = format.split(".")
|
|
133
|
+
paths << "#{path_without_format_and_extension}.#{formats.first}"
|
|
134
|
+
paths << "#{path_without_format_and_extension}.#{formats.second}"
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
# template without explicit template handler should only be reachable through its exact path
|
|
138
|
+
paths << template_path
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
paths
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def format_and_extension
|
|
145
|
+
(extensions = [format, extension].compact.join(".")).blank? ? nil : extensions
|
|
146
|
+
end
|
|
147
|
+
memoize :format_and_extension
|
|
148
|
+
|
|
149
|
+
def multipart?
|
|
150
|
+
format && format.include?('.')
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def content_type
|
|
154
|
+
format.gsub('.', '/')
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def mime_type
|
|
158
|
+
Mime::Type.lookup_by_extension(format) if format && defined?(::Mime)
|
|
159
|
+
end
|
|
160
|
+
memoize :mime_type
|
|
161
|
+
|
|
162
|
+
def path
|
|
163
|
+
[base_path, [name, locale, format, extension].compact.join('.')].compact.join('/')
|
|
164
|
+
end
|
|
165
|
+
memoize :path
|
|
166
|
+
|
|
167
|
+
def path_without_extension
|
|
168
|
+
[base_path, [name, locale, format].compact.join('.')].compact.join('/')
|
|
169
|
+
end
|
|
170
|
+
memoize :path_without_extension
|
|
171
|
+
|
|
172
|
+
def path_without_format_and_extension
|
|
173
|
+
[base_path, [name, locale].compact.join('.')].compact.join('/')
|
|
174
|
+
end
|
|
175
|
+
memoize :path_without_format_and_extension
|
|
176
|
+
|
|
177
|
+
def relative_path
|
|
178
|
+
path = File.expand_path(filename)
|
|
179
|
+
path.sub!(/^#{Regexp.escape(File.expand_path(RAILS_ROOT))}\//, '') if defined?(RAILS_ROOT)
|
|
180
|
+
path
|
|
181
|
+
end
|
|
182
|
+
memoize :relative_path
|
|
183
|
+
|
|
184
|
+
def exempt_from_layout?
|
|
185
|
+
@@exempt_from_layout.any? { |exempted| path =~ exempted }
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def filename
|
|
189
|
+
# no load_path means this is an "absolute pathed" template
|
|
190
|
+
load_path ? File.join(load_path, template_path) : template_path
|
|
191
|
+
end
|
|
192
|
+
memoize :filename
|
|
193
|
+
|
|
194
|
+
def source
|
|
195
|
+
File.read(filename)
|
|
196
|
+
end
|
|
197
|
+
memoize :source
|
|
198
|
+
|
|
199
|
+
def method_segment
|
|
200
|
+
relative_path.to_s.gsub(/([^a-zA-Z0-9_])/) { $1.ord }
|
|
201
|
+
end
|
|
202
|
+
memoize :method_segment
|
|
203
|
+
|
|
204
|
+
def render_template(view, local_assigns = {})
|
|
205
|
+
render(view, local_assigns)
|
|
206
|
+
rescue Exception => e
|
|
207
|
+
raise e unless filename
|
|
208
|
+
if TemplateError === e
|
|
209
|
+
e.sub_template_of(self)
|
|
210
|
+
raise e
|
|
211
|
+
else
|
|
212
|
+
raise TemplateError.new(self, view.assigns, e)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def load!
|
|
217
|
+
freeze
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
private
|
|
221
|
+
def valid_extension?(extension)
|
|
222
|
+
!Template.registered_template_handler(extension).nil?
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def valid_locale?(locale)
|
|
226
|
+
locale && I18n.available_locales.include?(locale.to_sym)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Returns file split into an array
|
|
230
|
+
# [base_path, name, locale, format, extension]
|
|
231
|
+
def split(file)
|
|
232
|
+
if m = file.to_s.match(/^(.*\/)?([^\.]+)\.(.*)$/)
|
|
233
|
+
[m[1], m[2], *parse_extensions(m[3])]
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# returns parsed extensions as an array
|
|
238
|
+
# [locale, format, extension]
|
|
239
|
+
def parse_extensions(extensions)
|
|
240
|
+
exts = extensions.split(".")
|
|
241
|
+
|
|
242
|
+
if extension = valid_extension?(exts.last) && exts.pop || nil
|
|
243
|
+
locale = valid_locale?(exts.first) && exts.shift || nil
|
|
244
|
+
format = exts.join('.') if exts.any? # join('.') is needed for multipart templates
|
|
245
|
+
else # no extension, just format
|
|
246
|
+
format = exts.last
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
[locale, format, extension]
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
# The TemplateError exception is raised when the compilation of the template fails. This exception then gathers a
|
|
3
|
+
# bunch of intimate details and uses it to report a very precise exception message.
|
|
4
|
+
class TemplateError < ActionViewError #:nodoc:
|
|
5
|
+
SOURCE_CODE_RADIUS = 3
|
|
6
|
+
|
|
7
|
+
attr_reader :original_exception
|
|
8
|
+
|
|
9
|
+
def initialize(template, assigns, original_exception)
|
|
10
|
+
@template, @assigns, @original_exception = template, assigns.dup, original_exception
|
|
11
|
+
@backtrace = compute_backtrace
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def file_name
|
|
15
|
+
@template.relative_path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def message
|
|
19
|
+
ActiveSupport::Deprecation.silence { original_exception.message }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def clean_backtrace
|
|
23
|
+
if defined?(Rails) && Rails.respond_to?(:backtrace_cleaner)
|
|
24
|
+
Rails.backtrace_cleaner.clean(original_exception.backtrace)
|
|
25
|
+
else
|
|
26
|
+
original_exception.backtrace
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def sub_template_message
|
|
31
|
+
if @sub_templates
|
|
32
|
+
"Trace of template inclusion: " +
|
|
33
|
+
@sub_templates.collect { |template| template.relative_path }.join(", ")
|
|
34
|
+
else
|
|
35
|
+
""
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def source_extract(indentation = 0)
|
|
40
|
+
return unless num = line_number
|
|
41
|
+
num = num.to_i
|
|
42
|
+
|
|
43
|
+
source_code = @template.source.split("\n")
|
|
44
|
+
|
|
45
|
+
start_on_line = [ num - SOURCE_CODE_RADIUS - 1, 0 ].max
|
|
46
|
+
end_on_line = [ num + SOURCE_CODE_RADIUS - 1, source_code.length].min
|
|
47
|
+
|
|
48
|
+
indent = ' ' * indentation
|
|
49
|
+
line_counter = start_on_line
|
|
50
|
+
return unless source_code = source_code[start_on_line..end_on_line]
|
|
51
|
+
|
|
52
|
+
source_code.sum do |line|
|
|
53
|
+
line_counter += 1
|
|
54
|
+
"#{indent}#{line_counter}: #{line}\n"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def sub_template_of(template_path)
|
|
59
|
+
@sub_templates ||= []
|
|
60
|
+
@sub_templates << template_path
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def line_number
|
|
64
|
+
@line_number ||=
|
|
65
|
+
if file_name
|
|
66
|
+
regexp = /#{Regexp.escape File.basename(file_name)}:(\d+)/
|
|
67
|
+
|
|
68
|
+
$1 if message =~ regexp or clean_backtrace.find { |line| line =~ regexp }
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def to_s
|
|
73
|
+
"\n#{self.class} (#{message}) #{source_location}:\n" +
|
|
74
|
+
"#{source_extract}\n #{clean_backtrace.join("\n ")}\n\n"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# don't do anything nontrivial here. Any raised exception from here becomes fatal
|
|
78
|
+
# (and can't be rescued).
|
|
79
|
+
def backtrace
|
|
80
|
+
@backtrace
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
def compute_backtrace
|
|
85
|
+
[
|
|
86
|
+
"#{source_location.capitalize}\n\n#{source_extract(4)}\n " +
|
|
87
|
+
clean_backtrace.join("\n ")
|
|
88
|
+
]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def source_location
|
|
92
|
+
if line_number
|
|
93
|
+
"on line ##{line_number} of "
|
|
94
|
+
else
|
|
95
|
+
'in '
|
|
96
|
+
end + file_name
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Legacy TemplateHandler stub
|
|
2
|
+
module ActionView
|
|
3
|
+
module TemplateHandlers #:nodoc:
|
|
4
|
+
module Compilable
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend(ClassMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
def call(template)
|
|
11
|
+
new.compile(template)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def compile(template)
|
|
16
|
+
raise "Need to implement #{self.class.name}#compile(template)"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class TemplateHandler
|
|
22
|
+
def self.call(template)
|
|
23
|
+
"#{name}.new(self).render(template, local_assigns)"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize(view = nil)
|
|
27
|
+
@view = view
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def render(template, local_assigns)
|
|
31
|
+
raise "Need to implement #{self.class.name}#render(template, local_assigns)"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'builder'
|
|
2
|
+
|
|
3
|
+
module ActionView
|
|
4
|
+
module TemplateHandlers
|
|
5
|
+
class Builder < TemplateHandler
|
|
6
|
+
include Compilable
|
|
7
|
+
|
|
8
|
+
def compile(template)
|
|
9
|
+
"_set_controller_content_type(Mime::XML);" +
|
|
10
|
+
"xml = ::Builder::XmlMarkup.new(:indent => 2);" +
|
|
11
|
+
"self.output_buffer = xml.target!;" +
|
|
12
|
+
template.source +
|
|
13
|
+
";xml.target!;"
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
module TemplateHandlers
|
|
3
|
+
class ERB < TemplateHandler
|
|
4
|
+
include Compilable
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# :singleton-method:
|
|
8
|
+
# Specify trim mode for the ERB compiler. Defaults to '-'.
|
|
9
|
+
# See ERb documentation for suitable values.
|
|
10
|
+
cattr_accessor :erb_trim_mode
|
|
11
|
+
self.erb_trim_mode = '-'
|
|
12
|
+
|
|
13
|
+
def compile(template)
|
|
14
|
+
src = ::ERB.new("<% __in_erb_template=true %>#{template.source}", nil, erb_trim_mode, '@output_buffer').src
|
|
15
|
+
|
|
16
|
+
# Ruby 1.9 prepends an encoding to the source. However this is
|
|
17
|
+
# useless because you can only set an encoding on the first line
|
|
18
|
+
RUBY_VERSION >= '1.9' ? src.sub(/\A#coding:.*\n/, '') : src
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module ActionView
|
|
2
|
+
module TemplateHandlers
|
|
3
|
+
class RJS < TemplateHandler
|
|
4
|
+
include Compilable
|
|
5
|
+
|
|
6
|
+
def compile(template)
|
|
7
|
+
"@template_format = :html;" +
|
|
8
|
+
"controller.response.content_type ||= Mime::JS;" +
|
|
9
|
+
"update_page do |page|;#{template.source}\nend"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module ActionView #:nodoc:
|
|
2
|
+
module TemplateHandlers #:nodoc:
|
|
3
|
+
autoload :ERB, 'action_view/template_handlers/erb'
|
|
4
|
+
autoload :RJS, 'action_view/template_handlers/rjs'
|
|
5
|
+
autoload :Builder, 'action_view/template_handlers/builder'
|
|
6
|
+
|
|
7
|
+
def self.extended(base)
|
|
8
|
+
base.register_default_template_handler :erb, TemplateHandlers::ERB
|
|
9
|
+
base.register_template_handler :rjs, TemplateHandlers::RJS
|
|
10
|
+
base.register_template_handler :builder, TemplateHandlers::Builder
|
|
11
|
+
|
|
12
|
+
# TODO: Depreciate old template extensions
|
|
13
|
+
base.register_template_handler :rhtml, TemplateHandlers::ERB
|
|
14
|
+
base.register_template_handler :rxml, TemplateHandlers::Builder
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
@@template_handlers = {}
|
|
18
|
+
@@default_template_handlers = nil
|
|
19
|
+
|
|
20
|
+
# Register a class that knows how to handle template files with the given
|
|
21
|
+
# extension. This can be used to implement new template types.
|
|
22
|
+
# The constructor for the class must take the ActiveView::Base instance
|
|
23
|
+
# as a parameter, and the class must implement a +render+ method that
|
|
24
|
+
# takes the contents of the template to render as well as the Hash of
|
|
25
|
+
# local assigns available to the template. The +render+ method ought to
|
|
26
|
+
# return the rendered template as a string.
|
|
27
|
+
def register_template_handler(extension, klass)
|
|
28
|
+
@@template_handlers[extension.to_sym] = klass
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def template_handler_extensions
|
|
32
|
+
@@template_handlers.keys.map(&:to_s).sort
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def registered_template_handler(extension)
|
|
36
|
+
extension && @@template_handlers[extension.to_sym]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def register_default_template_handler(extension, klass)
|
|
40
|
+
register_template_handler(extension, klass)
|
|
41
|
+
@@default_template_handlers = klass
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def handler_class_for_extension(extension)
|
|
45
|
+
registered_template_handler(extension) || @@default_template_handlers
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|