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,44 @@
1
+ module ActionView
2
+ module CompiledTemplates #:nodoc:
3
+ # holds compiled template code
4
+ end
5
+
6
+ # ActionView contexts are supplied to ActionController
7
+ # to render template. The default ActionView context
8
+ # is ActionView::Base.
9
+ #
10
+ # In order to work with ActionController, a Context
11
+ # must implement:
12
+ #
13
+ # Context.for_controller[controller] Create a new ActionView instance for a
14
+ # controller
15
+ # Context#render_partial[options]
16
+ # - responsible for setting options[:_template]
17
+ # - Returns String with the rendered partial
18
+ # options<Hash>:: see _render_partial in ActionView::Base
19
+ # Context#render_template[template, layout, options, partial]
20
+ # - Returns String with the rendered template
21
+ # template<ActionView::Template>:: The template to render
22
+ # layout<ActionView::Template>:: The layout to render around the template
23
+ # options<Hash>:: See _render_template_with_layout in ActionView::Base
24
+ # partial<Boolean>:: Whether or not the template to render is a partial
25
+ #
26
+ # An ActionView context can also mix in ActionView's
27
+ # helpers. In order to mix in helpers, a context must
28
+ # implement:
29
+ #
30
+ # Context#controller
31
+ # - Returns an instance of AbstractController
32
+ #
33
+ # In any case, a context must mix in ActionView::Context,
34
+ # which stores compiled template and provides the output
35
+ # buffer.
36
+ module Context
37
+ include CompiledTemplates
38
+ attr_accessor :output_buffer
39
+
40
+ def convert_to_model(object)
41
+ object.respond_to?(:to_model) ? object.to_model : object
42
+ end
43
+ end
44
+ end
@@ -1,9 +1,10 @@
1
+ require 'active_support/benchmarkable'
2
+
1
3
  module ActionView #:nodoc:
2
4
  module Helpers #:nodoc:
3
- autoload :ActiveRecordHelper, 'action_view/helpers/active_record_helper'
5
+ autoload :ActiveModelHelper, 'action_view/helpers/active_model_helper'
4
6
  autoload :AssetTagHelper, 'action_view/helpers/asset_tag_helper'
5
7
  autoload :AtomFeedHelper, 'action_view/helpers/atom_feed_helper'
6
- autoload :BenchmarkHelper, 'action_view/helpers/benchmark_helper'
7
8
  autoload :CacheHelper, 'action_view/helpers/cache_helper'
8
9
  autoload :CaptureHelper, 'action_view/helpers/capture_helper'
9
10
  autoload :CsrfHelper, 'action_view/helpers/csrf_helper'
@@ -33,10 +34,11 @@ module ActionView #:nodoc:
33
34
  include SanitizeHelper::ClassMethods
34
35
  end
35
36
 
36
- include ActiveRecordHelper
37
+ include ActiveSupport::Benchmarkable
38
+
39
+ include ActiveModelHelper
37
40
  include AssetTagHelper
38
41
  include AtomFeedHelper
39
- include BenchmarkHelper
40
42
  include CacheHelper
41
43
  include CaptureHelper
42
44
  include CsrfHelper
@@ -1,5 +1,8 @@
1
1
  require 'cgi'
2
2
  require 'action_view/helpers/form_helper'
3
+ require 'active_support/core_ext/class/attribute_accessors'
4
+ require 'active_support/core_ext/enumerable'
5
+ require 'active_support/core_ext/kernel/reporting'
3
6
 
4
7
  module ActionView
5
8
  class Base
@@ -12,7 +15,7 @@ module ActionView
12
15
  # method that creates a complete form for all the basic content types of the record (not associations or aggregations, though). This
13
16
  # is a great way of making the record quickly available for editing, but likely to prove lackluster for a complicated real-world form.
14
17
  # In that case, it's better to use the +input+ method and the specialized +form+ methods in link:classes/ActionView/Helpers/FormHelper.html
15
- module ActiveRecordHelper
18
+ module ActiveModelHelper
16
19
  # Returns a default input tag for the type of object returned by the method. For example, if <tt>@post</tt>
17
20
  # has an attribute +title+ mapped to a +VARCHAR+ column that holds "Hello World":
