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
@@ -0,0 +1,55 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ class Route #:nodoc:
4
+ attr_reader :app, :conditions, :defaults, :name
5
+ attr_reader :path, :requirements
6
+
7
+ def initialize(app, conditions = {}, requirements = {}, defaults = {}, name = nil)
8
+ @app = app
9
+ @defaults = defaults
10
+ @name = name
11
+
12
+ @requirements = requirements.merge(defaults)
13
+ @requirements.delete(:controller) if @requirements[:controller].is_a?(Regexp)
14
+ @requirements.delete_if { |k, v|
15
+ v == Regexp.compile("[^#{SEPARATORS.join}]+")
16
+ }
17
+
18
+ if path = conditions[:path_info]
19
+ @path = path
20
+ conditions[:path_info] = ::Rack::Mount::Strexp.compile(path, requirements, SEPARATORS)
21
+ end
22
+
23
+ @conditions = conditions.inject({}) { |h, (k, v)|
24
+ h[k] = Rack::Mount::RegexpWithNamedGroups.new(v)
25
+ h
26
+ }
27
+ end
28
+
29
+ def verb
30
+ if method = conditions[:request_method]
31
+ case method
32
+ when Regexp
33
+ method.source.upcase
34
+ else
35
+ method.to_s.upcase
36
+ end
37
+ end
38
+ end
39
+
40
+ def segment_keys
41
+ @segment_keys ||= conditions[:path_info].names.compact.map { |key| key.to_sym }
42
+ end
43
+
44
+ def to_a
45
+ [@app, @conditions, @defaults, @name]
46
+ end
47
+
48
+ def to_s
49
+ @to_s ||= begin
50
+ "%-6s %-40s %s" % [(verb || :any).to_s.upcase, path, requirements.inspect]
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,445 @@
1
+ require 'rack/mount'
2
+ require 'forwardable'
3
+
4
+ module ActionDispatch
5
+ module Routing
6
+ class RouteSet #:nodoc:
7
+ NotFound = lambda { |env|
8
+ raise ActionController::RoutingError, "No route matches #{env['PATH_INFO'].inspect}"
9
+ }
10
+
11
+ PARAMETERS_KEY = 'action_dispatch.request.path_parameters'
12
+
13
+ class Dispatcher
14
+ def initialize(options = {})
15
+ defaults = options[:defaults]
16
+ @glob_param = options.delete(:glob)
17
+ end
18
+
19
+ def call(env)
20
+ params = env[PARAMETERS_KEY]
21
+ prepare_params!(params)
22
+
23
+ unless controller = controller(params)
24
+ return [404, {'X-Cascade' => 'pass'}, []]
25
+ end
26
+
27
+ controller.action(params[:action]).call(env)
28
+ end
29
+
30
+ def prepare_params!(params)
31
+ merge_default_action!(params)
32
+ split_glob_param!(params) if @glob_param
33
+
34
+ params.each do |key, value|
35
+ if value.is_a?(String)
36
+ value = value.dup.force_encoding(Encoding::BINARY) if value.respond_to?(:force_encoding)
37
+ params[key] = URI.unescape(value)
38
+ end
39
+ end
40
+ end
41
+
42
+ def controller(params)
43
+ if params && params.has_key?(:controller)
44
+ controller = "#{params[:controller].camelize}Controller"
45
+ ActiveSupport::Inflector.constantize(controller)
46
+ end
47
+ rescue NameError
48
+ nil
49
+ end
50
+
51
+ private
52
+ def merge_default_action!(params)
53
+ params[:action] ||= 'index'
54
+ end
55
+
56
+ def split_glob_param!(params)
57
+ params[@glob_param] = params[@glob_param].split('/').map { |v| URI.unescape(v) }
58
+ end
59
+ end
60
+
61
+
62
+ # A NamedRouteCollection instance is a collection of named routes, and also
63
+ # maintains an anonymous module that can be used to install helpers for the
64
+ # named routes.
65
+ class NamedRouteCollection #:nodoc:
66
+ include Enumerable
67
+ attr_reader :routes, :helpers
68
+
69
+ def initialize
70
+ clear!
71
+ end
72
+
73
+ def clear!
74
+ @routes = {}
75
+ @helpers = []
76
+
77
+ @module ||= Module.new do
78
+ instance_methods.each { |selector| remove_method(selector) }
79
+ end
80
+ end
81
+
82
+ def add(name, route)
83
+ routes[name.to_sym] = route
84
+ define_named_route_methods(name, route)
85
+ end
86
+
87
+ def get(name)
88
+ routes[name.to_sym]
89
+ end
90
+
91
+ alias []= add
92
+ alias [] get
93
+ alias clear clear!
94
+
95
+ def each
96
+ routes.each { |name, route| yield name, route }
97
+ self
98
+ end
99
+
100
+ def names
101
+ routes.keys
102
+ end
103
+
104
+ def length
105
+ routes.length
106
+ end
107
+
108
+ def reset!
109
+ old_routes = routes.dup
110
+ clear!
111
+ old_routes.each do |name, route|
112
+ add(name, route)
113
+ end
114
+ end
115
+
116
+ def install(destinations = [ActionController::Base, ActionView::Base], regenerate = false)
117
+ reset! if regenerate
118
+ Array(destinations).each do |dest|
119
+ dest.__send__(:include, @module)
120
+ end
121
+ end
122
+
123
+ private
124
+ def url_helper_name(name, kind = :url)
125
+ :"#{name}_#{kind}"
126
+ end
127
+
128
+ def hash_access_name(name, kind = :url)
129
+ :"hash_for_#{name}_#{kind}"
130
+ end
131
+
132
+ def define_named_route_methods(name, route)
133
+ {:url => {:only_path => false}, :path => {:only_path => true}}.each do |kind, opts|
134
+ hash = route.defaults.merge(:use_route => name).merge(opts)
135
+ define_hash_access route, name, kind, hash
136
+ define_url_helper route, name, kind, hash
137
+ end
138
+ end
139
+
140
+ def define_hash_access(route, name, kind, options)
141
+ selector = hash_access_name(name, kind)
142
+
143
+ # We use module_eval to avoid leaks
144
+ @module.module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
145
+ def #{selector}(options = nil) # def hash_for_users_url(options = nil)
146
+ options ? #{options.inspect}.merge(options) : #{options.inspect} # options ? {:only_path=>false}.merge(options) : {:only_path=>false}
147
+ end # end
148
+ protected :#{selector} # protected :hash_for_users_url
149
+ END_EVAL
150
+ helpers << selector
151
+ end
152
+
153
+ # Create a url helper allowing ordered parameters to be associated
154
+ # with corresponding dynamic segments, so you can do:
155
+ #
156
+ # foo_url(bar, baz, bang)
157
+ #
158
+ # Instead of:
159
+ #
160
+ # foo_url(:bar => bar, :baz => baz, :bang => bang)
161
+ #
162
+ # Also allow options hash, so you can do:
163
+ #
164
+ # foo_url(bar, baz, bang, :sort_by => 'baz')
165
+ #
166
+ def define_url_helper(route, name, kind, options)
167
+ selector = url_helper_name(name, kind)
168
+ hash_access_method = hash_access_name(name, kind)
169
+
170
+ # We use module_eval to avoid leaks.
171
+ #
172
+ # def users_url(*args)
173
+ # if args.empty? || Hash === args.first
174
+ # options = hash_for_users_url(args.first || {})
175
+ # else
176
+ # options = hash_for_users_url(args.extract_options!)
177
+ # default = default_url_options(options) if self.respond_to?(:default_url_options, true)
178
+ # options = (default ||= {}).merge(options)
179
+ #
180
+ # keys = []
181
+ # keys -= options.keys if args.size < keys.size - 1
182
+ #
183
+ # args = args.zip(keys).inject({}) do |h, (v, k)|
184
+ # h[k] = v
185
+ # h
186
+ # end
187
+ #
188
+ # # Tell url_for to skip default_url_options
189
+ # options[:use_defaults] = false
190
+ # options.merge!(args)
191
+ # end
192
+ #
193
+ # url_for(options)
194
+ # end
195
+ @module.module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
196
+ def #{selector}(*args)
197
+ if args.empty? || Hash === args.first
198
+ options = #{hash_access_method}(args.first || {})
199
+ else
200
+ options = #{hash_access_method}(args.extract_options!)
201
+ default = default_url_options(options) if self.respond_to?(:default_url_options, true)
202
+ options = (default ||= {}).merge(options)
203
+
204
+ keys = #{route.segment_keys.inspect}
205
+ keys -= options.keys if args.size < keys.size - 1 # take format into account
206
+
207
+ args = args.zip(keys).inject({}) do |h, (v, k)|
208
+ h[k] = v
209
+ h
210
+ end
211
+
212
+ # Tell url_for to skip default_url_options
213
+ options[:use_defaults] = false
214
+ options.merge!(args)
215
+ end
216
+
217
+ url_for(options)
218
+ end
219
+ protected :#{selector}
220
+ END_EVAL
221
+ helpers << selector
222
+ end
223
+ end
224
+
225
+ attr_accessor :routes, :named_routes, :controller_namespaces
226
+ attr_accessor :disable_clear_and_finalize, :resources_path_names
227
+
228
+ def self.default_resources_path_names
229
+ { :new => 'new', :edit => 'edit' }
230
+ end
231
+
232
+ def initialize
233
+ self.routes = []
234
+ self.named_routes = NamedRouteCollection.new
235
+ self.resources_path_names = self.class.default_resources_path_names.dup
236
+ self.controller_namespaces = Set.new
237
+
238
+ @disable_clear_and_finalize = false
239
+ end
240
+
241
+ def draw(&block)
242
+ clear! unless @disable_clear_and_finalize
243
+
244
+ mapper = Mapper.new(self)
245
+ if block.arity == 1
246
+ mapper.instance_exec(DeprecatedMapper.new(self), &block)
247
+ else
248
+ mapper.instance_exec(&block)
249
+ end
250
+
251
+ finalize! unless @disable_clear_and_finalize
252
+
253
+ nil
254
+ end
255
+
256
+ def finalize!
257
+ @set.add_route(NotFound)
258
+ install_helpers
259
+ @set.freeze
260
+ end
261
+
262
+ def clear!
263
+ # Clear the controller cache so we may discover new ones
264
+ @controller_constraints = nil
265
+ routes.clear
266
+ named_routes.clear
267
+ @set = ::Rack::Mount::RouteSet.new(:parameters_key => PARAMETERS_KEY)
268
+ end
269
+
270
+ def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false)
271
+ Array(destinations).each { |d| d.module_eval { include Helpers } }
272
+ named_routes.install(destinations, regenerate_code)
273
+ end
274
+
275
+ def empty?
276
+ routes.empty?
277
+ end
278
+
279
+ CONTROLLER_REGEXP = /[_a-zA-Z0-9]+/
280
+
281
+ def controller_constraints
282
+ @controller_constraints ||= begin
283
+ namespaces = controller_namespaces + in_memory_controller_namespaces
284
+ source = namespaces.map { |ns| "#{Regexp.escape(ns)}/#{CONTROLLER_REGEXP.source}" }
285
+ source << CONTROLLER_REGEXP.source
286
+ Regexp.compile(source.sort.reverse.join('|'))
287
+ end
288
+ end
289
+
290
+ def in_memory_controller_namespaces
291
+ namespaces = Set.new
292
+ ActionController::Base.subclasses.each do |klass|
293
+ controller_name = klass.underscore
294
+ namespaces << controller_name.split('/')[0...-1].join('/')
295
+ end
296
+ namespaces.delete('')
297
+ namespaces
298
+ end
299
+
300
+ def add_route(app, conditions = {}, requirements = {}, defaults = {}, name = nil)
301
+ route = Route.new(app, conditions, requirements, defaults, name)
302
+ @set.add_route(*route)
303
+ named_routes[name] = route if name
304
+ routes << route
305
+ route
306
+ end
307
+
308
+ def options_as_params(options)
309
+ # If an explicit :controller was given, always make :action explicit
310
+ # too, so that action expiry works as expected for things like
311
+ #
312
+ # generate({:controller => 'content'}, {:controller => 'content', :action => 'show'})
313
+ #
314
+ # (the above is from the unit tests). In the above case, because the
315
+ # controller was explicitly given, but no action, the action is implied to
316
+ # be "index", not the recalled action of "show".
317
+ #
318
+ # great fun, eh?
319
+
320
+ options_as_params = options.clone
321
+ options_as_params[:action] ||= 'index' if options[:controller]
322
+ options_as_params[:action] = options_as_params[:action].to_s if options_as_params[:action]
323
+ options_as_params
324
+ end
325
+
326
+ def build_expiry(options, recall)
327
+ recall.inject({}) do |expiry, (key, recalled_value)|
328
+ expiry[key] = (options.key?(key) && options[key].to_param != recalled_value.to_param)
329
+ expiry
330
+ end
331
+ end
332
+
333
+ # Generate the path indicated by the arguments, and return an array of
334
+ # the keys that were not used to generate it.
335
+ def extra_keys(options, recall={})
336
+ generate_extras(options, recall).last
337
+ end
338
+
339
+ def generate_extras(options, recall={})
340
+ generate(options, recall, :generate_extras)
341
+ end
342
+
343
+ def generate(options, recall = {}, method = :generate)
344
+ options, recall = options.dup, recall.dup
345
+ named_route = options.delete(:use_route)
346
+
347
+ options = options_as_params(options)
348
+ expire_on = build_expiry(options, recall)
349
+
350
+ recall[:action] ||= 'index' if options[:controller] || recall[:controller]
351
+
352
+ if recall[:controller] && (!options.has_key?(:controller) || options[:controller] == recall[:controller])
353
+ options[:controller] = recall.delete(:controller)
354
+
355
+ if recall[:action] && (!options.has_key?(:action) || options[:action] == recall[:action])
356
+ options[:action] = recall.delete(:action)
357
+
358
+ if recall[:id] && (!options.has_key?(:id) || options[:id] == recall[:id])
359
+ options[:id] = recall.delete(:id)
360
+ end
361
+ end
362
+ end
363
+
364
+ options[:controller] = options[:controller].to_s if options[:controller]
365
+
366
+ if !named_route && expire_on[:controller] && options[:controller] && options[:controller][0] != ?/
367
+ old_parts = recall[:controller].split('/')
368
+ new_parts = options[:controller].split('/')
369
+ parts = old_parts[0..-(new_parts.length + 1)] + new_parts
370
+ options[:controller] = parts.join('/')
371
+ end
372
+
373
+ options[:controller] = options[:controller][1..-1] if options[:controller] && options[:controller][0] == ?/
374
+
375
+ merged = options.merge(recall)
376
+ if options.has_key?(:action) && options[:action].nil?
377
+ options.delete(:action)
378
+ recall[:action] = 'index'
379
+ end
380
+ recall[:action] = options.delete(:action) if options[:action] == 'index'
381
+
382
+ opts = {}
383
+ opts[:parameterize] = lambda { |name, value|
384
+ if name == :controller
385
+ value
386
+ elsif value.is_a?(Array)
387
+ value.map { |v| Rack::Mount::Utils.escape_uri(v.to_param) }.join('/')
388
+ else
389
+ Rack::Mount::Utils.escape_uri(value.to_param)
390
+ end
391
+ }
392
+
393
+ unless result = @set.generate(:path_info, named_route, options, recall, opts)
394
+ raise ActionController::RoutingError, "No route matches #{options.inspect}"
395
+ end
396
+
397
+ path, params = result
398
+ params.each do |k, v|
399
+ if v
400
+ params[k] = v
401
+ else
402
+ params.delete(k)
403
+ end
404
+ end
405
+
406
+ if path && method == :generate_extras
407
+ [path, params.keys]
408
+ elsif path
409
+ path << "?#{params.to_query}" if params.any?
410
+ path
411
+ else
412
+ raise ActionController::RoutingError, "No route matches #{options.inspect}"
413
+ end
414
+ rescue Rack::Mount::RoutingError
415
+ raise ActionController::RoutingError, "No route matches #{options.inspect}"
416
+ end
417
+
418
+ def call(env)
419
+ @set.call(env)
420
+ end
421
+
422
+ def recognize_path(path, environment = {})
423
+ method = (environment[:method] || "GET").to_s.upcase
424
+ path = Rack::Mount::Utils.normalize_path(path)
425
+
426
+ begin
427
+ env = Rack::MockRequest.env_for(path, {:method => method})
428
+ rescue URI::InvalidURIError => e
429
+ raise ActionController::RoutingError, e.message
430
+ end
431
+
432
+ req = Rack::Request.new(env)
433
+ @set.recognize(req) do |route, params|
434
+ dispatcher = route.app
435
+ if dispatcher.is_a?(Dispatcher) && dispatcher.controller(params)
436
+ dispatcher.prepare_params!(params)
437
+ return params
438
+ end
439
+ end
440
+
441
+ raise ActionController::RoutingError, "No route matches #{path.inspect}"
442
+ end
443
+ end
444
+ end
445
+ end