actionpack 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (513) hide show
  1. data/CHANGELOG +15 -64
  2. data/README +39 -48
  3. data/lib/abstract_controller.rb +22 -0
  4. data/lib/abstract_controller/base.rb +191 -0
  5. data/lib/abstract_controller/callbacks.rb +113 -0
  6. data/lib/abstract_controller/collector.rb +30 -0
  7. data/lib/abstract_controller/compatibility.rb +18 -0
  8. data/lib/abstract_controller/helpers.rb +163 -0
  9. data/lib/abstract_controller/layouts.rb +413 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +13 -0
  12. data/lib/abstract_controller/rendering.rb +238 -0
  13. data/lib/{action_controller → abstract_controller}/translation.rb +1 -1
  14. data/lib/action_controller.rb +68 -102
  15. data/lib/action_controller/base.rb +77 -1409
  16. data/lib/action_controller/caching.rb +58 -45
  17. data/lib/action_controller/caching/actions.rb +100 -114
  18. data/lib/action_controller/caching/fragments.rb +17 -19
  19. data/lib/action_controller/caching/pages.rb +12 -6
  20. data/lib/action_controller/caching/sweeping.rb +42 -0
  21. data/lib/action_controller/deprecated.rb +5 -0
  22. data/lib/action_controller/deprecated/dispatcher.rb +28 -0
  23. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  24. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  25. data/lib/action_controller/metal.rb +125 -0
  26. data/lib/action_controller/metal/compatibility.rb +141 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +17 -0
  30. data/lib/action_controller/metal/exceptions.rb +46 -0
  31. data/lib/action_controller/metal/flash.rb +28 -0
  32. data/lib/action_controller/metal/head.rb +33 -0
  33. data/lib/action_controller/metal/helpers.rb +116 -0
  34. data/lib/action_controller/metal/hide_actions.rb +50 -0
  35. data/lib/action_controller/{http_authentication.rb → metal/http_authentication.rb} +18 -15
  36. data/lib/action_controller/metal/instrumentation.rb +99 -0
  37. data/lib/action_controller/metal/mime_responds.rb +300 -0
  38. data/lib/action_controller/metal/rack_delegation.rb +35 -0
  39. data/lib/action_controller/metal/redirecting.rb +90 -0
  40. data/lib/action_controller/metal/renderers.rb +95 -0
  41. data/lib/action_controller/metal/rendering.rb +69 -0
  42. data/lib/action_controller/metal/request_forgery_protection.rb +115 -0
  43. data/lib/action_controller/metal/rescue.rb +13 -0
  44. data/lib/action_controller/metal/responder.rb +220 -0
  45. data/lib/action_controller/{session_management.rb → metal/session_management.rb} +5 -14
  46. data/lib/action_controller/{streaming.rb → metal/streaming.rb} +13 -12
  47. data/lib/action_controller/metal/testing.rb +42 -0
  48. data/lib/action_controller/metal/url_for.rb +157 -0
  49. data/lib/action_controller/{verification.rb → metal/verification.rb} +41 -41
  50. data/lib/action_controller/middleware.rb +38 -0
  51. data/lib/action_controller/polymorphic_routes.rb +20 -26
  52. data/lib/action_controller/railtie.rb +30 -0
  53. data/lib/action_controller/railties/subscriber.rb +63 -0
  54. data/lib/action_controller/record_identifier.rb +3 -16
  55. data/lib/action_controller/test_case.rb +156 -18
  56. data/lib/action_controller/url_rewriter.rb +47 -200
  57. data/lib/action_controller/vendor/html-scanner.rb +16 -12
  58. data/lib/action_controller/vendor/html-scanner/html/node.rb +1 -1
  59. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +12 -9
  60. data/lib/action_dispatch.rb +88 -0
  61. data/lib/action_dispatch/http/cache.rb +123 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +98 -0
  63. data/lib/{action_controller → action_dispatch/http}/headers.rb +8 -8
  64. data/lib/action_dispatch/http/mime_negotiation.rb +101 -0
  65. data/lib/{action_controller → action_dispatch/http}/mime_type.rb +30 -11
  66. data/lib/{action_controller → action_dispatch/http}/mime_types.rb +5 -3
  67. data/lib/action_dispatch/http/parameters.rb +49 -0
  68. data/lib/action_dispatch/http/request.rb +223 -0
  69. data/lib/action_dispatch/http/response.rb +209 -0
  70. data/lib/action_dispatch/http/upload.rb +48 -0
  71. data/lib/action_dispatch/http/url.rb +129 -0
  72. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  73. data/lib/action_dispatch/middleware/cascade.rb +29 -0
  74. data/lib/action_dispatch/middleware/cookies.rb +216 -0
  75. data/lib/{action_controller → action_dispatch/middleware}/flash.rb +51 -90
  76. data/lib/action_dispatch/middleware/head.rb +18 -0
  77. data/lib/action_dispatch/middleware/params_parser.rb +78 -0
  78. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  79. data/lib/action_dispatch/middleware/session/abstract_store.rb +209 -0
  80. data/lib/{action_controller → action_dispatch/middleware}/session/cookie_store.rb +56 -60
  81. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  82. data/lib/action_dispatch/middleware/show_exceptions.rb +173 -0
  83. data/lib/{action_controller/middleware_stack.rb → action_dispatch/middleware/stack.rb} +23 -13
  84. data/lib/action_dispatch/middleware/static.rb +44 -0
  85. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_request_and_response.erb +10 -3
  86. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/_trace.erb +4 -4
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/layout.erb +2 -2
  89. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/missing_template.erb +0 -0
  90. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/routing_error.erb +0 -0
  91. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/template_error.erb +3 -3
  92. data/lib/{action_controller → action_dispatch/middleware}/templates/rescues/unknown_action.erb +0 -0
  93. data/lib/action_dispatch/railtie.rb +15 -0
  94. data/lib/action_dispatch/routing.rb +217 -0
  95. data/lib/action_dispatch/routing/deprecated_mapper.rb +877 -0
  96. data/lib/action_dispatch/routing/mapper.rb +649 -0
  97. data/lib/action_dispatch/routing/route.rb +55 -0
  98. data/lib/action_dispatch/routing/route_set.rb +445 -0
  99. data/lib/action_dispatch/testing/assertions.rb +21 -0
  100. data/lib/action_dispatch/testing/assertions/dom.rb +37 -0
  101. data/lib/{action_controller/assertions/model_assertions.rb → action_dispatch/testing/assertions/model.rb} +2 -4
  102. data/lib/action_dispatch/testing/assertions/response.rb +154 -0
  103. data/lib/{action_controller/assertions/routing_assertions.rb → action_dispatch/testing/assertions/routing.rb} +72 -34
  104. data/lib/{action_controller/assertions/selector_assertions.rb → action_dispatch/testing/assertions/selector.rb} +14 -11
  105. data/lib/{action_controller/assertions/tag_assertions.rb → action_dispatch/testing/assertions/tag.rb} +25 -14
  106. data/lib/{action_controller → action_dispatch/testing}/integration.rb +173 -406
  107. data/lib/action_dispatch/testing/performance_test.rb +17 -0
  108. data/lib/action_dispatch/testing/test_process.rb +42 -0
  109. data/lib/action_dispatch/testing/test_request.rb +83 -0
  110. data/lib/action_dispatch/testing/test_response.rb +136 -0
  111. data/lib/action_pack/version.rb +3 -3
  112. data/lib/action_view.rb +29 -26
  113. data/lib/action_view/base.rb +101 -148
  114. data/lib/action_view/context.rb +44 -0
  115. data/lib/action_view/helpers.rb +6 -4
  116. data/lib/action_view/helpers/{active_record_helper.rb → active_model_helper.rb} +63 -63
  117. data/lib/action_view/helpers/asset_tag_helper.rb +166 -31
  118. data/lib/action_view/helpers/cache_helper.rb +1 -1
  119. data/lib/action_view/helpers/capture_helper.rb +40 -8
  120. data/lib/action_view/helpers/csrf_helper.rb +2 -4
  121. data/lib/action_view/helpers/date_helper.rb +14 -15
  122. data/lib/action_view/helpers/form_helper.rb +121 -24
  123. data/lib/action_view/helpers/form_options_helper.rb +26 -25
  124. data/lib/action_view/helpers/form_tag_helper.rb +42 -33
  125. data/lib/action_view/helpers/javascript_helper.rb +1 -109
  126. data/lib/action_view/helpers/number_helper.rb +4 -1
  127. data/lib/action_view/helpers/prototype_helper.rb +75 -499
  128. data/lib/action_view/helpers/raw_output_helper.rb +1 -1
  129. data/lib/action_view/helpers/record_tag_helper.rb +3 -3
  130. data/lib/action_view/helpers/sanitize_helper.rb +3 -2
  131. data/lib/action_view/helpers/scriptaculous_helper.rb +89 -53
  132. data/lib/action_view/helpers/tag_helper.rb +12 -13
  133. data/lib/action_view/helpers/text_helper.rb +33 -38
  134. data/lib/action_view/helpers/translation_helper.rb +11 -35
  135. data/lib/action_view/helpers/url_helper.rb +140 -134
  136. data/lib/action_view/locale/en.yml +34 -28
  137. data/lib/action_view/paths.rb +27 -24
  138. data/lib/action_view/railtie.rb +17 -0
  139. data/lib/action_view/railties/subscriber.rb +24 -0
  140. data/lib/action_view/{partials.rb → render/partials.rb} +161 -51
  141. data/lib/action_view/render/rendering.rb +117 -0
  142. data/lib/action_view/template.rb +88 -217
  143. data/lib/action_view/template/error.rb +105 -0
  144. data/lib/action_view/template/handler.rb +41 -0
  145. data/lib/action_view/template/handlers.rb +54 -0
  146. data/lib/action_view/{template_handlers → template/handlers}/builder.rb +6 -6
  147. data/lib/action_view/template/handlers/erb.rb +58 -0
  148. data/lib/action_view/{template_handlers → template/handlers}/rjs.rb +8 -3
  149. data/lib/action_view/template/resolver.rb +164 -0
  150. data/lib/action_view/template/text.rb +40 -0
  151. data/lib/action_view/test_case.rb +18 -18
  152. metadata +165 -420
  153. data/RUNNING_UNIT_TESTS +0 -24
  154. data/Rakefile +0 -158
  155. data/install.rb +0 -30
  156. data/lib/action_controller/assertions/dom_assertions.rb +0 -55
  157. data/lib/action_controller/assertions/response_assertions.rb +0 -169
  158. data/lib/action_controller/benchmarking.rb +0 -107
  159. data/lib/action_controller/caching/sweeper.rb +0 -45
  160. data/lib/action_controller/cgi_ext.rb +0 -15
  161. data/lib/action_controller/cgi_ext/cookie.rb +0 -112
  162. data/lib/action_controller/cgi_ext/query_extension.rb +0 -22
  163. data/lib/action_controller/cgi_ext/stdinput.rb +0 -24
  164. data/lib/action_controller/cgi_process.rb +0 -77
  165. data/lib/action_controller/cookies.rb +0 -197
  166. data/lib/action_controller/dispatcher.rb +0 -133
  167. data/lib/action_controller/failsafe.rb +0 -87
  168. data/lib/action_controller/filters.rb +0 -680
  169. data/lib/action_controller/helpers.rb +0 -225
  170. data/lib/action_controller/layout.rb +0 -286
  171. data/lib/action_controller/middlewares.rb +0 -14
  172. data/lib/action_controller/mime_responds.rb +0 -193
  173. data/lib/action_controller/params_parser.rb +0 -77
  174. data/lib/action_controller/performance_test.rb +0 -15
  175. data/lib/action_controller/rack_lint_patch.rb +0 -36
  176. data/lib/action_controller/reloader.rb +0 -54
  177. data/lib/action_controller/request.rb +0 -518
  178. data/lib/action_controller/request_forgery_protection.rb +0 -116
  179. data/lib/action_controller/rescue.rb +0 -183
  180. data/lib/action_controller/resources.rb +0 -682
  181. data/lib/action_controller/response.rb +0 -237
  182. data/lib/action_controller/routing.rb +0 -388
  183. data/lib/action_controller/routing/builder.rb +0 -197
  184. data/lib/action_controller/routing/optimisations.rb +0 -130
  185. data/lib/action_controller/routing/recognition_optimisation.rb +0 -167
  186. data/lib/action_controller/routing/route.rb +0 -265
  187. data/lib/action_controller/routing/route_set.rb +0 -503
  188. data/lib/action_controller/routing/routing_ext.rb +0 -49
  189. data/lib/action_controller/routing/segments.rb +0 -343
  190. data/lib/action_controller/session/abstract_store.rb +0 -276
  191. data/lib/action_controller/session/mem_cache_store.rb +0 -60
  192. data/lib/action_controller/status_codes.rb +0 -88
  193. data/lib/action_controller/string_coercion.rb +0 -29
  194. data/lib/action_controller/templates/rescues/diagnostics.erb +0 -11
  195. data/lib/action_controller/test_process.rb +0 -580
  196. data/lib/action_controller/uploaded_file.rb +0 -44
  197. data/lib/action_view/helpers/benchmark_helper.rb +0 -54
  198. data/lib/action_view/inline_template.rb +0 -19
  199. data/lib/action_view/reloadable_template.rb +0 -117
  200. data/lib/action_view/renderable.rb +0 -109
  201. data/lib/action_view/renderable_partial.rb +0 -53
  202. data/lib/action_view/template_error.rb +0 -99
  203. data/lib/action_view/template_handler.rb +0 -34
  204. data/lib/action_view/template_handlers.rb +0 -48
  205. data/lib/action_view/template_handlers/erb.rb +0 -25
  206. data/lib/actionpack.rb +0 -2
  207. data/test/abstract_unit.rb +0 -78
  208. data/test/active_record_unit.rb +0 -104
  209. data/test/activerecord/active_record_store_test.rb +0 -221
  210. data/test/activerecord/render_partial_with_record_identification_test.rb +0 -188
  211. data/test/adv_attr_test.rb +0 -20
  212. data/test/controller/action_pack_assertions_test.rb +0 -545
  213. data/test/controller/addresses_render_test.rb +0 -37
  214. data/test/controller/assert_select_test.rb +0 -735
  215. data/test/controller/base_test.rb +0 -217
  216. data/test/controller/benchmark_test.rb +0 -32
  217. data/test/controller/caching_test.rb +0 -743
  218. data/test/controller/capture_test.rb +0 -66
  219. data/test/controller/content_type_test.rb +0 -178
  220. data/test/controller/controller_fixtures/app/controllers/admin/user_controller.rb +0 -0
  221. data/test/controller/controller_fixtures/app/controllers/user_controller.rb +0 -0
  222. data/test/controller/controller_fixtures/vendor/plugins/bad_plugin/lib/plugin_controller.rb +0 -0
  223. data/test/controller/cookie_test.rb +0 -208
  224. data/test/controller/deprecation/deprecated_base_methods_test.rb +0 -32
  225. data/test/controller/dispatcher_test.rb +0 -144
  226. data/test/controller/dom_assertions_test.rb +0 -53
  227. data/test/controller/failsafe_test.rb +0 -60
  228. data/test/controller/fake_controllers.rb +0 -33
  229. data/test/controller/fake_models.rb +0 -19
  230. data/test/controller/filter_params_test.rb +0 -52
  231. data/test/controller/filters_test.rb +0 -885
  232. data/test/controller/flash_test.rb +0 -174
  233. data/test/controller/header_test.rb +0 -14
  234. data/test/controller/helper_test.rb +0 -224
  235. data/test/controller/html-scanner/cdata_node_test.rb +0 -15
  236. data/test/controller/html-scanner/document_test.rb +0 -148
  237. data/test/controller/html-scanner/node_test.rb +0 -89
  238. data/test/controller/html-scanner/sanitizer_test.rb +0 -300
  239. data/test/controller/html-scanner/tag_node_test.rb +0 -238
  240. data/test/controller/html-scanner/text_node_test.rb +0 -50
  241. data/test/controller/html-scanner/tokenizer_test.rb +0 -131
  242. data/test/controller/http_basic_authentication_test.rb +0 -113
  243. data/test/controller/http_digest_authentication_test.rb +0 -254
  244. data/test/controller/integration_test.rb +0 -526
  245. data/test/controller/layout_test.rb +0 -215
  246. data/test/controller/localized_templates_test.rb +0 -24
  247. data/test/controller/logging_test.rb +0 -46
  248. data/test/controller/middleware_stack_test.rb +0 -90
  249. data/test/controller/mime_responds_test.rb +0 -536
  250. data/test/controller/mime_type_test.rb +0 -93
  251. data/test/controller/output_escaping_test.rb +0 -19
  252. data/test/controller/polymorphic_routes_test.rb +0 -297
  253. data/test/controller/rack_test.rb +0 -308
  254. data/test/controller/record_identifier_test.rb +0 -139
  255. data/test/controller/redirect_test.rb +0 -285
  256. data/test/controller/reloader_test.rb +0 -125
  257. data/test/controller/render_test.rb +0 -1783
  258. data/test/controller/request/json_params_parsing_test.rb +0 -65
  259. data/test/controller/request/multipart_params_parsing_test.rb +0 -177
  260. data/test/controller/request/query_string_parsing_test.rb +0 -129
  261. data/test/controller/request/test_request_test.rb +0 -35
  262. data/test/controller/request/url_encoded_params_parsing_test.rb +0 -146
  263. data/test/controller/request/xml_params_parsing_test.rb +0 -103
  264. data/test/controller/request_forgery_protection_test.rb +0 -233
  265. data/test/controller/request_test.rb +0 -398
  266. data/test/controller/rescue_test.rb +0 -541
  267. data/test/controller/resources_test.rb +0 -1393
  268. data/test/controller/routing_test.rb +0 -2592
  269. data/test/controller/selector_test.rb +0 -628
  270. data/test/controller/send_file_test.rb +0 -171
  271. data/test/controller/session/abstract_store_test.rb +0 -64
  272. data/test/controller/session/cookie_store_test.rb +0 -354
  273. data/test/controller/session/mem_cache_store_test.rb +0 -187
  274. data/test/controller/session/test_session_test.rb +0 -58
  275. data/test/controller/test_test.rb +0 -700
  276. data/test/controller/translation_test.rb +0 -26
  277. data/test/controller/url_rewriter_test.rb +0 -395
  278. data/test/controller/verification_test.rb +0 -270
  279. data/test/controller/view_paths_test.rb +0 -141
  280. data/test/controller/webservice_test.rb +0 -273
  281. data/test/fixtures/_top_level_partial.html.erb +0 -1
  282. data/test/fixtures/_top_level_partial_only.erb +0 -1
  283. data/test/fixtures/addresses/list.erb +0 -1
  284. data/test/fixtures/alternate_helpers/foo_helper.rb +0 -3
  285. data/test/fixtures/bad_customers/_bad_customer.html.erb +0 -1
  286. data/test/fixtures/companies.yml +0 -24
  287. data/test/fixtures/company.rb +0 -10
  288. data/test/fixtures/content_type/render_default_content_types_for_respond_to.rhtml +0 -1
  289. data/test/fixtures/content_type/render_default_for_rhtml.rhtml +0 -1
  290. data/test/fixtures/content_type/render_default_for_rjs.rjs +0 -1
  291. data/test/fixtures/content_type/render_default_for_rxml.rxml +0 -1
  292. data/test/fixtures/customers/_customer.html.erb +0 -1
  293. data/test/fixtures/db_definitions/sqlite.sql +0 -49
  294. data/test/fixtures/developer.rb +0 -9
  295. data/test/fixtures/developers.yml +0 -21
  296. data/test/fixtures/developers/_developer.erb +0 -1
  297. data/test/fixtures/developers_projects.yml +0 -13
  298. data/test/fixtures/failsafe/500.html +0 -1
  299. data/test/fixtures/fun/games/_game.erb +0 -1
  300. data/test/fixtures/fun/games/hello_world.erb +0 -1
  301. data/test/fixtures/fun/serious/games/_game.erb +0 -1
  302. data/test/fixtures/functional_caching/_partial.erb +0 -3
  303. data/test/fixtures/functional_caching/formatted_fragment_cached.html.erb +0 -3
  304. data/test/fixtures/functional_caching/formatted_fragment_cached.js.rjs +0 -6
  305. data/test/fixtures/functional_caching/formatted_fragment_cached.xml.builder +0 -5
  306. data/test/fixtures/functional_caching/fragment_cached.html.erb +0 -2
  307. data/test/fixtures/functional_caching/html_fragment_cached_with_partial.html.erb +0 -1
  308. data/test/fixtures/functional_caching/inline_fragment_cached.html.erb +0 -2
  309. data/test/fixtures/functional_caching/js_fragment_cached_with_partial.js.rjs +0 -1
  310. data/test/fixtures/good_customers/_good_customer.html.erb +0 -1
  311. data/test/fixtures/helpers/abc_helper.rb +0 -5
  312. data/test/fixtures/helpers/fun/games_helper.rb +0 -3
  313. data/test/fixtures/helpers/fun/pdf_helper.rb +0 -3
  314. data/test/fixtures/layout_tests/abs_path_layout.rhtml +0 -1
  315. data/test/fixtures/layout_tests/alt/hello.rhtml +0 -1
  316. data/test/fixtures/layout_tests/alt/layouts/alt.rhtml +0 -0
  317. data/test/fixtures/layout_tests/layouts/controller_name_space/nested.rhtml +0 -1
  318. data/test/fixtures/layout_tests/layouts/item.rhtml +0 -1
  319. data/test/fixtures/layout_tests/layouts/layout_test.rhtml +0 -1
  320. data/test/fixtures/layout_tests/layouts/multiple_extensions.html.erb +0 -1
  321. data/test/fixtures/layout_tests/layouts/third_party_template_library.mab +0 -1
  322. data/test/fixtures/layout_tests/views/hello.rhtml +0 -1
  323. data/test/fixtures/layouts/_column.html.erb +0 -2
  324. data/test/fixtures/layouts/block_with_layout.erb +0 -3
  325. data/test/fixtures/layouts/builder.builder +0 -3
  326. data/test/fixtures/layouts/default_html.html.erb +0 -1
  327. data/test/fixtures/layouts/partial_with_layout.erb +0 -3
  328. data/test/fixtures/layouts/standard.erb +0 -1
  329. data/test/fixtures/layouts/talk_from_action.erb +0 -2
  330. data/test/fixtures/layouts/xhr.html.erb +0 -2
  331. data/test/fixtures/layouts/yield.erb +0 -2
  332. data/test/fixtures/localized/hello_world.de.html +0 -1
  333. data/test/fixtures/localized/hello_world.en.html +0 -1
  334. data/test/fixtures/mascot.rb +0 -3
  335. data/test/fixtures/mascots.yml +0 -4
  336. data/test/fixtures/mascots/_mascot.html.erb +0 -1
  337. data/test/fixtures/multipart/binary_file +0 -0
  338. data/test/fixtures/multipart/boundary_problem_file +0 -10
  339. data/test/fixtures/multipart/bracketed_param +0 -5
  340. data/test/fixtures/multipart/empty +0 -10
  341. data/test/fixtures/multipart/hello.txt +0 -1
  342. data/test/fixtures/multipart/large_text_file +0 -10
  343. data/test/fixtures/multipart/mixed_files +0 -0
  344. data/test/fixtures/multipart/mona_lisa.jpg +0 -0
  345. data/test/fixtures/multipart/none +0 -9
  346. data/test/fixtures/multipart/single_parameter +0 -5
  347. data/test/fixtures/multipart/text_file +0 -10
  348. data/test/fixtures/override/test/hello_world.erb +0 -1
  349. data/test/fixtures/override2/layouts/test/sub.erb +0 -1
  350. data/test/fixtures/post_test/layouts/post.html.erb +0 -1
  351. data/test/fixtures/post_test/layouts/super_post.iphone.erb +0 -1
  352. data/test/fixtures/post_test/post/index.html.erb +0 -1
  353. data/test/fixtures/post_test/post/index.iphone.erb +0 -1
  354. data/test/fixtures/post_test/super_post/index.html.erb +0 -1
  355. data/test/fixtures/post_test/super_post/index.iphone.erb +0 -1
  356. data/test/fixtures/project.rb +0 -3
  357. data/test/fixtures/projects.yml +0 -7
  358. data/test/fixtures/projects/_project.erb +0 -1
  359. data/test/fixtures/public/404.html +0 -1
  360. data/test/fixtures/public/500.da.html +0 -1
  361. data/test/fixtures/public/500.html +0 -1
  362. data/test/fixtures/public/absolute/test.css +0 -23
  363. data/test/fixtures/public/absolute/test.js +0 -63
  364. data/test/fixtures/public/images/rails.png +0 -0
  365. data/test/fixtures/public/javascripts/application.js +0 -1
  366. data/test/fixtures/public/javascripts/bank.js +0 -1
  367. data/test/fixtures/public/javascripts/controls.js +0 -1
  368. data/test/fixtures/public/javascripts/dragdrop.js +0 -1
  369. data/test/fixtures/public/javascripts/effects.js +0 -1
  370. data/test/fixtures/public/javascripts/prototype.js +0 -1
  371. data/test/fixtures/public/javascripts/robber.js +0 -1
  372. data/test/fixtures/public/javascripts/subdir/subdir.js +0 -1
  373. data/test/fixtures/public/javascripts/version.1.0.js +0 -1
  374. data/test/fixtures/public/stylesheets/bank.css +0 -1
  375. data/test/fixtures/public/stylesheets/robber.css +0 -1
  376. data/test/fixtures/public/stylesheets/subdir/subdir.css +0 -1
  377. data/test/fixtures/public/stylesheets/version.1.0.css +0 -1
  378. data/test/fixtures/quiz/questions/_question.html.erb +0 -1
  379. data/test/fixtures/replies.yml +0 -15
  380. data/test/fixtures/replies/_reply.erb +0 -1
  381. data/test/fixtures/reply.rb +0 -7
  382. data/test/fixtures/respond_to/all_types_with_layout.html.erb +0 -1
  383. data/test/fixtures/respond_to/all_types_with_layout.js.rjs +0 -1
  384. data/test/fixtures/respond_to/custom_constant_handling_without_block.mobile.erb +0 -1
  385. data/test/fixtures/respond_to/iphone_with_html_response_type.html.erb +0 -1
  386. data/test/fixtures/respond_to/iphone_with_html_response_type.iphone.erb +0 -1
  387. data/test/fixtures/respond_to/layouts/missing.html.erb +0 -1
  388. data/test/fixtures/respond_to/layouts/standard.html.erb +0 -1
  389. data/test/fixtures/respond_to/layouts/standard.iphone.erb +0 -1
  390. data/test/fixtures/respond_to/using_defaults.html.erb +0 -1
  391. data/test/fixtures/respond_to/using_defaults.js.rjs +0 -1
  392. data/test/fixtures/respond_to/using_defaults.xml.builder +0 -1
  393. data/test/fixtures/respond_to/using_defaults_with_type_list.html.erb +0 -1
  394. data/test/fixtures/respond_to/using_defaults_with_type_list.js.rjs +0 -1
  395. data/test/fixtures/respond_to/using_defaults_with_type_list.xml.builder +0 -1
  396. data/test/fixtures/scope/test/modgreet.erb +0 -1
  397. data/test/fixtures/session_autoload_test/session_autoload_test/foo.rb +0 -10
  398. data/test/fixtures/shared.html.erb +0 -1
  399. data/test/fixtures/symlink_parent/symlinked_layout.erb +0 -5
  400. data/test/fixtures/test/_counter.html.erb +0 -1
  401. data/test/fixtures/test/_customer.erb +0 -1
  402. data/test/fixtures/test/_customer_counter.erb +0 -1
  403. data/test/fixtures/test/_customer_counter_with_as.erb +0 -1
  404. data/test/fixtures/test/_customer_greeting.erb +0 -1
  405. data/test/fixtures/test/_customer_with_var.erb +0 -1
  406. data/test/fixtures/test/_form.erb +0 -1
  407. data/test/fixtures/test/_from_helper.erb +0 -1
  408. data/test/fixtures/test/_hash_greeting.erb +0 -1
  409. data/test/fixtures/test/_hash_object.erb +0 -2
  410. data/test/fixtures/test/_hello.builder +0 -1
  411. data/test/fixtures/test/_labelling_form.erb +0 -1
  412. data/test/fixtures/test/_layout_for_block_with_args.html.erb +0 -3
  413. data/test/fixtures/test/_layout_for_partial.html.erb +0 -3
  414. data/test/fixtures/test/_local_inspector.html.erb +0 -1
  415. data/test/fixtures/test/_one.html.erb +0 -1
  416. data/test/fixtures/test/_partial.erb +0 -1
  417. data/test/fixtures/test/_partial.html.erb +0 -1
  418. data/test/fixtures/test/_partial.js.erb +0 -1
  419. data/test/fixtures/test/_partial_for_use_in_layout.html.erb +0 -1
  420. data/test/fixtures/test/_partial_only.erb +0 -1
  421. data/test/fixtures/test/_partial_with_only_html_version.html.erb +0 -1
  422. data/test/fixtures/test/_person.erb +0 -2
  423. data/test/fixtures/test/_raise.html.erb +0 -1
  424. data/test/fixtures/test/_two.html.erb +0 -1
  425. data/test/fixtures/test/_utf8_partial.html.erb +0 -1
  426. data/test/fixtures/test/_utf8_partial_magic.html.erb +0 -2
  427. data/test/fixtures/test/action_talk_to_layout.erb +0 -2
  428. data/test/fixtures/test/array_translation.erb +0 -1
  429. data/test/fixtures/test/calling_partial_with_layout.html.erb +0 -1
  430. data/test/fixtures/test/capturing.erb +0 -4
  431. data/test/fixtures/test/content_for.erb +0 -2
  432. data/test/fixtures/test/content_for_concatenated.erb +0 -3
  433. data/test/fixtures/test/content_for_with_parameter.erb +0 -2
  434. data/test/fixtures/test/delete_with_js.rjs +0 -2
  435. data/test/fixtures/test/dont_pick_me +0 -1
  436. data/test/fixtures/test/dot.directory/render_file_with_ivar.erb +0 -1
  437. data/test/fixtures/test/enum_rjs_test.rjs +0 -6
  438. data/test/fixtures/test/formatted_html_erb.html.erb +0 -1
  439. data/test/fixtures/test/formatted_xml_erb.builder +0 -1
  440. data/test/fixtures/test/formatted_xml_erb.html.erb +0 -1
  441. data/test/fixtures/test/formatted_xml_erb.xml.erb +0 -1
  442. data/test/fixtures/test/greeting.erb +0 -1
  443. data/test/fixtures/test/greeting.js.rjs +0 -1
  444. data/test/fixtures/test/hello.builder +0 -4
  445. data/test/fixtures/test/hello_world.da.html.erb +0 -1
  446. data/test/fixtures/test/hello_world.erb +0 -1
  447. data/test/fixtures/test/hello_world.erb~ +0 -1
  448. data/test/fixtures/test/hello_world.pt-BR.html.erb +0 -1
  449. data/test/fixtures/test/hello_world_container.builder +0 -3
  450. data/test/fixtures/test/hello_world_from_rxml.builder +0 -4
  451. data/test/fixtures/test/hello_world_with_layout_false.erb +0 -1
  452. data/test/fixtures/test/hello_xml_world.builder +0 -11
  453. data/test/fixtures/test/hyphen-ated.erb +0 -1
  454. data/test/fixtures/test/implicit_content_type.atom.builder +0 -2
  455. data/test/fixtures/test/list.erb +0 -1
  456. data/test/fixtures/test/malformed/malformed.en.html.erb~ +0 -1
  457. data/test/fixtures/test/malformed/malformed.erb~ +0 -1
  458. data/test/fixtures/test/malformed/malformed.html.erb~ +0 -1
  459. data/test/fixtures/test/nested_layout.erb +0 -3
  460. data/test/fixtures/test/non_erb_block_content_for.builder +0 -4
  461. data/test/fixtures/test/potential_conflicts.erb +0 -4
  462. data/test/fixtures/test/render_explicit_html_template.js.rjs +0 -1
  463. data/test/fixtures/test/render_file_from_template.html.erb +0 -1
  464. data/test/fixtures/test/render_file_with_ivar.erb +0 -1
  465. data/test/fixtures/test/render_file_with_locals.erb +0 -1
  466. data/test/fixtures/test/render_implicit_html_template.js.rjs +0 -1
  467. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.da.html.erb +0 -1
  468. data/test/fixtures/test/render_implicit_html_template_from_xhr_request.html.erb +0 -1
  469. data/test/fixtures/test/render_implicit_js_template_without_layout.js.erb +0 -1
  470. data/test/fixtures/test/render_to_string_test.erb +0 -1
  471. data/test/fixtures/test/scoped_array_translation.erb +0 -1
  472. data/test/fixtures/test/sub_template_raise.html.erb +0 -1
  473. data/test/fixtures/test/template.erb +0 -1
  474. data/test/fixtures/test/translation.erb +0 -1
  475. data/test/fixtures/test/update_element_with_capture.erb +0 -9
  476. data/test/fixtures/test/using_layout_around_block.html.erb +0 -1
  477. data/test/fixtures/test/using_layout_around_block_with_args.html.erb +0 -1
  478. data/test/fixtures/test/utf8.html.erb +0 -4
  479. data/test/fixtures/test/utf8_magic.html.erb +0 -5
  480. data/test/fixtures/test/utf8_magic_with_bare_partial.html.erb +0 -5
  481. data/test/fixtures/topic.rb +0 -3
  482. data/test/fixtures/topics.yml +0 -22
  483. data/test/fixtures/topics/_topic.html.erb +0 -1
  484. data/test/template/active_record_helper_i18n_test.rb +0 -51
  485. data/test/template/active_record_helper_test.rb +0 -302
  486. data/test/template/asset_tag_helper_test.rb +0 -770
  487. data/test/template/atom_feed_helper_test.rb +0 -315
  488. data/test/template/benchmark_helper_test.rb +0 -86
  489. data/test/template/compiled_templates_test.rb +0 -204
  490. data/test/template/date_helper_i18n_test.rb +0 -121
  491. data/test/template/date_helper_test.rb +0 -2603
  492. data/test/template/erb_util_test.rb +0 -36
  493. data/test/template/form_helper_test.rb +0 -1447
  494. data/test/template/form_options_helper_i18n_test.rb +0 -27
  495. data/test/template/form_options_helper_test.rb +0 -811
  496. data/test/template/form_tag_helper_test.rb +0 -356
  497. data/test/template/javascript_helper_test.rb +0 -106
  498. data/test/template/number_helper_i18n_test.rb +0 -69
  499. data/test/template/number_helper_test.rb +0 -132
  500. data/test/template/prototype_helper_test.rb +0 -639
  501. data/test/template/raw_output_helper_test.rb +0 -21
  502. data/test/template/record_tag_helper_test.rb +0 -58
  503. data/test/template/render_test.rb +0 -329
  504. data/test/template/sanitize_helper_test.rb +0 -57
  505. data/test/template/scriptaculous_helper_test.rb +0 -90
  506. data/test/template/tag_helper_test.rb +0 -98
  507. data/test/template/template_test.rb +0 -32
  508. data/test/template/test_test.rb +0 -54
  509. data/test/template/text_helper_test.rb +0 -601
  510. data/test/template/translation_helper_test.rb +0 -95
  511. data/test/template/url_helper_test.rb +0 -641
  512. data/test/testing_sandbox.rb +0 -15
  513. data/test/view/test_case_test.rb +0 -176
