actionpack 3.2.19 → 4.2.11.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/array/extract_options'
2
+
1
3
  module ActionDispatch
2
4
  module Routing
3
5
  class RoutesProxy #:nodoc:
@@ -6,8 +8,9 @@ module ActionDispatch
6
8
  attr_accessor :scope, :routes
7
9
  alias :_routes :routes
8
10
 
9
- def initialize(routes, scope)
11
+ def initialize(routes, scope, helpers)
10
12
  @routes, @scope = routes, scope
13
+ @helpers = helpers
11
14
  end
12
15
 
13
16
  def url_options
@@ -17,16 +20,16 @@ module ActionDispatch
17
20
  end
18
21
 
19
22
  def respond_to?(method, include_private = false)
20
- super || routes.url_helpers.respond_to?(method)
23
+ super || @helpers.respond_to?(method)
21
24
  end
22
25
 
23
26
  def method_missing(method, *args)
24
- if routes.url_helpers.respond_to?(method)
27
+ if @helpers.respond_to?(method)
25
28
  self.class.class_eval <<-RUBY, __FILE__, __LINE__ + 1
26
29
  def #{method}(*args)
27
30
  options = args.extract_options!
28
31
  args << url_options.merge((options || {}).symbolize_keys)
29
- routes.url_helpers.#{method}(*args)
32
+ @helpers.#{method}(*args)
30
33
  end
31
34
  RUBY
32
35
  send(method, *args)
@@ -8,7 +8,8 @@ module ActionDispatch
8
8
  #
9
9
  # <b>Tip:</b> If you need to generate URLs from your models or some other place,
10
10
  # then ActionController::UrlFor is what you're looking for. Read on for
11
- # an introduction.
11
+ # an introduction. In general, this module should not be included on its own,
12
+ # as it is usually included by url_helpers (as in Rails.application.routes.url_helpers).
12
13
  #
13
14
  # == URL generation from parameters
14
15
  #
@@ -17,9 +18,9 @@ module ActionDispatch
17
18
  # of parameters. For example, you've probably had the chance to write code
18
19
  # like this in one of your views:
19
20
  #
20
- # <%= link_to('Click here', :controller => 'users',
21
- # :action => 'new', :message => 'Welcome!') %>
22
- # # => "/users/new?message=Welcome%21"
21
+ # <%= link_to('Click here', controller: 'users',
22
+ # action: 'new', message: 'Welcome!') %>
23
+ # # => <a href="/users/new?message=Welcome%21">Click here</a>
23
24
  #
24
25
  # link_to, and all other functions that require URL generation functionality,
25
26
  # actually use ActionController::UrlFor under the hood. And in particular,
@@ -27,22 +28,22 @@ module ActionDispatch
27
28
  # the same path as the above example by using the following code:
28
29
  #
29
30
  # include UrlFor
30
- # url_for(:controller => 'users',
31
- # :action => 'new',
32
- # :message => 'Welcome!',
33
- # :only_path => true)
31
+ # url_for(controller: 'users',
32
+ # action: 'new',
33
+ # message: 'Welcome!',
34
+ # only_path: true)
34
35
  # # => "/users/new?message=Welcome%21"
35
36
  #
36
- # Notice the <tt>:only_path => true</tt> part. This is because UrlFor has no
37
+ # Notice the <tt>only_path: true</tt> part. This is because UrlFor has no
37
38
  # information about the website hostname that your Rails app is serving. So if you
38
39
  # want to include the hostname as well, then you must also pass the <tt>:host</tt>
39
40
  # argument:
40
41
  #
41
42
  # include UrlFor
42
- # url_for(:controller => 'users',
43
- # :action => 'new',
44
- # :message => 'Welcome!',
45
- # :host => 'www.example.com')
43
+ # url_for(controller: 'users',
44
+ # action: 'new',
45
+ # message: 'Welcome!',
46
+ # host: 'www.example.com')
46
47
  # # => "http://www.example.com/users/new?message=Welcome%21"
47
48
  #
48
49
  # By default, all controllers and views have access to a special version of url_for,
@@ -67,7 +68,7 @@ module ActionDispatch
67
68
  # This generates, among other things, the method <tt>users_path</tt>. By default,
