actionpack 3.2.22.5 → 4.0.0.beta1

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +641 -418
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller.rb +1 -8
  6. data/lib/abstract_controller/asset_paths.rb +2 -2
  7. data/lib/abstract_controller/base.rb +39 -37
  8. data/lib/abstract_controller/callbacks.rb +101 -82
  9. data/lib/abstract_controller/collector.rb +7 -3
  10. data/lib/abstract_controller/helpers.rb +23 -11
  11. data/lib/abstract_controller/layouts.rb +68 -73
  12. data/lib/abstract_controller/logger.rb +1 -2
  13. data/lib/abstract_controller/rendering.rb +22 -13
  14. data/lib/abstract_controller/translation.rb +16 -1
  15. data/lib/abstract_controller/url_for.rb +6 -6
  16. data/lib/abstract_controller/view_paths.rb +1 -1
  17. data/lib/action_controller.rb +15 -6
  18. data/lib/action_controller/base.rb +46 -22
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/caching/fragments.rb +23 -53
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  23. data/lib/action_controller/log_subscriber.rb +11 -8
  24. data/lib/action_controller/metal.rb +16 -30
  25. data/lib/action_controller/metal/conditional_get.rb +76 -32
  26. data/lib/action_controller/metal/data_streaming.rb +20 -26
  27. data/lib/action_controller/metal/exceptions.rb +19 -6
  28. data/lib/action_controller/metal/flash.rb +24 -9
  29. data/lib/action_controller/metal/force_ssl.rb +32 -9
  30. data/lib/action_controller/metal/head.rb +25 -4
  31. data/lib/action_controller/metal/helpers.rb +6 -9
  32. data/lib/action_controller/metal/hide_actions.rb +1 -2
  33. data/lib/action_controller/metal/http_authentication.rb +105 -87
  34. data/lib/action_controller/metal/implicit_render.rb +1 -1
  35. data/lib/action_controller/metal/instrumentation.rb +2 -1
  36. data/lib/action_controller/metal/live.rb +141 -0
  37. data/lib/action_controller/metal/mime_responds.rb +161 -47
  38. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  39. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  40. data/lib/action_controller/metal/redirecting.rb +15 -20
  41. data/lib/action_controller/metal/renderers.rb +11 -9
  42. data/lib/action_controller/metal/rendering.rb +8 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  44. data/lib/action_controller/metal/responder.rb +20 -19
  45. data/lib/action_controller/metal/streaming.rb +12 -18
  46. data/lib/action_controller/metal/strong_parameters.rb +516 -0
  47. data/lib/action_controller/metal/testing.rb +13 -18
  48. data/lib/action_controller/metal/url_for.rb +27 -25
  49. data/lib/action_controller/model_naming.rb +12 -0
  50. data/lib/action_controller/railtie.rb +33 -17
  51. data/lib/action_controller/railties/helpers.rb +22 -0
  52. data/lib/action_controller/record_identifier.rb +18 -72
  53. data/lib/action_controller/test_case.rb +215 -123
  54. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  55. data/lib/action_dispatch.rb +27 -19
  56. data/lib/action_dispatch/http/cache.rb +63 -11
  57. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  58. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  59. data/lib/action_dispatch/http/headers.rb +27 -19
  60. data/lib/action_dispatch/http/mime_negotiation.rb +25 -2
  61. data/lib/action_dispatch/http/mime_type.rb +145 -113
  62. data/lib/action_dispatch/http/mime_types.rb +1 -1
  63. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  64. data/lib/action_dispatch/http/parameters.rb +12 -5
  65. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  66. data/lib/action_dispatch/http/request.rb +49 -18
  67. data/lib/action_dispatch/http/response.rb +129 -35
  68. data/lib/action_dispatch/http/upload.rb +60 -17
  69. data/lib/action_dispatch/http/url.rb +53 -31
  70. data/lib/action_dispatch/journey.rb +5 -0
  71. data/lib/action_dispatch/journey/backwards.rb +5 -0
  72. data/lib/action_dispatch/journey/formatter.rb +146 -0
  73. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  74. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  75. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  76. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  77. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  78. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  79. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  80. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  81. data/lib/action_dispatch/journey/parser.rb +206 -0
  82. data/lib/action_dispatch/journey/parser.y +47 -0
  83. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  84. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  85. data/lib/action_dispatch/journey/route.rb +116 -0
  86. data/lib/action_dispatch/journey/router.rb +164 -0
  87. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  88. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  89. data/lib/action_dispatch/journey/routes.rb +75 -0
  90. data/lib/action_dispatch/journey/scanner.rb +61 -0
  91. data/lib/action_dispatch/journey/visitors.rb +189 -0
  92. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  93. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  94. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  95. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  96. data/lib/action_dispatch/middleware/cookies.rb +168 -57
  97. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  98. data/lib/action_dispatch/middleware/exception_wrapper.rb +27 -3
  99. data/lib/action_dispatch/middleware/flash.rb +58 -58
  100. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  101. data/lib/action_dispatch/middleware/public_exceptions.rb +31 -14
  102. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  103. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  104. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  105. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  106. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  107. data/lib/action_dispatch/middleware/session/cookie_store.rb +81 -7
  108. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  109. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  110. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  111. data/lib/action_dispatch/middleware/stack.rb +6 -1
  112. data/lib/action_dispatch/middleware/static.rb +5 -24
  113. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  114. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  115. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +3 -3
  116. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  117. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +121 -5
  118. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  119. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  122. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  124. data/lib/action_dispatch/railtie.rb +16 -6
  125. data/lib/action_dispatch/request/session.rb +181 -0
  126. data/lib/action_dispatch/routing.rb +41 -40
  127. data/lib/action_dispatch/routing/inspector.rb +240 -0
  128. data/lib/action_dispatch/routing/mapper.rb +501 -273
  129. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  130. data/lib/action_dispatch/routing/redirection.rb +46 -29
  131. data/lib/action_dispatch/routing/route_set.rb +203 -164
  132. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  133. data/lib/action_dispatch/routing/url_for.rb +48 -33
  134. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  135. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  136. data/lib/action_dispatch/testing/assertions/routing.rb +40 -39
  137. data/lib/action_dispatch/testing/assertions/selector.rb +15 -20
  138. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  139. data/lib/action_dispatch/testing/integration.rb +41 -22
  140. data/lib/action_dispatch/testing/test_process.rb +9 -6
  141. data/lib/action_dispatch/testing/test_request.rb +7 -3
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_pack/version.rb +4 -4
  144. data/lib/action_view.rb +17 -8
  145. data/lib/action_view/base.rb +15 -34
  146. data/lib/action_view/buffers.rb +1 -1
  147. data/lib/action_view/context.rb +4 -4
  148. data/lib/action_view/dependency_tracker.rb +91 -0
  149. data/lib/action_view/digestor.rb +85 -0
  150. data/lib/action_view/flows.rb +1 -4
  151. data/lib/action_view/helpers.rb +2 -4
  152. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  153. data/lib/action_view/helpers/asset_tag_helper.rb +211 -353
  154. data/lib/action_view/helpers/asset_url_helper.rb +354 -0
  155. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  156. data/lib/action_view/helpers/cache_helper.rb +150 -18
  157. data/lib/action_view/helpers/capture_helper.rb +42 -29
  158. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  159. data/lib/action_view/helpers/date_helper.rb +268 -247
  160. data/lib/action_view/helpers/debug_helper.rb +10 -11
  161. data/lib/action_view/helpers/form_helper.rb +904 -547
  162. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  163. data/lib/action_view/helpers/form_tag_helper.rb +188 -88
  164. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  165. data/lib/action_view/helpers/number_helper.rb +148 -354
  166. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  167. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  168. data/lib/action_view/helpers/rendering_helper.rb +2 -4
  169. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  170. data/lib/action_view/helpers/tag_helper.rb +43 -37
  171. data/lib/action_view/helpers/tags.rb +39 -0
  172. data/lib/action_view/helpers/tags/base.rb +148 -0
  173. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  174. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  175. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  176. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  177. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  178. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  179. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  180. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  181. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  182. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  183. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  184. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  185. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  186. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  187. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  188. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  189. data/lib/action_view/helpers/tags/label.rb +65 -0
  190. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  191. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  192. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  193. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  194. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  195. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  196. data/lib/action_view/helpers/tags/select.rb +41 -0
  197. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  198. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  199. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  200. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  201. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  202. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  203. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  204. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  205. data/lib/action_view/helpers/text_helper.rb +126 -113
  206. data/lib/action_view/helpers/translation_helper.rb +32 -16
  207. data/lib/action_view/helpers/url_helper.rb +200 -271
  208. data/lib/action_view/locale/en.yml +1 -105
  209. data/lib/action_view/log_subscriber.rb +6 -4
  210. data/lib/action_view/lookup_context.rb +15 -39
  211. data/lib/action_view/model_naming.rb +12 -0
  212. data/lib/action_view/path_set.rb +9 -39
  213. data/lib/action_view/railtie.rb +6 -22
  214. data/lib/action_view/record_identifier.rb +84 -0
  215. data/lib/action_view/renderer/abstract_renderer.rb +10 -19
  216. data/lib/action_view/renderer/partial_renderer.rb +144 -81
  217. data/lib/action_view/renderer/renderer.rb +2 -19
  218. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  219. data/lib/action_view/renderer/template_renderer.rb +14 -13
  220. data/lib/action_view/routing_url_for.rb +107 -0
  221. data/lib/action_view/template.rb +22 -21
  222. data/lib/action_view/template/error.rb +22 -12
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/handlers/builder.rb +1 -1
  225. data/lib/action_view/template/handlers/erb.rb +11 -16
  226. data/lib/action_view/template/handlers/raw.rb +11 -0
  227. data/lib/action_view/template/resolver.rb +111 -83
  228. data/lib/action_view/template/text.rb +12 -8
  229. data/lib/action_view/template/types.rb +57 -0
  230. data/lib/action_view/test_case.rb +66 -43
  231. data/lib/action_view/testing/resolvers.rb +3 -2
  232. data/lib/action_view/vendor/html-scanner.rb +20 -0
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  235. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +18 -7
  236. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +1 -1
  237. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  238. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  239. metadata +135 -125
  240. data/lib/action_controller/caching/actions.rb +0 -185
  241. data/lib/action_controller/caching/pages.rb +0 -187
  242. data/lib/action_controller/caching/sweeping.rb +0 -97
  243. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  244. data/lib/action_controller/metal/compatibility.rb +0 -65
  245. data/lib/action_controller/metal/session_management.rb +0 -14
  246. data/lib/action_controller/railties/paths.rb +0 -25
  247. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  248. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  249. data/lib/action_dispatch/middleware/head.rb +0 -18
  250. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  251. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  252. data/lib/action_view/asset_paths.rb +0 -142
  253. data/lib/action_view/helpers/asset_paths.rb +0 -7
  254. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  255. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  256. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  257. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  258. data/lib/sprockets/assets.rake +0 -99
  259. data/lib/sprockets/bootstrap.rb +0 -37
  260. data/lib/sprockets/compressors.rb +0 -83
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  263. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  264. data/lib/sprockets/railtie.rb +0 -62
  265. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,4 +1,4 @@