18
21
  #
@@ -74,6 +77,7 @@ module ActionView
74
77
  # * <tt>:submit_value</tt> - The text of the submit button (default: "Create" if a new record, otherwise "Update").
75
78
  def form(record_name, options = {})
76
79
  record = instance_variable_get("@#{record_name}")
80
+ record = convert_to_model(record)
77
81
 
78
82
  options = options.symbolize_keys
79
83
  options[:action] ||= record.new_record? ? "create" : "update"
@@ -86,7 +90,7 @@ module ActionView
86
90
  contents.safe_concat all_input_tags(record, record_name, options)
87
91
  yield contents if block_given?
88
92
  contents.safe_concat submit_tag(submit_value)
89
- contents.safe_concat '</form>'
93
+ contents.safe_concat('</form>')
90
94
  end
91
95
 
92
96
  # Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
@@ -118,10 +122,12 @@ module ActionView
118
122
  end
119
123
  options.reverse_merge!(:prepend_text => '', :append_text => '', :css_class => 'formError')
120
124
 
125
+ object = convert_to_model(object)
126
+
121
127
  if (obj = (object.respond_to?(:errors) ? object : instance_variable_get("@#{object}"))) &&
122
- (errors = obj.errors.on(method))
128
+ (errors = obj.errors[method])
123
129
  content_tag("div",
124
- "#{options[:prepend_text]}#{ERB::Util.html_escape(errors.is_a?(Array) ? errors.first : errors)}#{options[:append_text]}".html_safe,
130
+ "#{options[:prepend_text]}#{ERB::Util.html_escape(errors.first)}#{options[:append_text]}",
125
131
  :class => options[:css_class]
126
132
  )
127
133
  else
@@ -154,11 +160,24 @@ module ActionView
154
160
  #
155
161
  # error_messages_for 'user'
156
162
  #
163
+ # You can also supply an object:
164
+ #
165
+ # error_messages_for @user
166
+ #
167
+ # This will use the last part of the model name in the presentation. For instance, if
168
+ # this is a MyKlass::User object, this will use "user" as the name in the String. This
169
+ # is taken from MyKlass::User.model_name.human, which can be overridden.
170
+ #
157
171
  # To specify more than one object, you simply list them; optionally, you can add an extra <tt>:object_name</tt> parameter, which
158
172
  # will be the name used in the header message:
159
173
  #
160
174
  # error_messages_for 'user_common', 'user', :object_name => 'user'
161
175
  #
176
+ # You can also use a number of objects, which will have the same naming semantics
177
+ # as a single object.
178
+ #
179
+ # error_messages_for @user, @post
180
+ #
162
181
  # If the objects cannot be located as instance variables, you can add an extra <tt>:object</tt> parameter which gives the actual
163
182
  # object (or array of objects to use):
164
183
  #
@@ -170,13 +189,20 @@ module ActionView
170
189
  def error_messages_for(*params)
171
190
  options = params.extract_options!.symbolize_keys
172
191
 
173
- if object = options.delete(:object)
174
- objects = Array.wrap(object)
175
- else
176
- objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
192
+ objects = Array.wrap(options.delete(:object) || params).map do |object|
193
+ object = instance_variable_get("@#{object}") unless object.respond_to?(:to_model)
194
+ object = convert_to_model(object)
195
+
196
+ if object.class.respond_to?(:model_name)
197
+ options[:object_name] ||= object.class.model_name.human.downcase
198
+ end
199
+
200
+ object
177
201
  end
178
202
 
179
- count = objects.inject(0) {|sum, object| sum + object.errors.count }
203
+ objects.compact!
204
+ count = objects.inject(0) {|sum, object| sum + object.errors.count }
205
+
180
206
  unless count.zero?
181
207
  html = {}
182
208
  [:id, :class].each do |key|
@@ -189,23 +215,27 @@ module ActionView
189
215
  end
190
216
  options[:object_name] ||= params.first
191
217
 
192
- I18n.with_options :locale => options[:locale], :scope => [:activerecord, :errors, :template] do |locale|
218
+ I18n.with_options :locale => options[:locale], :scope => [:errors, :template] do |locale|
193
219
  header_message = if options.include?(:header_message)
