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
@@ -3,69 +3,82 @@ require 'uri'
3
3
  require 'set'
4
4
 
5
5
  module ActionController #:nodoc:
6
- # Caching is a cheap way of speeding up slow applications by keeping the result of calculations, renderings, and database calls
7
- # around for subsequent requests. Action Controller affords you three approaches in varying levels of granularity: Page, Action, Fragment.
6
+ # Caching is a cheap way of speeding up slow applications by keeping the result of
7
+ # calculations, renderings, and database calls around for subsequent requests.
8
+ # Action Controller affords you three approaches in varying levels of granularity:
9
+ # Page, Action, Fragment.
8
10
  #
9
- # You can read more about each approach and the sweeping assistance by clicking the modules below.
10
- #
11
- # Note: To turn off all caching and sweeping, set Base.perform_caching = false.
11
+ # You can read more about each approach and the sweeping assistance by clicking the
12
+ # modules below.
12
13
  #
14
+ # Note: To turn off all caching and sweeping, set
15
+ # config.action_controller.perform_caching = false.
13
16
  #
14
17
  # == Caching stores
15
18
  #
16
- # All the caching stores from ActiveSupport::Cache is available to be used as backends for Action Controller caching. This setting only
17
- # affects action and fragment caching as page caching is always written to disk.
19
+ # All the caching stores from ActiveSupport::Cache are available to be used as backends
20
+ # for Action Controller caching. This setting only affects action and fragment caching
21
+ # as page caching is always written to disk.
18
22
  #
19
23
  # Configuration examples (MemoryStore is the default):
20
24
  #
21
- # ActionController::Base.cache_store = :memory_store
22
- # ActionController::Base.cache_store = :file_store, "/path/to/cache/directory"
23
- # ActionController::Base.cache_store = :drb_store, "druby://localhost:9192"
24
- # ActionController::Base.cache_store = :mem_cache_store, "localhost"
25
- # ActionController::Base.cache_store = :mem_cache_store, Memcached::Rails.new("localhost:11211")
26
- # ActionController::Base.cache_store = MyOwnStore.new("parameter")
25
+ # config.action_controller.cache_store = :memory_store
26
+ # config.action_controller.cache_store = :file_store, "/path/to/cache/directory"
27
+ # config.action_controller.cache_store = :drb_store, "druby://localhost:9192"
28
+ # config.action_controller.cache_store = :mem_cache_store, "localhost"
29
+ # config.action_controller.cache_store = :mem_cache_store, Memcached::Rails.new("localhost:11211")
30
+ # config.action_controller.cache_store = MyOwnStore.new("parameter")
27
31
  module Caching
28
- autoload :Actions, 'action_controller/caching/actions'
29
- autoload :Fragments, 'action_controller/caching/fragments'
30
- autoload :Pages, 'action_controller/caching/pages'
31
- autoload :Sweeper, 'action_controller/caching/sweeper'
32
- autoload :Sweeping, 'action_controller/caching/sweeping'
32
+ extend ActiveSupport::Concern
33
+ extend ActiveSupport::Autoload
33
34
 
34
- def self.included(base) #:nodoc:
35
- base.class_eval do
36
- @@cache_store = nil
37
- cattr_reader :cache_store
35
+ eager_autoload do
36
+ autoload :Actions
37
+ autoload :Fragments
38
+ autoload :Pages
39
+ autoload :Sweeper, 'action_controller/caching/sweeping'
40
+ autoload :Sweeping, 'action_controller/caching/sweeping'
41
+ end
38
42
 
39
- # Defines the storage option for cached fragments
40
- def self.cache_store=(store_option)
41
- @@cache_store = ActiveSupport::Cache.lookup_store(store_option)
42
- end
43
+ included do
44
+ @@cache_store = nil
45
+ cattr_reader :cache_store
43
46
 
44
- include Pages, Actions, Fragments
45
- include Sweeping if defined?(ActiveRecord)
47
+ # Defines the storage option for cached fragments
48
+ def self.cache_store=(store_option)
49
+ @@cache_store = ActiveSupport::Cache.lookup_store(store_option)
50
+ end
46
51
 
47
- @@perform_caching = true
48
- cattr_accessor :perform_caching
52
+ include Pages, Actions, Fragments
53
+ include Sweeping if defined?(ActiveRecord)
49
54
 