1
- require 'action_controller/vendor/html-scanner'
1
+ require 'action_view/vendor/html-scanner'
2
2
  require 'active_support/core_ext/object/inclusion'
3
3
 
4
4
  #--
@@ -39,7 +39,6 @@ module ActionDispatch
39
39
  # The selector may be a CSS selector expression (String), an expression
40
40
  # with substitution values (Array) or an HTML::Selector object.
41
41
  #
42
- # ==== Examples
43
42
  # # Selects all div tags
44
43
  # divs = css_select("div")
45
44
  #
@@ -58,7 +57,6 @@ module ActionDispatch
58
57
  # inputs = css_select(form, "input")
59
58
  # ...
60
59
  # end
61
- #
62
60
  def css_select(*args)
63
61
  # See assert_select to understand what's going on here.
64
62
  arg = args.shift
@@ -157,8 +155,6 @@ module ActionDispatch
157
155
  # If the method is called with a block, once all equality tests are
158
156
  # evaluated the block is called with an array of all matched elements.
159
157
  #
160
- # ==== Examples
161
- #
162
158
  # # At least one form element
163
159
  # assert_select "form"
164
160
  #
@@ -169,7 +165,7 @@ module ActionDispatch
169
165
  # assert_select "title", "Welcome"
170
166
  #