68
69
  # this method is accessible from your controllers, views and mailers. If you need
69
70
  # to access this auto-generated method from other places (such as a model), then
70
- # you can do that by including ActionController::UrlFor in your class:
71
+ # you can do that by including Rails.application.routes.url_helpers in your class:
71
72
  #
72
73
  # class User < ActiveRecord::Base
73
74
  # include Rails.application.routes.url_helpers
@@ -84,18 +85,18 @@ module ActionDispatch
84
85
  include PolymorphicRoutes
85
86
 
86
87
  included do
87
- # TODO: with_routing extends @controller with url_helpers, trickling down to including this module which overrides its default_url_options
88
88
  unless method_defined?(:default_url_options)
89
89
  # Including in a class uses an inheritable hash. Modules get a plain hash.
90
90
  if respond_to?(:class_attribute)
91
91
  class_attribute :default_url_options
92
92
  else
93
- mattr_accessor :default_url_options
94
- remove_method :default_url_options
93
+ mattr_writer :default_url_options
95
94
  end
96
95
 
97
96
  self.default_url_options = {}
98
97
  end
98
+
99
+ include(*_url_for_modules) if respond_to?(:_url_for_modules)
99
100
  end
100
101
 
101
102
  def initialize(*)
@@ -103,6 +104,9 @@ module ActionDispatch
103
104
  super
104
105
  end
105
106
 
107
+ # Hook overridden in controller to add request information
108
+ # with `default_url_options`. Application logic should not
109
+ # go into url_options.
106
110
  def url_options
107
111
  default_url_options
108
112
  end
@@ -126,41 +130,66 @@ module ActionDispatch
126
130
  # * <tt>:port</tt> - Optionally specify the port to connect to.
127
131
  # * <tt>:anchor</tt> - An anchor name to be appended to the path.
128
132
  # * <tt>:trailing_slash</tt> - If true, adds a trailing slash, as in "/archive/2009/"
133
+ # * <tt>:script_name</tt> - Specifies application path relative to domain root. If provided, prepends application path.
129
134
  #
130
135
  # Any other key (<tt>:controller</tt>, <tt>:action</tt>, etc.) given to
131
136
  # +url_for+ is forwarded to the Routes module.
132
137
  #
133
- # Examples:
134
- #
135
- # url_for :controller => 'tasks', :action => 'testing', :host => 'somehost.org', :port => '8080'
138
+ # url_for controller: 'tasks', action: 'testing', host: 'somehost.org', port: '8080'
136
139
  # # => 'http://somehost.org:8080/tasks/testing'
137
- # url_for :controller => 'tasks', :action => 'testing', :host => 'somehost.org', :anchor => 'ok', :only_path => true
140
+ # url_for controller: 'tasks', action: 'testing', host: 'somehost.org', anchor: 'ok', only_path: true
138
141
  # # => '/tasks/testing#ok'
139
- # url_for :controller => 'tasks', :action => 'testing', :trailing_slash => true
142
+ # url_for controller: 'tasks', action: 'testing', trailing_slash: true
140
143
  # # => 'http://somehost.org/tasks/testing/'
141
- # url_for :controller => 'tasks', :action => 'testing', :host => 'somehost.org', :number => '33'
144
+ # url_for controller: 'tasks', action: 'testing', host: 'somehost.org', number: '33'
142
145
  # # => 'http://somehost.org/tasks/testing?number=33'
146
+ # url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp"
147
+ # # => 'http://somehost.org/myapp/tasks/testing'
148
+ # url_for controller: 'tasks', action: 'testing', host: 'somehost.org', script_name: "/myapp", only_path: true
149
+ # # => '/myapp/tasks/testing'
143
150
  def url_for(options = nil)
144
151
  case options
152
+ when nil
153
+ _routes.url_for(url_options.symbolize_keys)
154
+ when Hash
155
+ route_name = options.delete :use_route
156
+ _routes.url_for(options.symbolize_keys.reverse_merge!(url_options),
157
+ route_name)
145
158
  when String
146
159
  options