50
- def self.cache_configured?
51
- perform_caching && cache_store
52
- end
53
- end
55
+ @@perform_caching = true
56
+ cattr_accessor :perform_caching
54
57
  end
55
58
 
56
- protected
57
- # Convenience accessor
58
- def cache(key, options = {}, &block)
59
- if cache_configured?
60
- cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &block)
61
- else
62
- yield
63
- end
59
+ module ClassMethods
60
+ def cache_configured?
61
+ perform_caching && cache_store
64
62
  end
63
+ end
65
64
 
66
- private
67
- def cache_configured?
68
- self.class.cache_configured?
65
+ def caching_allowed?
66
+ request.get? && response.status == 200
67
+ end
68
+
69
+ protected
70
+ # Convenience accessor
71
+ def cache(key, options = {}, &block)
72
+ if cache_configured?
73
+ cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &block)
74
+ else
75
+ yield
69
76
  end
77
+ end
78
+
79
+ private
80
+ def cache_configured?
81
+ self.class.cache_configured?
82
+ end
70
83
  end
71
84
  end
@@ -2,9 +2,12 @@ require 'set'
2
2
 
3
3
  module ActionController #:nodoc:
4
4
  module Caching
5
- # Action caching is similar to page caching by the fact that the entire output of the response is cached, but unlike page caching,
6
- # every request still goes through the Action Pack. The key benefit of this is that filters are run before the cache is served, which
7
- # allows for authentication and other restrictions on whether someone is allowed to see the cache. Example:
5
+ # Action caching is similar to page caching by the fact that the entire
6
+ # output of the response is cached, but unlike page caching, every
7
+ # request still goes through the Action Pack. The key benefit
8
+ # of this is that filters are run before the cache is served, which
9
+ # allows for authentication and other restrictions on whether someone
10
+ # is allowed to see the cache. Example:
8
11
  #
9
12
  # class ListsController < ApplicationController
10
13
  # before_filter :authenticate, :except => :public
@@ -12,45 +15,64 @@ module ActionController #:nodoc:
12
15
  # caches_action :index, :show, :feed
13
16
  # end
14
17
  #
15
- # In this example, the public action doesn't require authentication, so it's possible to use the faster page caching method. But both the
16
- # show and feed action are to be shielded behind the authenticate filter, so we need to implement those as action caches.
18
+ # In this example, the public action doesn't require authentication,
19
+ # so it's possible to use the faster page caching method. But both
20
+ # the show and feed action are to be shielded behind the authenticate
21
+ # filter, so we need to implement those as action caches.
17
22
  #
18
- # Action caching internally uses the fragment caching and an around filter to do the job. The fragment cache is named according to both
19
- # the current host and the path. So a page that is accessed at http://david.somewhere.com/lists/show/1 will result in a fragment named
20
- # "david.somewhere.com/lists/show/1". This allows the cacher to differentiate between "david.somewhere.com/lists/" and
21
- # "jamis.somewhere.com/lists/" -- which is a helpful way of assisting the subdomain-as-account-key pattern.
23
+ # Action caching internally uses the fragment caching and an around
24
+ # filter to do the job. The fragment cache is named according to both
25
+ # the current host and the path. So a page that is accessed at
26
+ # http://david.somewhere.com/lists/show/1 will result in a fragment named
27
+ # "david.somewhere.com/lists/show/1". This allows the cacher to
28
+ # differentiate between "david.somewhere.com/lists/" and
29
+ # "jamis.somewhere.com/lists/" -- which is a helpful way of assisting
30
+ # the subdomain-as-account-key pattern.
22
31
  #
23
- # Different representations of the same resource, e.g. <tt>http://david.somewhere.com/lists</tt> and <tt>http://david.somewhere.com/lists.xml</tt>
24
- # are treated like separate requests and so are cached separately. Keep in mind when expiring an action cache that <tt>:action => 'lists'</tt> is not the same
25
- # as <tt>:action => 'list', :format => :xml</tt>.
32
+ # Different representations of the same resource, e.g.
33
+ # <tt>http://david.somewhere.com/lists</tt> and
34
+ # <tt>http://david.somewhere.com/lists.xml</tt>
35
+ # are treated like separate requests and so are cached separately.
36
+ # Keep in mind when expiring an action cache that
37
+ # <tt>:action => 'lists'</tt> is not the same as
38
+ # <tt>:action => 'list', :format => :xml</tt>.
26
39
  #
