actionpack 3.2.19 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +850 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +39 -37
  7. data/lib/abstract_controller/callbacks.rb +101 -82
  8. data/lib/abstract_controller/collector.rb +7 -3
  9. data/lib/abstract_controller/helpers.rb +25 -13
  10. data/lib/abstract_controller/layouts.rb +74 -74
  11. data/lib/abstract_controller/logger.rb +1 -2
  12. data/lib/abstract_controller/rendering.rb +30 -13
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +6 -6
  15. data/lib/abstract_controller/view_paths.rb +1 -1
  16. data/lib/abstract_controller.rb +1 -8
  17. data/lib/action_controller/base.rb +46 -22
  18. data/lib/action_controller/caching/fragments.rb +23 -53
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/log_subscriber.rb +16 -8
  23. data/lib/action_controller/metal/conditional_get.rb +76 -32
  24. data/lib/action_controller/metal/data_streaming.rb +20 -26
  25. data/lib/action_controller/metal/exceptions.rb +19 -6
  26. data/lib/action_controller/metal/flash.rb +24 -9
  27. data/lib/action_controller/metal/force_ssl.rb +70 -12
  28. data/lib/action_controller/metal/head.rb +25 -4
  29. data/lib/action_controller/metal/helpers.rb +5 -9
  30. data/lib/action_controller/metal/hide_actions.rb +0 -1
  31. data/lib/action_controller/metal/http_authentication.rb +107 -83
  32. data/lib/action_controller/metal/implicit_render.rb +1 -1
  33. data/lib/action_controller/metal/instrumentation.rb +2 -1
  34. data/lib/action_controller/metal/live.rb +175 -0
  35. data/lib/action_controller/metal/mime_responds.rb +161 -47
  36. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  37. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  38. data/lib/action_controller/metal/redirecting.rb +15 -20
  39. data/lib/action_controller/metal/renderers.rb +11 -9
  40. data/lib/action_controller/metal/rendering.rb +9 -1
  41. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  42. data/lib/action_controller/metal/responder.rb +20 -19
  43. data/lib/action_controller/metal/streaming.rb +12 -18
  44. data/lib/action_controller/metal/strong_parameters.rb +520 -0
  45. data/lib/action_controller/metal/testing.rb +13 -18
  46. data/lib/action_controller/metal/url_for.rb +28 -25
  47. data/lib/action_controller/metal.rb +17 -32
  48. data/lib/action_controller/model_naming.rb +12 -0
  49. data/lib/action_controller/railtie.rb +33 -17
  50. data/lib/action_controller/railties/helpers.rb +22 -0
  51. data/lib/action_controller/record_identifier.rb +18 -72
  52. data/lib/action_controller/test_case.rb +251 -131
  53. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  54. data/lib/action_controller.rb +15 -6
  55. data/lib/action_dispatch/http/cache.rb +63 -11
  56. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  57. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  58. data/lib/action_dispatch/http/headers.rb +49 -17
  59. data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
  60. data/lib/action_dispatch/http/mime_type.rb +154 -100
  61. data/lib/action_dispatch/http/mime_types.rb +1 -1
  62. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  63. data/lib/action_dispatch/http/parameters.rb +28 -28
  64. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  65. data/lib/action_dispatch/http/request.rb +64 -18
  66. data/lib/action_dispatch/http/response.rb +130 -35
  67. data/lib/action_dispatch/http/upload.rb +63 -20
  68. data/lib/action_dispatch/http/url.rb +98 -35
  69. data/lib/action_dispatch/journey/backwards.rb +5 -0
  70. data/lib/action_dispatch/journey/formatter.rb +146 -0
  71. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  72. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  73. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  74. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  75. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  76. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  77. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  78. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  79. data/lib/action_dispatch/journey/parser.rb +206 -0
  80. data/lib/action_dispatch/journey/parser.y +47 -0
  81. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  82. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  83. data/lib/action_dispatch/journey/route.rb +124 -0
  84. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  85. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  86. data/lib/action_dispatch/journey/router.rb +166 -0
  87. data/lib/action_dispatch/journey/routes.rb +75 -0
  88. data/lib/action_dispatch/journey/scanner.rb +61 -0
  89. data/lib/action_dispatch/journey/visitors.rb +197 -0
  90. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  91. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  92. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  93. data/lib/action_dispatch/journey.rb +5 -0
  94. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  95. data/lib/action_dispatch/middleware/cookies.rb +259 -114
  96. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  97. data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
  98. data/lib/action_dispatch/middleware/flash.rb +58 -58
  99. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  100. data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
  101. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  102. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  103. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  104. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  105. data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
  106. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  107. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  108. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  109. data/lib/action_dispatch/middleware/stack.rb +6 -1
  110. data/lib/action_dispatch/middleware/static.rb +2 -1
  111. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  112. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
  114. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  115. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  118. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  119. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  120. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  121. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  122. data/lib/action_dispatch/railtie.rb +16 -6
  123. data/lib/action_dispatch/request/session.rb +181 -0
  124. data/lib/action_dispatch/routing/inspector.rb +240 -0
  125. data/lib/action_dispatch/routing/mapper.rb +540 -291
  126. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  127. data/lib/action_dispatch/routing/redirection.rb +46 -29
  128. data/lib/action_dispatch/routing/route_set.rb +207 -164
  129. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  130. data/lib/action_dispatch/routing/url_for.rb +48 -33
  131. data/lib/action_dispatch/routing.rb +48 -83
  132. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  133. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  134. data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
  135. data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
  136. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  137. data/lib/action_dispatch/testing/integration.rb +65 -51
  138. data/lib/action_dispatch/testing/test_process.rb +9 -6
  139. data/lib/action_dispatch/testing/test_request.rb +7 -3
  140. data/lib/action_dispatch.rb +21 -15
  141. data/lib/action_pack/version.rb +7 -6
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_view/base.rb +15 -34
  144. data/lib/action_view/buffers.rb +7 -1
  145. data/lib/action_view/context.rb +4 -4
  146. data/lib/action_view/dependency_tracker.rb +93 -0
  147. data/lib/action_view/digestor.rb +85 -0
  148. data/lib/action_view/flows.rb +1 -4
  149. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  150. data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
  151. data/lib/action_view/helpers/asset_url_helper.rb +355 -0
  152. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  153. data/lib/action_view/helpers/cache_helper.rb +150 -18
  154. data/lib/action_view/helpers/capture_helper.rb +44 -31
  155. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  156. data/lib/action_view/helpers/date_helper.rb +269 -248
  157. data/lib/action_view/helpers/debug_helper.rb +10 -11
  158. data/lib/action_view/helpers/form_helper.rb +931 -537
  159. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  160. data/lib/action_view/helpers/form_tag_helper.rb +190 -90
  161. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  162. data/lib/action_view/helpers/number_helper.rb +148 -329
  163. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  164. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  165. data/lib/action_view/helpers/rendering_helper.rb +2 -2
  166. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  167. data/lib/action_view/helpers/tag_helper.rb +46 -33
  168. data/lib/action_view/helpers/tags/base.rb +147 -0
  169. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  170. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  171. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  172. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  173. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  174. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  175. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  176. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  177. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  178. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  179. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  180. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  181. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  182. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  183. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  184. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  185. data/lib/action_view/helpers/tags/label.rb +65 -0
  186. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  187. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  188. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  189. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  190. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  191. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  192. data/lib/action_view/helpers/tags/select.rb +40 -0
  193. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  194. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  195. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  196. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  197. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  198. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  199. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  200. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  201. data/lib/action_view/helpers/tags.rb +39 -0
  202. data/lib/action_view/helpers/text_helper.rb +130 -114
  203. data/lib/action_view/helpers/translation_helper.rb +32 -16
  204. data/lib/action_view/helpers/url_helper.rb +211 -270
  205. data/lib/action_view/helpers.rb +2 -4
  206. data/lib/action_view/locale/en.yml +1 -105
  207. data/lib/action_view/log_subscriber.rb +6 -4
  208. data/lib/action_view/lookup_context.rb +15 -28
  209. data/lib/action_view/model_naming.rb +12 -0
  210. data/lib/action_view/path_set.rb +8 -20
  211. data/lib/action_view/railtie.rb +6 -22
  212. data/lib/action_view/record_identifier.rb +84 -0
  213. data/lib/action_view/renderer/abstract_renderer.rb +25 -19
  214. data/lib/action_view/renderer/partial_renderer.rb +158 -81
  215. data/lib/action_view/renderer/renderer.rb +8 -12
  216. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  217. data/lib/action_view/renderer/template_renderer.rb +12 -10
  218. data/lib/action_view/routing_url_for.rb +107 -0
  219. data/lib/action_view/template/error.rb +22 -12
  220. data/lib/action_view/template/handlers/builder.rb +1 -1
  221. data/lib/action_view/template/handlers/erb.rb +40 -19
  222. data/lib/action_view/template/handlers/raw.rb +11 -0
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/resolver.rb +107 -53
  225. data/lib/action_view/template/text.rb +12 -8
  226. data/lib/action_view/template/types.rb +57 -0
  227. data/lib/action_view/template.rb +25 -23
  228. data/lib/action_view/test_case.rb +67 -42
  229. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  230. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  231. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
  232. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  235. data/lib/action_view/vendor/html-scanner.rb +20 -0
  236. data/lib/action_view.rb +17 -8
  237. metadata +184 -214
  238. data/lib/action_controller/caching/actions.rb +0 -185
  239. data/lib/action_controller/caching/pages.rb +0 -187
  240. data/lib/action_controller/caching/sweeping.rb +0 -97
  241. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  242. data/lib/action_controller/metal/compatibility.rb +0 -65
  243. data/lib/action_controller/metal/session_management.rb +0 -14
  244. data/lib/action_controller/railties/paths.rb +0 -25
  245. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  246. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  247. data/lib/action_dispatch/middleware/head.rb +0 -18
  248. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  249. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  250. data/lib/action_view/asset_paths.rb +0 -142
  251. data/lib/action_view/helpers/asset_paths.rb +0 -7
  252. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  253. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  254. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  255. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  256. data/lib/sprockets/assets.rake +0 -99
  257. data/lib/sprockets/bootstrap.rb +0 -37
  258. data/lib/sprockets/compressors.rb +0 -83
  259. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  260. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/railtie.rb +0 -62
  263. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,10 +1,9 @@
