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,649 @@
1
+ module ActionDispatch
2
+ module Routing
3
+ class Mapper
4
+ class Constraints
5
+ def self.new(app, constraints = [])
6
+ if constraints.any?
7
+ super(app, constraints)
8
+ else
9
+ app
10
+ end
11
+ end
12
+
13
+ def initialize(app, constraints = [])
14
+ @app, @constraints = app, constraints
15
+ end
16
+
17
+ def call(env)
18
+ req = Rack::Request.new(env)
19
+
20
+ @constraints.each { |constraint|
21
+ if constraint.respond_to?(:matches?) && !constraint.matches?(req)
22
+ return [ 404, {'X-Cascade' => 'pass'}, [] ]
23
+ elsif constraint.respond_to?(:call) && !constraint.call(req)
24
+ return [ 404, {'X-Cascade' => 'pass'}, [] ]
25
+ end
26
+ }
27
+
28
+ @app.call(env)
29
+ end
30
+ end
31
+
32
+ class Mapping
33
+ def initialize(set, scope, args)
34
+ @set, @scope = set, scope
35
+ @path, @options = extract_path_and_options(args)
36
+ end
37
+
38
+ def to_route
39
+ [ app, conditions, requirements, defaults, @options[:as] ]
40
+ end
41
+
42
+ private
43
+ def extract_path_and_options(args)
44
+ options = args.extract_options!
45
+
46
+ case
47
+ when using_to_shorthand?(args, options)
48
+ path, to = options.find { |name, value| name.is_a?(String) }
49
+ options.merge!(:to => to).delete(path) if path
50
+ when using_match_shorthand?(args, options)
51
+ path = args.first
52
+ options = { :to => path.gsub("/", "#"), :as => path.gsub("/", "_") }
53
+ else
54
+ path = args.first
55
+ end
56
+
57
+ [ normalize_path(path), options ]
58
+ end
59
+
60
+ # match "account" => "account#index"
61
+ def using_to_shorthand?(args, options)
62
+ args.empty? && options.present?
63
+ end
64
+
65
+ # match "account/overview"
66
+ def using_match_shorthand?(args, options)
67
+ args.present? && options.except(:via).empty? && !args.first.include?(':')
68
+ end
69
+
70
+ def normalize_path(path)
71
+ path = "#{@scope[:path]}/#{path}"
72
+ raise ArgumentError, "path is required" if path.empty?
73
+ Mapper.normalize_path(path)
74
+ end
75
+
76
+ def app
77
+ Constraints.new(
78
+ to.respond_to?(:call) ? to : Routing::RouteSet::Dispatcher.new(:defaults => defaults),
79
+ blocks
80
+ )
81
+ end
82
+
83
+ def conditions
84
+ { :path_info => @path }.merge(constraints).merge(request_method_condition)
85
+ end
86
+
87
+ def requirements
88
+ @requirements ||= returning(@options[:constraints] || {}) do |requirements|
89
+ requirements.reverse_merge!(@scope[:constraints]) if @scope[:constraints]
90
+ @options.each { |k, v| requirements[k] = v if v.is_a?(Regexp) }
91
+ requirements[:controller] ||= @set.controller_constraints
92
+ end
93
+ end
94
+
95
+ def defaults
96
+ @defaults ||= if to.respond_to?(:call)
97
+ { }
98
+ else
99
+ defaults = case to
100
+ when String
101
+ controller, action = to.split('#')
102
+ { :controller => controller, :action => action }
103
+ when Symbol
104
+ { :action => to.to_s }.merge(default_controller ? { :controller => default_controller } : {})
105
+ else
106
+ default_controller ? { :controller => default_controller } : {}
107
+ end
108
+
109
+ if defaults[:controller].blank? && segment_keys.exclude?("controller")
110
+ raise ArgumentError, "missing :controller"
111
+ end
112
+
113
+ if defaults[:action].blank? && segment_keys.exclude?("action")
114
+ raise ArgumentError, "missing :action"
115
+ end
116
+
117
+ defaults
118
+ end
119
+ end
120
+
121
+ def blocks
122
+ if @options[:constraints].present? && !@options[:constraints].is_a?(Hash)
123
+ block = @options[:constraints]
124
+ else
125
+ block = nil
126
+ end
127
+
128
+ ((@scope[:blocks] || []) + [ block ]).compact
129
+ end
130
+
131
+ def constraints
132
+ @constraints ||= requirements.reject { |k, v| segment_keys.include?(k.to_s) || k == :controller }
133
+ end
134
+
135
+ def request_method_condition
136
+ if via = @options[:via]
137
+ via = Array(via).map { |m| m.to_s.upcase }
138
+ { :request_method => Regexp.union(*via) }
139
+ else
140
+ { }
141
+ end
142
+ end
143
+
144
+ def segment_keys
145
+ @segment_keys ||= Rack::Mount::RegexpWithNamedGroups.new(
146
+ Rack::Mount::Strexp.compile(@path, requirements, SEPARATORS)
147
+ ).names
148
+ end
149
+
150
+ def to
151
+ @options[:to]
152
+ end
153
+
154
+ def default_controller
155
+ @scope[:controller].to_s if @scope[:controller]
156
+ end
157
+ end
158
+
159
+ # Invokes Rack::Mount::Utils.normalize path and ensure that
160
+ # (:locale) becomes (/:locale) instead of /(:locale). Except
161
+ # for root cases, where the latter is the correct one.
162
+ def self.normalize_path(path)
163
+ path = Rack::Mount::Utils.normalize_path(path)
164
+ path.sub!(%r{/(\(+)/?:}, '\1/:') unless path =~ %r{^/\(+:.*\)$}
165
+ path
166
+ end
167
+
168
+ module Base
169
+ def initialize(set)
170
+ @set = set
171
+ end
172
+
173
+ def root(options = {})
174
+ match '/', options.reverse_merge(:as => :root)
175
+ end
176
+
177
+ def match(*args)
178
+ @set.add_route(*Mapping.new(@set, @scope, args).to_route)
179
+ self
180
+ end
181
+ end
182
+
183
+ module HttpHelpers
184
+ def get(*args, &block)
185
+ map_method(:get, *args, &block)
186
+ end
187
+
188
+ def post(*args, &block)
189
+ map_method(:post, *args, &block)
190
+ end
191
+
192
+ def put(*args, &block)
193
+ map_method(:put, *args, &block)
194
+ end
195
+
196
+ def delete(*args, &block)
197
+ map_method(:delete, *args, &block)
198
+ end
199
+
200
+ def redirect(*args, &block)
201
+ options = args.last.is_a?(Hash) ? args.pop : {}
202
+
203
+ path = args.shift || block
204
+ path_proc = path.is_a?(Proc) ? path : proc { |params| path % params }
205
+ status = options[:status] || 301
206
+ body = 'Moved Permanently'
207
+
208
+ lambda do |env|
209
+ req = Request.new(env)
210
+ uri = URI.parse(path_proc.call(req.symbolized_path_parameters))
211
+ uri.scheme ||= req.scheme
212
+ uri.host ||= req.host
213
+ uri.port ||= req.port unless req.port == 80
214
+
215
+ headers = {
216
+ 'Location' => uri.to_s,
217
+ 'Content-Type' => 'text/html',
218
+ 'Content-Length' => body.length.to_s
219
+ }
220
+ [ status, headers, [body] ]
221
+ end
222
+ end
223
+
224
+ private
225
+ def map_method(method, *args, &block)
226
+ options = args.extract_options!
227
+ options[:via] = method
228
+ args.push(options)
229
+ match(*args, &block)
230
+ self
231
+ end
232
+ end
233
+
234
+ module Scoping
235
+ def initialize(*args)
236
+ @scope = {}
237
+ super
238
+ end
239
+
240
+ def scope(*args)
241
+ options = args.extract_options!
242
+
243
+ case args.first
244
+ when String
245
+ options[:path] = args.first
246
+ when Symbol
247
+ options[:controller] = args.first
248
+ end
249
+
250
+ recover = {}
251
+
252
+ options[:constraints] ||= {}
253
+ unless options[:constraints].is_a?(Hash)
254
+ block, options[:constraints] = options[:constraints], {}
255
+ end
256
+
257
+ scope_options.each do |option|
258
+ if value = options.delete(option)
259
+ recover[option] = @scope[option]
260
+ @scope[option] = send("merge_#{option}_scope", @scope[option], value)
261
+ end
262
+ end
263
+
264
+ recover[:block] = @scope[:blocks]
265
+ @scope[:blocks] = merge_blocks_scope(@scope[:blocks], block)
266
+
267
+ recover[:options] = @scope[:options]
268
+ @scope[:options] = merge_options_scope(@scope[:options], options)
269
+
270
+ yield
271
+ self
272
+ ensure
273
+ scope_options.each do |option|
274
+ @scope[option] = recover[option] if recover.has_key?(option)
275
+ end
276
+
277
+ @scope[:options] = recover[:options]
278
+ @scope[:blocks] = recover[:block]
279
+ end
280
+
281
+ def controller(controller)
282
+ scope(controller.to_sym) { yield }
283
+ end
284
+
285
+ def namespace(path)
286
+ scope(path.to_s, :name_prefix => path.to_s, :namespace => path.to_s) { yield }
287
+ end
288
+
289
+ def constraints(constraints = {})
290
+ scope(:constraints => constraints) { yield }
291
+ end
292
+
293
+ def match(*args)
294
+ options = args.extract_options!
295
+
296
+ options = (@scope[:options] || {}).merge(options)
297
+
298
+ if @scope[:name_prefix] && !options[:as].blank?
299
+ options[:as] = "#{@scope[:name_prefix]}_#{options[:as]}"
300
+ elsif @scope[:name_prefix] && options[:as] == ""
301
+ options[:as] = @scope[:name_prefix].to_s
302
+ end
303
+
304
+ args.push(options)
305
+ super(*args)
306
+ end
307
+
308
+ private
309
+ def scope_options
310
+ @scope_options ||= private_methods.grep(/^merge_(.+)_scope$/) { $1.to_sym }
311
+ end
312
+
313
+ def merge_path_scope(parent, child)
314
+ Mapper.normalize_path("#{parent}/#{child}")
315
+ end
316
+
317
+ def merge_name_prefix_scope(parent, child)
318
+ parent ? "#{parent}_#{child}" : child
319
+ end
320
+
321
+ def merge_namespace_scope(parent, child)
322
+ parent ? "#{parent}/#{child}" : child
323
+ end
324
+
325
+ def merge_controller_scope(parent, child)
326
+ @scope[:namespace] ? "#{@scope[:namespace]}/#{child}" : child
327
+ end
328
+
329
+ def merge_resources_path_names_scope(parent, child)
330
+ merge_options_scope(parent, child)
331
+ end
332
+
333
+ def merge_constraints_scope(parent, child)
334
+ merge_options_scope(parent, child)
335
+ end
336
+
337
+ def merge_blocks_scope(parent, child)
338
+ (parent || []) + [child]
339
+ end
340
+
341
+ def merge_options_scope(parent, child)
342
+ (parent || {}).merge(child)
343
+ end
344
+ end
345
+
346
+ module Resources
347
+ CRUD_ACTIONS = [:index, :show, :create, :update, :destroy]
348
+
349
+ class Resource #:nodoc:
350
+ def self.default_actions
351
+ [:index, :create, :new, :show, :update, :destroy, :edit]
352
+ end
353
+
354
+ attr_reader :plural, :singular, :options
355
+
356
+ def initialize(entities, options = {})
357
+ entities = entities.to_s
358
+ @options = options
359
+
360
+ @plural = entities.pluralize
361
+ @singular = entities.singularize
362
+ end
363
+
364
+ def default_actions
365
+ self.class.default_actions
366
+ end
367
+
368
+ def actions
369
+ if only = options[:only]
370
+ only.map(&:to_sym)
371
+ elsif except = options[:except]
372
+ default_actions - except.map(&:to_sym)
373
+ else
374
+ default_actions
375
+ end
376
+ end
377
+
378
+ def action_type(action)
379
+ case action
380
+ when :index, :create
381
+ :collection
382
+ when :show, :update, :destroy
383
+ :member
384
+ end
385
+ end
386
+
387
+ def name
388
+ options[:as] || plural
389
+ end
390
+
391
+ def controller
392
+ options[:controller] || plural
393
+ end
394
+
395
+ def member_name
396
+ singular
397
+ end
398
+
399
+ def collection_name
400
+ plural
401
+ end
402
+
403
+ def name_for_action(action)
404
+ case action_type(action)
405
+ when :collection
406
+ collection_name
407
+ when :member
408
+ member_name
409
+ end
410
+ end
411
+
412
+ def id_segment
413
+ ":#{singular}_id"
414
+ end
415
+ end
416
+
417
+ class SingletonResource < Resource #:nodoc:
418
+ def self.default_actions
419
+ [:show, :create, :update, :destroy, :new, :edit]
420
+ end
421
+
422
+ def initialize(entity, options = {})
423
+ super
424
+ end
425
+
426
+ def action_type(action)
427
+ case action
428
+ when :show, :create, :update, :destroy
429
+ :member
430
+ end
431
+ end
432
+
433
+ def name
434
+ options[:as] || singular
435
+ end
436
+ end
437
+
438
+ def initialize(*args)
439
+ super
440
+ @scope[:resources_path_names] = @set.resources_path_names
441
+ end
442
+
443
+ def resource(*resources, &block)
444
+ options = resources.extract_options!
445
+
446
+ if verify_common_behavior_for(:resource, resources, options, &block)
447
+ return self
448
+ end
449
+
450
+ resource = SingletonResource.new(resources.pop, options)
451
+
452
+ scope(:path => resource.name.to_s, :controller => resource.controller) do
453
+ with_scope_level(:resource, resource) do
454
+ yield if block_given?
455
+
456
+ get :show if resource.actions.include?(:show)
457
+ post :create if resource.actions.include?(:create)
458
+ put :update if resource.actions.include?(:update)
459
+ delete :destroy if resource.actions.include?(:destroy)
460
+ get :new, :as => resource.singular if resource.actions.include?(:new)
461
+ get :edit, :as => resource.singular if resource.actions.include?(:edit)
462
+ end
463
+ end
464
+
465
+ self
466
+ end
467
+
468
+ def resources(*resources, &block)
469
+ options = resources.extract_options!
470
+
471
+ if verify_common_behavior_for(:resources, resources, options, &block)
472
+ return self
473
+ end
474
+
475
+ resource = Resource.new(resources.pop, options)
476
+
477
+ scope(:path => resource.name.to_s, :controller => resource.controller) do
478
+ with_scope_level(:resources, resource) do
479
+ yield if block_given?
480
+
481
+ with_scope_level(:collection) do
482
+ get :index if resource.actions.include?(:index)
483
+ post :create if resource.actions.include?(:create)
484
+ get :new, :as => resource.singular if resource.actions.include?(:new)
485
+ end
486
+
487
+ with_scope_level(:member) do
488
+ scope(':id') do
489
+ get :show if resource.actions.include?(:show)
490
+ put :update if resource.actions.include?(:update)
491
+ delete :destroy if resource.actions.include?(:destroy)
492
+ get :edit, :as => resource.singular if resource.actions.include?(:edit)
493
+ end
494
+ end
495
+ end
496
+ end
497
+
498
+ self
499
+ end
500
+
501
+ def collection
502
+ unless @scope[:scope_level] == :resources
503
+ raise ArgumentError, "can't use collection outside resources scope"
504
+ end
505
+
506
+ with_scope_level(:collection) do
507
+ scope(:name_prefix => parent_resource.collection_name, :as => "") do
508
+ yield
509
+ end
510
+ end
511
+ end
512
+
513
+ def member
514
+ unless @scope[:scope_level] == :resources
515
+ raise ArgumentError, "can't use member outside resources scope"
516
+ end
517
+
518
+ with_scope_level(:member) do
519
+ scope(':id', :name_prefix => parent_resource.member_name, :as => "") do
520
+ yield
521
+ end
522
+ end
523
+ end
524
+
525
+ def nested
526
+ unless @scope[:scope_level] == :resources
527
+ raise ArgumentError, "can't use nested outside resources scope"
528
+ end
529
+
530
+ with_scope_level(:nested) do
531
+ scope(parent_resource.id_segment, :name_prefix => parent_resource.member_name) do
532
+ yield
533
+ end
534
+ end
535
+ end
536
+
537
+ def match(*args)
538
+ options = args.extract_options!
539
+
540
+ if args.length > 1
541
+ args.each { |path| match(path, options) }
542
+ return self
543
+ end
544
+
545
+ resources_path_names = options.delete(:path_names)
546
+
547
+ if args.first.is_a?(Symbol)
548
+ action = args.first
549
+ if CRUD_ACTIONS.include?(action)
550
+ begin
551
+ old_path = @scope[:path]
552
+ @scope[:path] = "#{@scope[:path]}(.:format)"
553
+ return match(options.reverse_merge(
554
+ :to => action,
555
+ :as => parent_resource.name_for_action(action)
556
+ ))
557
+ ensure
558
+ @scope[:path] = old_path
559
+ end
560
+ else
561
+ with_exclusive_name_prefix(action) do
562
+ return match("#{action_path(action, resources_path_names)}(.:format)", options.reverse_merge(:to => action))
563
+ end
564
+ end
565
+ end
566
+
567
+ args.push(options)
568
+
569
+ case options.delete(:on)
570
+ when :collection
571
+ return collection { match(*args) }
572
+ when :member
573
+ return member { match(*args) }
574
+ end
575
+
576
+ if @scope[:scope_level] == :resources
577
+ raise ArgumentError, "can't define route directly in resources scope"
578
+ end
579
+
580
+ super
581
+ end
582
+
583
+ protected
584
+ def parent_resource
585
+ @scope[:scope_level_resource]
586
+ end
587
+
588
+ private
589
+ def action_path(name, path_names = nil)
590
+ path_names ||= @scope[:resources_path_names]
591
+ path_names[name.to_sym] || name.to_s
592
+ end
593
+
594
+ def verify_common_behavior_for(method, resources, options, &block)
595
+ if resources.length > 1
596
+ resources.each { |r| send(method, r, options, &block) }
597
+ return true
598
+ end
599
+
600
+ if path_names = options.delete(:path_names)
601
+ scope(:resources_path_names => path_names) do
602
+ send(method, resources.pop, options, &block)
603
+ end
604
+ return true
605
+ end
606
+
607
+ if @scope[:scope_level] == :resources
608
+ nested do
609
+ send(method, resources.pop, options, &block)
610
+ end
611
+ return true
612
+ end
613
+
614
+ false
615
+ end
616
+
617
+ def with_exclusive_name_prefix(prefix)
618
+ begin
619
+ old_name_prefix = @scope[:name_prefix]
620
+
621
+ if !old_name_prefix.blank?
622
+ @scope[:name_prefix] = "#{prefix}_#{@scope[:name_prefix]}"
623
+ else
624
+ @scope[:name_prefix] = prefix.to_s
625
+ end
626
+
627
+ yield
628
+ ensure
629
+ @scope[:name_prefix] = old_name_prefix
630
+ end
631
+ end
632
+
633
+ def with_scope_level(kind, resource = parent_resource)
634
+ old, @scope[:scope_level] = @scope[:scope_level], kind
635
+ old_resource, @scope[:scope_level_resource] = @scope[:scope_level_resource], resource
636
+ yield
637
+ ensure
638
+ @scope[:scope_level] = old
639
+ @scope[:scope_level_resource] = old_resource
640
+ end
641
+ end
642
+
643
+ include Base
644
+ include HttpHelpers
645
+ include Scoping
646
+ include Resources
647
+ end
648
+ end
649
+ end