147
- when nil, Hash
148
- _routes.url_for((options || {}).symbolize_keys.reverse_merge!(url_options))
160
+ when Symbol
161
+ HelperMethodBuilder.url.handle_string_call self, options
162
+ when Array
163
+ components = options.dup
164
+ polymorphic_url(components, components.extract_options!)
165
+ when Class
166
+ HelperMethodBuilder.url.handle_class_call self, options
149
167
  else
150
- polymorphic_url(options)
168
+ HelperMethodBuilder.url.handle_model_call self, options
151
169
  end
152
170
  end
153
171
 
154
172
  protected
155
- def _with_routes(routes)
156
- old_routes, @_routes = @_routes, routes
157
- yield
158
- ensure
159
- @_routes = old_routes
160
- end
161
173
 
162
- def _routes_context
163
- self
174
+ def optimize_routes_generation?
175
+ _routes.optimize_routes_generation? && default_url_options.empty?
176
+ end
177
+
178
+ def _with_routes(routes)
179
+ old_routes, @_routes = @_routes, routes
180
+ yield
181
+ ensure
182
+ @_routes = old_routes
183
+ end
184
+
185
+ def _routes_context
186
+ self
187
+ end
188
+
189
+ private
190
+
191
+ def _generate_paths_by_default
192
+ true
164
193
  end
165
194
  end
166
195
  end
@@ -1,5 +1,7 @@
1
+ # encoding: UTF-8
1
2
  require 'active_support/core_ext/object/to_param'
2
3
  require 'active_support/core_ext/regexp'
4
+ require 'active_support/dependencies/autoload'
3
5
 
4
6
  module ActionDispatch
5
7
  # The routing module provides URL rewriting in native Ruby. It's a way to
@@ -10,7 +12,7 @@ module ActionDispatch
10
12
  # Think of creating routes as drawing a map for your requests. The map tells
11
13
  # them where to go based on some predefined pattern:
12
14
  #
13
- # AppName::Application.routes.draw do
15
+ # Rails.application.routes.draw do
14
16
  # Pattern 1 tells some request to go to one place
15
17
  # Pattern 2 tell them to go to another
16
18
  # ...
@@ -60,7 +62,7 @@ module ActionDispatch
60
62
  # directory by using +scope+. +scope+ takes additional options which
61
63
  # apply to all enclosed routes.
62
64
  #
63
- # scope :path => "/cpanel", :as => 'admin' do
65
+ # scope path: "/cpanel", as: 'admin' do
64
66
  # resources :posts, :comments
65
67
  # end
66
68
  #
@@ -68,6 +70,22 @@ module ActionDispatch
68
70
  # <tt>Routing::Mapper::Scoping#namespace</tt>, and
69
71
  # <tt>Routing::Mapper::Scoping#scope</tt>.
70
72
  #
73
+ # == Non-resourceful routes
74
+ #
75
+ # For routes that don't fit the <tt>resources</tt> mold, you can use the HTTP helper
76
+ # methods <tt>get</tt>, <tt>post</tt>, <tt>patch</tt>, <tt>put</tt> and <tt>delete</tt>.
77
+ #
78
+ # get 'post/:id' => 'posts#show'
79
+ # post 'post/:id' => 'posts#create_comment'
80
+ #
81
+ # If your route needs to respond to more than one HTTP method (or all methods) then using the
82
+ # <tt>:via</tt> option on <tt>match</tt> is preferable.
83
+ #
84
+ # match 'post/:id' => 'posts#show', via: [:get, :post]
85
+ #
86
+ # Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
87
+ # URL will route to the <tt>show</tt> action.
88
+ #
71
89
  # == Named routes
72
90
  #
73
91
  # Routes can be named by passing an <tt>:as</tt> option,
@@ -77,22 +95,22 @@ module ActionDispatch
77
95
  # Example:
78
96
  #
79
97
  # # In routes.rb
80
- # match '/login' => 'accounts#login', :as => 'login'
98
+ # get '/login' => 'accounts#login', as: 'login'
81
99
  #
82
100
  # # With render, redirect_to, tests, etc.
83
101
  # redirect_to login_url
84
102
  #
85
103
  # Arguments can be passed as well.
86
104
  #
87
- # redirect_to show_item_path(:id => 25)
105
+ # redirect_to show_item_path(id: 25)
88
106
  #
89
107
  # Use <tt>root</tt> as a shorthand to name a route for the root path "/".