194
220
  options[:header_message]
195
221
  else
196
- object_name = options[:object_name].to_s
197
- object_name = I18n.t(object_name, :default => object_name.gsub('_', ' '), :scope => [:activerecord, :models], :count => 1)
198
- locale.t :header, :count => count, :model => object_name
222
+ locale.t :header, :count => count, :model => options[:object_name].to_s.gsub('_', ' ')
199
223
  end
224
+
200
225
  message = options.include?(:message) ? options[:message] : locale.t(:body)
201
- error_messages = objects.sum {|object| object.errors.full_messages.map {|msg| content_tag(:li, ERB::Util.html_escape(msg)) } }.join.html_safe
226
+
227
+ error_messages = objects.sum do |object|
228
+ object.errors.full_messages.map do |msg|
229
+ content_tag(:li, ERB::Util.html_escape(msg))
230
+ end
231
+ end.join
202
232
 
203
233
  contents = ''
204
234
  contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank?
205
235
  contents << content_tag(:p, message) unless message.blank?
206
236
  contents << content_tag(:ul, error_messages)
207
237
 
208
- content_tag(:div, contents.html_safe, html)
238
+ content_tag(:div, contents, html)
209
239
  end
210
240
  else
211
241
  ''
@@ -223,7 +253,14 @@ module ActionView
223
253
  end
224
254
  end
225
255
 
226
- class InstanceTag #:nodoc:
256
+ module ActiveRecordInstanceTag
257
+ def object
258
+ @active_model_object ||= begin
259
+ object = super
260
+ object.respond_to?(:to_model) ? object.to_model : object
261
+ end
262
+ end
263
+
227
264
  def to_tag(options = {})
228
265
  case column_type
229
266
  when :string
@@ -244,62 +281,25 @@ module ActionView
244
281
  end
245
282
  end
246
283
 
247
- alias_method :tag_without_error_wrapping, :tag
248
- def tag(name, options)
249
- if object.respond_to?(:errors) && object.errors.respond_to?(:on)
250
- error_wrapping(tag_without_error_wrapping(name, options), object.errors.on(@method_name))
251
- else
252
- tag_without_error_wrapping(name, options)
253
- end
284
+ %w(tag content_tag to_date_select_tag to_datetime_select_tag to_time_select_tag).each do |meth|
285
+ module_eval "def #{meth}(*) error_wrapping(super) end"
254
286
  end
255
287
 
256
- alias_method :content_tag_without_error_wrapping, :content_tag
257
- def content_tag(name, value, options)
258
- if object.respond_to?(:errors) && object.errors.respond_to?(:on)
259
- error_wrapping(content_tag_without_error_wrapping(name, value, options), object.errors.on(@method_name))
288
+ def error_wrapping(html_tag)
289
+ if object.respond_to?(:errors) && object.errors.respond_to?(:full_messages) && object.errors[@method_name].any?
290
+ Base.field_error_proc.call(html_tag, self)
260
291
  else
261
- content_tag_without_error_wrapping(name, value, options)
292
+ html_tag
262
293
  end
263
294
  end
264
295
 