1
1
  require 'stringio'
2
2
  require 'uri'
3
3
  require 'active_support/core_ext/kernel/singleton_class'
4
- require 'active_support/core_ext/object/inclusion'
5
4
  require 'active_support/core_ext/object/try'
6
5
  require 'rack/test'
7
- require 'test/unit/assertions'
6
+ require 'minitest/unit'
8
7
 
9
8
  module ActionDispatch
10
9
  module Integration #:nodoc:
@@ -18,56 +17,62 @@ module ActionDispatch
18
17
  # a Hash, or a String that is appropriately encoded
19
18
  # (<tt>application/x-www-form-urlencoded</tt> or
20
19
  # <tt>multipart/form-data</tt>).
21
- # - +headers+: Additional headers to pass, as a Hash. The headers will be
20
+ # - +headers_or_env+: Additional headers to pass, as a Hash. The headers will be
22
21
  # merged into the Rack env hash.
23
22
  #
24
- # This method returns an Response object, which one can use to
23
+ # This method returns a Response object, which one can use to
25
24
  # inspect the details of the response. Furthermore, if this method was
26
25
  # called from an ActionDispatch::IntegrationTest object, then that
27
26
  # object's <tt>@response</tt> instance variable will point to the same
28
27
  # response object.
29
28
  #