@@ -50,6 +50,7 @@ module ActionController
50
50
  # polymorphic_url([blog, post]) # => "http://example.com/blogs/1/posts/1"
51
51
  # polymorphic_url([:admin, blog, post]) # => "http://example.com/admin/blogs/1/posts/1"
52
52
  # polymorphic_url([user, :blog, post]) # => "http://example.com/users/1/blog/posts/1"
53
+ # polymorphic_url(Comment) # => "http://example.com/comments"
53
54
  #
54
55
  # ==== Options
55
56
  #
@@ -70,6 +71,9 @@ module ActionController
70
71
  # record = Comment.new
71
72
  # polymorphic_url(record) # same as comments_url()
72
73
  #
74
+ # # the class of a record will also map to the collection
75
+ # polymorphic_url(Comment) # same as comments_url()
76
+ #
73
77
  def polymorphic_url(record_or_hash_or_array, options = {})
74
78
  if record_or_hash_or_array.kind_of?(Array)
75
79
  record_or_hash_or_array = record_or_hash_or_array.compact
@@ -77,6 +81,7 @@ module ActionController
77
81
  end
78
82
 
79
83
  record = extract_record(record_or_hash_or_array)
84
+ record = record.to_model if record.respond_to?(:to_model)
80
85
 
81
86
  args = case record_or_hash_or_array