90
108
  #
91
109
  # # In routes.rb
92
- # root :to => 'blogs#index'
110
+ # root to: 'blogs#index'
93
111
  #
94
112
  # # would recognize http://www.example.com/ as
95
- # params = { :controller => 'blogs', :action => 'index' }
113
+ # params = { controller: 'blogs', action: 'index' }
96
114
  #
97
115
  # # and provide these named routes
98
116
  # root_url # => 'http://www.example.com/'
@@ -103,117 +121,70 @@ module ActionDispatch
103
121
  #
104
122
  # # In routes.rb
105
123
  # controller :blog do
106
- # match 'blog/show' => :list
107
- # match 'blog/delete' => :delete
108
- # match 'blog/edit/:id' => :edit
124
+ # get 'blog/show' => :list
125
+ # get 'blog/delete' => :delete
126
+ # get 'blog/edit/:id' => :edit
109
127
  # end
110
128
  #
111
129
  # # provides named routes for show, delete, and edit
112
- # link_to @article.title, show_path(:id => @article.id)
130
+ # link_to @article.title, show_path(id: @article.id)
113
131
  #
114
132
  # == Pretty URLs
115
133
  #
116
134
  # Routes can generate pretty URLs. For example:
117
135
  #
118
- # match '/articles/:year/:month/:day' => 'articles#find_by_id', :constraints => {
119
- # :year => /\d{4}/,
120
- # :month => /\d{1,2}/,
121
- # :day => /\d{1,2}/
136
+ # get '/articles/:year/:month/:day' => 'articles#find_by_id', constraints: {
137
+ # year: /\d{4}/,
138
+ # month: /\d{1,2}/,
139
+ # day: /\d{1,2}/
122
140
  # }
123
141
  #
124
142
  # Using the route above, the URL "http://localhost:3000/articles/2005/11/06"
125
143
  # maps to
126
144
  #
127
- # params = {:year => '2005', :month => '11', :day => '06'}
145
+ # params = {year: '2005', month: '11', day: '06'}
128
146
  #
129
147
  # == Regular Expressions and parameters
130
148
  # You can specify a regular expression to define a format for a parameter.
131
149
  #
132
150
  # controller 'geocode' do
133
- # match 'geocode/:postalcode' => :show, :constraints => {
134
- # :postalcode => /\d{5}(-\d{4})?/
151
+ # get 'geocode/:postalcode' => :show, constraints: {
152
+ # postalcode: /\d{5}(-\d{4})?/
135
153
  # }
136
154
  #
137
155
  # Constraints can include the 'ignorecase' and 'extended syntax' regular
138
156
  # expression modifiers:
139
157
  #
140
158
  # controller 'geocode' do
141
- # match 'geocode/:postalcode' => :show, :constraints => {
142
- # :postalcode => /hx\d\d\s\d[a-z]{2}/i
159
+ # get 'geocode/:postalcode' => :show, constraints: {
160
+ # postalcode: /hx\d\d\s\d[a-z]{2}/i
143
161
  # }
144
162
  # end
145
163
  #
146
164
  # controller 'geocode' do
147
- # match 'geocode/:postalcode' => :show, :constraints => {
148
- # :postalcode => /# Postcode format
165
+ # get 'geocode/:postalcode' => :show, constraints: {
166
+ # postalcode: /# Postcode format
149
167
  # \d{5} #Prefix
150
168
  # (-\d{4})? #Suffix
151
169
  # /x
152
170
  # }
153
171
  # end
154
172
  #
155
- # Using the multiline match modifier will raise an +ArgumentError+.
173
+ # Using the multiline modifier will raise an +ArgumentError+.
156
174
  # Encoding regular expression modifiers are silently ignored. The
157
175
  # match will always use the default encoding or ASCII.
158
176
  #
