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
@@ -1,265 +0,0 @@
1
- module ActionController
2
- module Routing
3
- class Route #:nodoc:
4
- attr_accessor :segments, :requirements, :conditions, :optimise
5
-
6
- def initialize(segments = [], requirements = {}, conditions = {})
7
- @segments = segments
8
- @requirements = requirements
9
- @conditions = conditions
10
-
11
- if !significant_keys.include?(:action) && !requirements[:action]
12
- @requirements[:action] = "index"
13
- @significant_keys << :action
14
- end
15
-
16
- # Routes cannot use the current string interpolation method
17
- # if there are user-supplied <tt>:requirements</tt> as the interpolation
18
- # code won't raise RoutingErrors when generating
19
- has_requirements = @segments.detect { |segment| segment.respond_to?(:regexp) && segment.regexp }
20
- if has_requirements || @requirements.keys.to_set != Routing::ALLOWED_REQUIREMENTS_FOR_OPTIMISATION
21
- @optimise = false
22
- else
23
- @optimise = true
24
- end
25
- end
26
-
27
- # Indicates whether the routes should be optimised with the string interpolation
28
- # version of the named routes methods.
29
- def optimise?
30
- @optimise && ActionController::Base::optimise_named_routes
31
- end
32
-
33
- def segment_keys
34
- segments.collect do |segment|
35
- segment.key if segment.respond_to? :key
36
- end.compact
37
- end
38
-
39
- def required_segment_keys
40
- required_segments = segments.select {|seg| (!seg.optional? && !seg.is_a?(DividerSegment)) || seg.is_a?(PathSegment) }
41
- required_segments.collect { |seg| seg.key if seg.respond_to?(:key)}.compact
42
- end
43
-
44
- # Build a query string from the keys of the given hash. If +only_keys+
45
- # is given (as an array), only the keys indicated will be used to build
46
- # the query string. The query string will correctly build array parameter
47
- # values.
48
- def build_query_string(hash, only_keys = nil)
49
- elements = []
50
-
51
- (only_keys || hash.keys).each do |key|
52
- if value = hash[key]
53
- elements << value.to_query(key)
54
- end
55
- end
56
-
57
- elements.empty? ? '' : "?#{elements.sort * '&'}"
58
- end
59
-
60
- # A route's parameter shell contains parameter values that are not in the
61
- # route's path, but should be placed in the recognized hash.
62
- #
63
- # For example, +{:controller => 'pages', :action => 'show'} is the shell for the route:
64
- #
65
- # map.connect '/page/:id', :controller => 'pages', :action => 'show', :id => /\d+/
66
- #
67
- def parameter_shell
68
- @parameter_shell ||= {}.tap do |shell|
69
- requirements.each do |key, requirement|
70
- shell[key] = requirement unless requirement.is_a? Regexp
71
- end
72
- end
73
- end
74
-
75
- # Return an array containing all the keys that are used in this route. This
76
- # includes keys that appear inside the path, and keys that have requirements
77
- # placed upon them.
78
- def significant_keys
79
- @significant_keys ||= [].tap do |sk|
80
- segments.each { |segment| sk << segment.key if segment.respond_to? :key }
81
- sk.concat requirements.keys
82
- sk.uniq!
83
- end
84
- end
85
-
86
- # Return a hash of key/value pairs representing the keys in the route that
87
- # have defaults, or which are specified by non-regexp requirements.
88
- def defaults
89
- @defaults ||= {}.tap do |hash|
90
- segments.each do |segment|
91
- next unless segment.respond_to? :default
92
- hash[segment.key] = segment.default unless segment.default.nil?
93
- end
94
- requirements.each do |key,req|
95
- next if Regexp === req || req.nil?
96
- hash[key] = req
97
- end
98
- end
99
- end
100
-
101
- def matches_controller_and_action?(controller, action)
102
- prepare_matching!
103
- (@controller_requirement.nil? || @controller_requirement === controller) &&
104
- (@action_requirement.nil? || @action_requirement === action)
105
- end
106
-
107
- def to_s
108
- @to_s ||= begin
109
- segs = segments.inject("") { |str,s| str << s.to_s }
110
- "%-6s %-40s %s" % [(conditions[:method] || :any).to_s.upcase, segs, requirements.inspect]
111
- end
112
- end
113
-
114
- # TODO: Route should be prepared and frozen on initialize
115
- def freeze
116
- unless frozen?
117
- write_generation!
118
- write_recognition!
119
- prepare_matching!
120
-
121
- parameter_shell
122
- significant_keys
123
- defaults
124
- to_s
125
- end
126
-
127
- super
128
- end
129
-
130
- def generate(options, hash, expire_on = {})
131
- path, hash = generate_raw(options, hash, expire_on)
132
- append_query_string(path, hash, extra_keys(options))
133
- end
134
-
135
- def generate_extras(options, hash, expire_on = {})
136
- path, hash = generate_raw(options, hash, expire_on)
137
- [path, extra_keys(options)]
138
- end
139
-
140
- private
141
- def requirement_for(key)
142
- return requirements[key] if requirements.key? key
143
- segments.each do |segment|
144
- return segment.regexp if segment.respond_to?(:key) && segment.key == key
145
- end
146
- nil
147
- end
148
-
149
- # Write and compile a +generate+ method for this Route.
150
- def write_generation!
151
- # Build the main body of the generation
152
- body = "expired = false\n#{generation_extraction}\n#{generation_structure}"
153
-
154
- # If we have conditions that must be tested first, nest the body inside an if
155
- body = "if #{generation_requirements}\n#{body}\nend" if generation_requirements
156
- args = "options, hash, expire_on = {}"
157
-
158
- # Nest the body inside of a def block, and then compile it.
159
- raw_method = method_decl = "def generate_raw(#{args})\npath = begin\n#{body}\nend\n[path, hash]\nend"
160
- instance_eval method_decl, "generated code (#{__FILE__}:#{__LINE__})"
161
-
162
- # expire_on.keys == recall.keys; in other words, the keys in the expire_on hash
163
- # are the same as the keys that were recalled from the previous request. Thus,
164
- # we can use the expire_on.keys to determine which keys ought to be used to build
165
- # the query string. (Never use keys from the recalled request when building the
166
- # query string.)
167
-
168
- raw_method
169
- end
170
-
171
- # Build several lines of code that extract values from the options hash. If any
172
- # of the values are missing or rejected then a return will be executed.
173
- def generation_extraction
174
- segments.collect do |segment|
175
- segment.extraction_code
176
- end.compact * "\n"
177
- end
178
-
179
- # Produce a condition expression that will check the requirements of this route
180
- # upon generation.
181
- def generation_requirements
182
- requirement_conditions = requirements.collect do |key, req|
183
- if req.is_a? Regexp
184
- value_regexp = Regexp.new "\\A#{req.to_s}\\Z"
185
- "hash[:#{key}] && #{value_regexp.inspect} =~ options[:#{key}]"
186
- else
187
- "hash[:#{key}] == #{req.inspect}"
188
- end
189
- end
190
- requirement_conditions * ' && ' unless requirement_conditions.empty?
191
- end
192
-
193
- def generation_structure
194
- segments.last.string_structure segments[0..-2]
195
- end
196
-
197
- # Write and compile a +recognize+ method for this Route.
198
- def write_recognition!
199
- # Create an if structure to extract the params from a match if it occurs.
200
- body = "params = parameter_shell.dup\n#{recognition_extraction * "\n"}\nparams"
201
- body = "if #{recognition_conditions.join(" && ")}\n#{body}\nend"
202
-
203
- # Build the method declaration and compile it
204
- method_decl = "def recognize(path, env = {})\n#{body}\nend"
205
- instance_eval method_decl, "generated code (#{__FILE__}:#{__LINE__})"
206
- method_decl
207
- end
208
-
209
- # Plugins may override this method to add other conditions, like checks on
210
- # host, subdomain, and so forth. Note that changes here only affect route
211
- # recognition, not generation.
212
- def recognition_conditions
213
- result = ["(match = #{Regexp.new(recognition_pattern).inspect}.match(path))"]
214
- result << "[conditions[:method]].flatten.include?(env[:method])" if conditions[:method]
215
- result
216
- end
217
-
218
- # Build the regular expression pattern that will match this route.
219
- def recognition_pattern(wrap = true)
220
- pattern = ''
221
- segments.reverse_each do |segment|
222
- pattern = segment.build_pattern pattern
223
- end
224
- wrap ? ("\\A" + pattern + "\\Z") : pattern
225
- end
226
-
227
- # Write the code to extract the parameters from a matched route.
228
- def recognition_extraction
229
- next_capture = 1
230
- extraction = segments.collect do |segment|
231
- x = segment.match_extraction(next_capture)
232
- next_capture += segment.number_of_captures
233
- x
234
- end
235
- extraction.compact
236
- end
237
-
238
- # Generate the query string with any extra keys in the hash and append
239
- # it to the given path, returning the new path.
240
- def append_query_string(path, hash, query_keys = nil)
241
- return nil unless path
242
- query_keys ||= extra_keys(hash)
243
- "#{path}#{build_query_string(hash, query_keys)}"
244
- end
245
-
246
- # Determine which keys in the given hash are "extra". Extra keys are
247
- # those that were not used to generate a particular route. The extra
248
- # keys also do not include those recalled from the prior request, nor
249
- # do they include any keys that were implied in the route (like a
250
- # <tt>:controller</tt> that is required, but not explicitly used in the
251
- # text of the route.)
252
- def extra_keys(hash, recall = {})
253
- (hash || {}).keys.map { |k| k.to_sym } - (recall || {}).keys - significant_keys
254
- end
255
-
256
- def prepare_matching!
257
- unless defined? @matching_prepared
258
- @controller_requirement = requirement_for(:controller)
259
- @action_requirement = requirement_for(:action)
260
- @matching_prepared = true
261
- end
262
- end
263
- end
264
- end
265
- end
@@ -1,503 +0,0 @@
1
- module ActionController
2
- module Routing
3
- class RouteSet #:nodoc:
4
- # Mapper instances are used to build routes. The object passed to the draw
5
- # block in config/routes.rb is a Mapper instance.
6
- #
7
- # Mapper instances have relatively few instance methods, in order to avoid
8
- # clashes with named routes.
9
- class Mapper #:doc:
10
- include ActionController::Resources
11
-
12
- def initialize(set) #:nodoc:
13
- @set = set
14
- end
15
-
16
- # Create an unnamed route with the provided +path+ and +options+. See
17
- # ActionController::Routing for an introduction to routes.
18
- def connect(path, options = {})
19
- @set.add_route(path, options)
20
- end
21
-
22
- # Creates a named route called "root" for matching the root level request.
23
- def root(options = {})
24
- if options.is_a?(Symbol)
25
- if source_route = @set.named_routes.routes[options]
26
- options = source_route.defaults.merge({ :conditions => source_route.conditions })
27
- end
28
- end
29
- named_route("root", '', options)
30
- end
31
-
32
- def named_route(name, path, options = {}) #:nodoc:
33
- @set.add_named_route(name, path, options)
34
- end
35
-
36
- # Enables the use of resources in a module by setting the name_prefix, path_prefix, and namespace for the model.
37
- # Example:
38
- #
39
- # map.namespace(:admin) do |admin|
40
- # admin.resources :products,
41
- # :has_many => [ :tags, :images, :variants ]
42
- # end
43
- #
44
- # This will create +admin_products_url+ pointing to "admin/products", which will look for an Admin::ProductsController.
45
- # It'll also create +admin_product_tags_url+ pointing to "admin/products/#{product_id}/tags", which will look for
46
- # Admin::TagsController.
47
- def namespace(name, options = {}, &block)
48
- if options[:namespace]
49
- with_options({:path_prefix => "#{options.delete(:path_prefix)}/#{name}", :name_prefix => "#{options.delete(:name_prefix)}#{name}_", :namespace => "#{options.delete(:namespace)}#{name}/" }.merge(options), &block)
50
- else
51
- with_options({:path_prefix => name, :name_prefix => "#{name}_", :namespace => "#{name}/" }.merge(options), &block)
52
- end
53
- end
54
-
55
- def method_missing(route_name, *args, &proc) #:nodoc:
56
- super unless args.length >= 1 && proc.nil?
57
- @set.add_named_route(route_name, *args)
58
- end
59
- end
60
-
61
- # A NamedRouteCollection instance is a collection of named routes, and also
62
- # maintains an anonymous module that can be used to install helpers for the
63
- # named routes.
64
- class NamedRouteCollection #:nodoc:
65
- include Enumerable
66
- include ActionController::Routing::Optimisation
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
78
- @module.instance_methods.each do |selector|
79
- @module.class_eval { remove_method selector }
80
- end
81
- end
82
-
83
- def add(name, route)
84
- routes[name.to_sym] = route
85
- define_named_route_methods(name, route)
86
- end
87
-
88
- def get(name)
89
- routes[name.to_sym]
90
- end
91
-
92
- alias []= add
93
- alias [] get
94
- alias clear clear!
95
-
96
- def each
97
- routes.each { |name, route| yield name, route }
98
- self
99
- end
100
-
101
- def names
102
- routes.keys
103
- end
104
-
105
- def length
106
- routes.length
107
- end
108
-
109
- def reset!
110
- old_routes = routes.dup
111
- clear!
112
- old_routes.each do |name, route|
113
- add(name, route)
114
- end
115
- end
116
-
117
- def install(destinations = [ActionController::Base, ActionView::Base], regenerate = false)
118
- reset! if regenerate
119
- Array(destinations).each do |dest|
120
- dest.__send__(:include, @module)
121
- end
122
- end
123
-
124
- private
125
- def url_helper_name(name, kind = :url)
126
- :"#{name}_#{kind}"
127
- end
128
-
129
- def hash_access_name(name, kind = :url)
130
- :"hash_for_#{name}_#{kind}"
131
- end
132
-
133
- def define_named_route_methods(name, route)
134
- {:url => {:only_path => false}, :path => {:only_path => true}}.each do |kind, opts|
135
- hash = route.defaults.merge(:use_route => name).merge(opts)
136
- define_hash_access route, name, kind, hash
137
- define_url_helper route, name, kind, hash
138
- end
139
- end
140
-
141
- def named_helper_module_eval(code, *args)
142
- @module.module_eval(code, *args)
143
- end
144
-
145
- def define_hash_access(route, name, kind, options)
146
- selector = hash_access_name(name, kind)
147
- named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
148
- def #{selector}(options = nil) # def hash_for_users_url(options = nil)
149
- options ? #{options.inspect}.merge(options) : #{options.inspect} # options ? {:only_path=>false}.merge(options) : {:only_path=>false}
150
- end # end
151
- protected :#{selector} # protected :hash_for_users_url
152
- end_eval
153
- helpers << selector
154
- end
155
-
156
- def define_url_helper(route, name, kind, options)
157
- selector = url_helper_name(name, kind)
158
- # The segment keys used for positional paramters
159
-
160
- hash_access_method = hash_access_name(name, kind)
161
-
162
- # allow ordered parameters to be associated with corresponding
163
- # dynamic segments, so you can do
164
- #
165
- # foo_url(bar, baz, bang)
166
- #
167
- # instead of
168
- #
169
- # foo_url(:bar => bar, :baz => baz, :bang => bang)
170
- #
171
- # Also allow options hash, so you can do
172
- #
173
- # foo_url(bar, baz, bang, :sort_by => 'baz')
174
- #
175
- named_helper_module_eval <<-end_eval # We use module_eval to avoid leaks
176
- def #{selector}(*args) # def users_url(*args)
177
- args.compact! #
178
- #
179
- #{generate_optimisation_block(route, kind)} # #{generate_optimisation_block(route, kind)}
180
- #
181
- opts = if args.empty? || Hash === args.first # opts = if args.empty? || Hash === args.first
182
- args.first || {} # args.first || {}
183
- else # else
184
- options = args.extract_options! # options = args.extract_options!
185
- args = args.zip(#{route.segment_keys.inspect}).inject({}) do |h, (v, k)| # args = args.zip([]).inject({}) do |h, (v, k)|
186
- h[k] = v # h[k] = v
187
- h # h
188
- end # end
189
- options.merge(args) # options.merge(args)
190
- end # end
191
- #
192
- url_for(#{hash_access_method}(opts)) # url_for(hash_for_users_url(opts))
193
- #
194
- end # end
195
- #Add an alias to support the now deprecated formatted_* URL. # #Add an alias to support the now deprecated formatted_* URL.
196
- def formatted_#{selector}(*args) # def formatted_users_url(*args)
197
- ActiveSupport::Deprecation.warn( # ActiveSupport::Deprecation.warn(
198
- "formatted_#{selector}() has been deprecated. " + # "formatted_users_url() has been deprecated. " +
199
- "Please pass format to the standard " + # "Please pass format to the standard " +
200
- "#{selector} method instead.", caller) # "users_url method instead.", caller)
201
- #{selector}(*args) # users_url(*args)
202
- end # end
203
- protected :#{selector} # protected :users_url
204
- end_eval
205
- helpers << selector
206
- end
207
- end
208
-
209
- attr_accessor :routes, :named_routes, :configuration_files
210
-
211
- def initialize
212
- self.configuration_files = []
213
-
214
- self.routes = []
215
- self.named_routes = NamedRouteCollection.new
216
-
217
- clear_recognize_optimized!
218
- end
219
-
220
- # Subclasses and plugins may override this method to specify a different
221
- # RouteBuilder instance, so that other route DSL's can be created.
222
- def builder
223
- @builder ||= RouteBuilder.new
224
- end
225
-
226
- def draw
227
- yield Mapper.new(self)
228
- install_helpers
229
- end
230
-
231
- def clear!
232
- routes.clear
233
- named_routes.clear
234
- @combined_regexp = nil
235
- @routes_by_controller = nil
236
- # This will force routing/recognition_optimization.rb
237
- # to refresh optimisations.
238
- clear_recognize_optimized!
239
- end
240
-
241
- def install_helpers(destinations = [ActionController::Base, ActionView::Base], regenerate_code = false)
242
- Array(destinations).each { |d| d.module_eval { include Helpers } }
243
- named_routes.install(destinations, regenerate_code)
244
- end
245
-
246
- def empty?
247
- routes.empty?
248
- end
249
-
250
- def add_configuration_file(path)
251
- self.configuration_files << path
252
- end
253
-
254
- # Deprecated accessor
255
- def configuration_file=(path)
256
- add_configuration_file(path)
257
- end
258
-
259
- # Deprecated accessor
260
- def configuration_file
261
- configuration_files
262
- end
263
-
264
- def load!
265
- Routing.use_controllers!(nil) # Clear the controller cache so we may discover new ones
266
- clear!
267
- load_routes!
268
- end
269
-
270
- # reload! will always force a reload whereas load checks the timestamp first
271
- alias reload! load!
272
-
273
- def reload
274
- if configuration_files.any? && @routes_last_modified
275
- if routes_changed_at == @routes_last_modified
276
- return # routes didn't change, don't reload
277
- else
278
- @routes_last_modified = routes_changed_at
279
- end
280
- end
281
-
282
- load!
283
- end
284
-
285
- def load_routes!
286
- if configuration_files.any?
287
- configuration_files.each { |config| load(config) }
288
- @routes_last_modified = routes_changed_at
289
- else
290
- add_route ":controller/:action/:id"
291
- end
292
- end
293
-
294
- def routes_changed_at
295
- routes_changed_at = nil
296
-
297
- configuration_files.each do |config|
298
- config_changed_at = File.stat(config).mtime
299
-
300
- if routes_changed_at.nil? || config_changed_at > routes_changed_at
301
- routes_changed_at = config_changed_at
302
- end
303
- end
304
-
305
- routes_changed_at
306
- end
307
-
308
- def add_route(path, options = {})
309
- options.each { |k, v| options[k] = v.to_s if [:controller, :action].include?(k) && v.is_a?(Symbol) }
310
- route = builder.build(path, options)
311
- routes << route
312
- route
313
- end
314
-
315
- def add_named_route(name, path, options = {})
316
- # TODO - is options EVER used?
317
- name = options[:name_prefix] + name.to_s if options[:name_prefix]
318
- named_routes[name.to_sym] = add_route(path, options)
319
- end
320
-
321
- def options_as_params(options)
322
- # If an explicit :controller was given, always make :action explicit
323
- # too, so that action expiry works as expected for things like
324
- #
325
- # generate({:controller => 'content'}, {:controller => 'content', :action => 'show'})
326
- #
327
- # (the above is from the unit tests). In the above case, because the
328
- # controller was explicitly given, but no action, the action is implied to
329
- # be "index", not the recalled action of "show".
330
- #
331
- # great fun, eh?
332
-
333
- options_as_params = options.clone
334
- options_as_params[:action] ||= 'index' if options[:controller]
335
- options_as_params[:action] = options_as_params[:action].to_s if options_as_params[:action]
336
- options_as_params
337
- end
338
-
339
- def build_expiry(options, recall)
340
- recall.inject({}) do |expiry, (key, recalled_value)|
341
- expiry[key] = (options.key?(key) && options[key].to_param != recalled_value.to_param)
342
- expiry
343
- end
344
- end
345
-
346
- # Generate the path indicated by the arguments, and return an array of
347
- # the keys that were not used to generate it.
348
- def extra_keys(options, recall={})
349
- generate_extras(options, recall).last
350
- end
351
-
352
- def generate_extras(options, recall={})
353
- generate(options, recall, :generate_extras)
354
- end
355
-
356
- def generate(options, recall = {}, method=:generate)
357
- named_route_name = options.delete(:use_route)
358
- generate_all = options.delete(:generate_all)
359
- if named_route_name
360
- named_route = named_routes[named_route_name]
361
- options = named_route.parameter_shell.merge(options)
362
- end
363
-
364
- options = options_as_params(options)
365
- expire_on = build_expiry(options, recall)
366
-
367
- if options[:controller]
368
- options[:controller] = options[:controller].to_s
369
- end
370
- # if the controller has changed, make sure it changes relative to the
371
- # current controller module, if any. In other words, if we're currently
372
- # on admin/get, and the new controller is 'set', the new controller
373
- # should really be admin/set.
374
- if !named_route && expire_on[:controller] && options[:controller] && options[:controller][0] != ?/
375
- old_parts = recall[:controller].split('/')
376
- new_parts = options[:controller].split('/')
377
- parts = old_parts[0..-(new_parts.length + 1)] + new_parts
378
- options[:controller] = parts.join('/')
379
- end
380
-
381
- # drop the leading '/' on the controller name
382
- options[:controller] = options[:controller][1..-1] if options[:controller] && options[:controller][0] == ?/
383
- merged = recall.merge(options)
384
-
385
- if named_route
386
- path = named_route.generate(options, merged, expire_on)
387
- if path.nil?
388
- raise_named_route_error(options, named_route, named_route_name)
389
- else
390
- return path
391
- end
392
- else
393
- merged[:action] ||= 'index'
394
- options[:action] ||= 'index'
395
-
396
- controller = merged[:controller]
397
- action = merged[:action]
398
-
399
- raise RoutingError, "Need controller and action!" unless controller && action
400
-
401
- if generate_all
402
- # Used by caching to expire all paths for a resource
403
- return routes.collect do |route|
404
- route.__send__(method, options, merged, expire_on)
405
- end.compact
406
- end
407
-
408
- # don't use the recalled keys when determining which routes to check
409
- future_routes, deprecated_routes = routes_by_controller[controller][action][options.reject {|k,v| !v}.keys.sort_by { |x| x.object_id }]
410
- routes = Routing.generate_best_match ? deprecated_routes : future_routes
411
-
412
- routes.each_with_index do |route, index|
413
- results = route.__send__(method, options, merged, expire_on)
414
- if results && (!results.is_a?(Array) || results.first)
415
- return results
416
- end
417
- end
418
- end
419
-
420
- raise RoutingError, "No route matches #{options.inspect}"
421
- end
422
-
423
- # try to give a helpful error message when named route generation fails
424
- def raise_named_route_error(options, named_route, named_route_name)
425
- diff = named_route.requirements.diff(options)
426
- unless diff.empty?
427
- raise RoutingError, "#{named_route_name}_url failed to generate from #{options.inspect}, expected: #{named_route.requirements.inspect}, diff: #{named_route.requirements.diff(options).inspect}"
428
- else
429
- required_segments = named_route.segments.select {|seg| (!seg.optional?) && (!seg.is_a?(DividerSegment)) }
430
- required_keys_or_values = required_segments.map { |seg| seg.key rescue seg.value } # we want either the key or the value from the segment
431
- raise RoutingError, "#{named_route_name}_url failed to generate from #{options.inspect} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: #{required_keys_or_values.inspect} - are they all satisfied?"
432
- end
433
- end
434
-
435
- def call(env)
436
- request = Request.new(env)
437
- app = Routing::Routes.recognize(request)
438
- app.call(env).to_a
439
- end
440
-
441
- def recognize(request)
442
- params = recognize_path(request.path, extract_request_environment(request))
443
- request.path_parameters = params.with_indifferent_access
444
- "#{params[:controller].to_s.camelize}Controller".constantize
445
- end
446
-
447
- def recognize_path(path, environment={})
448
- raise "Not optimized! Check that routing/recognition_optimisation overrides RouteSet#recognize_path."
449
- end
450
-
451
- def routes_by_controller
452
- @routes_by_controller ||= Hash.new do |controller_hash, controller|
453
- controller_hash[controller] = Hash.new do |action_hash, action|
454
- action_hash[action] = Hash.new do |key_hash, keys|
455
- key_hash[keys] = [
456
- routes_for_controller_and_action_and_keys(controller, action, keys),
457
- deprecated_routes_for_controller_and_action_and_keys(controller, action, keys)
458
- ]
459
- end
460
- end
461
- end
462
- end
463
-
464
- def routes_for(options, merged, expire_on)
465
- raise "Need controller and action!" unless controller && action
466
- controller = merged[:controller]
467
- merged = options if expire_on[:controller]
468
- action = merged[:action] || 'index'
469
-
470
- routes_by_controller[controller][action][merged.keys][1]
471
- end
472
-
473
- def routes_for_controller_and_action(controller, action)
474
- ActiveSupport::Deprecation.warn "routes_for_controller_and_action() has been deprecated. Please use routes_for()"
475
- selected = routes.select do |route|
476
- route.matches_controller_and_action? controller, action
477
- end
478
- (selected.length == routes.length) ? routes : selected
479
- end
480
-
481
- def routes_for_controller_and_action_and_keys(controller, action, keys)
482
- routes.select do |route|
483
- route.matches_controller_and_action? controller, action
484
- end
485
- end
486
-
487
- def deprecated_routes_for_controller_and_action_and_keys(controller, action, keys)
488
- selected = routes.select do |route|
489
- route.matches_controller_and_action? controller, action
490
- end
491
- selected.sort_by do |route|
492
- (keys - route.significant_keys).length
493
- end
494
- end
495
-
496
- # Subclasses and plugins may override this method to extract further attributes
497
- # from the request, for use by route conditions and such.
498
- def extract_request_environment(request)
499
- { :method => request.method }
500
- end
501
- end
502
- end
503
- end