27
- # You can set modify the default action cache path by passing a :cache_path option. This will be passed directly to ActionCachePath.path_for. This is handy
28
- # for actions with multiple possible routes that should be cached differently. If a block is given, it is called with the current controller instance.
40
+ # You can set modify the default action cache path by passing a
41
+ # :cache_path option. This will be passed directly to
42
+ # ActionCachePath.path_for. This is handy for actions with multiple
43
+ # possible routes that should be cached differently. If a block is
44
+ # given, it is called with the current controller instance.
29
45
  #
30
- # And you can also use :if (or :unless) to pass a Proc that specifies when the action should be cached.
46
+ # And you can also use :if (or :unless) to pass a Proc that
47
+ # specifies when the action should be cached.
31
48
  #
32
49
  # Finally, if you are using memcached, you can also pass :expires_in.
33
50
  #
34
51
  # class ListsController < ApplicationController
35
52
  # before_filter :authenticate, :except => :public
36
53
  # caches_page :public
37
- # caches_action :index, :if => Proc.new { |c| !c.request.format.json? } # cache if is not a JSON request
38
- # caches_action :show, :cache_path => { :project => 1 }, :expires_in => 1.hour
39
- # caches_action :feed, :cache_path => Proc.new { |controller|
40
- # controller.params[:user_id] ?
41
- # controller.send(:user_list_url, controller.params[:user_id], controller.params[:id]) :
42
- # controller.send(:list_url, controller.params[:id]) }
54
+ # caches_action :index, :if => proc do |c|
55
+ # !c.request.format.json? # cache if is not a JSON request
56
+ # end
57
+ #
58
+ # caches_action :show, :cache_path => { :project => 1 },
59
+ # :expires_in => 1.hour
60
+ #
61
+ # caches_action :feed, :cache_path => proc do |controller|
62
+ # if controller.params[:user_id]
63
+ # controller.send(:user_list_url,
64
+ # controller.params[:user_id], controller.params[:id])
65
+ # else
66
+ # controller.send(:list_url, controller.params[:id])
67
+ # end
68
+ # end
43
69
  # end
44
70
  #
45
- # If you pass :layout => false, it will only cache your action content. It is useful when your layout has dynamic information.
71
+ # If you pass :layout => false, it will only cache your action
72
+ # content. It is useful when your layout has dynamic information.
46
73
  #
47
74
  module Actions
48
- def self.included(base) #:nodoc:
49
- base.extend(ClassMethods)
50
- base.class_eval do
51
- attr_accessor :rendered_action_cache, :action_cache_path
52
- end
53
- end
75
+ extend ActiveSupport::Concern
54
76
 
55
77
  module ClassMethods
56
78
  # Declares that +actions+ should be cached.
@@ -58,119 +80,83 @@ module ActionController #:nodoc:
58
80
  def caches_action(*actions)
59
81
  return unless cache_configured?
60
82
  options = actions.extract_options!
61
- filter_options = { :only => actions, :if => options.delete(:if), :unless => options.delete(:unless) }
83
+ filter_options = options.extract!(:if, :unless).merge(:only => actions)
84
+ cache_options = options.extract!(:layout, :cache_path).merge(:store_options => options)
62
85
 
63
- cache_filter = ActionCacheFilter.new(:layout => options.delete(:layout), :cache_path => options.delete(:cache_path), :store_options => options)
64
- around_filter(filter_options) do |controller, action|
65
- cache_filter.filter(controller, action)
66
- end
86
+ around_filter ActionCacheFilter.new(cache_options), filter_options
67
87
  end
68
88
  end
69
89
 
70
- protected
71
- def expire_action(options = {})
72
- return unless cache_configured?
90
+ def _render_cache_fragment(cache, extension, layout)
91
+ render :text => cache, :layout => layout, :content_type => Mime[extension || :html]
92
+ end
73
93
 
74
- if options[:action].is_a?(Array)
75
- options[:action].dup.each do |action|
76
- expire_fragment(ActionCachePath.path_for(self, options.merge({ :action => action }), false))
77
- end
78
- else
79
- expire_fragment(ActionCachePath.path_for(self, options, false))
80
- end
81
- end
94
+ def _save_fragment(name, layout, options)
95
+ return unless caching_allowed?
82
96
 
83
- class ActionCacheFilter #:nodoc:
84
- def initialize(options, &block)
85
- @options = options
86
- end
97
+ content = layout ? view_context.content_for(:layout) : response_body
98
+ write_fragment(name, content, options)
99
+ end
87
100
 