171
167
  # # Page title is "Welcome" and there is only one title element
172
- # assert_select "title", {:count => 1, :text => "Welcome"},
168
+ # assert_select "title", {count: 1, text: "Welcome"},
173
169
  # "Wrong title or more than one title element"
174
170
  #
175
171
  # # Page contains no forms
@@ -271,7 +267,7 @@ module ActionDispatch
271
267
  text.strip! unless NO_STRIP.include?(match.name)
272
268
  text.sub!(/\A\n/, '') if match.name == "textarea"
273
269
  unless match_with.is_a?(Regexp) ? (text =~ match_with) : (text == match_with.to_s)
274
- content_mismatch ||= build_message(message, "<?> expected but was\n<?>.", match_with, text)
270
+ content_mismatch ||= sprintf("<%s> expected but was\n<%s>.", match_with, text)
275
271
  true
276
272
  end
277
273
  end
@@ -280,7 +276,7 @@ module ActionDispatch
280
276
  html = match.children.map(&:to_s).join
281
277
  html.strip! unless NO_STRIP.include?(match.name)
282
278
  unless match_with.is_a?(Regexp) ? (html =~ match_with) : (html == match_with.to_s)
283
- content_mismatch ||= build_message(message, "<?> expected but was\n<?>.", match_with, html)
279
+ content_mismatch ||= sprintf("<%s> expected but was\n<%s>.", match_with, html)
284
280
  true
