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,171 @@
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
+ alias_method_chain :perform_action, :flash
33
+ alias_method_chain :reset_session, :flash
34
+ end
35
+ end
36
+
37
+ class FlashNow #:nodoc:
38
+ def initialize(flash)
39
+ @flash = flash
40
+ end
41
+
42
+ def []=(k, v)
43
+ @flash[k] = v
44
+ @flash.discard(k)
45
+ v
46
+ end
47
+
48
+ def [](k)
49
+ @flash[k]
50
+ end
51
+ end
52
+
53
+ class FlashHash < Hash
54
+ def initialize #:nodoc:
55
+ super
56
+ @used = {}
57
+ end
58
+
59
+ def []=(k, v) #:nodoc:
60
+ keep(k)
61
+ super
62
+ end
63
+
64
+ def update(h) #:nodoc:
65
+ h.keys.each { |k| keep(k) }
66
+ super
67
+ end
68
+
69
+ alias :merge! :update
70
+
71
+ def replace(h) #:nodoc:
72
+ @used = {}
73
+ super
74
+ end
75
+
76
+ # Sets a flash that will not be available to the next action, only to the current.
77
+ #
78
+ # flash.now[:message] = "Hello current action"
79
+ #
80
+ # This method enables you to use the flash as a central messaging system in your app.
81
+ # When you need to pass an object to the next action, you use the standard flash assign (<tt>[]=</tt>).
82
+ # When you need to pass an object to the current action, you use <tt>now</tt>, and your object will
83
+ # vanish when the current action is done.
84
+ #
85
+ # Entries set via <tt>now</tt> are accessed the same way as standard entries: <tt>flash['my-key']</tt>.
86
+ def now
87
+ FlashNow.new(self)
88
+ end
89
+
90
+ # Keeps either the entire current flash or a specific flash entry available for the next action:
91
+ #
92
+ # flash.keep # keeps the entire flash
93
+ # flash.keep(:notice) # keeps only the "notice" entry, the rest of the flash is discarded
94
+ def keep(k = nil)
95
+ use(k, false)
96
+ end
97
+
98
+ # Marks the entire flash or a single flash entry to be discarded by the end of the current action:
99
+ #
100
+ # flash.discard # discard the entire flash at the end of the current action
101
+ # flash.discard(:warning) # discard only the "warning" entry at the end of the current action
102
+ def discard(k = nil)
103
+ use(k)
104
+ end
105
+
106
+ # Mark for removal entries that were kept, and delete unkept ones.
107
+ #
108
+ # This method is called automatically by filters, so you generally don't need to care about it.
109
+ def sweep #:nodoc:
110
+ keys.each do |k|
111
+ unless @used[k]
112
+ use(k)
113
+ else
114
+ delete(k)
115
+ @used.delete(k)
116
+ end
117
+ end
118
+
119
+ # clean up after keys that could have been left over by calling reject! or shift on the flash
120
+ (@used.keys - keys).each{ |k| @used.delete(k) }
121
+ end
122
+
123
+ def store(session, key = "flash")
124
+ return if self.empty?
125
+ session[key] = self
126
+ end
127
+
128
+ private
129
+ # Used internally by the <tt>keep</tt> and <tt>discard</tt> methods
130
+ # use() # marks the entire flash as used
131
+ # use('msg') # marks the "msg" entry as used
132
+ # use(nil, false) # marks the entire flash as unused (keeps it around for one more action)
133
+ # use('msg', false) # marks the "msg" entry as unused (keeps it around for one more action)
134
+ def use(k=nil, v=true)
135
+ unless k.nil?
136
+ @used[k] = v
137
+ else
138
+ keys.each{ |key| use(key, v) }
139
+ end
140
+ end
141
+ end
142
+
143
+ module InstanceMethods #:nodoc:
144
+ protected
145
+ def perform_action_with_flash
146
+ perform_action_without_flash
147
+ if defined? @_flash
148
+ @_flash.store(session)
149
+ remove_instance_variable(:@_flash)
150
+ end
151
+ end
152
+
153
+ def reset_session_with_flash
154
+ reset_session_without_flash
155
+ remove_instance_variable(:@_flash) if defined? @_flash
156
+ end
157
+
158
+ # Access the contents of the flash. Use <tt>flash["notice"]</tt> to
159
+ # read a notice you put there or <tt>flash["notice"] = "hello"</tt>
160
+ # to put a new one.
161
+ def flash #:doc:
162
+ if !defined?(@_flash)
163
+ @_flash = session["flash"] || FlashHash.new
164
+ @_flash.sweep
165
+ end
166
+
167
+ @_flash
168
+ end
169
+ end
170
+ end
171
+ 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