actionpack-rack-upgrade-2 2.3.15

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 (441) hide show
  1. data/CHANGELOG +5250 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/RUNNING_UNIT_TESTS +24 -0
  5. data/Rakefile +158 -0
  6. data/install.rb +30 -0
  7. data/lib/action_controller.rb +113 -0
  8. data/lib/action_controller/assertions/dom_assertions.rb +55 -0
  9. data/lib/action_controller/assertions/model_assertions.rb +21 -0
  10. data/lib/action_controller/assertions/response_assertions.rb +169 -0
  11. data/lib/action_controller/assertions/routing_assertions.rb +146 -0
  12. data/lib/action_controller/assertions/selector_assertions.rb +638 -0
  13. data/lib/action_controller/assertions/tag_assertions.rb +127 -0
  14. data/lib/action_controller/base.rb +1425 -0
  15. data/lib/action_controller/benchmarking.rb +107 -0
  16. data/lib/action_controller/caching.rb +71 -0
  17. data/lib/action_controller/caching/actions.rb +177 -0
  18. data/lib/action_controller/caching/fragments.rb +120 -0
  19. data/lib/action_controller/caching/pages.rb +152 -0
  20. data/lib/action_controller/caching/sweeper.rb +45 -0
  21. data/lib/action_controller/caching/sweeping.rb +55 -0
  22. data/lib/action_controller/cgi_ext.rb +15 -0
  23. data/lib/action_controller/cgi_ext/cookie.rb +112 -0
  24. data/lib/action_controller/cgi_ext/query_extension.rb +22 -0
  25. data/lib/action_controller/cgi_ext/stdinput.rb +24 -0
  26. data/lib/action_controller/cgi_process.rb +77 -0
  27. data/lib/action_controller/cookies.rb +197 -0
  28. data/lib/action_controller/dispatcher.rb +133 -0
  29. data/lib/action_controller/failsafe.rb +87 -0
  30. data/lib/action_controller/filters.rb +680 -0
  31. data/lib/action_controller/flash.rb +213 -0
  32. data/lib/action_controller/headers.rb +33 -0
  33. data/lib/action_controller/helpers.rb +225 -0
  34. data/lib/action_controller/http_authentication.rb +309 -0
  35. data/lib/action_controller/integration.rb +708 -0
  36. data/lib/action_controller/layout.rb +286 -0
  37. data/lib/action_controller/middleware_stack.rb +119 -0
  38. data/lib/action_controller/middlewares.rb +14 -0
  39. data/lib/action_controller/mime_responds.rb +193 -0
  40. data/lib/action_controller/mime_type.rb +212 -0
  41. data/lib/action_controller/mime_types.rb +21 -0
  42. data/lib/action_controller/params_parser.rb +77 -0
  43. data/lib/action_controller/performance_test.rb +15 -0
  44. data/lib/action_controller/polymorphic_routes.rb +189 -0
  45. data/lib/action_controller/rack_lint_patch.rb +36 -0
  46. data/lib/action_controller/record_identifier.rb +104 -0
  47. data/lib/action_controller/reloader.rb +54 -0
  48. data/lib/action_controller/request.rb +495 -0
  49. data/lib/action_controller/request_forgery_protection.rb +116 -0
  50. data/lib/action_controller/rescue.rb +183 -0
  51. data/lib/action_controller/resources.rb +682 -0
  52. data/lib/action_controller/response.rb +237 -0
  53. data/lib/action_controller/routing.rb +388 -0
  54. data/lib/action_controller/routing/builder.rb +197 -0
  55. data/lib/action_controller/routing/optimisations.rb +130 -0
  56. data/lib/action_controller/routing/recognition_optimisation.rb +167 -0
  57. data/lib/action_controller/routing/route.rb +265 -0
  58. data/lib/action_controller/routing/route_set.rb +503 -0
  59. data/lib/action_controller/routing/routing_ext.rb +49 -0
  60. data/lib/action_controller/routing/segments.rb +343 -0
  61. data/lib/action_controller/session/abstract_store.rb +276 -0
  62. data/lib/action_controller/session/cookie_store.rb +240 -0
  63. data/lib/action_controller/session/mem_cache_store.rb +60 -0
  64. data/lib/action_controller/session_management.rb +54 -0
  65. data/lib/action_controller/status_codes.rb +88 -0
  66. data/lib/action_controller/streaming.rb +181 -0
  67. data/lib/action_controller/string_coercion.rb +29 -0
  68. data/lib/action_controller/templates/rescues/_request_and_response.erb +24 -0
  69. data/lib/action_controller/templates/rescues/_trace.erb +26 -0
  70. data/lib/action_controller/templates/rescues/diagnostics.erb +11 -0
  71. data/lib/action_controller/templates/rescues/layout.erb +29 -0
  72. data/lib/action_controller/templates/rescues/missing_template.erb +2 -0
  73. data/lib/action_controller/templates/rescues/routing_error.erb +10 -0
  74. data/lib/action_controller/templates/rescues/template_error.erb +21 -0
  75. data/lib/action_controller/templates/rescues/unknown_action.erb +2 -0
  76. data/lib/action_controller/test_case.rb +209 -0
  77. data/lib/action_controller/test_process.rb +580 -0
  78. data/lib/action_controller/translation.rb +13 -0
  79. data/lib/action_controller/uploaded_file.rb +44 -0
  80. data/lib/action_controller/url_rewriter.rb +229 -0
  81. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  82. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  83. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  84. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +173 -0
  85. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  86. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  87. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  88. data/lib/action_controller/verification.rb +130 -0
  89. data/lib/action_pack.rb +24 -0
  90. data/lib/action_pack/version.rb +9 -0
  91. data/lib/action_view.rb +58 -0
  92. data/lib/action_view/base.rb +362 -0
  93. data/lib/action_view/helpers.rb +61 -0
  94. data/lib/action_view/helpers/active_record_helper.rb +305 -0
  95. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  96. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  97. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  98. data/lib/action_view/helpers/cache_helper.rb +39 -0
  99. data/lib/action_view/helpers/capture_helper.rb +136 -0
  100. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  101. data/lib/action_view/helpers/date_helper.rb +989 -0
  102. data/lib/action_view/helpers/debug_helper.rb +38 -0
  103. data/lib/action_view/helpers/form_helper.rb +1118 -0
  104. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  105. data/lib/action_view/helpers/form_tag_helper.rb +490 -0
  106. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  107. data/lib/action_view/helpers/number_helper.rb +308 -0
  108. data/lib/action_view/helpers/prototype_helper.rb +1305 -0
  109. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  110. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  111. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  112. data/lib/action_view/helpers/sanitize_helper.rb +251 -0
  113. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  114. data/lib/action_view/helpers/tag_helper.rb +151 -0
  115. data/lib/action_view/helpers/text_helper.rb +597 -0
  116. data/lib/action_view/helpers/translation_helper.rb +67 -0
  117. data/lib/action_view/helpers/url_helper.rb +637 -0
  118. data/lib/action_view/inline_template.rb +19 -0
  119. data/lib/action_view/locale/en.yml +117 -0
  120. data/lib/action_view/partials.rb +241 -0
  121. data/lib/action_view/paths.rb +77 -0
  122. data/lib/action_view/reloadable_template.rb +117 -0
  123. data/lib/action_view/renderable.rb +109 -0
  124. data/lib/action_view/renderable_partial.rb +53 -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.rb +48 -0
  129. data/lib/action_view/template_handlers/builder.rb +17 -0
  130. data/lib/action_view/template_handlers/erb.rb +25 -0
  131. data/lib/action_view/template_handlers/rjs.rb +13 -0
  132. data/lib/action_view/test_case.rb +162 -0
  133. data/lib/actionpack.rb +2 -0
  134. data/test/abstract_unit.rb +78 -0
  135. data/test/active_record_unit.rb +104 -0
  136. data/test/activerecord/active_record_store_test.rb +221 -0
  137. data/test/activerecord/render_partial_with_record_identification_test.rb +188 -0
  138. data/test/adv_attr_test.rb +20 -0
  139. data/test/controller/action_pack_assertions_test.rb +545 -0
  140. data/test/controller/addresses_render_test.rb +37 -0
  141. data/test/controller/assert_select_test.rb +735 -0
  142. data/test/controller/base_test.rb +217 -0
  143. data/test/controller/benchmark_test.rb +32 -0
  144. data/test/controller/caching_test.rb +743 -0
  145. data/test/controller/capture_test.rb +66 -0
  146. data/test/controller/content_type_test.rb +178 -0
  147. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  148. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  149. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  150. data/test/controller/cookie_test.rb +208 -0
  151. data/test/controller/deprecation/deprecated_base_methods_test.rb +32 -0
  152. data/test/controller/dispatcher_test.rb +144 -0
  153. data/test/controller/dom_assertions_test.rb +53 -0
  154. data/test/controller/failsafe_test.rb +60 -0
  155. data/test/controller/fake_controllers.rb +33 -0
  156. data/test/controller/fake_models.rb +19 -0
  157. data/test/controller/filter_params_test.rb +52 -0
  158. data/test/controller/filters_test.rb +885 -0
  159. data/test/controller/flash_test.rb +174 -0
  160. data/test/controller/header_test.rb +14 -0
  161. data/test/controller/helper_test.rb +224 -0
  162. data/test/controller/html-scanner/cdata_node_test.rb +15 -0
  163. data/test/controller/html-scanner/document_test.rb +148 -0
  164. data/test/controller/html-scanner/node_test.rb +89 -0
  165. data/test/controller/html-scanner/sanitizer_test.rb +281 -0
  166. data/test/controller/html-scanner/tag_node_test.rb +238 -0
  167. data/test/controller/html-scanner/text_node_test.rb +50 -0
  168. data/test/controller/html-scanner/tokenizer_test.rb +131 -0
  169. data/test/controller/http_basic_authentication_test.rb +113 -0
  170. data/test/controller/http_digest_authentication_test.rb +254 -0
  171. data/test/controller/integration_test.rb +526 -0
  172. data/test/controller/layout_test.rb +215 -0
  173. data/test/controller/localized_templates_test.rb +24 -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/output_escaping_test.rb +19 -0
  179. data/test/controller/polymorphic_routes_test.rb +297 -0
  180. data/test/controller/rack_test.rb +308 -0
  181. data/test/controller/record_identifier_test.rb +139 -0
  182. data/test/controller/redirect_test.rb +285 -0
  183. data/test/controller/reloader_test.rb +125 -0
  184. data/test/controller/render_test.rb +1783 -0
  185. data/test/controller/request/json_params_parsing_test.rb +65 -0
  186. data/test/controller/request/multipart_params_parsing_test.rb +177 -0
  187. data/test/controller/request/query_string_parsing_test.rb +120 -0
  188. data/test/controller/request/test_request_test.rb +35 -0
  189. data/test/controller/request/url_encoded_params_parsing_test.rb +146 -0
  190. data/test/controller/request/xml_params_parsing_test.rb +103 -0
  191. data/test/controller/request_forgery_protection_test.rb +233 -0
  192. data/test/controller/request_test.rb +398 -0
  193. data/test/controller/rescue_test.rb +541 -0
  194. data/test/controller/resources_test.rb +1393 -0
  195. data/test/controller/routing_test.rb +2592 -0
  196. data/test/controller/selector_test.rb +628 -0
  197. data/test/controller/send_file_test.rb +171 -0
  198. data/test/controller/session/abstract_store_test.rb +64 -0
  199. data/test/controller/session/cookie_store_test.rb +354 -0
  200. data/test/controller/session/mem_cache_store_test.rb +187 -0
  201. data/test/controller/session/test_session_test.rb +58 -0
  202. data/test/controller/test_test.rb +700 -0
  203. data/test/controller/translation_test.rb +26 -0
  204. data/test/controller/url_rewriter_test.rb +395 -0
  205. data/test/controller/verification_test.rb +270 -0
  206. data/test/controller/view_paths_test.rb +141 -0
  207. data/test/controller/webservice_test.rb +273 -0
  208. data/test/fixtures/_top_level_partial.html.erb +1 -0
  209. data/test/fixtures/_top_level_partial_only.erb +1 -0
  210. data/test/fixtures/addresses/list.erb +1 -0
  211. data/test/fixtures/alternate_helpers/foo_helper.rb +3 -0
  212. data/test/fixtures/bad_customers/_bad_customer.html.erb +1 -0
  213. data/test/fixtures/companies.yml +24 -0
  214. data/test/fixtures/company.rb +10 -0
  215. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +1 -0
  216. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +1 -0
  217. data/test/fixtures/content_type/render_default_for_rjs.rjs +1 -0
  218. data/test/fixtures/content_type/render_default_for_rxml.rxml +1 -0
  219. data/test/fixtures/customers/_customer.html.erb +1 -0
  220. data/test/fixtures/db_definitions/sqlite.sql +49 -0
  221. data/test/fixtures/developer.rb +9 -0
  222. data/test/fixtures/developers.yml +21 -0
  223. data/test/fixtures/developers/_developer.erb +1 -0
  224. data/test/fixtures/developers_projects.yml +13 -0
  225. data/test/fixtures/failsafe/500.html +1 -0
  226. data/test/fixtures/fun/games/_game.erb +1 -0
  227. data/test/fixtures/fun/games/hello_world.erb +1 -0
  228. data/test/fixtures/fun/serious/games/_game.erb +1 -0
  229. data/test/fixtures/functional_caching/_partial.erb +3 -0
  230. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +3 -0
  231. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +6 -0
  232. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +5 -0
  233. data/test/fixtures/functional_caching/fragment_cached.html.erb +2 -0
  234. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +1 -0
  235. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +2 -0
  236. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +1 -0
  237. data/test/fixtures/good_customers/_good_customer.html.erb +1 -0
  238. data/test/fixtures/helpers/abc_helper.rb +5 -0
  239. data/test/fixtures/helpers/fun/games_helper.rb +3 -0
  240. data/test/fixtures/helpers/fun/pdf_helper.rb +3 -0
  241. data/test/fixtures/layout_tests/abs_path_layout.rhtml +1 -0
  242. data/test/fixtures/layout_tests/alt/hello.rhtml +1 -0
  243. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  244. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +1 -0
  245. data/test/fixtures/layout_tests/layouts/item.rhtml +1 -0
  246. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +1 -0
  247. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +1 -0
  248. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +1 -0
  249. data/test/fixtures/layout_tests/views/hello.rhtml +1 -0
  250. data/test/fixtures/layouts/_column.html.erb +2 -0
  251. data/test/fixtures/layouts/block_with_layout.erb +3 -0
  252. data/test/fixtures/layouts/builder.builder +3 -0
  253. data/test/fixtures/layouts/default_html.html.erb +1 -0
  254. data/test/fixtures/layouts/partial_with_layout.erb +3 -0
  255. data/test/fixtures/layouts/standard.erb +1 -0
  256. data/test/fixtures/layouts/talk_from_action.erb +2 -0
  257. data/test/fixtures/layouts/xhr.html.erb +2 -0
  258. data/test/fixtures/layouts/yield.erb +2 -0
  259. data/test/fixtures/localized/hello_world.de.html +1 -0
  260. data/test/fixtures/localized/hello_world.en.html +1 -0
  261. data/test/fixtures/mascot.rb +3 -0
  262. data/test/fixtures/mascots.yml +4 -0
  263. data/test/fixtures/mascots/_mascot.html.erb +1 -0
  264. data/test/fixtures/multipart/binary_file +0 -0
  265. data/test/fixtures/multipart/boundary_problem_file +10 -0
  266. data/test/fixtures/multipart/bracketed_param +5 -0
  267. data/test/fixtures/multipart/empty +10 -0
  268. data/test/fixtures/multipart/hello.txt +1 -0
  269. data/test/fixtures/multipart/large_text_file +10 -0
  270. data/test/fixtures/multipart/mixed_files +0 -0
  271. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  272. data/test/fixtures/multipart/none +9 -0
  273. data/test/fixtures/multipart/single_parameter +5 -0
  274. data/test/fixtures/multipart/text_file +10 -0
  275. data/test/fixtures/override/test/hello_world.erb +1 -0
  276. data/test/fixtures/override2/layouts/test/sub.erb +1 -0
  277. data/test/fixtures/post_test/layouts/post.html.erb +1 -0
  278. data/test/fixtures/post_test/layouts/super_post.iphone.erb +1 -0
  279. data/test/fixtures/post_test/post/index.html.erb +1 -0
  280. data/test/fixtures/post_test/post/index.iphone.erb +1 -0
  281. data/test/fixtures/post_test/super_post/index.html.erb +1 -0
  282. data/test/fixtures/post_test/super_post/index.iphone.erb +1 -0
  283. data/test/fixtures/project.rb +3 -0
  284. data/test/fixtures/projects.yml +7 -0
  285. data/test/fixtures/projects/_project.erb +1 -0
  286. data/test/fixtures/public/404.html +1 -0
  287. data/test/fixtures/public/500.da.html +1 -0
  288. data/test/fixtures/public/500.html +1 -0
  289. data/test/fixtures/public/absolute/test.css +23 -0
  290. data/test/fixtures/public/absolute/test.js +63 -0
  291. data/test/fixtures/public/images/rails.png +0 -0
  292. data/test/fixtures/public/javascripts/application.js +1 -0
  293. data/test/fixtures/public/javascripts/bank.js +1 -0
  294. data/test/fixtures/public/javascripts/controls.js +1 -0
  295. data/test/fixtures/public/javascripts/dragdrop.js +1 -0
  296. data/test/fixtures/public/javascripts/effects.js +1 -0
  297. data/test/fixtures/public/javascripts/prototype.js +1 -0
  298. data/test/fixtures/public/javascripts/robber.js +1 -0
  299. data/test/fixtures/public/javascripts/subdir/subdir.js +1 -0
  300. data/test/fixtures/public/javascripts/version.1.0.js +1 -0
  301. data/test/fixtures/public/stylesheets/bank.css +1 -0
  302. data/test/fixtures/public/stylesheets/robber.css +1 -0
  303. data/test/fixtures/public/stylesheets/subdir/subdir.css +1 -0
  304. data/test/fixtures/public/stylesheets/version.1.0.css +1 -0
  305. data/test/fixtures/quiz/questions/_question.html.erb +1 -0
  306. data/test/fixtures/replies.yml +15 -0
  307. data/test/fixtures/replies/_reply.erb +1 -0
  308. data/test/fixtures/reply.rb +7 -0
  309. data/test/fixtures/respond_to/all_types_with_layout.html.erb +1 -0
  310. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +1 -0
  311. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +1 -0
  312. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +1 -0
  313. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +1 -0
  314. data/test/fixtures/respond_to/layouts/missing.html.erb +1 -0
  315. data/test/fixtures/respond_to/layouts/standard.html.erb +1 -0
  316. data/test/fixtures/respond_to/layouts/standard.iphone.erb +1 -0
  317. data/test/fixtures/respond_to/using_defaults.html.erb +1 -0
  318. data/test/fixtures/respond_to/using_defaults.js.rjs +1 -0
  319. data/test/fixtures/respond_to/using_defaults.xml.builder +1 -0
  320. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +1 -0
  321. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +1 -0
  322. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +1 -0
  323. data/test/fixtures/scope/test/modgreet.erb +1 -0
  324. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +10 -0
  325. data/test/fixtures/shared.html.erb +1 -0
  326. data/test/fixtures/symlink_parent/symlinked_layout.erb +5 -0
  327. data/test/fixtures/test/_counter.html.erb +1 -0
  328. data/test/fixtures/test/_customer.erb +1 -0
  329. data/test/fixtures/test/_customer_counter.erb +1 -0
  330. data/test/fixtures/test/_customer_counter_with_as.erb +1 -0
  331. data/test/fixtures/test/_customer_greeting.erb +1 -0
  332. data/test/fixtures/test/_customer_with_var.erb +1 -0
  333. data/test/fixtures/test/_form.erb +1 -0
  334. data/test/fixtures/test/_from_helper.erb +1 -0
  335. data/test/fixtures/test/_hash_greeting.erb +1 -0
  336. data/test/fixtures/test/_hash_object.erb +2 -0
  337. data/test/fixtures/test/_hello.builder +1 -0
  338. data/test/fixtures/test/_labelling_form.erb +1 -0
  339. data/test/fixtures/test/_layout_for_block_with_args.html.erb +3 -0
  340. data/test/fixtures/test/_layout_for_partial.html.erb +3 -0
  341. data/test/fixtures/test/_local_inspector.html.erb +1 -0
  342. data/test/fixtures/test/_one.html.erb +1 -0
  343. data/test/fixtures/test/_partial.erb +1 -0
  344. data/test/fixtures/test/_partial.html.erb +1 -0
  345. data/test/fixtures/test/_partial.js.erb +1 -0
  346. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +1 -0
  347. data/test/fixtures/test/_partial_only.erb +1 -0
  348. data/test/fixtures/test/_partial_with_only_html_version.html.erb +1 -0
  349. data/test/fixtures/test/_person.erb +2 -0
  350. data/test/fixtures/test/_raise.html.erb +1 -0
  351. data/test/fixtures/test/_two.html.erb +1 -0
  352. data/test/fixtures/test/_utf8_partial.html.erb +1 -0
  353. data/test/fixtures/test/_utf8_partial_magic.html.erb +2 -0
  354. data/test/fixtures/test/action_talk_to_layout.erb +2 -0
  355. data/test/fixtures/test/array_translation.erb +1 -0
  356. data/test/fixtures/test/calling_partial_with_layout.html.erb +1 -0
  357. data/test/fixtures/test/capturing.erb +4 -0
  358. data/test/fixtures/test/content_for.erb +2 -0
  359. data/test/fixtures/test/content_for_concatenated.erb +3 -0
  360. data/test/fixtures/test/content_for_with_parameter.erb +2 -0
  361. data/test/fixtures/test/delete_with_js.rjs +2 -0
  362. data/test/fixtures/test/dont_pick_me +1 -0
  363. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +1 -0
  364. data/test/fixtures/test/enum_rjs_test.rjs +6 -0
  365. data/test/fixtures/test/formatted_html_erb.html.erb +1 -0
  366. data/test/fixtures/test/formatted_xml_erb.builder +1 -0
  367. data/test/fixtures/test/formatted_xml_erb.html.erb +1 -0
  368. data/test/fixtures/test/formatted_xml_erb.xml.erb +1 -0
  369. data/test/fixtures/test/greeting.erb +1 -0
  370. data/test/fixtures/test/greeting.js.rjs +1 -0
  371. data/test/fixtures/test/hello.builder +4 -0
  372. data/test/fixtures/test/hello_world.da.html.erb +1 -0
  373. data/test/fixtures/test/hello_world.erb +1 -0
  374. data/test/fixtures/test/hello_world.erb~ +1 -0
  375. data/test/fixtures/test/hello_world.pt-BR.html.erb +1 -0
  376. data/test/fixtures/test/hello_world_container.builder +3 -0
  377. data/test/fixtures/test/hello_world_from_rxml.builder +4 -0
  378. data/test/fixtures/test/hello_world_with_layout_false.erb +1 -0
  379. data/test/fixtures/test/hello_xml_world.builder +11 -0
  380. data/test/fixtures/test/hyphen-ated.erb +1 -0
  381. data/test/fixtures/test/implicit_content_type.atom.builder +2 -0
  382. data/test/fixtures/test/list.erb +1 -0
  383. data/test/fixtures/test/malformed/malformed.en.html.erb~ +1 -0
  384. data/test/fixtures/test/malformed/malformed.erb~ +1 -0
  385. data/test/fixtures/test/malformed/malformed.html.erb~ +1 -0
  386. data/test/fixtures/test/nested_layout.erb +3 -0
  387. data/test/fixtures/test/non_erb_block_content_for.builder +4 -0
  388. data/test/fixtures/test/potential_conflicts.erb +4 -0
  389. data/test/fixtures/test/render_explicit_html_template.js.rjs +1 -0
  390. data/test/fixtures/test/render_file_from_template.html.erb +1 -0
  391. data/test/fixtures/test/render_file_with_ivar.erb +1 -0
  392. data/test/fixtures/test/render_file_with_locals.erb +1 -0
  393. data/test/fixtures/test/render_implicit_html_template.js.rjs +1 -0
  394. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +1 -0
  395. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +1 -0
  396. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +1 -0
  397. data/test/fixtures/test/render_to_string_test.erb +1 -0
  398. data/test/fixtures/test/scoped_array_translation.erb +1 -0
  399. data/test/fixtures/test/sub_template_raise.html.erb +1 -0
  400. data/test/fixtures/test/template.erb +1 -0
  401. data/test/fixtures/test/translation.erb +1 -0
  402. data/test/fixtures/test/update_element_with_capture.erb +9 -0
  403. data/test/fixtures/test/using_layout_around_block.html.erb +1 -0
  404. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +1 -0
  405. data/test/fixtures/test/utf8.html.erb +4 -0
  406. data/test/fixtures/test/utf8_magic.html.erb +5 -0
  407. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +5 -0
  408. data/test/fixtures/topic.rb +3 -0
  409. data/test/fixtures/topics.yml +22 -0
  410. data/test/fixtures/topics/_topic.html.erb +1 -0
  411. data/test/template/active_record_helper_i18n_test.rb +51 -0
  412. data/test/template/active_record_helper_test.rb +302 -0
  413. data/test/template/asset_tag_helper_test.rb +770 -0
  414. data/test/template/atom_feed_helper_test.rb +315 -0
  415. data/test/template/benchmark_helper_test.rb +86 -0
  416. data/test/template/compiled_templates_test.rb +204 -0
  417. data/test/template/date_helper_i18n_test.rb +121 -0
  418. data/test/template/date_helper_test.rb +2603 -0
  419. data/test/template/erb_util_test.rb +36 -0
  420. data/test/template/form_helper_test.rb +1447 -0
  421. data/test/template/form_options_helper_i18n_test.rb +27 -0
  422. data/test/template/form_options_helper_test.rb +811 -0
  423. data/test/template/form_tag_helper_test.rb +356 -0
  424. data/test/template/javascript_helper_test.rb +106 -0
  425. data/test/template/number_helper_i18n_test.rb +69 -0
  426. data/test/template/number_helper_test.rb +132 -0
  427. data/test/template/prototype_helper_test.rb +639 -0
  428. data/test/template/raw_output_helper_test.rb +21 -0
  429. data/test/template/record_tag_helper_test.rb +58 -0
  430. data/test/template/render_test.rb +329 -0
  431. data/test/template/sanitize_helper_test.rb +57 -0
  432. data/test/template/scriptaculous_helper_test.rb +90 -0
  433. data/test/template/tag_helper_test.rb +98 -0
  434. data/test/template/template_test.rb +32 -0
  435. data/test/template/test_test.rb +54 -0
  436. data/test/template/text_helper_test.rb +597 -0
  437. data/test/template/translation_helper_test.rb +95 -0
  438. data/test/template/url_helper_test.rb +641 -0
  439. data/test/testing_sandbox.rb +15 -0
  440. data/test/view/test_case_test.rb +176 -0
  441. metadata +519 -0