265
- alias_method :to_date_select_tag_without_error_wrapping, :to_date_select_tag
266
- def to_date_select_tag(options = {}, html_options = {})
267
- if object.respond_to?(:errors) && object.errors.respond_to?(:on)
268
- error_wrapping(to_date_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
269
- else
270
- to_date_select_tag_without_error_wrapping(options, html_options)
271
- end
272
- end
273
-
274
- alias_method :to_datetime_select_tag_without_error_wrapping, :to_datetime_select_tag
275
- def to_datetime_select_tag(options = {}, html_options = {})
276
- if object.respond_to?(:errors) && object.errors.respond_to?(:on)
277
- error_wrapping(to_datetime_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
278
- else
279
- to_datetime_select_tag_without_error_wrapping(options, html_options)
280
- end
281
- end
282
-
283
- alias_method :to_time_select_tag_without_error_wrapping, :to_time_select_tag
284
- def to_time_select_tag(options = {}, html_options = {})
285
- if object.respond_to?(:errors) && object.errors.respond_to?(:on)
286
- error_wrapping(to_time_select_tag_without_error_wrapping(options, html_options), object.errors.on(@method_name))
287
- else
288
- to_time_select_tag_without_error_wrapping(options, html_options)
289
- end
290
- end
291
-
292
- def error_wrapping(html_tag, has_error)
293
- has_error ? Base.field_error_proc.call(html_tag, self) : html_tag
294
- end
295
-
296
- def error_message
297
- object.errors.on(@method_name)
298
- end
299
-
300
296
  def column_type
301
297
  object.send(:column_for_attribute, @method_name).type
302
298
  end
303
299
  end
300
+
301
+ class InstanceTag
302
+ include ActiveRecordInstanceTag
303
+ end
304
304
  end
305
305
  end
@@ -1,7 +1,8 @@
1
+ require 'thread'
1
2
  require 'cgi'
2
3
  require 'action_view/helpers/url_helper'
3
4
  require 'action_view/helpers/tag_helper'
4
- require 'thread'
5
+ require 'active_support/core_ext/file'
5
6
 
6
7
  module ActionView
7
8
  module Helpers #:nodoc:
@@ -132,10 +133,14 @@ module ActionView
132
133
  # change. You can use something like Live HTTP Headers for Firefox to verify
133
134
  # that the cache is indeed working.
134
135
  module AssetTagHelper
135
- ASSETS_DIR = defined?(Rails.public_path) ? Rails.public_path : "public"
136
- JAVASCRIPTS_DIR = "#{ASSETS_DIR}/javascripts"
137
- STYLESHEETS_DIR = "#{ASSETS_DIR}/stylesheets"
138
- JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES)
136
+ assets_dir = defined?(Rails.public_path) ? Rails.public_path : "public"
137
+ ActionView::DEFAULT_CONFIG = {
138
+ :assets_dir => assets_dir,
139
+ :javascripts_dir => "#{assets_dir}/javascripts",
140
+ :stylesheets_dir => "#{assets_dir}/stylesheets",
141
+ }
142
+
143
+ JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls', 'rails'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES)
139
144
 
140
145
  # Returns a link tag that browsers and news readers can use to auto-detect
141
146
  # an RSS or ATOM feed. The +type+ can either be <tt>:rss</tt> (default) or
@@ -171,7 +176,7 @@ module ActionView
171
176
  end
172
177
 
173
178
  # Computes the path to a javascript asset in the public javascripts directory.
174
- # If the +source+ filename has no extension, .js will be appended.
179
+ # If the +source+ filename has no extension, .js will be appended (except for explicit URIs)
175
180
  # Full paths from the document root will be passed through.
176
181
  # Used internally by javascript_include_tag to build the script path.
177
182
  #
@@ -179,7 +184,7 @@ module ActionView
179
184
  # javascript_path "xmlhr" # => /javascripts/xmlhr.js
180
185
  # javascript_path "dir/xmlhr.js" # => /javascripts/dir/xmlhr.js
181
186
  # javascript_path "/dir/xmlhr" # => /dir/xmlhr.js
182
- # javascript_path "http://www.railsapplication.com/js/xmlhr" # => http://www.railsapplication.com/js/xmlhr.js
187
+ # javascript_path "http://www.railsapplication.com/js/xmlhr" # => http://www.railsapplication.com/js/xmlhr
183
188
  # javascript_path "http://www.railsapplication.com/js/xmlhr.js" # => http://www.railsapplication.com/js/xmlhr.js
184
189
  def javascript_path(source)
185
190
  compute_public_path(source, 'javascripts', 'js')
@@ -279,14 +284,16 @@ module ActionView
279
284
 
280
285
  if concat || (ActionController::Base.perform_caching && cache)
281
286
  joined_javascript_name = (cache == true ? "all" : cache) + ".js"
282
- joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? ASSETS_DIR : JAVASCRIPTS_DIR, joined_javascript_name)
287
+ joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? config.assets_dir : config.javascripts_dir, joined_javascript_name)
283
288
 
284
289
  unless ActionController::Base.perform_caching && File.exists?(joined_javascript_path)