30
- # You can also perform POST, PUT, DELETE, and HEAD requests with +#post+,
31
- # +#put+, +#delete+, and +#head+.
32
- def get(path, parameters = nil, headers = nil)
33
- process :get, path, parameters, headers
29
+ # You can also perform POST, PATCH, PUT, DELETE, and HEAD requests with
30
+ # +#post+, +#patch+, +#put+, +#delete+, and +#head+.
31
+ def get(path, parameters = nil, headers_or_env = nil)
32
+ process :get, path, parameters, headers_or_env
34
33
  end
35
34
 
36
35
  # Performs a POST request with the given parameters. See +#get+ for more
37
36
  # details.
38
- def post(path, parameters = nil, headers = nil)
39
- process :post, path, parameters, headers
37
+ def post(path, parameters = nil, headers_or_env = nil)
38
+ process :post, path, parameters, headers_or_env
39
+ end
40
+
41
+ # Performs a PATCH request with the given parameters. See +#get+ for more
42
+ # details.
43
+ def patch(path, parameters = nil, headers_or_env = nil)
44
+ process :patch, path, parameters, headers_or_env
40
45
  end
41
46
 
42
47
  # Performs a PUT request with the given parameters. See +#get+ for more
43
48
  # details.
44
- def put(path, parameters = nil, headers = nil)
45
- process :put, path, parameters, headers
49
+ def put(path, parameters = nil, headers_or_env = nil)
50
+ process :put, path, parameters, headers_or_env
46
51
  end
47
52
 
48
53
  # Performs a DELETE request with the given parameters. See +#get+ for
49
54
  # more details.
50
- def delete(path, parameters = nil, headers = nil)
51
- process :delete, path, parameters, headers
55
+ def delete(path, parameters = nil, headers_or_env = nil)
56
+ process :delete, path, parameters, headers_or_env
52
57
  end