82
87
  when Hash; [ record_or_hash_or_array ]
@@ -84,17 +89,19 @@ module ActionController
84
89
  else [ record_or_hash_or_array ]
85
90
  end
86
91
 
87
- inflection =
88
- case
89
- when options[:action].to_s == "new"
90
- args.pop
91
- :singular
92
- when record.respond_to?(:new_record?) && record.new_record?
93
- args.pop
94
- :plural
95
- else
96
- :singular
97
- end
92
+ inflection = if options[:action].to_s == "new"
93
+ args.pop
94
+ :singular
95
+ elsif (record.respond_to?(:new_record?) && record.new_record?) ||
96
+ (record.respond_to?(:destroyed?) && record.destroyed?)
97
+ args.pop
98
+ :plural
99
+ elsif record.is_a?(Class)
100
+ args.pop
101
+ :plural
102
+ else
103
+ :singular
104
+ end
98
105
 
99
106
  args.delete_if {|arg| arg.is_a?(Symbol) || arg.is_a?(String)}
100
107
  named_route = build_named_route_call(record_or_hash_or_array, inflection, options)
@@ -110,12 +117,11 @@ module ActionController
110
117
  # Returns the path component of a URL for the given record. It uses
111
118
  # <tt>polymorphic_url</tt> with <tt>:routing_type => :path</tt>.