@@ -0,0 +1,117 @@
1
+ module ActionView #:nodoc:
2
+ class ReloadableTemplate < Template
3
+
4
+ class TemplateDeleted < ActionView::ActionViewError
5
+ end
6
+
7
+ class ReloadablePath < Template::Path
8
+
9
+ def initialize(path)
10
+ super
11
+ @paths = {}
12
+ new_request!
13
+ end
14
+
15
+ def new_request!
16
+ @disk_cache = {}
17
+ end
18
+ alias_method :load!, :new_request!
19
+
20
+ def [](path)
21
+ if found_template = @paths[path]
22
+ begin
23
+ found_template.reset_cache_if_stale!
24
+ rescue TemplateDeleted
25
+ unregister_template(found_template)
26
+ self[path]
27
+ end
28
+ else
29
+ load_all_templates_from_dir(templates_dir_from_path(path))
30
+ # don't ever hand out a template without running a stale check
31
+ (new_template = @paths[path]) && new_template.reset_cache_if_stale!
32
+ end
33
+ end
34
+
35
+ private
36
+ def register_template_from_file(template_full_file_path)
37
+ if !@paths[relative_path = relative_path_for_template_file(template_full_file_path)] && File.file?(template_full_file_path)
38
+ register_template(ReloadableTemplate.new(relative_path, self))
39
+ end
40
+ end
41
+
42
+ def register_template(template)
43
+ template.accessible_paths.each do |path|
44
+ @paths[path] = template
45
+ end
46
+ end
47
+
48
+ # remove (probably deleted) template from cache
49
+ def unregister_template(template)
50
+ template.accessible_paths.each do |template_path|
51
+ @paths.delete(template_path) if @paths[template_path] == template
52
+ end
53
+ # fill in any newly created gaps
54
+ @paths.values.uniq.each do |template|
55
+ template.accessible_paths.each {|path| @paths[path] ||= template}
56
+ end
57
+ end
58
+
59
+ # load all templates from the directory of the requested template
60
+ def load_all_templates_from_dir(dir)
61
+ # hit disk only once per template-dir/request
62
+ @disk_cache[dir] ||= template_files_from_dir(dir).each {|template_file| register_template_from_file(template_file)}
63
+ end
64
+
65
+ def templates_dir_from_path(path)
66
+ dirname = File.dirname(path)
67
+ File.join(@path, dirname == '.' ? '' : dirname)
68
+ end
69
+
70
+ # get all the template filenames from the dir
71
+ def template_files_from_dir(dir)
72
+ Dir.glob(File.join(dir, '*'))
73
+ end
74
+ end
75
+
76
+ module Unfreezable
77
+ def freeze; self; end
78
+ end
79
+
80
+ def initialize(*args)
81
+ super
82
+
83
+ # we don't ever want to get frozen
84
+ extend Unfreezable
85
+ end
86
+
87
+ def mtime
88
+ File.mtime(filename)
89
+ end
90
+
91
+ attr_accessor :previously_last_modified
92
+
93
+ def stale?
94
+ previously_last_modified.nil? || previously_last_modified < mtime
95
+ rescue Errno::ENOENT => e
96
+ undef_my_compiled_methods!
97
+ raise TemplateDeleted
98
+ end
99
+
100
+ def reset_cache_if_stale!
101
+ if stale?
102
+ flush_cache 'source', 'compiled_source'
103
+ undef_my_compiled_methods!
104
+ @previously_last_modified = mtime
105
+ end
106
+ self
107
+ end
108
+
109
+ # remove any compiled methods that look like they might belong to me
110
+ def undef_my_compiled_methods!
111
+ ActionView::Base::CompiledTemplates.public_instance_methods.grep(/#{Regexp.escape(method_name_without_locals)}(?:_locals_)?/).each do |m|
112
+ ActionView::Base::CompiledTemplates.send(:remove_method, m)
113
+ end
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,109 @@
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
+ code = compiled_source
69
+ if code.sub!(/\A(#.*coding.*)\n/, '')
70
+ encoding_comment = $1
71
+ elsif defined?(Encoding) && Encoding.respond_to?(:default_external)
72
+ encoding_comment = "#coding:#{Encoding.default_external}"
73
+ end
74
+
75
+ source = <<-end_src
76
+ def #{render_symbol}(local_assigns)
77
+ old_output_buffer = output_buffer;#{locals_code};#{code}
78
+ ensure
79
+ self.output_buffer = old_output_buffer
80
+ end
81
+ end_src
82
+
83
+ if encoding_comment
84
+ source = "#{encoding_comment}\n#{source}"
85
+ line = -1
86
+ else
87
+ line = 0
88
+ end
89
+
90
+ begin
91
+ ActionView::Base::CompiledTemplates.module_eval(source, filename, line)
92
+ rescue Errno::ENOENT => e
93
+ raise e # Missing template file, re-raise for Base to rescue
94
+ rescue Exception => e # errors from template code
95
+ if logger = defined?(ActionController) && Base.logger
96
+ logger.debug "ERROR: compiling #{render_symbol} RAISED #{e}"
97
+ logger.debug "Function body: #{source}"
98
+ logger.debug "Backtrace: #{e.backtrace.join("\n")}"
99
+ end
100
+
101
+ raise ActionView::TemplateError.new(self, {}, e)
102
+ end
103
+ end
104
+
105
+ def recompile?
106
+ false
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,53 @@
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? && !local_assigns_key?(local_assigns) && 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
+
47
+ private
48
+
49
+ def local_assigns_key?(local_assigns)
50
+ local_assigns.key?(:object) || local_assigns.key?(variable_name)
51
+ end
52
+ end
53
+ 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
+ new(path).tap 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