53
58
 
54
59
  # Performs a HEAD request with the given parameters. See +#get+ for more
55
60
  # details.
56
- def head(path, parameters = nil, headers = nil)
57
- process :head, path, parameters, headers
61
+ def head(path, parameters = nil, headers_or_env = nil)
62
+ process :head, path, parameters, headers_or_env
58
63
  end
59
64
 
60
65
  # Performs an XMLHttpRequest request with the given parameters, mirroring
61
66
  # a request from the Prototype library.
62
67
  #
63
- # The request_method is +:get+, +:post+, +:put+, +:delete+ or +:head+; the
64
- # parameters are +nil+, a hash, or a url-encoded or multipart string;
65
- # the headers are a hash.
66
- def xml_http_request(request_method, path, parameters = nil, headers = nil)
67
- headers ||= {}
68
- headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
69
- headers['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
70
- process(request_method, path, parameters, headers)
68
+ # The request_method is +:get+, +:post+, +:patch+, +:put+, +:delete+ or
69
+ # +:head+; the parameters are +nil+, a hash, or a url-encoded or multipart
70
+ # string; the headers are a hash.
71
+ def xml_http_request(request_method, path, parameters = nil, headers_or_env = nil)
72
+ headers_or_env ||= {}
73
+ headers_or_env['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
74
+ headers_or_env['HTTP_ACCEPT'] ||= [Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')
75
+ process(request_method, path, parameters, headers_or_env)
71
76
  end
72
77
  alias xhr :xml_http_request
73
78
 
@@ -84,34 +89,40 @@ module ActionDispatch
84
89
  # redirect. Note that the redirects are followed until the response is
85
90
  # not a redirect--this means you may run into an infinite loop if your
86
91
  # redirect loops back to itself.
87
- def request_via_redirect(http_method, path, parameters = nil, headers = nil)
88
- process(http_method, path, parameters, headers)
92
+ def request_via_redirect(http_method, path, parameters = nil, headers_or_env = nil)
93
+ process(http_method, path, parameters, headers_or_env)
89
94
  follow_redirect! while redirect?
90
95
  status
91
96
  end
92
97
 
93
98
  # Performs a GET request, following any subsequent redirect.
94
99
  # See +request_via_redirect+ for more information.
95
- def get_via_redirect(path, parameters = nil, headers = nil)
96
- request_via_redirect(:get, path, parameters, headers)
100
+ def get_via_redirect(path, parameters = nil, headers_or_env = nil)
101
+ request_via_redirect(:get, path, parameters, headers_or_env)
97
102
  end
98
103
 
99
104
  # Performs a POST request, following any subsequent redirect.
100
105
  # See +request_via_redirect+ for more information.
101
- def post_via_redirect(path, parameters = nil, headers = nil)
102
- request_via_redirect(:post, path, parameters, headers)
106
+ def post_via_redirect(path, parameters = nil, headers_or_env = nil)
107
+ request_via_redirect(:post, path, parameters, headers_or_env)
108
+ end
109
+
110
+ # Performs a PATCH request, following any subsequent redirect.
111
+ # See +request_via_redirect+ for more information.
112
+ def patch_via_redirect(path, parameters = nil, headers_or_env = nil)
113
+ request_via_redirect(:patch, path, parameters, headers_or_env)
103
114
  end
104
115
 
105
116
  # Performs a PUT request, following any subsequent redirect.
106
117
  # See +request_via_redirect+ for more information.
107
- def put_via_redirect(path, parameters = nil, headers = nil)
108
- request_via_redirect(:put, path, parameters, headers)
118
+ def put_via_redirect(path, parameters = nil, headers_or_env = nil)
119
+ request_via_redirect(:put, path, parameters, headers_or_env)
109
120
  end
110
121
 
111
122
  # Performs a DELETE request, following any subsequent redirect.
112
123
  # See +request_via_redirect+ for more information.
113
- def delete_via_redirect(path, parameters = nil, headers = nil)
114
- request_via_redirect(:delete, path, parameters, headers)
124
+ def delete_via_redirect(path, parameters = nil, headers_or_env = nil)
125
+ request_via_redirect(:delete, path, parameters, headers_or_env)
115
126
  end
116
127
  end
117
128
 
@@ -126,7 +137,7 @@ module ActionDispatch
126
137
  class Session
127
138
  DEFAULT_HOST = "www.example.com"
128
139
 
129
- include Test::Unit::Assertions
140
+ include MiniTest::Assertions
130
141
  include TestProcess, RequestHelpers, Assertions
131
142
 
132
143
  %w( status status_message headers body redirect? ).each do |method|
@@ -251,12 +262,11 @@ module ActionDispatch
251
262
  end
252
263
 
253
264
  # Performs the actual request.
254
- def process(method, path, parameters = nil, rack_env = nil)
255
- rack_env ||= {}
265
+ def process(method, path, parameters = nil, headers_or_env = nil)
256
266
  if path =~ %r{://}
257
267
  location = URI.parse(path)
258
268
  https! URI::HTTPS === location if location.scheme
259
- host! location.host if location.host
269
+ host! "#{location.host}:#{location.port}" if location.host
260
270
  path = location.query ? "#{location.path}?#{location.query}" : location.path
261
271
  end
262
272
 
@@ -283,10 +293,12 @@ module ActionDispatch
283
293
  "CONTENT_TYPE" => "application/x-www-form-urlencoded",
284
294
  "HTTP_ACCEPT" => accept
285
295
  }
296
+ # this modifies the passed env directly
297
+ Http::Headers.new(env).merge!(headers_or_env || {})
286
298
 
287
299
  session = Rack::Test::Session.new(_mock_session)
288
300
 
289
- env.merge!(rack_env)
301
+ env.merge!(env)
290
302
 
291
303
  # NOTE: rack-test v0.5 doesn't build a default uri correctly
292
304
  # Make sure requested path is always a full uri
@@ -324,12 +336,12 @@ module ActionDispatch
324
336
  @integration_session = Integration::Session.new(app)
325
337
  end
326
338
 
327
- %w(get post put head delete cookies assigns
339
+ %w(get post patch put head delete cookies assigns
328
340
  xml_http_request xhr get_via_redirect post_via_redirect).each do |method|
329
341
  define_method(method) do |*args|
330
342
  reset! unless integration_session
331
343
  # reset the html_document variable, but only for new get/post calls
332
- @html_document = nil unless method.in?(["cookies", "assigns"])
344
+ @html_document = nil unless method == 'cookies' || method == 'assigns'
333
345
  integration_session.__send__(method, *args).tap do
334
346
  copy_session_variables!
335
347
  end
@@ -367,7 +379,7 @@ module ActionDispatch
367
379
  end
368
380
 
369
381
  def default_url_options=(options)
370
- integration_session.url_options
382
+ reset! unless integration_session
371
383
  integration_session.default_url_options = options
372
384
  end
373
385
 
@@ -413,8 +425,8 @@ module ActionDispatch
413
425
  # assert_equal 200, status
414
426
  #
415
427
  # # post the login and follow through to the home page
416
- # post "/login", :username => people(:jamis).username,
417
- # :password => people(:jamis).password
428
+ # post "/login", username: people(:jamis).username,
429
+ # password: people(:jamis).password
418
430
  # follow_redirect!
419
431
  # assert_equal 200, status
420
432
  # assert_equal "/home", path
@@ -447,13 +459,13 @@ module ActionDispatch
447
459
  # module CustomAssertions
448
460
  # def enter(room)
449
461
  # # reference a named route, for maximum internal consistency!
450
- # get(room_url(:id => room.id))
462
+ # get(room_url(id: room.id))
451
463
  # assert(...)
452
464
  # ...
453
465
  # end
454
466
  #
455
467
  # def speak(room, message)
456
- # xml_http_request "/say/#{room.id}", :message => message
468
+ # xml_http_request "/say/#{room.id}", message: message
457
469
  # assert(...)
458
470
  # ...
459
471
  # end
@@ -463,8 +475,8 @@ module ActionDispatch
463
475
  # open_session do |sess|
464
476
  # sess.extend(CustomAssertions)
465
477
  # who = people(who)
466
- # sess.post "/login", :username => who.username,
467
- # :password => who.password
478
+ # sess.post "/login", username: who.username,
479
+ # password: who.password
468
480
  # assert(...)
469
481
  # end
470
482
  # end
@@ -477,9 +489,11 @@ module ActionDispatch
477
489
  @@app = nil
478
490
 
479
491
  def self.app
480
- # DEPRECATE Rails application fallback
481
- # This should be set by the initializer
482
- @@app || (defined?(Rails.application) && Rails.application) || nil
492
+ if !@@app && !ActionDispatch.test_app
493
+ ActiveSupport::Deprecation.warn "Rails application fallback is deprecated and no longer works, please set ActionDispatch.test_app"
494
+ end
495
+
496
+ @@app || ActionDispatch.test_app
483
497
  end
484
498
 
485
499
  def self.app=(app)
@@ -5,7 +5,8 @@ require 'active_support/core_ext/hash/indifferent_access'
5
5
  module ActionDispatch
6
6
  module TestProcess
7
7
  def assigns(key = nil)
8
- assigns = @controller.view_assigns.with_indifferent_access
8
+ assigns = {}.with_indifferent_access
9
+ @controller.view_assigns.each { |k, v| assigns.regular_writer(k, v) }
9
10
  key.nil? ? assigns : assigns[key]
10
11
  end
11
12
 
@@ -25,17 +26,19 @@ module ActionDispatch
25
26
  @response.redirect_url
26
27
  end
27
28
 
28
- # Shortcut for <tt>Rack::Test::UploadedFile.new(ActionController::TestCase.fixture_path + path, type)</tt>:
29
+ # Shortcut for <tt>Rack::Test::UploadedFile.new(File.join(ActionController::TestCase.fixture_path, path), type)</tt>:
29
30
  #
30
- # post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png')
31
+ # post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png')
31
32
  #
32
33
  # To upload binary files on Windows, pass <tt>:binary</tt> as the last parameter.
33
34
  # This will not affect other platforms:
34
35
  #
35
- # post :change_avatar, :avatar => fixture_file_upload('/files/spongebob.png', 'image/png', :binary)
36
+ # post :change_avatar, avatar: fixture_file_upload('files/spongebob.png', 'image/png', :binary)
36
37
  def fixture_file_upload(path, mime_type = nil, binary = false)
37
- fixture_path = self.class.fixture_path if self.class.respond_to?(:fixture_path)
38
- Rack::Test::UploadedFile.new("#{fixture_path}#{path}", mime_type, binary)
38
+ if self.class.respond_to?(:fixture_path) && self.class.fixture_path
39
+ path = File.join(self.class.fixture_path, path)
40
+ end
41
+ Rack::Test::UploadedFile.new(path, mime_type, binary)
39
42
  end
40
43
  end
41
44
  end
@@ -1,6 +1,4 @@
1
- require 'active_support/core_ext/object/blank'
2
1
  require 'active_support/core_ext/hash/indifferent_access'
3
- require 'active_support/core_ext/hash/reverse_merge'
4
2
  require 'rack/utils'
5
3
 
6
4
  module ActionDispatch
@@ -13,7 +11,7 @@ module ActionDispatch
13
11
 
14
12
  def initialize(env = {})
15
13
  env = Rails.application.env_config.merge(env) if defined?(Rails.application) && Rails.application
16
- super(DEFAULT_ENV.merge(env))
14
+ super(default_env.merge(env))
17
15
 
18
16
  self.host = 'test.host'
19
17
  self.remote_addr = '0.0.0.0'
@@ -70,5 +68,11 @@ module ActionDispatch
70
68
  def cookies
71
69
  @cookies ||= {}.with_indifferent_access
72
70
  end
71
+
72
+ private
73
+
74
+ def default_env
75
+ DEFAULT_ENV
76
+ end
73
77
  end
74
78
  end
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2004-2011 David Heinemeier Hansson
2
+ # Copyright (c) 2004-2013 David Heinemeier Hansson
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -21,17 +21,11 @@
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
23
 
24
- activesupport_path = File.expand_path('../../../activesupport/lib', __FILE__)
25
- $:.unshift(activesupport_path) if File.directory?(activesupport_path) && !$:.include?(activesupport_path)
26
-
27
- activemodel_path = File.expand_path('../../../activemodel/lib', __FILE__)
28
- $:.unshift(activemodel_path) if File.directory?(activemodel_path) && !$:.include?(activemodel_path)
29
-
30
24
  require 'active_support'
31
- require 'active_support/dependencies/autoload'
25
+ require 'active_support/rails'
26
+ require 'active_support/core_ext/module/attribute_accessors'
32
27
 
33
28
  require 'action_pack'
34
- require 'active_model'
35
29
  require 'rack'
36
30
 
37
31
  module Rack
@@ -41,14 +35,18 @@ end
41
35
  module ActionDispatch
42
36
  extend ActiveSupport::Autoload
43
37
 
44
- autoload_under 'http' do
45
- autoload :Request
46
- autoload :Response
38
+ class IllegalStateError < StandardError
39
+ end
40
+
41
+ eager_autoload do
42
+ autoload_under 'http' do
43
+ autoload :Request
44
+ autoload :Response
45
+ end
47
46
  end
48
47
 
49
48
  autoload_under 'middleware' do
50
49
  autoload :RequestId
51
- autoload :BestStandardsSupport
52
50
  autoload :Callbacks
53
51
  autoload :Cookies
54
52
  autoload :DebugExceptions
@@ -59,11 +57,12 @@ module ActionDispatch
59
57
  autoload :PublicExceptions
60
58
  autoload :Reloader
61
59
  autoload :RemoteIp
62
- autoload :Rescue
63
60
  autoload :ShowExceptions
61
+ autoload :SSL
64
62
  autoload :Static
65
63
  end
66
64
 
65
+ autoload :Journey
67
66
  autoload :MiddlewareStack, 'action_dispatch/middleware/stack'
68
67
  autoload :Routing
69
68
 
@@ -76,6 +75,7 @@ module ActionDispatch
76
75
  autoload :Parameters
77
76
  autoload :ParameterFilter
78
77
  autoload :FilterParameters
78
+ autoload :FilterRedirect
79
79
  autoload :Upload
80
80
  autoload :UploadedFile, 'action_dispatch/http/upload'
81
81
  autoload :URL
@@ -88,11 +88,12 @@ module ActionDispatch
88
88
  autoload :CacheStore, 'action_dispatch/middleware/session/cache_store'
89
89
  end
90
90
 
91
+ mattr_accessor :test_app
92
+
91
93
  autoload_under 'testing' do
92
94
  autoload :Assertions
93
95
  autoload :Integration
94
96
  autoload :IntegrationTest, 'action_dispatch/testing/integration'
95
- autoload :PerformanceTest
96
97
  autoload :TestProcess
97
98
  autoload :TestRequest
98
99
  autoload :TestResponse
@@ -100,3 +101,8 @@ module ActionDispatch
100
101
  end
101
102
 
102
103
  autoload :Mime, 'action_dispatch/http/mime_type'
104
+
105
+ ActiveSupport.on_load(:action_view) do
106
+ ActionView::Base.default_formats ||= Mime::SET.symbols
107
+ ActionView::Template::Types.delegate_to Mime
108
+ end
@@ -1,10 +1,11 @@
1
1
  module ActionPack
2
- module VERSION #:nodoc:
3
- MAJOR = 3
4
- MINOR = 2
5
- TINY = 19
6
- PRE = nil
2
+ # Returns the version of the currently loaded ActionPack as a Gem::Version
3
+ def self.version
4
+ Gem::Version.new "4.0.0"
5
+ end
7
6
 
8
- STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
7
+ module VERSION #:nodoc:
8
+ MAJOR, MINOR, TINY, PRE = ActionPack.version.segments
9
+ STRING = ActionPack.version.to_s
9
10
  end
10
11
  end
data/lib/action_pack.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2004-2011 David Heinemeier Hansson
2
+ # Copyright (c) 2004-2013 David Heinemeier Hansson
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -1,15 +1,12 @@
1
1
  require 'active_support/core_ext/module/attr_internal'
2
- require 'active_support/core_ext/module/delegation'
3
- require 'active_support/core_ext/class/attribute'
4
- require 'active_support/core_ext/array/wrap'
2
+ require 'active_support/core_ext/class/attribute_accessors'
5
3
  require 'active_support/ordered_options'
6
4
  require 'action_view/log_subscriber'
7
- require 'active_support/core_ext/module/deprecation'
8
5
 
9
6
  module ActionView #:nodoc:
10
7
  # = Action View Base
11
8
  #
12
- # Action View templates can be written in several ways. If the template file has a <tt>.erb</tt> extension then it uses a mixture of ERb
9
+ # Action View templates can be written in several ways. If the template file has a <tt>.erb</tt> extension then it uses a mixture of ERB
13
10
  # (included in Ruby) and HTML. If the template file has a <tt>.builder</tt> extension then Jim Weirich's Builder::XmlMarkup library is used.
14
11
  #
15
12
  # == ERB
@@ -58,7 +55,7 @@ module ActionView #:nodoc:
58
55
  #
59
56
  # You can pass local variables to sub templates by using a hash with the variable names as keys and the objects as values:
60
57
  #
61
- # <%= render "shared/header", { :headline => "Welcome", :person => person } %>
58
+ # <%= render "shared/header", { headline: "Welcome", person: person } %>
62
59
  #
63
60
  # These can now be accessed in <tt>shared/header</tt> with:
64
61
  #
@@ -141,14 +138,22 @@ module ActionView #:nodoc:
141
138
  # How to complete the streaming when an exception occurs.
142
139
  # This is our best guess: first try to close the attribute, then the tag.
143
140
  cattr_accessor :streaming_completion_on_exception
144
- @@streaming_completion_on_exception = %("><script type="text/javascript">window.location = "/500.html"</script></html>)
141
+ @@streaming_completion_on_exception = %("><script>window.location = "/500.html"</script></html>)
142
+
143
+ # Specify whether rendering within namespaced controllers should prefix
144
+ # the partial paths for ActiveModel objects with the namespace.
145
+ # (e.g., an Admin::PostsController would render @post using /admin/posts/_post.erb)
146
+ cattr_accessor :prefix_partial_path_with_controller_namespace
147
+ @@prefix_partial_path_with_controller_namespace = true
148
+
149
+ # Specify default_formats that can be rendered.
150
+ cattr_accessor :default_formats
145
151
 
146
- class_attribute :helpers
147
152
  class_attribute :_routes
153
+ class_attribute :logger
148
154
 
149
155
  class << self
150
156
  delegate :erb_trim_mode=, :to => 'ActionView::Template::Handlers::ERB'
151
- delegate :logger, :to => 'ActionController::Base', :allow_nil => true
152
157
 
153
158
  def cache_template_loading
154
159
  ActionView::Resolver.caching?
@@ -158,31 +163,9 @@ module ActionView #:nodoc:
158
163
  ActionView::Resolver.caching = value
159
164
  end
160
165
 
161
- def process_view_paths(value)
162
- value.is_a?(PathSet) ?
163
- value.dup : ActionView::PathSet.new(Array.wrap(value))
164
- end
165
- deprecate :process_view_paths
166
-
167
166
  def xss_safe? #:nodoc:
168
167
  true
169
168
  end
170
-
171
- # This method receives routes and helpers from the controller
172
- # and return a subclass ready to be used as view context.
173
- def prepare(routes, helpers) #:nodoc:
174
- Class.new(self) do
175
- if routes
176
- include routes.url_helpers
177
- include routes.mounted_helpers
178
- end
179
-
180
- if helpers
181
- include helpers
182
- self.helpers = helpers
183
- end
184
- end
185
- end
186
169
  end
187
170
 
188
171
  attr_accessor :view_renderer
@@ -198,11 +181,9 @@ module ActionView #:nodoc:
198
181
  def initialize(context = nil, assigns = {}, controller = nil, formats = nil) #:nodoc:
199
182
  @_config = ActiveSupport::InheritableOptions.new
200
183
 
201
- # Handle all these for backwards compatibility.
202
- # TODO Provide a new API for AV::Base and deprecate this one.
203
184
  if context.is_a?(ActionView::Renderer)
204
185
  @view_renderer = context
205
- elsif
186
+ else
206
187
  lookup_context = context.is_a?(ActionView::LookupContext) ?
207
188
  context : ActionView::LookupContext.new(context)
208
189
  lookup_context.formats = formats if formats
@@ -4,13 +4,19 @@ module ActionView
4
4
  class OutputBuffer < ActiveSupport::SafeBuffer #:nodoc:
5
5
  def initialize(*)
6
6
  super
7
- encode! if encoding_aware?
7
+ encode!
8
8
  end
9
9
 
10
10
  def <<(value)
11
+ return self if value.nil?
11
12
  super(value.to_s)
12
13
  end
13
14
  alias :append= :<<
15
+
16
+ def safe_concat(value)
17
+ return self if value.nil?
18
+ super(value.to_s)
19
+ end
14
20
  alias :safe_append= :safe_concat
15
21
  end
16
22
 
@@ -5,7 +5,7 @@ module ActionView
5
5
 
6
6
  # = Action View Context
7
7
  #
8
- # Action View contexts are supplied to Action Controller to render template.
8
+ # Action View contexts are supplied to Action Controller to render a template.
9
9
  # The default Action View context is ActionView::Base.
10
10
  #
11
11
  # In order to work with ActionController, a Context must just include this module.
@@ -25,12 +25,12 @@ module ActionView
25
25
  end
26
26
 
27
27
  # Encapsulates the interaction with the view flow so it
28
- # returns the correct buffer on yield. This is usually
29
- # overwriten by helpers to add more behavior.
28
+ # returns the correct buffer on +yield+. This is usually
29
+ # overwritten by helpers to add more behavior.
30
30
  # :api: plugin
31
31
  def _layout_for(name=nil)
32
32
  name ||= :layout
33
33
  view_flow.get(name).html_safe
34
34
  end
35
35
  end
36
- end
36
+ end