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,6 +1,6 @@
1
1
  require 'uri'
2
- require 'active_support/core_ext/hash/diff'
3
2
  require 'active_support/core_ext/hash/indifferent_access'
3
+ require 'active_support/core_ext/string/access'
4
4
  require 'action_controller/metal/exceptions'
5
5
 
6
6
  module ActionDispatch
@@ -15,38 +15,40 @@ module ActionDispatch
15
15
  # and a :method containing the required HTTP verb.
16
16
  #
17
17
  # # assert that POSTing to /items will call the create action on ItemsController
18
- # assert_recognizes({:controller => 'items', :action => 'create'}, {:path => 'items', :method => :post})
18
+ # assert_recognizes({controller: 'items', action: 'create'}, {path: 'items', method: :post})
19
19
  #
20
20
  # You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used
21
21
  # to assert that values in the query string string will end up in the params hash correctly. To test query strings you must use the
22
22
  # extras argument, appending the query string on the path directly will not work. For example:
23
23
  #
24
24
  # # assert that a path of '/items/list/1?view=print' returns the correct options
25
- # assert_recognizes({:controller => 'items', :action => 'list', :id => '1', :view => 'print'}, 'items/list/1', { :view => "print" })
25
+ # assert_recognizes({controller: 'items', action: 'list', id: '1', view: 'print'}, 'items/list/1', { view: "print" })
26
26
  #
27
27
  # The +message+ parameter allows you to pass in an error message that is displayed upon failure.
28
28
  #
29
- # ==== Examples
30
29
  # # Check the default route (i.e., the index action)
31
- # assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
30
+ # assert_recognizes({controller: 'items', action: 'index'}, 'items')
32
31
  #
33
32
  # # Test a specific action
34
- # assert_recognizes({:controller => 'items', :action => 'list'}, 'items/list')
33
+ # assert_recognizes({controller: 'items', action: 'list'}, 'items/list')
35
34
  #
36
35
  # # Test an action with a parameter
37
- # assert_recognizes({:controller => 'items', :action => 'destroy', :id => '1'}, 'items/destroy/1')
36
+ # assert_recognizes({controller: 'items', action: 'destroy', id: '1'}, 'items/destroy/1')
38
37
  #
39
38
  # # Test a custom route
40
- # assert_recognizes({:controller => 'items', :action => 'show', :id => '1'}, 'view/item1')
41
- def assert_recognizes(expected_options, path, extras={}, message=nil)
39
+ # assert_recognizes({controller: 'items', action: 'show', id: '1'}, 'view/item1')
40
+ def assert_recognizes(expected_options, path, extras={}, msg=nil)
42
41
  request = recognized_request_for(path, extras)
43
42
 
44
43
  expected_options = expected_options.clone
45
- extras.each_key { |key| expected_options.delete key } unless extras.nil?
46
44
 
47
45
  expected_options.stringify_keys!
48
- msg = build_message(message, "The recognized options <?> did not match <?>, difference: <?>",
49
- request.path_parameters, expected_options, expected_options.diff(request.path_parameters))
46
+
47
+ msg = message(msg, "") {
48
+ sprintf("The recognized options <%s> did not match <%s>, difference:",
49
+ request.path_parameters, expected_options)
50
+ }
51
+
50
52
  assert_equal(expected_options, request.path_parameters, msg)
51
53
  end
52
54
 
@@ -56,25 +58,22 @@ module ActionDispatch
56
58
  #
57
59
  # The +defaults+ parameter is unused.
58
60
  #
59
- # ==== Examples
60
61
  # # Asserts that the default action is generated for a route with no action
61
- # assert_generates "/items", :controller => "items", :action => "index"
62
+ # assert_generates "/items", controller: "items", action: "index"
62
63
  #
63
64
  # # Tests that the list action is properly routed
64
- # assert_generates "/items/list", :controller => "items", :action => "list"
65
+ # assert_generates "/items/list", controller: "items", action: "list"
65
66
  #
66
67
  # # Tests the generation of a route with a parameter
67
- # assert_generates "/items/list/1", { :controller => "items", :action => "list", :id => "1" }
68
+ # assert_generates "/items/list/1", { controller: "items", action: "list", id: "1" }
68
69
  #
69
70
  # # Asserts that the generated route gives us our custom route
70
- # assert_generates "changesets/12", { :controller => 'scm', :action => 'show_diff', :revision => "12" }
71
+ # assert_generates "changesets/12", { controller: 'scm', action: 'show_diff', revision: "12" }
71
72
  def assert_generates(expected_path, options, defaults={}, extras = {}, message=nil)