159
- # == Default route
160
- #
161
- # Consider the following route, which you will find commented out at the
162
- # bottom of your generated <tt>config/routes.rb</tt>:
163
- #
164
- # match ':controller(/:action(/:id))(.:format)'
165
- #
166
- # This route states that it expects requests to consist of a
167
- # <tt>:controller</tt> followed optionally by an <tt>:action</tt> that in
168
- # turn is followed optionally by an <tt>:id</tt>, which in turn is followed
169
- # optionally by a <tt>:format</tt>.
170
- #
171
- # Suppose you get an incoming request for <tt>/blog/edit/22</tt>, you'll end
172
- # up with:
173
- #
174
- # params = { :controller => 'blog',
175
- # :action => 'edit',
176
- # :id => '22'
177
- # }
178
- #
179
- # By not relying on default routes, you improve the security of your
180
- # application since not all controller actions, which includes actions you
181
- # might add at a later time, are exposed by default.
182
- #
183
- # == HTTP Methods
184
- #
185
- # Using the <tt>:via</tt> option when specifying a route allows you to restrict it to a specific HTTP method.
186
- # Possible values are <tt>:post</tt>, <tt>:get</tt>, <tt>:put</tt>, <tt>:delete</tt> and <tt>:any</tt>.
187
- # If your route needs to respond to more than one method you can use an array, e.g. <tt>[ :get, :post ]</tt>.
188
- # The default value is <tt>:any</tt> which means that the route will respond to any of the HTTP methods.
189
- #
190
- # Examples:
191
- #
192
- # match 'post/:id' => 'posts#show', :via => :get
193
- # match 'post/:id' => "posts#create_comment', :via => :post
194
- #
195
- # Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
196
- # URL will route to the <tt>show</tt> action.
197
- #
198
- # === HTTP helper methods
199
- #
200
- # An alternative method of specifying which HTTP method a route should respond to is to use the helper
201
- # methods <tt>get</tt>, <tt>post</tt>, <tt>put</tt> and <tt>delete</tt>.
202
- #
203
- # Examples:
177
+ # == External redirects
204
178
  #
205
- # get 'post/:id' => 'posts#show'
206
- # post 'post/:id' => "posts#create_comment'
179
+ # You can redirect any path to another path using the redirect helper in your router:
207
180
  #
208
- # This syntax is less verbose and the intention is more apparent to someone else reading your code,
209
- # however if your route needs to respond to more than one HTTP method (or all methods) then using the
210
- # <tt>:via</tt> option on <tt>match</tt> is preferable.
181
+ # get "/stories" => redirect("/posts")
211
182
  #
212
- # == External redirects
183
+ # == Unicode character routes
213
184
  #
214
- # You can redirect any path to another path using the redirect helper in your router:
185
+ # You can specify unicode character routes in your router:
215
186
  #
216
- # match "/stories" => redirect("/posts")
187
+ # get "こんにちは" => "welcome#index"
217
188
  #
218
189
  # == Routing to Rack Applications
219
190
  #
@@ -221,7 +192,7 @@ module ActionDispatch
221
192
  # index action in the PostsController, you can specify any Rack application
222
193
  # as the endpoint for a matcher:
223
194
  #
224
- # match "/application.js" => Sprockets
195
+ # get "/application.js" => Sprockets
225
196
  #
226
197
  # == Reloading routes
227
198
  #
@@ -239,7 +210,7 @@ module ActionDispatch
239
210
  # === +assert_routing+
240
211
  #
241
212
  # def test_movie_route_properly_splits
242
- # opts = {:controller => "plugin", :action => "checkout", :id => "2"}
213
+ # opts = {controller: "plugin", action: "checkout", id: "2"}
243
214
  # assert_routing "plugin/checkout/2", opts
244
215
  # end
245
216
  #
@@ -248,7 +219,7 @@ module ActionDispatch
248
219
  # === +assert_recognizes+
249
220
  #
250
221
  # def test_route_has_options
251
- # opts = {:controller => "plugin", :action => "show", :id => "12"}
222
+ # opts = {controller: "plugin", action: "show", id: "12"}
252
223
  # assert_recognizes opts, "/plugins/show/12"
253
224
  # end
254
225
  #
@@ -276,18 +247,15 @@ module ActionDispatch
276
247
  # Target specific controllers by prefixing the command with <tt>CONTROLLER=x</tt>.
277
248
  #
278
249
  module Routing