285
290
  write_asset_file_contents(joined_javascript_path, compute_javascript_paths(sources, recursive))
286
291
  end
287
292
  javascript_src_tag(joined_javascript_name, options)
288
293
  else
289
- expand_javascript_sources(sources, recursive).collect { |source| javascript_src_tag(source, options) }.join("\n").html_safe
294
+ sources = expand_javascript_sources(sources, recursive)
295
+ ensure_javascript_sources!(sources) if cache
296
+ sources.collect { |source| javascript_src_tag(source, options) }.join("\n").html_safe
290
297
  end
291
298
  end
292
299
 
@@ -337,7 +344,7 @@ module ActionView
337
344
  end
338
345
 
339
346
  # Computes the path to a stylesheet asset in the public stylesheets directory.
340
- # If the +source+ filename has no extension, <tt>.css</tt> will be appended.
347
+ # If the +source+ filename has no extension, <tt>.css</tt> will be appended (except for explicit URIs).
341
348
  # Full paths from the document root will be passed through.
342
349
  # Used internally by +stylesheet_link_tag+ to build the stylesheet path.
343
350
  #
@@ -345,8 +352,8 @@ module ActionView
345
352
  # stylesheet_path "style" # => /stylesheets/style.css
346
353
  # stylesheet_path "dir/style.css" # => /stylesheets/dir/style.css
347
354
  # stylesheet_path "/dir/style.css" # => /dir/style.css
348
- # stylesheet_path "http://www.railsapplication.com/css/style" # => http://www.railsapplication.com/css/style.css
349
- # stylesheet_path "http://www.railsapplication.com/css/style.js" # => http://www.railsapplication.com/css/style.css
355
+ # stylesheet_path "http://www.railsapplication.com/css/style" # => http://www.railsapplication.com/css/style
356
+ # stylesheet_path "http://www.railsapplication.com/css/style.css" # => http://www.railsapplication.com/css/style.css
350
357
  def stylesheet_path(source)
351
358
  compute_public_path(source, 'stylesheets', 'css')
352
359
  end
@@ -428,14 +435,16 @@ module ActionView
428
435
 
429
436
  if concat || (ActionController::Base.perform_caching && cache)
430
437
  joined_stylesheet_name = (cache == true ? "all" : cache) + ".css"