88
- def filter(controller, action)
89
- should_continue = before(controller)
90
- action.call if should_continue
91
- after(controller)
92
- end
101
+ protected
102
+ def expire_action(options = {})
103
+ return unless cache_configured?
93
104
 
94
- def before(controller)
95
- cache_path = ActionCachePath.new(controller, path_options_for(controller, @options.slice(:cache_path)))
96
- if cache = controller.read_fragment(cache_path.path, @options[:store_options])
97
- controller.rendered_action_cache = true
98
- set_content_type!(controller, cache_path.extension)
99
- options = { :text => cache }
100
- options.merge!(:layout => true) if cache_layout?
101
- controller.__send__(:render, options)
102
- false
103
- else
104
- controller.action_cache_path = cache_path
105
- end
105
+ actions = options[:action]
106
+ if actions.is_a?(Array)
107
+ actions.each {|action| expire_action(options.merge(:action => action)) }
108
+ else
109
+ expire_fragment(ActionCachePath.new(self, options, false).path)
106
110
  end
111
+ end
107
112
 
108
- def after(controller)
109
- return if controller.rendered_action_cache || !caching_allowed(controller)
110
- action_content = cache_layout? ? content_for_layout(controller) : controller.response.body
111
- controller.write_fragment(controller.action_cache_path.path, action_content, @options[:store_options])
113
+ class ActionCacheFilter #:nodoc:
114
+ def initialize(options, &block)
115
+ @cache_path, @store_options, @layout =
116
+ options.values_at(:cache_path, :store_options, :layout)
112
117
  end
113
118
 
114
- private
115
- def set_content_type!(controller, extension)
116
- controller.response.content_type = Mime::Type.lookup_by_extension(extension).to_s if extension
117
- end
118
-
119
- def path_options_for(controller, options)
120
- ((path_options = options[:cache_path]).respond_to?(:call) ? path_options.call(controller) : path_options) || {}
121
- end
122
-
123
- def caching_allowed(controller)
124
- controller.request.get? && controller.response.status.to_i == 200
119
+ def filter(controller)
120
+ path_options = if @cache_path.respond_to?(:call)
121
+ controller.instance_exec(controller, &@cache_path)
122
+ else
123
+ @cache_path
125
124
  end
126
125
 
127
- def cache_layout?
128
- @options[:layout] == false
129
- end
126
+ cache_path = ActionCachePath.new(controller, path_options || {})
130
127
 
131
- def content_for_layout(controller)
132
- controller.response.layout && controller.response.template.instance_variable_get('@cached_content_for_layout')
128
+ if cache = controller.read_fragment(cache_path.path, @store_options)
129
+ controller._render_cache_fragment(cache, cache_path.extension, @layout == false)
130
+ else
131
+ yield
132
+ controller._save_fragment(cache_path.path, @layout == false, @store_options)
133
133
  end
134
+ end
134
135
  end
135
136
 
136
137
  class ActionCachePath
137
138
  attr_reader :path, :extension
138
139
 
139
- class << self
140
- def path_for(controller, options, infer_extension = true)
141
- new(controller, options, infer_extension).path
142
- end
143
- end
144
-
145
- # When true, infer_extension will look up the cache path extension from the request's path & format.
146
- # This is desirable when reading and writing the cache, but not when expiring the cache -
147
- # expire_action should expire the same files regardless of the request format.
140
+ # If +infer_extension+ is true, the cache path extension is looked up from the request's
141
+ # path & format. This is desirable when reading and writing the cache, but not when
142
+ # expiring the cache - expire_action should expire the same files regardless of the
143
+ # request format.
148
144
  def initialize(controller, options = {}, infer_extension = true)
149
145
  if infer_extension
150
- extract_extension(controller.request)
151
- options = options.reverse_merge(:format => @extension) if options.is_a?(Hash)
146
+ @extension = controller.params[:format]
147
+ options.reverse_merge!(:format => @extension) if options.is_a?(Hash)
152
148
  end
153
149
 