279
- autoload :Mapper, 'action_dispatch/routing/mapper'
280
- autoload :RouteSet, 'action_dispatch/routing/route_set'
281
- autoload :RoutesProxy, 'action_dispatch/routing/routes_proxy'
282
- autoload :UrlFor, 'action_dispatch/routing/url_for'
283
- autoload :PolymorphicRoutes, 'action_dispatch/routing/polymorphic_routes'
250
+ extend ActiveSupport::Autoload
284
251
 
285
- SEPARATORS = %w( / . ? ) #:nodoc:
286
- HTTP_METHODS = [:get, :head, :post, :put, :delete, :options] #:nodoc:
252
+ autoload :Mapper
253
+ autoload :RouteSet
254
+ autoload :RoutesProxy
255
+ autoload :UrlFor
256
+ autoload :PolymorphicRoutes
287
257
 
288
- # A helper module to hold URL related helpers.
289
- module Helpers #:nodoc:
290
- include PolymorphicRoutes
291
- end
258
+ SEPARATORS = %w( / . ? ) #:nodoc:
259
+ HTTP_METHODS = [:get, :head, :post, :patch, :put, :delete, :options] #:nodoc:
292
260
  end
293
261
  end
@@ -1,37 +1,3 @@
1
- require 'action_controller/vendor/html-scanner'
1
+ require 'active_support/deprecation'
2
2
 
3
- module ActionDispatch
4
- module Assertions
5
- module DomAssertions
6
- # \Test two HTML strings for equivalency (e.g., identical up to reordering of attributes)
7
- #
8
- # ==== Examples
9
- #
10
- # # assert that the referenced method generates the appropriate HTML string
11
- # assert_dom_equal '<a href="http://www.example.com">Apples</a>', link_to("Apples", "http://www.example.com")
12
- #
13
- def assert_dom_equal(expected, actual, message = "")
14
- expected_dom = HTML::Document.new(expected).root
15
- actual_dom = HTML::Document.new(actual).root
16
- full_message = build_message(message, "<?> expected to be == to\n<?>.", expected_dom.to_s, actual_dom.to_s)
17
-
18
- assert_block(full_message) { expected_dom == actual_dom }
19
- end
20
-
21
- # The negated form of +assert_dom_equivalent+.
22
- #
23
- # ==== Examples
24
- #
25
- # # assert that the referenced method does not generate the specified HTML string
26
- # assert_dom_not_equal '<a href="http://www.example.com">Apples</a>', link_to("Oranges", "http://www.example.com")
27
- #
28
- def assert_dom_not_equal(expected, actual, message = "")
29
- expected_dom = HTML::Document.new(expected).root
30
- actual_dom = HTML::Document.new(actual).root
31
- full_message = build_message(message, "<?> expected to be != to\n<?>.", expected_dom.to_s, actual_dom.to_s)
32
-
33
- assert_block(full_message) { expected_dom != actual_dom }
34
- end
35
- end
36
- end
37
- end
3
+ ActiveSupport::Deprecation.warn("ActionDispatch::Assertions::DomAssertions has been extracted to the rails-dom-testing gem.")
@@ -1,14 +1,11 @@
1
- require 'active_support/core_ext/object/inclusion'
2
1
 
3
2
  module ActionDispatch
4
3
  module Assertions
5
4
  # A small suite of assertions that test responses from \Rails applications.
6
5
  module ResponseAssertions
7
- extend ActiveSupport::Concern
8
-
9
6
  # Asserts that the response is one of the following types:
10
7
  #
11
- # * <tt>:success</tt> - Status code was 200
8
+ # * <tt>:success</tt> - Status code was in the 200-299 range
12
9
  # * <tt>:redirect</tt> - Status code was in the 300-399 range
13
10
  # * <tt>:missing</tt> - Status code was 404
14
11
  # * <tt>:error</tt> - Status code was in the 500-599 range
@@ -17,36 +14,35 @@ module ActionDispatch
17
14
  # or its symbolic equivalent <tt>assert_response(:not_implemented)</tt>.
18
15
  # See Rack::Utils::SYMBOL_TO_STATUS_CODE for a full list.
19
16
  #
20
- # ==== Examples
21
- #
22
17
  # # assert that the response was a redirection
23
18
  # assert_response :redirect
24
19
  #
25
20
  # # assert that the response code was status code 401 (unauthorized)
26
21
  # assert_response 401