431
- joined_stylesheet_path = File.join(joined_stylesheet_name[/^#{File::SEPARATOR}/] ? ASSETS_DIR : STYLESHEETS_DIR, joined_stylesheet_name)
438
+ joined_stylesheet_path = File.join(joined_stylesheet_name[/^#{File::SEPARATOR}/] ? config.assets_dir : config.stylesheets_dir, joined_stylesheet_name)
432
439
 
433
440
  unless ActionController::Base.perform_caching && File.exists?(joined_stylesheet_path)
434
441
  write_asset_file_contents(joined_stylesheet_path, compute_stylesheet_paths(sources, recursive))
435
442
  end
436
443
  stylesheet_tag(joined_stylesheet_name, options)
437
444
  else
438
- expand_stylesheet_sources(sources, recursive).collect { |source| stylesheet_tag(source, options) }.join("\n").html_safe
445
+ sources = expand_stylesheet_sources(sources, recursive)
446
+ ensure_stylesheet_sources!(sources) if cache
447
+ sources.collect { |source| stylesheet_tag(source, options) }.join("\n").html_safe
439
448
  end
440
449
  end
441
450
 
@@ -454,6 +463,36 @@ module ActionView
454
463
  end
455
464
  alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
456
465
 
466
+ # Computes the path to a video asset in the public videos directory.
467
+ # Full paths from the document root will be passed through.
468
+ # Used internally by +video_tag+ to build the video path.
469
+ #
470
+ # ==== Examples
471
+ # video_path("hd") # => /videos/hd
472
+ # video_path("hd.avi") # => /videos/hd.avi
473
+ # video_path("trailers/hd.avi") # => /videos/trailers/hd.avi
474
+ # video_path("/trailers/hd.avi") # => /trailers/hd.avi
475
+ # video_path("http://www.railsapplication.com/vid/hd.avi") # => http://www.railsapplication.com/vid/hd.avi
476
+ def video_path(source)
477
+ compute_public_path(source, 'videos')
478
+ end
479
+ alias_method :path_to_video, :video_path # aliased to avoid conflicts with a video_path named route
480
+
481
+ # Computes the path to an audio asset in the public audios directory.
482
+ # Full paths from the document root will be passed through.
483
+ # Used internally by +audio_tag+ to build the audio path.
484
+ #
485
+ # ==== Examples
486
+ # audio_path("horse") # => /audios/horse
487
+ # audio_path("horse.wav") # => /audios/horse.avi
488
+ # audio_path("sounds/horse.wav") # => /audios/sounds/horse.avi
489
+ # audio_path("/sounds/horse.wav") # => /sounds/horse.avi
490
+ # audio_path("http://www.railsapplication.com/sounds/horse.wav") # => http://www.railsapplication.com/sounds/horse.wav
491
+ def audio_path(source)
492
+ compute_public_path(source, 'audios')
493
+ end
494
+ alias_method :path_to_audio, :audio_path # aliased to avoid conflicts with an audio_path named route
495
+
457
496
  # Returns an html image tag for the +source+. The +source+ can be a full
458
497
  # path or a file that exists in your public images directory.
459
498
  #
@@ -490,8 +529,8 @@ module ActionView
490
529
  def image_tag(source, options = {})
491
530
  options.symbolize_keys!
492
531
 
493
- options[:src] = path_to_image(source)
494
- options[:alt] ||= File.basename(options[:src], '.*').split('.').first.to_s.capitalize
532
+ src = options[:src] = path_to_image(source)
533
+ options[:alt] ||= File.basename(src, '.*').split('.').first.to_s.capitalize
495
534
 
496
535
  if size = options.delete(:size)
497
536
  options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
@@ -499,12 +538,81 @@ module ActionView
499
538
 
500
539
  if mouseover = options.delete(:mouseover)
501
540
  options[:onmouseover] = "this.src='#{image_path(mouseover)}'"
502
- options[:onmouseout] = "this.src='#{image_path(options[:src])}'"
541
+ options[:onmouseout] = "this.src='#{src}'"
503
542
  end
504
543
 
505
544
  tag("img", options)
506
545
  end
507
546
 
547
+ # Returns an html video tag for the +sources+. If +sources+ is a string,
548
+ # a single video tag will be returned. If +sources+ is an array, a video
549
+ # tag with nested source tags for each source will be returned. The
550
+ # +sources+ can be full paths or files that exists in your public videos
551
+ # directory.
552
+ #
553
+ # ==== Options
554
+ # You can add HTML attributes using the +options+. The +options+ supports
555
+ # two additional keys for convenience and conformance:
556
+ #
557
+ # * <tt>:poster</tt> - Set an image (like a screenshot) to be shown
558
+ # before the video loads. The path is calculated like the +src+ of +image_tag+.
559
+ # * <tt>:size</tt> - Supplied as "{Width}x{Height}", so "30x45" becomes
560
+ # width="30" and height="45". <tt>:size</tt> will be ignored if the
561
+ # value is not in the correct format.
562
+ #
563
+ # ==== Examples
564
+ # video_tag("trailer") # =>
565
+ # <video src="/videos/trailer" />
566
+ # video_tag("trailer.ogg") # =>
567
+ # <video src="/videos/trailer.ogg" />
568
+ # video_tag("trailer.ogg", :controls => true, :autobuffer => true) # =>
569
+ # <video autobuffer="autobuffer" controls="controls" src="/videos/trailer.ogg" />
570
+ # video_tag("trailer.m4v", :size => "16x10", :poster => "screenshot.png") # =>
571
+ # <video src="/videos/trailer.m4v" width="16" height="10" poster="/images/screenshot.png" />
572
+ # video_tag("/trailers/hd.avi", :size => "16x16") # =>
573
+ # <video src="/trailers/hd.avi" width="16" height="16" />
574
+ # video_tag("/trailers/hd.avi", :height => '32', :width => '32') # =>
575
+ # <video height="32" src="/trailers/hd.avi" width="32" />
576
+ # video_tag(["trailer.ogg", "trailer.flv"]) # =>
577
+ # <video><source src="trailer.ogg" /><source src="trailer.ogg" /><source src="trailer.flv" /></video>
578
+ # video_tag(["trailer.ogg", "trailer.flv"] :size => "160x120") # =>
579
+ # <video height="120" width="160"><source src="trailer.ogg" /><source src="trailer.flv" /></video>
580
+ def video_tag(sources, options = {})
581
+ options.symbolize_keys!
582
+
583
+ options[:poster] = path_to_image(options[:poster]) if options[:poster]
584
+
585
+ if size = options.delete(:size)
586
+ options[:width], options[:height] = size.split("x") if size =~ %r{^\d+x\d+$}
587
+ end
588
+
589
+ if sources.is_a?(Array)
590
+ content_tag("video", options) do
591
+ sources.map { |source| tag("source", :src => source) }.join.html_safe
592
+ end
593
+ else
594
+ options[:src] = path_to_video(sources)
595
+ tag("video", options)
596
+ end
597
+ end
598
+
599
+ # Returns an html audio tag for the +source+.
600
+ # The +source+ can be full path or file that exists in
601
+ # your public audios directory.
602
+ #
603
+ # ==== Examples
604
+ # audio_tag("sound") # =>
605
+ # <audio src="/audios/sound" />
606
+ # audio_tag("sound.wav") # =>
607
+ # <audio src="/audios/sound.wav" />
608
+ # audio_tag("sound.wav", :autoplay => true, :controls => true) # =>
609
+ # <audio autoplay="autoplay" controls="controls" src="/audios/sound.wav" />
610
+ def audio_tag(source, options = {})
611
+ options.symbolize_keys!
612
+ options[:src] = path_to_audio(source)
613
+ tag("audio", options)
614
+ end
615
+
508
616
  def self.cache_asset_timestamps
509
617
  @@cache_asset_timestamps
510
618
  end
@@ -527,14 +635,14 @@ module ActionView
527
635
  # roots. Rewrite the asset path for cache-busting asset ids. Include
528
636
  # asset host, if configured, with the correct request protocol.
529
637
  def compute_public_path(source, dir, ext = nil, include_host = true)
530
- has_request = @controller.respond_to?(:request)
638
+ has_request = controller.respond_to?(:request)
531
639
 
532
640
  source_ext = File.extname(source)[1..-1]
533
- if ext && (source_ext.blank? || (ext != source_ext && File.exist?(File.join(ASSETS_DIR, dir, "#{source}.#{ext}"))))
641
+ if ext && !is_uri?(source) && (source_ext.blank? || (ext != source_ext && File.exist?(File.join(config.assets_dir, dir, "#{source}.#{ext}"))))
534
642
  source += ".#{ext}"
535
643
  end
536
644
 
537
- unless source =~ %r{^[-a-z]+://}
645
+ unless is_uri?(source)
538
646
  source = "/#{dir}/#{source}" unless source[0] == ?/
539
647
 
540
648
  source = rewrite_asset_path(source)
@@ -546,11 +654,11 @@ module ActionView
546
654
  end
547
655
  end
548
656
 
549
- if include_host && source !~ %r{^[-a-z]+://}
657
+ if include_host && !is_uri?(source)
550
658
  host = compute_asset_host(source)
551
659
 
552
- if has_request && !host.blank? && host !~ %r{^[-a-z]+://}
553
- host = "#{@controller.request.protocol}#{host}"
660
+ if has_request && !host.blank? && !is_uri?(host)
661
+ host = "#{controller.request.protocol}#{host}"
554
662
  end
555
663
 
556
664
  "#{host}#{source}"
@@ -559,6 +667,10 @@ module ActionView
559
667
  end
560
668
  end
561
669
 
670
+ def is_uri?(path)
671
+ path =~ %r{^[-a-z]+://}
672
+ end
673
+
562
674
  # Pick an asset host for this source. Returns +nil+ if no host is set,
563
675
  # the host if no wildcard is set, the host interpolated with the
564
676
  # numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
@@ -569,7 +681,7 @@ module ActionView
569
681
  if host.is_a?(Proc) || host.respond_to?(:call)
570
682
  case host.is_a?(Proc) ? host.arity : host.method(:call).arity
571
683
  when 2
572
- request = @controller.respond_to?(:request) && @controller.request
684
+ request = controller.respond_to?(:request) && controller.request
573
685
  host.call(source, request)
574
686
  else
575
687
  host.call(source)
@@ -592,7 +704,7 @@ module ActionView
592
704
  if @@cache_asset_timestamps && (asset_id = @@asset_timestamps_cache[source])
593
705
  asset_id
594
706
  else
595
- path = File.join(ASSETS_DIR, source)
707
+ path = File.join(config.assets_dir, source)
596
708
  asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : ''
597
709
 
598
710
  if @@cache_asset_timestamps
@@ -635,20 +747,20 @@ module ActionView
635
747
 
636
748
  def expand_javascript_sources(sources, recursive = false)
637
749
  if sources.include?(:all)
638
- all_javascript_files = collect_asset_files(JAVASCRIPTS_DIR, ('**' if recursive), '*.js')
750
+ all_javascript_files = collect_asset_files(config.javascripts_dir, ('**' if recursive), '*.js')
639
751
  ((determine_source(:defaults, @@javascript_expansions).dup & all_javascript_files) + all_javascript_files).uniq
640
752
  else
641
753
  expanded_sources = sources.collect do |source|
642
754
  determine_source(source, @@javascript_expansions)
643
755
  end.flatten
644
- expanded_sources << "application" if sources.include?(:defaults) && File.exist?(File.join(JAVASCRIPTS_DIR, "application.js"))
756
+ expanded_sources << "application" if sources.include?(:defaults) && File.exist?(File.join(config.javascripts_dir, "application.js"))
645
757
  expanded_sources
646
758
  end
647
759
  end
648
760
 
649
761
  def expand_stylesheet_sources(sources, recursive)
650
762
  if sources.first == :all
651
- collect_asset_files(STYLESHEETS_DIR, ('**' if recursive), '*.css')
763
+ collect_asset_files(config.stylesheets_dir, ('**' if recursive), '*.css')
652
764
  else
653
765
  sources.collect do |source|
654
766
  determine_source(source, @@stylesheet_expansions)
@@ -665,13 +777,28 @@ module ActionView
665
777
  end
666
778
  end
667
779
 
780
+ def ensure_stylesheet_sources!(sources)
781
+ sources.each do |source|
782
+ asset_file_path!(path_to_stylesheet(source))
783
+ end
784
+ return sources
785
+ end
786
+
787
+ def ensure_javascript_sources!(sources)
788
+ sources.each do |source|
789
+ asset_file_path!(path_to_javascript(source))
790
+ end
791
+ return sources
792
+ end
793
+
668
794
  def join_asset_file_contents(paths)
669
- paths.collect { |path| File.read(asset_file_path(path)) }.join("\n\n")
795
+ paths.collect { |path| File.read(asset_file_path!(path)) }.join("\n\n")
670
796
  end
671
797
 
672
798
  def write_asset_file_contents(joined_asset_path, asset_paths)
799
+
673
800
  FileUtils.mkdir_p(File.dirname(joined_asset_path))
674
- File.open(joined_asset_path, "w+") { |cache| cache.write(join_asset_file_contents(asset_paths)) }
801
+ File.atomic_write(joined_asset_path) { |cache| cache.write(join_asset_file_contents(asset_paths)) }
675
802
 
676
803
  # Set mtime to the latest of the combined files to allow for
677
804
  # consistent ETag without a shared filesystem.
@@ -680,7 +807,15 @@ module ActionView
680
807
  end
681
808
 
682
809
  def asset_file_path(path)
683
- File.join(ASSETS_DIR, path.split('?').first)
810
+ File.join(config.assets_dir, path.split('?').first)
811
+ end
812
+
813
+ def asset_file_path!(path)
814
+ unless is_uri?(path)
815
+ absolute_path = asset_file_path(path)
816
+ raise(Errno::ENOENT, "Asset file not found at '#{absolute_path}'" ) unless File.exist?(absolute_path)
817
+ return absolute_path
818
+ end
684
819
  end
685
820
 
686
821
  def collect_asset_files(*path)