72
73
  if expected_path =~ %r{://}
73
- begin
74
+ fail_on(URI::InvalidURIError) do
74
75
  uri = URI.parse(expected_path)
75
76
  expected_path = uri.path.to_s.empty? ? "/" : uri.path
76
- rescue URI::InvalidURIError => e
77
- raise ActionController::RoutingError, e.message
78
77
  end
79
78
  else
80
79
  expected_path = "/#{expected_path}" unless expected_path.first == '/'
@@ -82,12 +81,12 @@ module ActionDispatch
82
81
  # Load routes.rb if it hasn't been loaded.
83
82
 
84
83
  generated_path, extra_keys = @routes.generate_extras(options, defaults)
85
- found_extras = options.reject {|k, v| ! extra_keys.include? k}
84
+ found_extras = options.reject { |k, _| ! extra_keys.include? k }
86
85
 
87
- msg = build_message(message, "found extras <?>, not <?>", found_extras, extras)
86
+ msg = message || sprintf("found extras <%s>, not <%s>", found_extras, extras)
88
87
  assert_equal(extras, found_extras, msg)
89
88
 
90
- msg = build_message(message, "The generated path <?> did not match <?>", generated_path,
89
+ msg = message || sprintf("The generated path <%s> did not match <%s>", generated_path,
91
90
  expected_path)
92
91
  assert_equal(expected_path, generated_path, msg)
93
92
  end
@@ -99,21 +98,20 @@ module ActionDispatch
99
98
  # The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
100
99
  # +message+ parameter allows you to specify a custom error message to display upon failure.
101
100
  #
102
- # ==== Examples
103
101
  # # Assert a basic route: a controller with the default action (index)
104
- # assert_routing '/home', :controller => 'home', :action => 'index'
102
+ # assert_routing '/home', controller: 'home', action: 'index'
105
103
  #
106
104
  # # Test a route generated with a specific controller, action, and parameter (id)
107
- # assert_routing '/entries/show/23', :controller => 'entries', :action => 'show', :id => 23
105
+ # assert_routing '/entries/show/23', controller: 'entries', action: 'show', id: 23
108
106
  #
109
107
  # # Assert a basic route (controller + default action), with an error message if it fails
110
- # assert_routing '/store', { :controller => 'store', :action => 'index' }, {}, {}, 'Route for store index not generated properly'
108
+ # assert_routing '/store', { controller: 'store', action: 'index' }, {}, {}, 'Route for store index not generated properly'
111
109
  #
112
110
  # # Tests a route, providing a defaults hash
113
- # assert_routing 'controller/action/9', {:id => "9", :item => "square"}, {:controller => "controller", :action => "action"}, {}, {:item => "square"}
111
+ # assert_routing 'controller/action/9', {id: "9", item: "square"}, {controller: "controller", action: "action"}, {}, {item: "square"}
114
112
  #
115
113
  # # Tests a route with a HTTP method
116
- # assert_routing({ :method => 'put', :path => '/product/321' }, { :controller => "product", :action => "update", :id => "321" })
114
+ # assert_routing({ method: 'put', path: '/product/321' }, { controller: "product", action: "update", id: "321" })
117
115
  def assert_routing(path, options, defaults={}, extras={}, message=nil)
118
116
  assert_recognizes(options, path, extras, message)
119
117
 
@@ -122,7 +120,7 @@ module ActionDispatch
122
120
  options[:controller] = "/#{controller}"
123
121
  end
124
122
 
125
- generate_options = options.dup.delete_if{ |k,v| defaults.key?(k) }
123
+ generate_options = options.dup.delete_if{ |k, _| defaults.key?(k) }
126
124
  assert_generates(path.is_a?(Hash) ? path[:path] : path, generate_options, defaults, extras, message)
127
125
  end
128
126
 
@@ -131,16 +129,13 @@ module ActionDispatch
131
129
  # with a new RouteSet instance.
132
130
  #
133
131
  # The new instance is yielded to the passed block. Typically the block
134
- # will create some routes using <tt>map.draw { map.connect ... }</tt>:
132
+ # will create some routes using <tt>set.draw { match ... }</tt>:
135
133
  #
136
134
  # with_routing do |set|
137
- # set.draw do |map|
138
- # map.connect ':controller/:action/:id'
139
- # assert_equal(
140
- # ['/content/10/show', {}],
141
- # map.generate(:controller => 'content', :id => 10, :action => 'show')
142
- # end
135
+ # set.draw do
136
+ # resources :users
143
137
  # end
138
+ # assert_equal "/users", users_path
144
139
  # end
145
140
  #
146
141
  def with_routing
@@ -191,14 +186,12 @@ module ActionDispatch
191
186
  request = ActionController::TestRequest.new
192
187
 
193
188
  if path =~ %r{://}
194
- begin
189
+ fail_on(URI::InvalidURIError) do
195
190
  uri = URI.parse(path)
196
191
  request.env["rack.url_scheme"] = uri.scheme || "http"
197
192
  request.host = uri.host if uri.host
198
193
  request.port = uri.port if uri.port
199
194
  request.path = uri.path.to_s.empty? ? "/" : uri.path
200
- rescue URI::InvalidURIError => e
201
- raise ActionController::RoutingError, e.message
202
195
  end
203
196
  else
204
197
  path = "/#{path}" unless path.first == "/"
@@ -207,11 +200,19 @@ module ActionDispatch
207
200
 
208
201
  request.request_method = method if method
209
202
 
210
- params = @routes.recognize_path(path, { :method => method, :extras => extras })
203
+ params = fail_on(ActionController::RoutingError) do
204
+ @routes.recognize_path(path, { :method => method, :extras => extras })
205
+ end
211
206
  request.path_parameters = params.with_indifferent_access
212
207
 
213
208
  request
214
209
  end
210
+
211
+ def fail_on(exception_class)
212
+ yield
213
+ rescue exception_class => e
214
+ raise MiniTest::Assertion, e.message
215
+ end
215
216
  end
216
217
  end
217
218
  end
@@ -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.
@@ -379,8 +377,8 @@ module ActionDispatch
379
377
  node.content.gsub(/<!\[CDATA\[(.*)(\]\]>)?/m) { Rack::Utils.escapeHTML($1) }
380
378
  end
381
379
 
382
- selected = elements.map do |_element|
383
- text = _element.children.select{ |c| not c.tag? }.map{ |c| fix_content[c] }.join
380
+ selected = elements.map do |elem|
381
+ text = elem.children.select{ |c| not c.tag? }.map{ |c| fix_content[c] }.join
384
382
  root = HTML::Document.new(CGI.unescapeHTML("<encoded>#{text}</encoded>")).root
385
383
  css_select(root, "encoded:root", &block)[0]
386
384
  end
@@ -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)