27
- #
28
22
  def assert_response(type, message = nil)
29
- validate_request!
23
+ message ||= "Expected response to be a <#{type}>, but was <#{@response.response_code}>"
30
24
 
31
- if type.in?([:success, :missing, :redirect, :error]) && @response.send("#{type}?")
32
- assert_block("") { true } # to count the assertion
33
- elsif type.is_a?(Fixnum) && @response.response_code == type
34
- assert_block("") { true } # to count the assertion
35
- elsif type.is_a?(Symbol) && @response.response_code == Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
36
- assert_block("") { true } # to count the assertion
25
+ if Symbol === type
26
+ if [:success, :missing, :redirect, :error].include?(type)
27
+ assert @response.send("#{type}?"), message
28
+ else
29
+ code = Rack::Utils::SYMBOL_TO_STATUS_CODE[type]
30
+ if code.nil?
31
+ raise ArgumentError, "Invalid response type :#{type}"
32
+ end
33
+ assert_equal code, @response.response_code, message
34
+ end
37
35
  else
38
- flunk(build_message(message, "Expected response to be a <?>, but was <?>", type, @response.response_code))
36
+ assert_equal type, @response.response_code, message
39
37
  end
40
38
  end
41
39
 
42
40
  # Assert that the redirection options passed in match those of the redirect called in the latest action.
43
- # This match can be partial, such that <tt>assert_redirected_to(:controller => "weblog")</tt> will also
44
- # match the redirection of <tt>redirect_to(:controller => "weblog", :action => "show")</tt> and so on.
45
- #
46
- # ==== Examples
41
+ # This match can be partial, such that <tt>assert_redirected_to(controller: "weblog")</tt> will also
42
+ # match the redirection of <tt>redirect_to(controller: "weblog", action: "show")</tt> and so on.
47
43
  #
48
44
  # # assert that the redirection was to the "index" action on the WeblogController
49
- # assert_redirected_to :controller => "weblog", :action => "index"
45
+ # assert_redirected_to controller: "weblog", action: "index"
50
46
  #
51
47
  # # assert that the redirection was to the named route login_url
52
48
  # assert_redirected_to login_url
@@ -54,16 +50,17 @@ module ActionDispatch
54
50
  # # assert that the redirection was to the url for @customer
55
51
  # assert_redirected_to @customer
56
52
  #
53
+ # # asserts that the redirection matches the regular expression
54
+ # assert_redirected_to %r(\Ahttp://example.org)
57
55
  def assert_redirected_to(options = {}, message=nil)
58
56
  assert_response(:redirect, message)
59
- return true if options == @response.location
57
+ return true if options === @response.location
60
58
 
61
59
  redirect_is = normalize_argument_to_redirection(@response.location)
62
60
  redirect_expected = normalize_argument_to_redirection(options)
63
61
 
64
- if redirect_is != redirect_expected
65
- flunk(build_message(message, "Expected response to be a redirect to <?> but was a redirect to <?>", redirect_expected, redirect_is))
66
- end
62
+ message ||= "Expected response to be a redirect to <#{redirect_expected}> but was a redirect to <#{redirect_is}>"
63
+ assert_operator redirect_expected, :===, redirect_is, message
67
64
  end
68
65
 
69
66
  private
@@ -73,22 +70,11 @@ module ActionDispatch
73
70
  end
74
71
 
75
72
  def normalize_argument_to_redirection(fragment)
76
- case fragment
77
- when %r{^\w[A-Za-z\d+.-]*:.*}
73
+ if Regexp === fragment
78
74
  fragment
79
- when String
80
- @request.protocol + @request.host_with_port + fragment
81
- when :back
82
- raise RedirectBackError unless refer = @request.headers["Referer"]
83
- refer
84
75
  else
85
- @controller.url_for(fragment)
86
- end.gsub(/[\0\r\n]/, '')
87
- end
88
-
89
- def validate_request!
90
- unless @request.is_a?(ActionDispatch::Request)
91
- raise ArgumentError, "@request must be an ActionDispatch::Request"
76
+ handle = @controller || ActionController::Redirecting
77
+ handle._compute_redirect_to_location(@request, fragment)
92
78
  end
93
79
  end
94
80
  end