actionpack-rack-upgrade 2.3.14

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/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 +169 -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 +1425 -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 +197 -0
  27. data/lib/action_controller/dispatcher.rb +133 -0
  28. data/lib/action_controller/failsafe.rb +87 -0
  29. data/lib/action_controller/filters.rb +680 -0
  30. data/lib/action_controller/flash.rb +213 -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 +708 -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 +495 -0
  48. data/lib/action_controller/request_forgery_protection.rb +116 -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 +237 -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 +503 -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 +276 -0
  61. data/lib/action_controller/session/cookie_store.rb +240 -0
  62. data/lib/action_controller/session/mem_cache_store.rb +60 -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 +229 -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/helpers/active_record_helper.rb +305 -0
  93. data/lib/action_view/helpers/asset_tag_helper.rb +695 -0
  94. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  95. data/lib/action_view/helpers/benchmark_helper.rb +54 -0
  96. data/lib/action_view/helpers/cache_helper.rb +39 -0
  97. data/lib/action_view/helpers/capture_helper.rb +136 -0
  98. data/lib/action_view/helpers/csrf_helper.rb +14 -0
  99. data/lib/action_view/helpers/date_helper.rb +989 -0
  100. data/lib/action_view/helpers/debug_helper.rb +38 -0
  101. data/lib/action_view/helpers/form_helper.rb +1118 -0
  102. data/lib/action_view/helpers/form_options_helper.rb +599 -0
  103. data/lib/action_view/helpers/form_tag_helper.rb +490 -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 +251 -0
  111. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  112. data/lib/action_view/helpers/tag_helper.rb +151 -0
  113. data/lib/action_view/helpers/text_helper.rb +597 -0
  114. data/lib/action_view/helpers/translation_helper.rb +67 -0
  115. data/lib/action_view/helpers/url_helper.rb +637 -0
  116. data/lib/action_view/helpers.rb +61 -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 +241 -0
  120. data/lib/action_view/paths.rb +77 -0
  121. data/lib/action_view/reloadable_template.rb +117 -0
  122. data/lib/action_view/renderable.rb +109 -0
  123. data/lib/action_view/renderable_partial.rb +53 -0
  124. data/lib/action_view/template.rb +252 -0
  125. data/lib/action_view/template_error.rb +99 -0
  126. data/lib/action_view/template_handler.rb +34 -0
  127. data/lib/action_view/template_handlers/builder.rb +17 -0
  128. data/lib/action_view/template_handlers/erb.rb +25 -0
  129. data/lib/action_view/template_handlers/rjs.rb +13 -0
  130. data/lib/action_view/template_handlers.rb +48 -0
  131. data/lib/action_view/test_case.rb +162 -0
  132. data/lib/action_view.rb +58 -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 +395 -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 +260 -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/_developer.erb +1 -0
  223. data/test/fixtures/developers.yml +21 -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/_mascot.html.erb +1 -0
  263. data/test/fixtures/mascots.yml +4 -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/_project.erb +1 -0
  285. data/test/fixtures/projects.yml +7 -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/_reply.erb +1 -0
  307. data/test/fixtures/replies.yml +15 -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/_topic.html.erb +1 -0
  410. data/test/fixtures/topics.yml +22 -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,213 @@