112
119
  def polymorphic_path(record_or_hash_or_array, options = {})
113
- options[:routing_type] = :path
114
- polymorphic_url(record_or_hash_or_array, options)
120
+ polymorphic_url(record_or_hash_or_array, options.merge(:routing_type => :path))
115
121
  end
116
122
 
117
123
  %w(edit new).each do |action|
118
- module_eval <<-EOT, __FILE__, __LINE__ + 1
124
+ module_eval <<-EOT, __FILE__, __LINE__
119
125
  def #{action}_polymorphic_url(record_or_hash, options = {}) # def edit_polymorphic_url(record_or_hash, options = {})
120
126
  polymorphic_url( # polymorphic_url(
121
127
  record_or_hash, # record_or_hash,
@@ -130,18 +136,6 @@ module ActionController
130
136
  EOT
131
137
  end
132
138
 
133
- def formatted_polymorphic_url(record_or_hash, options = {})
134
- ActiveSupport::Deprecation.warn("formatted_polymorphic_url has been deprecated. Please pass :format to the polymorphic_url method instead", caller)
135
- options[:format] = record_or_hash.pop if Array === record_or_hash
136
- polymorphic_url(record_or_hash, options)
137
- end
138
-
139
- def formatted_polymorphic_path(record_or_hash, options = {})
140
- ActiveSupport::Deprecation.warn("formatted_polymorphic_path has been deprecated. Please pass :format to the polymorphic_path method instead", caller)
141
- options[:format] = record_or_hash.pop if record_or_hash === Array
142
- polymorphic_url(record_or_hash, options.merge(:routing_type => :path))
143
- end
144
-
145
139
  private
146
140
  def action_prefix(options)
147
141
  options[:action] ? "#{options[:action]}_" : ''
@@ -0,0 +1,30 @@
1
+ require "action_controller"
2
+ require "rails"
3
+ require "action_view/railtie"
4
+
5
+ module ActionController
6
+ class Railtie < Rails::Railtie
7
+ railtie_name :action_controller
8
+
9
+ require "action_controller/railties/subscriber"
10
+ subscriber ActionController::Railties::Subscriber.new
11
+
12
+ initializer "action_controller.logger" do
13
+ ActionController::Base.logger ||= Rails.logger
14
+ end
15
+
16
+ initializer "action_controller.set_configs" do |app|
17
+ app.config.action_controller.each do |k,v|
18
+ ActionController::Base.send "#{k}=", v
19
+ end
20
+ end
21
+
22
+ initializer "action_controller.initialize_framework_caches" do
23
+ ActionController::Base.cache_store ||= RAILS_CACHE
24
+ end
25
+
26
+ initializer "action_controller.set_helpers_path" do |app|
27
+ ActionController::Base.helpers_path = app.config.paths.app.helpers.to_a
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,63 @@
1
+ module ActionController
2
+ module Railties
3
+ class Subscriber < Rails::Subscriber
4
+ INTERNAL_PARAMS = %w(controller action format _method only_path)
5
+
6
+ def start_processing(event)
7
+ payload = event.payload
8
+ params = payload[:params].except(*INTERNAL_PARAMS)
9
+
10
+ info " Processing by #{payload[:controller]}##{payload[:action]} as #{payload[:formats].first.to_s.upcase}"
11
+ info " Parameters: #{params.inspect}" unless params.empty?
12
+ end
13
+
14
+ def process_action(event)
15
+ payload = event.payload
16
+ additions = ActionController::Base.log_process_action(payload)
17
+
18
+ message = "Completed in %.0fms" % event.duration
19
+ message << " (#{additions.join(" | ")})" unless additions.blank?
20
+ message << " with #{payload[:status]}"
21
+
22
+ info(message)
23
+ end
24
+
25
+ def send_file(event)
26
+ message = if event.payload[:x_sendfile]
27
+ header = ActionController::Streaming::X_SENDFILE_HEADER
28
+ "Sent #{header} header %s"
29
+ elsif event.payload[:stream]
30
+ "Streamed file %s"
31
+ else
32
+ "Sent file %s"
33
+ end
34
+
35
+ message << " (%.1fms)"
36
+ info(message % [event.payload[:path], event.duration])
37
+ end
38
+
39
+ def redirect_to(event)
40
+ info "Redirected to #{event.payload[:location]}"
41
+ end
42
+
43
+ def send_data(event)
44
+ info("Sent data %s (%.1fms)" % [event.payload[:filename], event.duration])
45
+ end
46
+
47
+ %w(write_fragment read_fragment exist_fragment?
48
+ expire_fragment expire_page write_page).each do |method|
49
+ class_eval <<-METHOD, __FILE__, __LINE__ + 1
50
+ def #{method}(event)
51
+ key_or_path = event.payload[:key] || event.payload[:path]
52
+ human_name = #{method.to_s.humanize.inspect}
53
+ info("\#{human_name} \#{key_or_path} (%.1fms)" % event.duration)
54
+ end
55
+ METHOD
56
+ end
57
+
58
+ def logger
59
+ ActionController::Base.logger
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,4 +1,6 @@
1
- module ActionController
1
+ require 'active_support/core_ext/module'
2
+
3
+ module ActionController
2
4
  # The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or
3
5
  # Active Resources or pretty much any other model type that has an id. These patterns are then used to try elevate
4
6
  # the view actions to a higher logical level. Example:
@@ -34,21 +36,6 @@ module ActionController
34
36
  JOIN = '_'.freeze
35
37
  NEW = 'new'.freeze
36
38
 
37
- # Returns plural/singular for a record or class. Example:
38
- #
39
- # partial_path(post) # => "posts/post"
40
- # partial_path(Person) # => "people/person"
41
- # partial_path(Person, "admin/games") # => "admin/people/person"
42
- def partial_path(record_or_class, controller_path = nil)
43
- name = model_name_from_record_or_class(record_or_class)
44
-
45
- if controller_path && controller_path.include?("/")
46
- "#{File.dirname(controller_path)}/#{name.partial_path}"
47
- else
48
- name.partial_path
49
- end
50
- end
51
-
52
39
  # The DOM class convention is to use the singular form of an object or class. Examples:
53
40
  #
54
41
  # dom_class(post) # => "post"
@@ -1,7 +1,84 @@
1
- require 'active_support/test_case'
2
- require 'action_controller/test_process'
1
+ require 'rack/session/abstract/id'
2
+ require 'action_view/test_case'
3
3
 
4
4
  module ActionController
5
+ class TestRequest < ActionDispatch::TestRequest #:nodoc:
6
+ def initialize(env = {})
7
+ super
8
+
9
+ self.session = TestSession.new
10
+ self.session_options = TestSession::DEFAULT_OPTIONS.merge(:id => ActiveSupport::SecureRandom.hex(16))
11
+ end
12
+
13
+ class Result < ::Array #:nodoc:
14
+ def to_s() join '/' end
15
+ def self.new_escaped(strings)
16
+ new strings.collect {|str| URI.unescape str}
17
+ end
18
+ end
19
+
20
+ def assign_parameters(controller_path, action, parameters = {})
21
+ parameters = parameters.symbolize_keys.merge(:controller => controller_path, :action => action)
22
+ extra_keys = ActionController::Routing::Routes.extra_keys(parameters)
23
+ non_path_parameters = get? ? query_parameters : request_parameters
24
+ parameters.each do |key, value|
25
+ if value.is_a? Fixnum
26
+ value = value.to_s
27
+ elsif value.is_a? Array
28
+ value = Result.new(value)
29
+ end
30
+
31
+ if extra_keys.include?(key.to_sym)
32
+ non_path_parameters[key] = value
33
+ else
34
+ path_parameters[key.to_s] = value
35
+ end
36
+ end
37
+
38
+ params = self.request_parameters.dup
39
+
40
+ %w(controller action only_path).each do |k|
41
+ params.delete(k)
42
+ params.delete(k.to_sym)
43
+ end
44
+
45
+ data = params.to_query
46
+ @env['CONTENT_LENGTH'] = data.length.to_s
47
+ @env['rack.input'] = StringIO.new(data)
48
+ end
49
+
50
+ def recycle!
51
+ @formats = nil
52
+ @env.delete_if { |k, v| k =~ /^(action_dispatch|rack)\.request/ }
53
+ @env.delete_if { |k, v| k =~ /^action_dispatch\.rescue/ }
54
+ @env['action_dispatch.request.query_parameters'] = {}
55
+ end
56
+ end
57
+
58
+ class TestResponse < ActionDispatch::TestResponse
59
+ def recycle!
60
+ @status = 200
61
+ @header = {}
62
+ @writer = lambda { |x| @body << x }
63
+ @block = nil
64
+ @length = 0
65
+ @body = []
66
+ @charset = nil
67
+ @content_type = nil
68
+
69
+ @request = @template = nil
70
+ end
71
+ end
72
+
73
+ class TestSession < ActionDispatch::Session::AbstractStore::SessionHash #:nodoc:
74
+ DEFAULT_OPTIONS = ActionDispatch::Session::AbstractStore::DEFAULT_OPTIONS
75
+
76
+ def initialize(session = {})
77
+ replace(session.stringify_keys)
78
+ @loaded = true
79
+ end
80
+ end
81
+
5
82
  # Superclass for ActionController functional tests. Functional tests allow you to
6
83
  # test a single controller action per test method. This should not be confused with
7
84
  # integration tests (see ActionController::IntegrationTest), which are more like
@@ -56,7 +133,7 @@ module ActionController
56
133
  #
57
134
  # ActionController::TestCase will automatically infer the controller under test
58
135
  # from the test class name. If the controller cannot be inferred from the test
59
- # class name, you can explicity set it with +tests+.
136
+ # class name, you can explicitly set it with +tests+.
60
137
  #
61
138
  # class SpecialEdgeCaseWidgetsControllerTest < ActionController::TestCase
62
139
  # tests WidgetController
@@ -103,27 +180,78 @@ module ActionController
103
180
  #
104
181
  # assert_redirected_to page_url(:title => 'foo')
105
182
  class TestCase < ActiveSupport::TestCase
106
- include TestProcess
183
+ include ActionDispatch::TestProcess
107
184
 
108
- def initialize(*args)
109
- super
110
- @controller = nil
185
+ # Executes a request simulating GET HTTP method and set/volley the response
186
+ def get(action, parameters = nil, session = nil, flash = nil)
187
+ process(action, parameters, session, flash, "GET")
188
+ end
189
+
190
+ # Executes a request simulating POST HTTP method and set/volley the response
191
+ def post(action, parameters = nil, session = nil, flash = nil)
192
+ process(action, parameters, session, flash, "POST")
193
+ end
194
+
195
+ # Executes a request simulating PUT HTTP method and set/volley the response
196
+ def put(action, parameters = nil, session = nil, flash = nil)
197
+ process(action, parameters, session, flash, "PUT")
198
+ end
199
+
200
+ # Executes a request simulating DELETE HTTP method and set/volley the response
201
+ def delete(action, parameters = nil, session = nil, flash = nil)
202
+ process(action, parameters, session, flash, "DELETE")
203
+ end
204
+
205
+ # Executes a request simulating HEAD HTTP method and set/volley the response
206
+ def head(action, parameters = nil, session = nil, flash = nil)
207
+ process(action, parameters, session, flash, "HEAD")
111
208
  end
112
209
 
113
- module Assertions
114
- %w(response selector tag dom routing model).each do |kind|
115
- include ActionController::Assertions.const_get("#{kind.camelize}Assertions")
210
+ def xml_http_request(request_method, action, parameters = nil, session = nil, flash = nil)
211
+ @request.env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
212
+ @request.env['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
213
+ returning __send__(request_method, action, parameters, session, flash) do
214
+ @request.env.delete 'HTTP_X_REQUESTED_WITH'
215
+ @request.env.delete 'HTTP_ACCEPT'
116
216
  end
217
+ end
218
+ alias xhr :xml_http_request
117
219
 
118
- def clean_backtrace(&block)
119
- yield
120
- rescue ActiveSupport::TestCase::Assertion => error
121
- framework_path = Regexp.new(File.expand_path("#{File.dirname(__FILE__)}/assertions"))
122
- error.backtrace.reject! { |line| File.expand_path(line) =~ framework_path }
123
- raise
220
+ def process(action, parameters = nil, session = nil, flash = nil, http_method = 'GET')
221
+ # Sanity check for required instance variables so we can give an
222
+ # understandable error message.
223
+ %w(@controller @request @response).each do |iv_name|
224
+ if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil?
225
+ raise "#{iv_name} is nil: make sure you set it in your test's setup method."
226
+ end
124
227
  end
228
+
229
+ @request.recycle!
230
+ @response.recycle!
231
+ @controller.response_body = nil
232
+ @controller.formats = nil
233
+ @controller.params = nil
234
+
235
+ @html_document = nil
236
+ @request.env['REQUEST_METHOD'] = http_method
237
+
238
+ parameters ||= {}
239
+ @request.assign_parameters(@controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters)
240
+
241
+ @request.session = ActionController::TestSession.new(session) unless session.nil?
242
+ @request.session["flash"] = @request.flash.update(flash || {})
243
+ @request.session["flash"].sweep
244
+
245
+ @controller.request = @request
246
+ @controller.params.merge!(parameters)
247
+ build_request_uri(action, parameters)
248
+ Base.class_eval { include Testing }
249
+ @controller.process_with_new_base_test(@request, @response)
250
+ @request.session.delete('flash') if @request.session['flash'].blank?
251
+ @response
125
252
  end
126
- include Assertions
253
+
254
+ include ActionDispatch::Assertions
127
255
 
128
256
  # When the request.remote_addr remains the default for testing, which is 0.0.0.0, the exception is simply raised inline
129
257
  # (bystepping the regular exception handling from rescue_action). If the request.remote_addr is anything else, the regular
@@ -197,7 +325,6 @@ module ActionController
197
325
  if @controller
198
326
  @controller.request = @request
199
327
  @controller.params = {}
200
- @controller.send(:initialize_current_url)
201
328
  end
202
329
  end
203
330
 
@@ -205,5 +332,16 @@ module ActionController
205
332
  def rescue_action_in_public!
206
333
  @request.remote_addr = '208.77.188.166' # example.com
207
334
  end
335
+
336
+ private
337
+ def build_request_uri(action, parameters)
338
+ unless @request.env['REQUEST_URI']
339
+ options = @controller.__send__(:rewrite_options, parameters)
340
+ options.update(:only_path => true, :action => action)
341
+
342
+ url = ActionController::UrlRewriter.new(@request, parameters)
343
+ @request.request_uri = url.rewrite(options)
344
+ end
345
+ end
208
346
  end
209
347
  end
@@ -1,178 +1,21 @@
1
- require 'uri'
1
+ require 'active_support/core_ext/hash/except'
2
2
 
3
3
  module ActionController
4
- # In <b>routes.rb</b> one defines URL-to-controller mappings, but the reverse
5
- # is also possible: an URL can be generated from one of your routing definitions.
6
- # URL generation functionality is centralized in this module.
7
- #
8
- # See ActionController::Routing and ActionController::Resources for general
9
- # information about routing and routes.rb.
10
- #
11
- # <b>Tip:</b> If you need to generate URLs from your models or some other place,
12
- # then ActionController::UrlWriter is what you're looking for. Read on for
13
- # an introduction.
14
- #
15
- # == URL generation from parameters
16
- #
17
- # As you may know, some functions - such as ActionController::Base#url_for
18
- # and ActionView::Helpers::UrlHelper#link_to, can generate URLs given a set
19
- # of parameters. For example, you've probably had the chance to write code
20
- # like this in one of your views:
21
- #
22
- # <%= link_to('Click here', :controller => 'users',
23
- # :action => 'new', :message => 'Welcome!') %>
24
- #
25
- # #=> Generates a link to: /users/new?message=Welcome%21
26
- #
27
- # link_to, and all other functions that require URL generation functionality,
28
- # actually use ActionController::UrlWriter under the hood. And in particular,
29
- # they use the ActionController::UrlWriter#url_for method. One can generate
30
- # the same path as the above example by using the following code:
31
- #
32
- # include UrlWriter
33
- # url_for(:controller => 'users',
34
- # :action => 'new',
35
- # :message => 'Welcome!',
36
- # :only_path => true)
37
- # # => "/users/new?message=Welcome%21"
38
- #
39
- # Notice the <tt>:only_path => true</tt> part. This is because UrlWriter has no
40
- # information about the website hostname that your Rails app is serving. So if you
41
- # want to include the hostname as well, then you must also pass the <tt>:host</tt>
42
- # argument:
43
- #
44
- # include UrlWriter
45
- # url_for(:controller => 'users',
46
- # :action => 'new',
47
- # :message => 'Welcome!',
48
- # :host => 'www.example.com') # Changed this.
49
- # # => "http://www.example.com/users/new?message=Welcome%21"
50
- #
51
- # By default, all controllers and views have access to a special version of url_for,
52
- # that already knows what the current hostname is. So if you use url_for in your
53
- # controllers or your views, then you don't need to explicitly pass the <tt>:host</tt>
54
- # argument.
55
- #
56
- # For convenience reasons, mailers provide a shortcut for ActionController::UrlWriter#url_for.
57
- # So within mailers, you only have to type 'url_for' instead of 'ActionController::UrlWriter#url_for'
58
- # in full. However, mailers don't have hostname information, and what's why you'll still
59
- # have to specify the <tt>:host</tt> argument when generating URLs in mailers.
60
- #
61
- #
62
- # == URL generation for named routes
63
- #
64
- # UrlWriter also allows one to access methods that have been auto-generated from
65
- # named routes. For example, suppose that you have a 'users' resource in your
66
- # <b>routes.rb</b>:
67
- #
68
- # map.resources :users
69
- #
70
- # This generates, among other things, the method <tt>users_path</tt>. By default,
71
- # this method is accessible from your controllers, views and mailers. If you need
72
- # to access this auto-generated method from other places (such as a model), then
73
- # you can do that in two ways.
74
- #
75
- # The first way is to include ActionController::UrlWriter in your class:
76
- #
77
- # class User < ActiveRecord::Base
78
- # include ActionController::UrlWriter # !!!
79
- #
80
- # def name=(value)
81
- # write_attribute('name', value)
82
- # write_attribute('base_uri', users_path) # !!!
83
- # end
84
- # end
85
- #
86
- # The second way is to access them through ActionController::UrlWriter.
87
- # The autogenerated named routes methods are available as class methods:
88
- #
89
- # class User < ActiveRecord::Base
90
- # def name=(value)
91
- # write_attribute('name', value)
92
- # path = ActionController::UrlWriter.users_path # !!!
93
- # write_attribute('base_uri', path) # !!!
94
- # end
95
- # end
96
- module UrlWriter
97
- RESERVED_PCHAR = ':@&=+$,;%'
98
- SAFE_PCHAR = "#{URI::REGEXP::PATTERN::UNRESERVED}#{RESERVED_PCHAR}"
99
- if RUBY_VERSION >= '1.9'
100
- UNSAFE_PCHAR = Regexp.new("[^#{SAFE_PCHAR}]", false).freeze
101
- else
102
- UNSAFE_PCHAR = Regexp.new("[^#{SAFE_PCHAR}]", false, 'N').freeze
103
- end
104
-
105
- def self.included(base) #:nodoc:
106
- ActionController::Routing::Routes.install_helpers(base)
107
- base.mattr_accessor :default_url_options
108
-
109
- # The default options for urls written by this writer. Typically a <tt>:host</tt> pair is provided.
110
- base.default_url_options ||= {}
111
- end
112
-
113
- # Generate a url based on the options provided, default_url_options and the
114
- # routes defined in routes.rb. The following options are supported:
115
- #
116
- # * <tt>:only_path</tt> - If true, the relative url is returned. Defaults to +false+.
117
- # * <tt>:protocol</tt> - The protocol to connect to. Defaults to 'http'.
118
- # * <tt>:host</tt> - Specifies the host the link should be targetted at.
119
- # If <tt>:only_path</tt> is false, this option must be
120
- # provided either explicitly, or via +default_url_options+.
121
- # * <tt>:port</tt> - Optionally specify the port to connect to.
122
- # * <tt>:anchor</tt> - An anchor name to be appended to the path.
123
- # * <tt>:skip_relative_url_root</tt> - If true, the url is not constructed using the
124
- # +relative_url_root+ set in ActionController::Base.relative_url_root.
125
- # * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2009/"
126
- #
127
- # Any other key (<tt>:controller</tt>, <tt>:action</tt>, etc.) given to
128
- # +url_for+ is forwarded to the Routes module.
129
- #
130
- # Examples:
131
- #
132
- # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :port=>'8080' # => 'http://somehost.org:8080/tasks/testing'
133
- # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :anchor => 'ok', :only_path => true # => '/tasks/testing#ok'
134
- # url_for :controller => 'tasks', :action => 'testing', :trailing_slash=>true # => 'http://somehost.org/tasks/testing/'
135
- # url_for :controller => 'tasks', :action => 'testing', :host=>'somehost.org', :number => '33' # => 'http://somehost.org/tasks/testing?number=33'
136
- def url_for(options)
137
- options = self.class.default_url_options.merge(options)
138
-
139
- url = ''
140
-
141
- unless options.delete(:only_path)
142
- url << (options.delete(:protocol) || 'http')
143
- url << '://' unless url.match("://")
144
-
145
- raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
146
-
147
- url << options.delete(:host)
148
- url << ":#{options.delete(:port)}" if options.key?(:port)
149
- else
150
- # Delete the unused options to prevent their appearance in the query string.
151
- [:protocol, :host, :port, :skip_relative_url_root].each { |k| options.delete(k) }
152
- end
153
- trailing_slash = options.delete(:trailing_slash) if options.key?(:trailing_slash)
154
- url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
155
- anchor = "##{URI.escape(options.delete(:anchor).to_param.to_s, UNSAFE_PCHAR)}" if options[:anchor]
156
- generated = Routing::Routes.generate(options, {})
157
- url << (trailing_slash ? generated.sub(/\?|\z/) { "/" + $& } : generated)
158
- url << anchor if anchor
159
-
160
- url
161
- end
162
- end
163
-
164
4
  # Rewrites URLs for Base.redirect_to and Base.url_for in the controller.
165
5
  class UrlRewriter #:nodoc:
166
6
  RESERVED_OPTIONS = [:anchor, :params, :only_path, :host, :protocol, :port, :trailing_slash, :skip_relative_url_root]
7
+
167
8
  def initialize(request, parameters)
168
9
  @request, @parameters = request, parameters
169
10
  end
170
11
 
171
12
  def rewrite(options = {})
172
- if options.include?(:overwrite_params)
173
- ActiveSupport::Deprecation.warn 'The :overwrite_params option is deprecated. Specify all the necessary parameters instead', caller
13
+ options[:host] ||= @request.host_with_port
14
+ options[:protocol] ||= @request.protocol
15
+
16
+ self.class.rewrite(options, @request.symbolized_path_parameters) do |options|
17
+ process_path_options(options)
174
18
  end
175
- rewrite_url(options)
176
19
  end
177
20
 
178
21
  def to_str
@@ -181,49 +24,53 @@ module ActionController
181
24
 
182
25
  alias_method :to_s, :to_str
183
26
 
184
- private
185
- # Given a path and options, returns a rewritten URL string
186
- def rewrite_url(options)
187
- rewritten_url = ""
188
-
189
- unless options[:only_path]
190
- rewritten_url << (options[:protocol] || @request.protocol)
191
- rewritten_url << "://" unless rewritten_url.match("://")
192
- rewritten_url << rewrite_authentication(options)
193
- rewritten_url << (options[:host] || @request.host_with_port)
194
- rewritten_url << ":#{options.delete(:port)}" if options.key?(:port)
195
- end
196
-
197
- path = rewrite_path(options)
198
- rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
199
- rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
200
- rewritten_url << "##{CGI.escape(options[:anchor].to_param.to_s)}" if options[:anchor]
201
-
202
- rewritten_url
27
+ def self.rewrite(options, path_segments=nil)
28
+ rewritten_url = ""
29
+
30
+ unless options[:only_path]
31
+ rewritten_url << (options[:protocol] || "http")
32
+ rewritten_url << "://" unless rewritten_url.match("://")
33
+ rewritten_url << rewrite_authentication(options)
34
+
35
+ raise "Missing host to link to! Please provide :host parameter or set default_url_options[:host]" unless options[:host]
36
+
37
+ rewritten_url << options[:host]
38
+ rewritten_url << ":#{options.delete(:port)}" if options.key?(:port)
203
39
  end
204
40
 
205
- # Given a Hash of options, generates a route
206
- def rewrite_path(options)
207
- options = options.symbolize_keys
208
- options.update(options[:params].symbolize_keys) if options[:params]
41
+ path_options = options.except(*RESERVED_OPTIONS)
42
+ path_options = yield(path_options) if block_given?
43
+ path = Routing::Routes.generate(path_options, path_segments || {})
44
+
45
+ rewritten_url << ActionController::Base.relative_url_root.to_s unless options[:skip_relative_url_root]
46
+ rewritten_url << (options[:trailing_slash] ? path.sub(/\?|\z/) { "/" + $& } : path)
47
+ rewritten_url << "##{Rack::Utils.escape(options[:anchor].to_param.to_s)}" if options[:anchor]
209
48
 
210
- if overwrite = options.delete(:overwrite_params)
211
- options.update(@parameters.symbolize_keys)
212
- options.update(overwrite.symbolize_keys)
213
- end
49
+ rewritten_url
50
+ end
214
51
 
215
- RESERVED_OPTIONS.each { |k| options.delete(k) }
52
+ protected
216
53
 
217
- # Generates the query string, too
218
- Routing::Routes.generate(options, @request.symbolized_path_parameters)
54
+ def self.rewrite_authentication(options)
55
+ if options[:user] && options[:password]
56
+ "#{Rack::Utils.escape(options.delete(:user))}:#{Rack::Utils.escape(options.delete(:password))}@"
57
+ else
58
+ ""
219
59
  end
60
+ end
61
+
62
+ # Given a Hash of options, generates a route
63
+ def process_path_options(options)
64
+ options = options.symbolize_keys
65
+ options.update(options[:params].symbolize_keys) if options[:params]
220
66
 
221
- def rewrite_authentication(options)
222
- if options[:user] && options[:password]
223
- "#{CGI.escape(options.delete(:user))}:#{CGI.escape(options.delete(:password))}@"
224
- else
225
- ""
226
- end
67
+ if (overwrite = options.delete(:overwrite_params))
68
+ options.update(@parameters.symbolize_keys)
69
+ options.update(overwrite.symbolize_keys)
227
70
  end
71
+
72
+ options
73
+ end
74
+
228
75
  end
229
76
  end