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.
Files changed (429) hide show
  1. data/CHANGELOG +5184 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +160 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  8. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  9. data/lib/action_controller/assertions/response_assertions.rb +160 -0
  10. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  11. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  12. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  13. data/lib/action_controller/base.rb +1423 -0
  14. data/lib/action_controller/benchmarking.rb +107 -0
  15. data/lib/action_controller/caching/actions.rb +177 -0
  16. data/lib/action_controller/caching/fragments.rb +120 -0
  17. data/lib/action_controller/caching/pages.rb +152 -0
  18. data/lib/action_controller/caching/sweeper.rb +45 -0
  19. data/lib/action_controller/caching/sweeping.rb +55 -0
  20. data/lib/action_controller/caching.rb +71 -0
  21. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  22. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  23. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  24. data/lib/action_controller/cgi_ext.rb +15 -0
  25. data/lib/action_controller/cgi_process.rb +77 -0
  26. data/lib/action_controller/cookies.rb +95 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +86 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +171 -0
  31. data/lib/action_controller/headers.rb +33 -0
  32. data/lib/action_controller/helpers.rb +225 -0
  33. data/lib/action_controller/http_authentication.rb +309 -0
  34. data/lib/action_controller/integration.rb +692 -0
  35. data/lib/action_controller/layout.rb +286 -0
  36. data/lib/action_controller/middleware_stack.rb +119 -0
  37. data/lib/action_controller/middlewares.rb +14 -0
  38. data/lib/action_controller/mime_responds.rb +193 -0
  39. data/lib/action_controller/mime_type.rb +212 -0
  40. data/lib/action_controller/mime_types.rb +21 -0
  41. data/lib/action_controller/params_parser.rb +77 -0
  42. data/lib/action_controller/performance_test.rb +15 -0
  43. data/lib/action_controller/polymorphic_routes.rb +189 -0
  44. data/lib/action_controller/rack_lint_patch.rb +36 -0
  45. data/lib/action_controller/record_identifier.rb +104 -0
  46. data/lib/action_controller/reloader.rb +54 -0
  47. data/lib/action_controller/request.rb +493 -0
  48. data/lib/action_controller/request_forgery_protection.rb +113 -0
  49. data/lib/action_controller/rescue.rb +183 -0
  50. data/lib/action_controller/resources.rb +682 -0
  51. data/lib/action_controller/response.rb +239 -0
  52. data/lib/action_controller/routing/builder.rb +197 -0
  53. data/lib/action_controller/routing/optimisations.rb +130 -0
  54. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  55. data/lib/action_controller/routing/route.rb +265 -0
  56. data/lib/action_controller/routing/route_set.rb +502 -0
  57. data/lib/action_controller/routing/routing_ext.rb +49 -0
  58. data/lib/action_controller/routing/segments.rb +343 -0
  59. data/lib/action_controller/routing.rb +388 -0
  60. data/lib/action_controller/session/abstract_store.rb +181 -0
  61. data/lib/action_controller/session/cookie_store.rb +221 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +51 -0
  63. data/lib/action_controller/session_management.rb +54 -0
  64. data/lib/action_controller/status_codes.rb +88 -0
  65. data/lib/action_controller/streaming.rb +181 -0
  66. data/lib/action_controller/string_coercion.rb +29 -0
  67. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  68. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  69. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  70. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  71. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  72. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  73. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  74. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  75. data/lib/action_controller/test_case.rb +209 -0
  76. data/lib/action_controller/test_process.rb +580 -0
  77. data/lib/action_controller/translation.rb +13 -0
  78. data/lib/action_controller/uploaded_file.rb +44 -0
  79. data/lib/action_controller/url_rewriter.rb +216 -0
  80. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  81. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  82. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  83. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  84. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  85. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  86. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  87. data/lib/action_controller/verification.rb +130 -0
  88. data/lib/action_controller.rb +113 -0
  89. data/lib/action_pack/version.rb +9 -0
  90. data/lib/action_pack.rb +24 -0
  91. data/lib/action_view/base.rb +362 -0
  92. data/lib/action_view/erb/util.rb +44 -0
  93. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  94. data/lib/action_view/helpers/asset_tag_helper.rb +694 -0
  95. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  96. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  97. data/lib/action_view/helpers/cache_helper.rb +39 -0
  98. data/lib/action_view/helpers/capture_helper.rb +136 -0
  99. data/lib/action_view/helpers/date_helper.rb +988 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1074 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +487 -0
  104. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  105. data/lib/action_view/helpers/number_helper.rb +308 -0
  106. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  107. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  108. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  109. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  110. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +150 -0
  113. data/lib/action_view/helpers/text_helper.rb +587 -0
  114. data/lib/action_view/helpers/translation_helper.rb +39 -0
  115. data/lib/action_view/helpers/url_helper.rb +639 -0
  116. data/lib/action_view/helpers.rb +59 -0
  117. data/lib/action_view/inline_template.rb +19 -0
  118. data/lib/action_view/locale/en.yml +117 -0
  119. data/lib/action_view/partials.rb +240 -0
  120. data/lib/action_view/paths.rb +69 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +95 -0
  123. data/lib/action_view/renderable_partial.rb +47 -0
  124. data/lib/action_view/safe_buffer.rb +28 -0
  125. data/lib/action_view/template.rb +252 -0
  126. data/lib/action_view/template_error.rb +99 -0
  127. data/lib/action_view/template_handler.rb +34 -0
  128. data/lib/action_view/template_handlers/builder.rb +17 -0
  129. data/lib/action_view/template_handlers/erb.rb +22 -0
  130. data/lib/action_view/template_handlers/rjs.rb +13 -0
  131. data/lib/action_view/template_handlers.rb +48 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/action_view.rb +58 -0
  134. data/lib/actionpack.rb +2 -0
  135. data/test/abstract_unit.rb +61 -0
  136. data/test/active_record_unit.rb +104 -0
  137. data/test/activerecord/active_record_store_test.rb +174 -0
  138. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  139. data/test/adv_attr_test.rb +20 -0
  140. data/test/controller/action_pack_assertions_test.rb +543 -0
  141. data/test/controller/addresses_render_test.rb +37 -0
  142. data/test/controller/assert_select_test.rb +734 -0
  143. data/test/controller/base_test.rb +217 -0
  144. data/test/controller/benchmark_test.rb +32 -0
  145. data/test/controller/caching_test.rb +729 -0
  146. data/test/controller/capture_test.rb +66 -0
  147. data/test/controller/content_type_test.rb +168 -0
  148. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  150. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  151. data/test/controller/cookie_test.rb +134 -0
  152. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  153. data/test/controller/dispatcher_test.rb +144 -0
  154. data/test/controller/dom_assertions_test.rb +53 -0
  155. data/test/controller/failsafe_test.rb +60 -0
  156. data/test/controller/fake_controllers.rb +33 -0
  157. data/test/controller/fake_models.rb +19 -0
  158. data/test/controller/filter_params_test.rb +52 -0
  159. data/test/controller/filters_test.rb +885 -0
  160. data/test/controller/flash_test.rb +147 -0
  161. data/test/controller/header_test.rb +14 -0
  162. data/test/controller/helper_test.rb +224 -0
  163. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  164. data/test/controller/html-scanner/document_test.rb +148 -0
  165. data/test/controller/html-scanner/node_test.rb +89 -0
  166. data/test/controller/html-scanner/sanitizer_test.rb +274 -0
  167. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  168. data/test/controller/html-scanner/text_node_test.rb +50 -0
  169. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  170. data/test/controller/http_basic_authentication_test.rb +113 -0
  171. data/test/controller/http_digest_authentication_test.rb +254 -0
  172. data/test/controller/integration_test.rb +483 -0
  173. data/test/controller/layout_test.rb +215 -0
  174. data/test/controller/logging_test.rb +46 -0
  175. data/test/controller/middleware_stack_test.rb +90 -0
  176. data/test/controller/mime_responds_test.rb +536 -0
  177. data/test/controller/mime_type_test.rb +93 -0
  178. data/test/controller/polymorphic_routes_test.rb +297 -0
  179. data/test/controller/rack_test.rb +311 -0
  180. data/test/controller/record_identifier_test.rb +139 -0
  181. data/test/controller/redirect_test.rb +285 -0
  182. data/test/controller/reloader_test.rb +124 -0
  183. data/test/controller/render_test.rb +1762 -0
  184. data/test/controller/request/json_params_parsing_test.rb +65 -0
  185. data/test/controller/request/multipart_params_parsing_test.rb +162 -0
  186. data/test/controller/request/query_string_parsing_test.rb +120 -0
  187. data/test/controller/request/test_request_test.rb +35 -0
  188. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  189. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  190. data/test/controller/request_forgery_protection_test.rb +265 -0
  191. data/test/controller/request_test.rb +395 -0
  192. data/test/controller/rescue_test.rb +536 -0
  193. data/test/controller/resources_test.rb +1393 -0
  194. data/test/controller/routing_test.rb +2591 -0
  195. data/test/controller/selector_test.rb +628 -0
  196. data/test/controller/send_file_test.rb +171 -0
  197. data/test/controller/session/cookie_store_test.rb +216 -0
  198. data/test/controller/session/mem_cache_store_test.rb +127 -0
  199. data/test/controller/session/test_session_test.rb +58 -0
  200. data/test/controller/test_test.rb +700 -0
  201. data/test/controller/translation_test.rb +26 -0
  202. data/test/controller/url_rewriter_test.rb +385 -0
  203. data/test/controller/verification_test.rb +270 -0
  204. data/test/controller/view_paths_test.rb +141 -0
  205. data/test/controller/webservice_test.rb +273 -0
  206. data/test/fixtures/_top_level_partial.html.erb +1 -0
  207. data/test/fixtures/_top_level_partial_only.erb +1 -0
  208. data/test/fixtures/addresses/list.erb +1 -0
  209. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  210. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  211. data/test/fixtures/companies.yml +24 -0
  212. data/test/fixtures/company.rb +10 -0
  213. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  214. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  215. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  216. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  217. data/test/fixtures/customers/_customer.html.erb +1 -0
  218. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  219. data/test/fixtures/developer.rb +9 -0
  220. data/test/fixtures/developers/_developer.erb +1 -0
  221. data/test/fixtures/developers.yml +21 -0
  222. data/test/fixtures/developers_projects.yml +13 -0
  223. data/test/fixtures/failsafe/500.html +1 -0
  224. data/test/fixtures/fun/games/_game.erb +1 -0
  225. data/test/fixtures/fun/games/hello_world.erb +1 -0
  226. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  227. data/test/fixtures/functional_caching/_partial.erb +3 -0
  228. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  229. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  231. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  232. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  233. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  235. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  236. data/test/fixtures/helpers/abc_helper.rb +5 -0
  237. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  238. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  239. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  240. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  241. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  242. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  243. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  244. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  246. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  247. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  248. data/test/fixtures/layouts/_column.html.erb +2 -0
  249. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  250. data/test/fixtures/layouts/builder.builder +3 -0
  251. data/test/fixtures/layouts/default_html.html.erb +1 -0
  252. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  253. data/test/fixtures/layouts/standard.erb +1 -0
  254. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  255. data/test/fixtures/layouts/xhr.html.erb +2 -0
  256. data/test/fixtures/layouts/yield.erb +2 -0
  257. data/test/fixtures/mascot.rb +3 -0
  258. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  259. data/test/fixtures/mascots.yml +4 -0
  260. data/test/fixtures/multipart/binary_file +0 -0
  261. data/test/fixtures/multipart/boundary_problem_file +10 -0
  262. data/test/fixtures/multipart/bracketed_param +5 -0
  263. data/test/fixtures/multipart/empty +10 -0
  264. data/test/fixtures/multipart/hello.txt +1 -0
  265. data/test/fixtures/multipart/large_text_file +10 -0
  266. data/test/fixtures/multipart/mixed_files +0 -0
  267. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  268. data/test/fixtures/multipart/none +9 -0
  269. data/test/fixtures/multipart/single_parameter +5 -0
  270. data/test/fixtures/multipart/text_file +10 -0
  271. data/test/fixtures/override/test/hello_world.erb +1 -0
  272. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  273. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  274. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  275. data/test/fixtures/post_test/post/index.html.erb +1 -0
  276. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  277. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  278. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  279. data/test/fixtures/project.rb +3 -0
  280. data/test/fixtures/projects/_project.erb +1 -0
  281. data/test/fixtures/projects.yml +7 -0
  282. data/test/fixtures/public/404.html +1 -0
  283. data/test/fixtures/public/500.da.html +1 -0
  284. data/test/fixtures/public/500.html +1 -0
  285. data/test/fixtures/public/absolute/test.css +23 -0
  286. data/test/fixtures/public/absolute/test.js +63 -0
  287. data/test/fixtures/public/images/rails.png +0 -0
  288. data/test/fixtures/public/javascripts/application.js +1 -0
  289. data/test/fixtures/public/javascripts/bank.js +1 -0
  290. data/test/fixtures/public/javascripts/controls.js +1 -0
  291. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  292. data/test/fixtures/public/javascripts/effects.js +1 -0
  293. data/test/fixtures/public/javascripts/prototype.js +1 -0
  294. data/test/fixtures/public/javascripts/robber.js +1 -0
  295. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  296. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  297. data/test/fixtures/public/stylesheets/bank.css +1 -0
  298. data/test/fixtures/public/stylesheets/robber.css +1 -0
  299. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  300. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  301. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  302. data/test/fixtures/replies/_reply.erb +1 -0
  303. data/test/fixtures/replies.yml +15 -0
  304. data/test/fixtures/reply.rb +7 -0
  305. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  306. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  307. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  308. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  309. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  310. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  311. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  312. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  313. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  314. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  315. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  316. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  318. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  319. data/test/fixtures/scope/test/modgreet.erb +1 -0
  320. data/test/fixtures/shared.html.erb +1 -0
  321. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  322. data/test/fixtures/test/_counter.html.erb +1 -0
  323. data/test/fixtures/test/_customer.erb +1 -0
  324. data/test/fixtures/test/_customer_counter.erb +1 -0
  325. data/test/fixtures/test/_customer_greeting.erb +1 -0
  326. data/test/fixtures/test/_customer_with_var.erb +1 -0
  327. data/test/fixtures/test/_form.erb +1 -0
  328. data/test/fixtures/test/_from_helper.erb +1 -0
  329. data/test/fixtures/test/_hash_greeting.erb +1 -0
  330. data/test/fixtures/test/_hash_object.erb +2 -0
  331. data/test/fixtures/test/_hello.builder +1 -0
  332. data/test/fixtures/test/_labelling_form.erb +1 -0
  333. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  334. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  335. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  336. data/test/fixtures/test/_one.html.erb +1 -0
  337. data/test/fixtures/test/_partial.erb +1 -0
  338. data/test/fixtures/test/_partial.html.erb +1 -0
  339. data/test/fixtures/test/_partial.js.erb +1 -0
  340. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  341. data/test/fixtures/test/_partial_only.erb +1 -0
  342. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  343. data/test/fixtures/test/_person.erb +2 -0
  344. data/test/fixtures/test/_raise.html.erb +1 -0
  345. data/test/fixtures/test/_two.html.erb +1 -0
  346. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  347. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  348. data/test/fixtures/test/capturing.erb +4 -0
  349. data/test/fixtures/test/content_for.erb +2 -0
  350. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  351. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  352. data/test/fixtures/test/delete_with_js.rjs +2 -0
  353. data/test/fixtures/test/dont_pick_me +1 -0
  354. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  355. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  356. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  357. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  358. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  359. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  360. data/test/fixtures/test/greeting.erb +1 -0
  361. data/test/fixtures/test/greeting.js.rjs +1 -0
  362. data/test/fixtures/test/hello.builder +4 -0
  363. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  364. data/test/fixtures/test/hello_world.erb +1 -0
  365. data/test/fixtures/test/hello_world.erb~ +1 -0
  366. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  367. data/test/fixtures/test/hello_world_container.builder +3 -0
  368. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  369. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  370. data/test/fixtures/test/hello_xml_world.builder +11 -0
  371. data/test/fixtures/test/hyphen-ated.erb +1 -0
  372. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  373. data/test/fixtures/test/list.erb +1 -0
  374. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  375. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  376. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  377. data/test/fixtures/test/nested_layout.erb +3 -0
  378. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  379. data/test/fixtures/test/potential_conflicts.erb +4 -0
  380. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  381. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  382. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  383. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  384. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  385. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  386. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  387. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  388. data/test/fixtures/test/render_to_string_test.erb +1 -0
  389. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  390. data/test/fixtures/test/template.erb +1 -0
  391. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  392. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  393. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  394. data/test/fixtures/test/utf8.html.erb +2 -0
  395. data/test/fixtures/topic.rb +3 -0
  396. data/test/fixtures/topics/_topic.html.erb +1 -0
  397. data/test/fixtures/topics.yml +22 -0
  398. data/test/template/active_record_helper_i18n_test.rb +44 -0
  399. data/test/template/active_record_helper_test.rb +302 -0
  400. data/test/template/asset_tag_helper_test.rb +771 -0
  401. data/test/template/atom_feed_helper_test.rb +315 -0
  402. data/test/template/benchmark_helper_test.rb +86 -0
  403. data/test/template/compiled_templates_test.rb +204 -0
  404. data/test/template/date_helper_i18n_test.rb +121 -0
  405. data/test/template/date_helper_test.rb +2485 -0
  406. data/test/template/erb_util_test.rb +24 -0
  407. data/test/template/form_helper_test.rb +1393 -0
  408. data/test/template/form_options_helper_i18n_test.rb +27 -0
  409. data/test/template/form_options_helper_test.rb +807 -0
  410. data/test/template/form_tag_helper_test.rb +344 -0
  411. data/test/template/javascript_helper_test.rb +106 -0
  412. data/test/template/number_helper_i18n_test.rb +69 -0
  413. data/test/template/number_helper_test.rb +132 -0
  414. data/test/template/prototype_helper_test.rb +639 -0
  415. data/test/template/raw_output_helper_test.rb +21 -0
  416. data/test/template/record_tag_helper_test.rb +58 -0
  417. data/test/template/render_test.rb +290 -0
  418. data/test/template/sanitize_helper_test.rb +57 -0
  419. data/test/template/scriptaculous_helper_test.rb +90 -0
  420. data/test/template/tag_helper_test.rb +98 -0
  421. data/test/template/template_test.rb +32 -0
  422. data/test/template/test_test.rb +54 -0
  423. data/test/template/text_helper_test.rb +543 -0
  424. data/test/template/translation_helper_test.rb +32 -0
  425. data/test/template/url_helper_test.rb +622 -0
  426. data/test/testing_sandbox.rb +15 -0
  427. data/test/view/safe_buffer_test.rb +36 -0
  428. data/test/view/test_case_test.rb +176 -0
  429. 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