154
- path = controller.url_for(options).split('://').last
155
- normalize!(path)
156
- add_extension!(path, @extension)
157
- @path = URI.unescape(path)
150
+ path = controller.url_for(options).split(%r{://}).last
151
+ @path = normalize!(path)
158
152
  end
159
153
 
160
- private
161
- def normalize!(path)
162
- path << 'index' if path[-1] == ?/
163
- end
164
-
165
- def add_extension!(path, extension)
166
- path << ".#{extension}" if extension and !path.ends_with?(extension)
167
- end
168
-
169
- def extract_extension(request)
170
- # Don't want just what comes after the last '.' to accommodate multi part extensions
171
- # such as tar.gz.
172
- @extension = request.path[/^[^.]+\.(.+)$/, 1] || request.cache_format
173
- end
154
+ private
155
+ def normalize!(path)
156
+ path << 'index' if path[-1] == ?/
157
+ path << ".#{extension}" if extension and !path.ends_with?(extension)
158
+ URI.unescape(path)
159
+ end
174
160
  end
175
161
  end
176
162
  end
@@ -36,8 +36,8 @@ module ActionController #:nodoc:
36
36
 
37
37
  def fragment_for(buffer, name = {}, options = nil, &block) #:nodoc:
38
38
  if perform_caching
39
- if cache = read_fragment(name, options)
40
- buffer.safe_concat(cache.html_safe)
39
+ if fragment_exist?(name, options)
40
+ buffer.safe_concat(read_fragment(name, options))
41
41
  else
42
42
  pos = buffer.length
43
43
  block.call
@@ -51,34 +51,30 @@ module ActionController #:nodoc:
51
51
  # Writes <tt>content</tt> to the location signified by <tt>key</tt> (see <tt>expire_fragment</tt> for acceptable formats)
52
52
  def write_fragment(key, content, options = nil)
53
53
  return content unless cache_configured?
54
+ key = fragment_cache_key(key)
54
55
 
55
- self.class.benchmark "Cached fragment miss: #{key}" do
56
- key = fragment_cache_key(key)
57
- content = content.html_safe.to_str if content.respond_to?(:html_safe)
56
+ instrument_fragment_cache :write_fragment, key do
58
57
  cache_store.write(key, content, options)
59
58
  end
60
-
61
59
  content
62
60
  end
63
61
 
64
62
  # Reads a cached fragment from the location signified by <tt>key</tt> (see <tt>expire_fragment</tt> for acceptable formats)
65
63
  def read_fragment(key, options = nil)
66
64
  return unless cache_configured?
67
-
68
65
  key = fragment_cache_key(key)
69
- self.class.benchmark "Cached fragment hit: #{key}" do
70
- result = cache_store.read(key, options)
71
- result.respond_to?(:html_safe) ? result.html_safe : result
66
+
67
+ instrument_fragment_cache :read_fragment, key do
68
+ cache_store.read(key, options)
72
69
  end
73
70
  end
74
71
 
75
72
  # Check if a cached fragment from the location signified by <tt>key</tt> exists (see <tt>expire_fragment</tt> for acceptable formats)
76
73
  def fragment_exist?(key, options = nil)
77
74
  return unless cache_configured?
78
-
79
75
  key = fragment_cache_key(key)
80
76
 
81
- self.class.benchmark "Cached fragment exists?: #{key}" do
77
+ instrument_fragment_cache :exist_fragment?, key do
82
78
  cache_store.exist?(key, options)
83
79
  end
84
80
  end
@@ -102,19 +98,21 @@ module ActionController #:nodoc:
102
98
  # method (or <tt>delete_matched</tt>, for Regexp keys.)
103
99
  def expire_fragment(key, options = nil)
104
100
  return unless cache_configured?
101
+ key = fragment_cache_key(key) unless key.is_a?(Regexp)
102
+ message = nil
105
103
 
106
- key = key.is_a?(Regexp) ? key : fragment_cache_key(key)
107
-
108
- if key.is_a?(Regexp)
109
- self.class.benchmark "Expired fragments matching: #{key.source}" do
104
+ instrument_fragment_cache :expire_fragment, key do
105
+ if key.is_a?(Regexp)
110
106
  cache_store.delete_matched(key, options)
111
- end
112
- else
113
- self.class.benchmark "Expired fragment: #{key}" do
107
+ else
114
108
  cache_store.delete(key, options)
115
109
  end
116
110
  end
117
111
  end
112
+
113
+ def instrument_fragment_cache(name, key)
114
+ ActiveSupport::Notifications.instrument("action_controller.#{name}", :key => key){ yield }
115
+ end
118
116
  end
119
117
  end
120
118
  end