1
+ module ActionController #:nodoc:
2
+ # The flash provides a way to pass temporary objects between actions. Anything you place in the flash will be exposed
3
+ # to the very next action and then cleared out. This is a great way of doing notices and alerts, such as a create
4
+ # action that sets <tt>flash[:notice] = "Successfully created"</tt> before redirecting to a display action that can
5
+ # then expose the flash to its template. Actually, that exposure is automatically done. Example:
6
+ #
7
+ # class PostsController < ActionController::Base
8
+ # def create
9
+ # # save post
10
+ # flash[:notice] = "Successfully created post"
11
+ # redirect_to posts_path(@post)
12
+ # end
13
+ #
14
+ # def show
15
+ # # doesn't need to assign the flash notice to the template, that's done automatically
16
+ # end
17
+ # end
18
+ #
19
+ # show.html.erb
20
+ # <% if flash[:notice] %>
21
+ # <div class="notice"><%= flash[:notice] %></div>
22
+ # <% end %>
23
+ #
24
+ # This example just places a string in the flash, but you can put any object in there. And of course, you can put as
25
+ # many as you like at a time too. Just remember: They'll be gone by the time the next action has been performed.
26
+ #
27
+ # See docs on the FlashHash class for more details about the flash.
28
+ module Flash
29
+ def self.included(base)
30
+ base.class_eval do
31
+ include InstanceMethods
32
+
33
+ alias_method_chain :perform_action, :flash
34
+ alias_method_chain :reset_session, :flash
35
+ alias_method_chain :redirect_to, :flash
36
+
37
+ helper_method :alert
38
+ helper_method :notice
39
+ end
40
+ end
41
+
42
+ class FlashNow #:nodoc:
43
+ def initialize(flash)
44
+ @flash = flash
45
+ end
46
+
47
+ def []=(k, v)
48
+ @flash[k] = v
49
+ @flash.discard(k)
50
+ v
51
+ end
52
+
53
+ def [](k)
54
+ @flash[k]
55
+ end
56
+ end
57
+
58
+ class FlashHash < Hash
59
+ def initialize #:nodoc:
60
+ super
61
+ @used = {}
62
+ end
63
+
64
+ def []=(k, v) #:nodoc:
65
+ keep(k)
66
+ super
67
+ end
68
+
69
+ def update(h) #:nodoc:
70
+ h.keys.each { |k| keep(k) }
71
+ super
72
+ end
73
+
74
+ alias :merge! :update
75
+
76
+ def replace(h) #:nodoc:
77
+ @used = {}
78
+ super
79
+ end
80
+
81
+ # Sets a flash that will not be available to the next action, only to the current.
82
+ #
83
+ # flash.now[:message] = "Hello current action"
84
+ #
85
+ # This method enables you to use the flash as a central messaging system in your app.
86
+ # When you need to pass an object to the next action, you use the standard flash assign (<tt>[]=</tt>).
87
+ # When you need to pass an object to the current action, you use <tt>now</tt>, and your object will
88
+ # vanish when the current action is done.
89
+ #
90
+ # Entries set via <tt>now</tt> are accessed the same way as standard entries: <tt>flash['my-key']</tt>.
91
+ def now
92
+ FlashNow.new(self)
93
+ end
94
+
95
+ # Keeps either the entire current flash or a specific flash entry available for the next action:
96
+ #
97
+ # flash.keep # keeps the entire flash
98
+ # flash.keep(:notice) # keeps only the "notice" entry, the rest of the flash is discarded
99
+ def keep(k = nil)
100
+ use(k, false)
101
+ end
102
+
103
+ # Marks the entire flash or a single flash entry to be discarded by the end of the current action:
104
+ #
105
+ # flash.discard # discard the entire flash at the end of the current action
106
+ # flash.discard(:warning) # discard only the "warning" entry at the end of the current action
107
+ def discard(k = nil)
108
+ use(k)
109
+ end
110
+
111
+ # Mark for removal entries that were kept, and delete unkept ones.
112
+ #
113
+ # This method is called automatically by filters, so you generally don't need to care about it.
114
+ def sweep #:nodoc:
115
+ keys.each do |k|
116
+ unless @used[k]
117
+ use(k)
118
+ else
119
+ delete(k)
120
+ @used.delete(k)
121
+ end
122
+ end
123
+
124
+ # clean up after keys that could have been left over by calling reject! or shift on the flash
125
+ (@used.keys - keys).each{ |k| @used.delete(k) }
126
+ end
127
+
128
+ def store(session, key = "flash")
129
+ return if self.empty?
130
+ session[key] = self
131
+ end
132
+
133
+ private
134
+ # Used internally by the <tt>keep</tt> and <tt>discard</tt> methods
135
+ # use() # marks the entire flash as used
136
+ # use('msg') # marks the "msg" entry as used
137
+ # use(nil, false) # marks the entire flash as unused (keeps it around for one more action)
138
+ # use('msg', false) # marks the "msg" entry as unused (keeps it around for one more action)
139
+ def use(k=nil, v=true)
140
+ unless k.nil?
141
+ @used[k] = v
142
+ else
143
+ keys.each{ |key| use(key, v) }
144
+ end
145
+ end
146
+ end
147
+
148
+ module InstanceMethods #:nodoc:
149
+ protected
150
+ def perform_action_with_flash
151
+ perform_action_without_flash
152
+ if defined? @_flash
153
+ @_flash.store(session)
154
+ remove_instance_variable(:@_flash)
155
+ end
156
+ end
157
+
158
+ def reset_session_with_flash
159
+ reset_session_without_flash
160
+ remove_instance_variable(:@_flash) if defined? @_flash
161
+ end
162
+
163
+ def redirect_to_with_flash(options = {}, response_status_and_flash = {}) #:doc:
164
+ if alert = response_status_and_flash.delete(:alert)
165
+ flash[:alert] = alert
166
+ end
167
+
168
+ if notice = response_status_and_flash.delete(:notice)
169
+ flash[:notice] = notice
170
+ end
171
+
172
+ if other_flashes = response_status_and_flash.delete(:flash)
173
+ flash.update(other_flashes)
174
+ end
175
+
176
+ redirect_to_without_flash(options, response_status_and_flash)
177
+ end
178
+
179
+ # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
180
+ # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
181
+ # to put a new one.
182
+ def flash #:doc:
183
+ if !defined?(@_flash)
184
+ @_flash = session["flash"] || FlashHash.new
185
+ @_flash.sweep
186
+ end
187
+
188
+ @_flash
189
+ end
190
+
191
+
192
+ # Convenience accessor for flash[:alert]
193
+ def alert
194
+ flash[:alert]
195
+ end
196
+
197
+ # Convenience accessor for flash[:alert]=
198
+ def alert=(message)
199
+ flash[:alert] = message
200
+ end
201
+
202
+ # Convenience accessor for flash[:notice]
203
+ def notice
204
+ flash[:notice]
205
+ end
206
+
207
+ # Convenience accessor for flash[:notice]=
208
+ def notice=(message)
209
+ flash[:notice] = message
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,33 @@
1
+ require 'active_support/memoizable'
2
+
3
+ module ActionController
4
+ module Http
5
+ class Headers < ::Hash
6
+ extend ActiveSupport::Memoizable
7
+
8
+ def initialize(*args)
9
+ if args.size == 1 && args[0].is_a?(Hash)
10
+ super()
11
+ update(args[0])
12
+ else
13
+ super
14
+ end
15
+ end
16
+
17
+ def [](header_name)
18
+ if include?(header_name)
19
+ super
20
+ else
21
+ super(env_name(header_name))
22
+ end
23
+ end
24
+
25
+ private
26
+ # Converts a HTTP header name to an environment variable name.
27
+ def env_name(header_name)
28
+ "HTTP_#{header_name.upcase.gsub(/-/, '_')}"
29
+ end
30
+ memoize :env_name
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,225 @@
1
+ require 'active_support/dependencies'
2
+
3
+ # FIXME: helper { ... } is broken on Ruby 1.9
4
+ module ActionController #:nodoc:
5
+ module Helpers #:nodoc:
6
+ def self.included(base)
7
+ # Initialize the base module to aggregate its helpers.
8
+ base.class_inheritable_accessor :master_helper_module
9
+ base.master_helper_module = Module.new
10
+
11
+ # Set the default directory for helpers
12
+ base.class_inheritable_accessor :helpers_dir
13
+ base.helpers_dir = (defined?(RAILS_ROOT) ? "#{RAILS_ROOT}/app/helpers" : "app/helpers")
14
+
15
+ # Extend base with class methods to declare helpers.
16
+ base.extend(ClassMethods)
17
+
18
+ base.class_eval do
19
+ # Wrap inherited to create a new master helper module for subclasses.
20
+ class << self
21
+ alias_method_chain :inherited, :helper
22
+ end
23
+ end
24
+ end
25
+
26
+ # The Rails framework provides a large number of helpers for working with +assets+, +dates+, +forms+,
27
+ # +numbers+ and Active Record objects, to name a few. These helpers are available to all templates
28
+ # by default.
29
+ #
30
+ # In addition to using the standard template helpers provided in the Rails framework, creating custom helpers to
31
+ # extract complicated logic or reusable functionality is strongly encouraged. By default, the controller will
32
+ # include a helper whose name matches that of the controller, e.g., <tt>MyController</tt> will automatically
33
+ # include <tt>MyHelper</tt>.
34
+ #
35
+ # Additional helpers can be specified using the +helper+ class method in <tt>ActionController::Base</tt> or any
36
+ # controller which inherits from it.
37
+ #
38
+ # ==== Examples
39
+ # The +to_s+ method from the Time class can be wrapped in a helper method to display a custom message if
40
+ # the Time object is blank:
41
+ #
42
+ # module FormattedTimeHelper
43
+ # def format_time(time, format=:long, blank_message="&nbsp;")
44
+ # time.blank? ? blank_message : time.to_s(format)
45
+ # end
46
+ # end
47
+ #
48
+ # FormattedTimeHelper can now be included in a controller, using the +helper+ class method:
49
+ #
50
+ # class EventsController < ActionController::Base
51
+ # helper FormattedTimeHelper
52
+ # def index
53
+ # @events = Event.find(:all)
54
+ # end
55
+ # end
56
+ #
57
+ # Then, in any view rendered by <tt>EventController</tt>, the <tt>format_time</tt> method can be called:
58
+ #
59
+ # <% @events.each do |event| -%>
60
+ # <p>
61
+ # <% format_time(event.time, :short, "N/A") %> | <%= event.name %>
62
+ # </p>
63
+ # <% end -%>
64
+ #
65
+ # Finally, assuming we have two event instances, one which has a time and one which does not,
66
+ # the output might look like this:
67
+ #
68
+ # 23 Aug 11:30 | Carolina Railhawks Soccer Match
69
+ # N/A | Carolina Railhaws Training Workshop
70
+ #
71
+ module ClassMethods
72
+ # Makes all the (instance) methods in the helper module available to templates rendered through this controller.
73
+ # See ActionView::Helpers (link:classes/ActionView/Helpers.html) for more about making your own helper modules
74
+ # available to the templates.
75
+ def add_template_helper(helper_module) #:nodoc:
76
+ master_helper_module.module_eval { include helper_module }
77
+ end
78
+
79
+ # The +helper+ class method can take a series of helper module names, a block, or both.
80
+ #
81
+ # * <tt>*args</tt>: One or more modules, strings or symbols, or the special symbol <tt>:all</tt>.
82
+ # * <tt>&block</tt>: A block defining helper methods.
83
+ #
84
+ # ==== Examples
85
+ # When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
86
+ # and include the module in the template class. The second form illustrates how to include custom helpers
87
+ # when working with namespaced controllers, or other cases where the file containing the helper definition is not
88
+ # in one of Rails' standard load paths:
89
+ # helper :foo # => requires 'foo_helper' and includes FooHelper
90
+ # helper 'resources/foo' # => requires 'resources/foo_helper' and includes Resources::FooHelper
91
+ #
92
+ # When the argument is a module it will be included directly in the template class.
93
+ # helper FooHelper # => includes FooHelper
94
+ #
95
+ # When the argument is the symbol <tt>:all</tt>, the controller will include all helpers beneath
96
+ # <tt>ActionController::Base.helpers_dir</tt> (defaults to <tt>app/helpers/**/*.rb</tt> under RAILS_ROOT).
97
+ # helper :all
98
+ #
99
+ # Additionally, the +helper+ class method can receive and evaluate a block, making the methods defined available
100
+ # to the template.
101
+ # # One line
102
+ # helper { def hello() "Hello, world!" end }
103
+ # # Multi-line
104
+ # helper do
105
+ # def foo(bar)
106
+ # "#{bar} is the very best"
107
+ # end
108
+ # end
109
+ #
110
+ # Finally, all the above styles can be mixed together, and the +helper+ method can be invoked with a mix of
111
+ # +symbols+, +strings+, +modules+ and blocks.
112
+ # helper(:three, BlindHelper) { def mice() 'mice' end }
113
+ #
114
+ def helper(*args, &block)
115
+ args.flatten.each do |arg|
116
+ case arg
117
+ when Module
118
+ add_template_helper(arg)
119
+ when :all
120
+ helper(all_application_helpers)
121
+ when String, Symbol
122
+ file_name = arg.to_s.underscore + '_helper'
123
+ class_name = file_name.camelize
124
+
125
+ begin
126
+ require_dependency(file_name)
127
+ rescue LoadError => load_error
128
+ requiree = / -- (.*?)(\.rb)?$/.match(load_error.message).to_a[1]
129
+ if requiree == file_name
130
+ msg = "Missing helper file helpers/#{file_name}.rb"
131
+ raise LoadError.new(msg).copy_blame!(load_error)
132
+ else
133
+ raise
134
+ end
135
+ end
136
+
137
+ add_template_helper(class_name.constantize)
138
+ else
139
+ raise ArgumentError, "helper expects String, Symbol, or Module argument (was: #{args.inspect})"
140
+ end
141
+ end
142
+
143
+ # Evaluate block in template class if given.
144
+ master_helper_module.module_eval(&block) if block_given?
145
+ end
146
+
147
+ # Declare a controller method as a helper. For example, the following
148
+ # makes the +current_user+ controller method available to the view:
149
+ # class ApplicationController < ActionController::Base
150
+ # helper_method :current_user, :logged_in?
151
+ #
152
+ # def current_user
153
+ # @current_user ||= User.find_by_id(session[:user])
154
+ # end
155
+ #
156
+ # def logged_in?
157
+ # current_user != nil
158
+ # end
159
+ # end
160
+ #
161
+ # In a view:
162
+ # <% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>
163
+ def helper_method(*methods)
164
+ methods.flatten.each do |method|
165
+ master_helper_module.module_eval <<-end_eval
166
+ def #{method}(*args, &block) # def current_user(*args, &block)
167
+ controller.send(%(#{method}), *args, &block) # controller.send(%(current_user), *args, &block)
168
+ end # end
169
+ end_eval
170
+ end
171
+ end
172
+
173
+ # Declares helper accessors for controller attributes. For example, the
174
+ # following adds new +name+ and <tt>name=</tt> instance methods to a
175
+ # controller and makes them available to the view:
176
+ # helper_attr :name
177
+ # attr_accessor :name
178
+ def helper_attr(*attrs)
179
+ attrs.flatten.each { |attr| helper_method(attr, "#{attr}=") }
180
+ end
181
+
182
+ # Provides a proxy to access helpers methods from outside the view.
183
+ def helpers
184
+ unless @helper_proxy
185
+ @helper_proxy = ActionView::Base.new
186
+ @helper_proxy.extend master_helper_module
187
+ else
188
+ @helper_proxy
189
+ end
190
+ end
191
+
192
+ private
193
+ def default_helper_module!
194
+ unless name.blank?
195
+ module_name = name.sub(/Controller$|$/, 'Helper')
196
+ module_path = module_name.split('::').map { |m| m.underscore }.join('/')
197
+ require_dependency module_path
198
+ helper module_name.constantize
199
+ end
200
+ rescue MissingSourceFile => e
201
+ raise unless e.is_missing? module_path
202
+ rescue NameError => e
203
+ raise unless e.missing_name? module_name
204
+ end
205
+
206
+ def inherited_with_helper(child)
207
+ inherited_without_helper(child)
208
+
209
+ begin
210
+ child.master_helper_module = Module.new
211
+ child.master_helper_module.__send__ :include, master_helper_module
212
+ child.__send__ :default_helper_module!
213
+ rescue MissingSourceFile => e
214
+ raise unless e.is_missing?("helpers/#{child.controller_path}_helper")
215
+ end
216
+ end
217
+
218
+ # Extract helper names from files in app/helpers/**/*.rb
219
+ def all_application_helpers
220
+ extract = /^#{Regexp.quote(helpers_dir)}\/?(.*)_helper.rb$/
221
+ Dir["#{helpers_dir}/**/*_helper.rb"].map { |file| file.sub extract, '\1' }
222
+ end
223
+ end
224
+ end
225
+ end