285
281
  end
286
282
  end
@@ -290,12 +286,15 @@ module ActionDispatch
290
286
  message ||= content_mismatch if matches.empty?
291
287
  # Test minimum/maximum occurrence.
292
288
  min, max, count = equals[:minimum], equals[:maximum], equals[:count]
289
+
290
+ # FIXME: minitest provides messaging when we use assert_operator,
291
+ # so is this custom message really needed?
293
292
  message = message || %(Expected #{count_description(min, max, count)} matching "#{selector.to_s}", found #{matches.size}.)
294
293
  if count
295
- assert matches.size == count, message
294
+ assert_equal matches.size, count, message
296
295
  else
297
- assert matches.size >= min, message if min
298
- assert matches.size <= max, message if max
296
+ assert_operator matches.size, :>=, min, message if min
297
+ assert_operator matches.size, :<=, max, message if max
299
298
  end
300
299
 
301
300
  # If a block is given call that block. Set @selected to allow
@@ -337,9 +336,8 @@ module ActionDispatch
337
336
  # The content of each element is un-encoded, and wrapped in the root
338
337
  # element +encoded+. It then calls the block with all un-encoded elements.
339
338
  #
340
- # ==== Examples
341
- # # Selects all bold tags from within the title of an ATOM feed's entries (perhaps to nab a section name prefix)
342
- # assert_select_feed :atom, 1.0 do
339
+ # # Selects all bold tags from within the title of an Atom feed's entries (perhaps to nab a section name prefix)
340
+ # assert_select "feed[xmlns='http://www.w3.org/2005/Atom']" do
343
341
  # # Select each entry item and then the title item
344
342
  # assert_select "entry>title" do
345
343
  # # Run assertions on the encoded title elements
@@ -351,7 +349,7 @@ module ActionDispatch
351
349
  #
352
350
  #
353
351
  # # Selects all paragraph tags from within the description of an RSS feed
354
- # assert_select_feed :rss, 2.0 do
352
+ # assert_select "rss[version=2.0]" do
355
353
  # # Select description element of each feed item.
356
354
  # assert_select "channel>item>description" do
357
355
  # # Run assertions on the encoded elements.
@@ -398,8 +396,6 @@ module ActionDispatch
398
396
  # You must enable deliveries for this assertion to work, use:
399
397
  # ActionMailer::Base.perform_deliveries = true
400
398
  #
401
- # ==== Examples
402
- #
403
399
  # assert_select_email do
404
400
  # assert_select "h1", "Email alert"
405
401
  # end
@@ -410,13 +406,12 @@ module ActionDispatch
410
406
  # # Work with items here...
411
407
  # end
412
408
  # end
413
- #
414
409
  def assert_select_email(&block)
415
410
  deliveries = ActionMailer::Base.deliveries
416
411
  assert !deliveries.empty?, "No e-mail in delivery list"
417
412
 
418
- for delivery in deliveries
419
- for part in (delivery.parts.empty? ? [delivery] : delivery.parts)
413
+ deliveries.each do |delivery|
414
+ (delivery.parts.empty? ? [delivery] : delivery.parts).each do |part|
420
415
  if part["Content-Type"].to_s =~ /^text\/html\W/
421
416
  root = HTML::Document.new(part.body.to_s).root
422
417
  assert_select root, ":root", &block
@@ -1,4 +1,4 @@
1
- require 'action_controller/vendor/html-scanner'
1
+ require 'action_view/vendor/html-scanner'
2
2
 
3
3
  module ActionDispatch
4
4
  module Assertions
@@ -48,47 +48,45 @@ module ActionDispatch
48
48
  # * if the condition is +true+, the value must not be +nil+.
49
49
  # * if the condition is +false+ or +nil+, the value must be +nil+.
50
50
  #
51
- # === Examples
52
- #
53
51
  # # Assert that there is a "span" tag
54
- # assert_tag :tag => "span"
52
+ # assert_tag tag: "span"
55
53
  #
56
54
  # # Assert that there is a "span" tag with id="x"
57
- # assert_tag :tag => "span", :attributes => { :id => "x" }
55
+ # assert_tag tag: "span", attributes: { id: "x" }
58
56
  #
59
57
  # # Assert that there is a "span" tag using the short-hand
60
58
  # assert_tag :span
61
59
  #
62
60
  # # Assert that there is a "span" tag with id="x" using the short-hand
63
- # assert_tag :span, :attributes => { :id => "x" }
61
+ # assert_tag :span, attributes: { id: "x" }
64
62
  #
65
63
  # # Assert that there is a "span" inside of a "div"
66
- # assert_tag :tag => "span", :parent => { :tag => "div" }
64
+ # assert_tag tag: "span", parent: { tag: "div" }
67
65
  #
68
66
  # # Assert that there is a "span" somewhere inside a table
69
- # assert_tag :tag => "span", :ancestor => { :tag => "table" }
67
+ # assert_tag tag: "span", ancestor: { tag: "table" }
70
68
  #
71
69
  # # Assert that there is a "span" with at least one "em" child
72
- # assert_tag :tag => "span", :child => { :tag => "em" }
70
+ # assert_tag tag: "span", child: { tag: "em" }
73
71
  #
74
72
  # # Assert that there is a "span" containing a (possibly nested)
75
73
  # # "strong" tag.
76
- # assert_tag :tag => "span", :descendant => { :tag => "strong" }
74
+ # assert_tag tag: "span", descendant: { tag: "strong" }
77
75
  #
78
76
  # # Assert that there is a "span" containing between 2 and 4 "em" tags
79
77
  # # as immediate children
80
- # assert_tag :tag => "span",
81
- # :children => { :count => 2..4, :only => { :tag => "em" } }
78
+ # assert_tag tag: "span",
79
+ # children: { count: 2..4, only: { tag: "em" } }
82
80
  #
83
81
  # # Get funky: assert that there is a "div", with an "ul" ancestor
84
82
  # # and an "li" parent (with "class" = "enum"), and containing a
85
83
  # # "span" descendant that contains text matching /hello world/
86
- # assert_tag :tag => "div",
87
- # :ancestor => { :tag => "ul" },
88
- # :parent => { :tag => "li",
89
- # :attributes => { :class => "enum" } },
90
- # :descendant => { :tag => "span",
91
- # :child => /hello world/ }
84
+ # assert_tag tag: "div",
85
+ # ancestor: { tag: "ul" },
86
+ # parent: { tag: "li",
87
+ # attributes: { class: "enum" } },
88
+ # descendant: { tag: "span",
89
+ # child: /hello world/ }
92
90
  #
93
91
  # <b>Please note</b>: +assert_tag+ and +assert_no_tag+ only work
94
92
  # with well-formed XHTML. They recognize a few tags as implicitly self-closing
@@ -104,17 +102,16 @@ module ActionDispatch
104
102
  # Identical to +assert_tag+, but asserts that a matching tag does _not_
105
103
  # exist. (See +assert_tag+ for a full discussion of the syntax.)
106
104
  #
107
- # === Examples
108
105
  # # Assert that there is not a "div" containing a "p"
109
- # assert_no_tag :tag => "div", :descendant => { :tag => "p" }
106
+ # assert_no_tag tag: "div", descendant: { tag: "p" }
110
107
  #
111
108
  # # Assert that an unordered list is empty
112
- # assert_no_tag :tag => "ul", :descendant => { :tag => "li" }
109
+ # assert_no_tag tag: "ul", descendant: { tag: "li" }
113
110
  #
114
111
  # # Assert that there is not a "p" tag with between 1 to 3 "img" tags
115
112
  # # as immediate children
116
- # assert_no_tag :tag => "p",
117
- # :children => { :count => 1..3, :only => { :tag => "img" } }
113
+ # assert_no_tag tag: "p",
114
+ # children: { count: 1..3, only: { tag: "img" } }
118
115
  def assert_no_tag(*opts)
119
116
  opts = opts.size > 1 ? opts.last.merge({ :tag => opts.first.to_s }) : opts.first
120
117
  tag = find_tag(opts)
@@ -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:
@@ -21,14 +20,14 @@ module ActionDispatch
21
20
  # - +headers+: 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+.
29
+ # You can also perform POST, PATCH, PUT, DELETE, and HEAD requests with
30
+ # +#post+, +#patch+, +#put+, +#delete+, and +#head+.
32
31
  def get(path, parameters = nil, headers = nil)
33
32
  process :get, path, parameters, headers
34
33
  end
@@ -39,6 +38,12 @@ module ActionDispatch
39
38
  process :post, path, parameters, headers
40
39
  end
41
40
 
41
+ # Performs a PATCH request with the given parameters. See +#get+ for more
42
+ # details.
43
+ def patch(path, parameters = nil, headers = nil)
44
+ process :patch, path, parameters, headers
45
+ end
46
+
42
47
  # Performs a PUT request with the given parameters. See +#get+ for more
43
48
  # details.
44
49
  def put(path, parameters = nil, headers = nil)
@@ -57,12 +62,18 @@ module ActionDispatch
57
62
  process :head, path, parameters, headers
58
63
  end
59
64
 
65
+ # Performs a OPTIONS request with the given parameters. See +#get+ for
66
+ # more details.
67
+ def options(path, parameters = nil, headers = nil)
68
+ process :options, path, parameters, headers
69
+ end
70
+
60
71
  # Performs an XMLHttpRequest request with the given parameters, mirroring
61
72
  # a request from the Prototype library.
62
73
  #
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.
74
+ # The request_method is +:get+, +:post+, +:patch+, +:put+, +:delete+ or
75
+ # +:head+; the parameters are +nil+, a hash, or a url-encoded or multipart
76
+ # string; the headers are a hash.
66
77
  def xml_http_request(request_method, path, parameters = nil, headers = nil)
67
78
  headers ||= {}
68
79
  headers['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
@@ -102,6 +113,12 @@ module ActionDispatch
102
113
  request_via_redirect(:post, path, parameters, headers)
103
114
  end
104
115
 
116
+ # Performs a PATCH request, following any subsequent redirect.
117
+ # See +request_via_redirect+ for more information.
118
+ def patch_via_redirect(path, parameters = nil, headers = nil)
119
+ request_via_redirect(:patch, path, parameters, headers)
120
+ end
121
+
105
122
  # Performs a PUT request, following any subsequent redirect.
106
123
  # See +request_via_redirect+ for more information.
107
124
  def put_via_redirect(path, parameters = nil, headers = nil)
@@ -126,7 +143,7 @@ module ActionDispatch
126
143
  class Session
127
144
  DEFAULT_HOST = "www.example.com"
128
145
 
129
- include Test::Unit::Assertions
146
+ include MiniTest::Assertions
130
147
  include TestProcess, RequestHelpers, Assertions
131
148
 
132
149
  %w( status status_message headers body redirect? ).each do |method|
@@ -256,7 +273,7 @@ module ActionDispatch
256
273
  if path =~ %r{://}
257
274
  location = URI.parse(path)
258
275
  https! URI::HTTPS === location if location.scheme
259
- host! location.host if location.host
276
+ host! "#{location.host}:#{location.port}" if location.host
260
277
  path = location.query ? "#{location.path}?#{location.query}" : location.path
261
278
  end
262
279
 
@@ -324,12 +341,12 @@ module ActionDispatch
324
341
  @integration_session = Integration::Session.new(app)
325
342
  end
326
343
 
327
- %w(get post put head delete cookies assigns
344
+ %w(get post patch put head delete options cookies assigns
328
345
  xml_http_request xhr get_via_redirect post_via_redirect).each do |method|
329
346
  define_method(method) do |*args|
330
347
  reset! unless integration_session
331
348
  # reset the html_document variable, but only for new get/post calls
332
- @html_document = nil unless method.in?(["cookies", "assigns"])
349
+ @html_document = nil unless method == 'cookies' || method == 'assigns'
333
350
  integration_session.__send__(method, *args).tap do
334
351
  copy_session_variables!
335
352
  end
@@ -367,7 +384,7 @@ module ActionDispatch
367
384
  end
368
385
 
369
386
  def default_url_options=(options)
370
- integration_session.url_options
387
+ reset! unless integration_session
371
388
  integration_session.default_url_options = options
372
389
  end
373
390
 
@@ -413,8 +430,8 @@ module ActionDispatch
413
430
  # assert_equal 200, status
414
431
  #
415
432
  # # post the login and follow through to the home page
416
- # post "/login", :username => people(:jamis).username,
417
- # :password => people(:jamis).password
433
+ # post "/login", username: people(:jamis).username,
434
+ # password: people(:jamis).password
418
435
  # follow_redirect!
419
436
  # assert_equal 200, status
420
437
  # assert_equal "/home", path
@@ -447,13 +464,13 @@ module ActionDispatch
447
464
  # module CustomAssertions
448
465
  # def enter(room)
449
466
  # # reference a named route, for maximum internal consistency!
450
- # get(room_url(:id => room.id))
467
+ # get(room_url(id: room.id))
451
468
  # assert(...)
452
469
  # ...
453
470
  # end
454
471
  #
455
472
  # def speak(room, message)
456
- # xml_http_request "/say/#{room.id}", :message => message
473
+ # xml_http_request "/say/#{room.id}", message: message
457
474
  # assert(...)
458
475
  # ...
459
476
  # end
@@ -463,8 +480,8 @@ module ActionDispatch
463
480
  # open_session do |sess|
464
481
  # sess.extend(CustomAssertions)
465
482
  # who = people(who)
466
- # sess.post "/login", :username => who.username,
467
- # :password => who.password
483
+ # sess.post "/login", username: who.username,
484
+ # password: who.password
468
485
  # assert(...)
469
486
  # end
470
487
  # end
@@ -477,9 +494,11 @@ module ActionDispatch
477
494
  @@app = nil
478
495
 
479
496
  def self.app
480
- # DEPRECATE Rails application fallback
481
- # This should be set by the initializer
482
- @@app || (defined?(Rails.application) && Rails.application) || nil
497
+ if !@@app && !ActionDispatch.test_app
498
+ ActiveSupport::Deprecation.warn "Rails application fallback is deprecated and no longer works, please set ActionDispatch.test_app"
499
+ end
500
+
501
+ @@app || ActionDispatch.test_app
483
502
  end
484
503
 
485
504
  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
@@ -1,9 +1,9 @@
1
1
  module ActionPack
2
2
  module VERSION #:nodoc:
3
- MAJOR = 3
4
- MINOR = 2
5
- TINY = 22
6
- PRE = "5"
3
+ MAJOR = 4
4
+ MINOR = 0
5
+ TINY = 0
6
+ PRE = "beta1"
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
9
9
  end