actionpack 6.0.0.beta1 → 6.0.1.rc1
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.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +125 -13
 - data/README.rdoc +2 -1
 - data/lib/abstract_controller/caching/fragments.rb +0 -1
 - data/lib/abstract_controller/translation.rb +1 -0
 - data/lib/action_controller.rb +4 -1
 - data/lib/action_controller/metal.rb +3 -3
 - data/lib/action_controller/metal/basic_implicit_render.rb +1 -1
 - data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
 - data/lib/action_controller/metal/exceptions.rb +2 -2
 - data/lib/action_controller/metal/force_ssl.rb +1 -2
 - data/lib/action_controller/metal/helpers.rb +2 -2
 - data/lib/action_controller/metal/implicit_render.rb +2 -2
 - data/lib/action_controller/metal/live.rb +2 -2
 - data/lib/action_controller/metal/mime_responds.rb +1 -1
 - data/lib/action_controller/metal/params_wrapper.rb +2 -2
 - data/lib/action_controller/metal/redirecting.rb +6 -27
 - data/lib/action_controller/metal/renderers.rb +4 -4
 - data/lib/action_controller/metal/rendering.rb +1 -1
 - data/lib/action_controller/metal/request_forgery_protection.rb +2 -2
 - data/lib/action_controller/metal/strong_parameters.rb +6 -12
 - data/lib/action_controller/renderer.rb +2 -2
 - data/lib/action_controller/template_assertions.rb +1 -1
 - data/lib/action_controller/test_case.rb +3 -2
 - data/lib/action_dispatch.rb +1 -1
 - data/lib/action_dispatch/http/content_security_policy.rb +20 -9
 - data/lib/action_dispatch/http/mime_negotiation.rb +5 -0
 - data/lib/action_dispatch/http/mime_type.rb +13 -1
 - data/lib/action_dispatch/http/response.rb +27 -7
 - data/lib/action_dispatch/http/upload.rb +4 -1
 - data/lib/action_dispatch/journey/formatter.rb +1 -1
 - data/lib/action_dispatch/journey/path/pattern.rb +6 -1
 - data/lib/action_dispatch/journey/route.rb +5 -4
 - data/lib/action_dispatch/journey/routes.rb +0 -1
 - data/lib/action_dispatch/middleware/actionable_exceptions.rb +39 -0
 - data/lib/action_dispatch/middleware/cookies.rb +9 -10
 - data/lib/action_dispatch/middleware/debug_exceptions.rb +8 -2
 - data/lib/action_dispatch/middleware/debug_view.rb +19 -1
 - data/lib/action_dispatch/middleware/exception_wrapper.rb +15 -10
 - data/lib/action_dispatch/middleware/host_authorization.rb +2 -2
 - data/lib/action_dispatch/middleware/public_exceptions.rb +6 -2
 - data/lib/action_dispatch/middleware/remote_ip.rb +3 -3
 - data/lib/action_dispatch/middleware/session/cookie_store.rb +4 -3
 - data/lib/action_dispatch/middleware/show_exceptions.rb +1 -1
 - data/lib/action_dispatch/middleware/stack.rb +34 -2
 - data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
 - data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
 - data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +3 -1
 - data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +1 -1
 - data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +2 -2
 - data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +2 -2
 - data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +6 -2
 - data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +1 -1
 - data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +4 -1
 - data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +3 -1
 - data/lib/action_dispatch/middleware/templates/rescues/layout.erb +4 -0
 - data/lib/action_dispatch/railtie.rb +6 -2
 - data/lib/action_dispatch/routing.rb +18 -18
 - data/lib/action_dispatch/routing/mapper.rb +26 -11
 - data/lib/action_dispatch/routing/route_set.rb +13 -15
 - data/lib/action_dispatch/system_test_case.rb +43 -5
 - data/lib/action_dispatch/system_testing/browser.rb +38 -7
 - data/lib/action_dispatch/system_testing/driver.rb +10 -1
 - data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +3 -2
 - data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +7 -6
 - data/lib/action_dispatch/testing/assertions.rb +1 -1
 - data/lib/action_dispatch/testing/assertions/routing.rb +8 -1
 - data/lib/action_dispatch/testing/integration.rb +2 -2
 - data/lib/action_dispatch/testing/request_encoder.rb +2 -2
 - data/lib/action_dispatch/testing/test_response.rb +1 -1
 - data/lib/action_pack/gem_version.rb +2 -2
 - metadata +20 -15
 - data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +0 -26
 
| 
         @@ -23,6 +23,7 @@ module ActionDispatch 
     | 
|
| 
       23 
23 
     | 
    
         
             
                config.action_dispatch.use_authenticated_cookie_encryption = false
         
     | 
| 
       24 
24 
     | 
    
         
             
                config.action_dispatch.use_cookies_with_metadata = false
         
     | 
| 
       25 
25 
     | 
    
         
             
                config.action_dispatch.perform_deep_munge = true
         
     | 
| 
      
 26 
     | 
    
         
            +
                config.action_dispatch.return_only_media_type_on_content_type = true
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
                config.action_dispatch.default_headers = {
         
     | 
| 
       28 
29 
     | 
    
         
             
                  "X-Frame-Options" => "SAMEORIGIN",
         
     | 
| 
         @@ -41,8 +42,11 @@ module ActionDispatch 
     | 
|
| 
       41 
42 
     | 
    
         
             
                  ActionDispatch::Http::URL.tld_length = app.config.action_dispatch.tld_length
         
     | 
| 
       42 
43 
     | 
    
         
             
                  ActionDispatch::Request.ignore_accept_header = app.config.action_dispatch.ignore_accept_header
         
     | 
| 
       43 
44 
     | 
    
         
             
                  ActionDispatch::Request::Utils.perform_deep_munge = app.config.action_dispatch.perform_deep_munge
         
     | 
| 
       44 
     | 
    
         
            -
                   
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
                  ActiveSupport.on_load(:action_dispatch_response) do
         
     | 
| 
      
 46 
     | 
    
         
            +
                    self.default_charset = app.config.action_dispatch.default_charset || app.config.encoding
         
     | 
| 
      
 47 
     | 
    
         
            +
                    self.default_headers = app.config.action_dispatch.default_headers
         
     | 
| 
      
 48 
     | 
    
         
            +
                    self.return_only_media_type_on_content_type = app.config.action_dispatch.return_only_media_type_on_content_type
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
       46 
50 
     | 
    
         | 
| 
       47 
51 
     | 
    
         
             
                  ActionDispatch::ExceptionWrapper.rescue_responses.merge!(config.action_dispatch.rescue_responses)
         
     | 
| 
       48 
52 
     | 
    
         
             
                  ActionDispatch::ExceptionWrapper.rescue_templates.merge!(config.action_dispatch.rescue_templates)
         
     | 
| 
         @@ -74,8 +74,8 @@ module ActionDispatch 
     | 
|
| 
       74 
74 
     | 
    
         
             
              # For routes that don't fit the <tt>resources</tt> mold, you can use the HTTP helper
         
     | 
| 
       75 
75 
     | 
    
         
             
              # methods <tt>get</tt>, <tt>post</tt>, <tt>patch</tt>, <tt>put</tt> and <tt>delete</tt>.
         
     | 
| 
       76 
76 
     | 
    
         
             
              #
         
     | 
| 
       77 
     | 
    
         
            -
              #   get 'post/:id'  
     | 
| 
       78 
     | 
    
         
            -
              #   post 'post/:id'  
     | 
| 
      
 77 
     | 
    
         
            +
              #   get 'post/:id', to: 'posts#show'
         
     | 
| 
      
 78 
     | 
    
         
            +
              #   post 'post/:id', to: 'posts#create_comment'
         
     | 
| 
       79 
79 
     | 
    
         
             
              #
         
     | 
| 
       80 
80 
     | 
    
         
             
              # Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
         
     | 
| 
       81 
81 
     | 
    
         
             
              # URL will route to the <tt>show</tt> action.
         
     | 
| 
         @@ -83,7 +83,7 @@ module ActionDispatch 
     | 
|
| 
       83 
83 
     | 
    
         
             
              # If your route needs to respond to more than one HTTP method (or all methods) then using the
         
     | 
| 
       84 
84 
     | 
    
         
             
              # <tt>:via</tt> option on <tt>match</tt> is preferable.
         
     | 
| 
       85 
85 
     | 
    
         
             
              #
         
     | 
| 
       86 
     | 
    
         
            -
              #   match 'post/:id'  
     | 
| 
      
 86 
     | 
    
         
            +
              #   match 'post/:id', to: 'posts#show', via: [:get, :post]
         
     | 
| 
       87 
87 
     | 
    
         
             
              #
         
     | 
| 
       88 
88 
     | 
    
         
             
              # == Named routes
         
     | 
| 
       89 
89 
     | 
    
         
             
              #
         
     | 
| 
         @@ -94,7 +94,7 @@ module ActionDispatch 
     | 
|
| 
       94 
94 
     | 
    
         
             
              # Example:
         
     | 
| 
       95 
95 
     | 
    
         
             
              #
         
     | 
| 
       96 
96 
     | 
    
         
             
              #   # In config/routes.rb
         
     | 
| 
       97 
     | 
    
         
            -
              #   get '/login'  
     | 
| 
      
 97 
     | 
    
         
            +
              #   get '/login', to: 'accounts#login', as: 'login'
         
     | 
| 
       98 
98 
     | 
    
         
             
              #
         
     | 
| 
       99 
99 
     | 
    
         
             
              #   # With render, redirect_to, tests, etc.
         
     | 
| 
       100 
100 
     | 
    
         
             
              #   redirect_to login_url
         
     | 
| 
         @@ -120,9 +120,9 @@ module ActionDispatch 
     | 
|
| 
       120 
120 
     | 
    
         
             
              #
         
     | 
| 
       121 
121 
     | 
    
         
             
              #   # In config/routes.rb
         
     | 
| 
       122 
122 
     | 
    
         
             
              #   controller :blog do
         
     | 
| 
       123 
     | 
    
         
            -
              #     get 'blog/show' 
     | 
| 
       124 
     | 
    
         
            -
              #     get 'blog/delete' 
     | 
| 
       125 
     | 
    
         
            -
              #     get 'blog/edit' 
     | 
| 
      
 123 
     | 
    
         
            +
              #     get 'blog/show',    to: :list
         
     | 
| 
      
 124 
     | 
    
         
            +
              #     get 'blog/delete',  to: :delete
         
     | 
| 
      
 125 
     | 
    
         
            +
              #     get 'blog/edit',    to: :edit
         
     | 
| 
       126 
126 
     | 
    
         
             
              #   end
         
     | 
| 
       127 
127 
     | 
    
         
             
              #
         
     | 
| 
       128 
128 
     | 
    
         
             
              #   # provides named routes for show, delete, and edit
         
     | 
| 
         @@ -132,7 +132,7 @@ module ActionDispatch 
     | 
|
| 
       132 
132 
     | 
    
         
             
              #
         
     | 
| 
       133 
133 
     | 
    
         
             
              # Routes can generate pretty URLs. For example:
         
     | 
| 
       134 
134 
     | 
    
         
             
              #
         
     | 
| 
       135 
     | 
    
         
            -
              #   get '/articles/:year/:month/:day'  
     | 
| 
      
 135 
     | 
    
         
            +
              #   get '/articles/:year/:month/:day', to: 'articles#find_by_id', constraints: {
         
     | 
| 
       136 
136 
     | 
    
         
             
              #     year:       /\d{4}/,
         
     | 
| 
       137 
137 
     | 
    
         
             
              #     month:      /\d{1,2}/,
         
     | 
| 
       138 
138 
     | 
    
         
             
              #     day:        /\d{1,2}/
         
     | 
| 
         @@ -147,7 +147,7 @@ module ActionDispatch 
     | 
|
| 
       147 
147 
     | 
    
         
             
              # You can specify a regular expression to define a format for a parameter.
         
     | 
| 
       148 
148 
     | 
    
         
             
              #
         
     | 
| 
       149 
149 
     | 
    
         
             
              #   controller 'geocode' do
         
     | 
| 
       150 
     | 
    
         
            -
              #     get 'geocode/:postalcode'  
     | 
| 
      
 150 
     | 
    
         
            +
              #     get 'geocode/:postalcode', to: :show, constraints: {
         
     | 
| 
       151 
151 
     | 
    
         
             
              #       postalcode: /\d{5}(-\d{4})?/
         
     | 
| 
       152 
152 
     | 
    
         
             
              #     }
         
     | 
| 
       153 
153 
     | 
    
         
             
              #   end
         
     | 
| 
         @@ -156,13 +156,13 @@ module ActionDispatch 
     | 
|
| 
       156 
156 
     | 
    
         
             
              # expression modifiers:
         
     | 
| 
       157 
157 
     | 
    
         
             
              #
         
     | 
| 
       158 
158 
     | 
    
         
             
              #   controller 'geocode' do
         
     | 
| 
       159 
     | 
    
         
            -
              #     get 'geocode/:postalcode'  
     | 
| 
      
 159 
     | 
    
         
            +
              #     get 'geocode/:postalcode', to: :show, constraints: {
         
     | 
| 
       160 
160 
     | 
    
         
             
              #       postalcode: /hx\d\d\s\d[a-z]{2}/i
         
     | 
| 
       161 
161 
     | 
    
         
             
              #     }
         
     | 
| 
       162 
162 
     | 
    
         
             
              #   end
         
     | 
| 
       163 
163 
     | 
    
         
             
              #
         
     | 
| 
       164 
164 
     | 
    
         
             
              #   controller 'geocode' do
         
     | 
| 
       165 
     | 
    
         
            -
              #     get 'geocode/:postalcode'  
     | 
| 
      
 165 
     | 
    
         
            +
              #     get 'geocode/:postalcode', to: :show, constraints: {
         
     | 
| 
       166 
166 
     | 
    
         
             
              #       postalcode: /# Postalcode format
         
     | 
| 
       167 
167 
     | 
    
         
             
              #          \d{5} #Prefix
         
     | 
| 
       168 
168 
     | 
    
         
             
              #          (-\d{4})? #Suffix
         
     | 
| 
         @@ -178,13 +178,13 @@ module ActionDispatch 
     | 
|
| 
       178 
178 
     | 
    
         
             
              #
         
     | 
| 
       179 
179 
     | 
    
         
             
              # You can redirect any path to another path using the redirect helper in your router:
         
     | 
| 
       180 
180 
     | 
    
         
             
              #
         
     | 
| 
       181 
     | 
    
         
            -
              #   get "/stories"  
     | 
| 
      
 181 
     | 
    
         
            +
              #   get "/stories", to: redirect("/posts")
         
     | 
| 
       182 
182 
     | 
    
         
             
              #
         
     | 
| 
       183 
183 
     | 
    
         
             
              # == Unicode character routes
         
     | 
| 
       184 
184 
     | 
    
         
             
              #
         
     | 
| 
       185 
185 
     | 
    
         
             
              # You can specify unicode character routes in your router:
         
     | 
| 
       186 
186 
     | 
    
         
             
              #
         
     | 
| 
       187 
     | 
    
         
            -
              #   get "こんにちは"  
     | 
| 
      
 187 
     | 
    
         
            +
              #   get "こんにちは", to: "welcome#index"
         
     | 
| 
       188 
188 
     | 
    
         
             
              #
         
     | 
| 
       189 
189 
     | 
    
         
             
              # == Routing to Rack Applications
         
     | 
| 
       190 
190 
     | 
    
         
             
              #
         
     | 
| 
         @@ -192,7 +192,7 @@ module ActionDispatch 
     | 
|
| 
       192 
192 
     | 
    
         
             
              # index action in the PostsController, you can specify any Rack application
         
     | 
| 
       193 
193 
     | 
    
         
             
              # as the endpoint for a matcher:
         
     | 
| 
       194 
194 
     | 
    
         
             
              #
         
     | 
| 
       195 
     | 
    
         
            -
              #   get "/application.js"  
     | 
| 
      
 195 
     | 
    
         
            +
              #   get "/application.js", to: Sprockets
         
     | 
| 
       196 
196 
     | 
    
         
             
              #
         
     | 
| 
       197 
197 
     | 
    
         
             
              # == Reloading routes
         
     | 
| 
       198 
198 
     | 
    
         
             
              #
         
     | 
| 
         @@ -210,8 +210,8 @@ module ActionDispatch 
     | 
|
| 
       210 
210 
     | 
    
         
             
              # === +assert_routing+
         
     | 
| 
       211 
211 
     | 
    
         
             
              #
         
     | 
| 
       212 
212 
     | 
    
         
             
              #   def test_movie_route_properly_splits
         
     | 
| 
       213 
     | 
    
         
            -
              # 
     | 
| 
       214 
     | 
    
         
            -
              # 
     | 
| 
      
 213 
     | 
    
         
            +
              #     opts = {controller: "plugin", action: "checkout", id: "2"}
         
     | 
| 
      
 214 
     | 
    
         
            +
              #     assert_routing "plugin/checkout/2", opts
         
     | 
| 
       215 
215 
     | 
    
         
             
              #   end
         
     | 
| 
       216 
216 
     | 
    
         
             
              #
         
     | 
| 
       217 
217 
     | 
    
         
             
              # +assert_routing+ lets you test whether or not the route properly resolves into options.
         
     | 
| 
         @@ -219,8 +219,8 @@ module ActionDispatch 
     | 
|
| 
       219 
219 
     | 
    
         
             
              # === +assert_recognizes+
         
     | 
| 
       220 
220 
     | 
    
         
             
              #
         
     | 
| 
       221 
221 
     | 
    
         
             
              #   def test_route_has_options
         
     | 
| 
       222 
     | 
    
         
            -
              # 
     | 
| 
       223 
     | 
    
         
            -
              # 
     | 
| 
      
 222 
     | 
    
         
            +
              #     opts = {controller: "plugin", action: "show", id: "12"}
         
     | 
| 
      
 223 
     | 
    
         
            +
              #     assert_recognizes opts, "/plugins/show/12"
         
     | 
| 
       224 
224 
     | 
    
         
             
              #   end
         
     | 
| 
       225 
225 
     | 
    
         
             
              #
         
     | 
| 
       226 
226 
     | 
    
         
             
              # Note the subtle difference between the two: +assert_routing+ tests that
         
     | 
| 
         @@ -70,17 +70,17 @@ module ActionDispatch 
     | 
|
| 
       70 
70 
     | 
    
         
             
                    ANCHOR_CHARACTERS_REGEX = %r{\A(\\A|\^)|(\\Z|\\z|\$)\Z}
         
     | 
| 
       71 
71 
     | 
    
         
             
                    OPTIONAL_FORMAT_REGEX = %r{(?:\(\.:format\)+|\.:format|/)\Z}
         
     | 
| 
       72 
72 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
                    attr_reader :requirements, :defaults
         
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
                    attr_reader :required_defaults, :ast
         
     | 
| 
      
 73 
     | 
    
         
            +
                    attr_reader :requirements, :defaults, :to, :default_controller,
         
     | 
| 
      
 74 
     | 
    
         
            +
                                :default_action, :required_defaults, :ast, :scope_options
         
     | 
| 
       76 
75 
     | 
    
         | 
| 
       77 
76 
     | 
    
         
             
                    def self.build(scope, set, ast, controller, default_action, to, via, formatted, options_constraints, anchor, options)
         
     | 
| 
       78 
77 
     | 
    
         
             
                      options = scope[:options].merge(options) if scope[:options]
         
     | 
| 
       79 
78 
     | 
    
         | 
| 
       80 
79 
     | 
    
         
             
                      defaults = (scope[:defaults] || {}).dup
         
     | 
| 
       81 
80 
     | 
    
         
             
                      scope_constraints = scope[:constraints] || {}
         
     | 
| 
      
 81 
     | 
    
         
            +
                      scope_options = scope[:options] || {}
         
     | 
| 
       82 
82 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
                      new set, ast, defaults, controller, default_action, scope[:module], to, formatted, scope_constraints, scope[:blocks] || [], via, options_constraints, anchor, options
         
     | 
| 
      
 83 
     | 
    
         
            +
                      new set, ast, defaults, controller, default_action, scope[:module], to, formatted, scope_constraints, scope_options, scope[:blocks] || [], via, options_constraints, anchor, options
         
     | 
| 
       84 
84 
     | 
    
         
             
                    end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         
             
                    def self.check_via(via)
         
     | 
| 
         @@ -111,17 +111,18 @@ module ActionDispatch 
     | 
|
| 
       111 
111 
     | 
    
         
             
                      format != false && path !~ OPTIONAL_FORMAT_REGEX
         
     | 
| 
       112 
112 
     | 
    
         
             
                    end
         
     | 
| 
       113 
113 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
                    def initialize(set, ast, defaults, controller, default_action, modyoule, to, formatted, scope_constraints, blocks, via, options_constraints, anchor, options)
         
     | 
| 
      
 114 
     | 
    
         
            +
                    def initialize(set, ast, defaults, controller, default_action, modyoule, to, formatted, scope_constraints, scope_options, blocks, via, options_constraints, anchor, options)
         
     | 
| 
       115 
115 
     | 
    
         
             
                      @defaults = defaults
         
     | 
| 
       116 
116 
     | 
    
         
             
                      @set = set
         
     | 
| 
       117 
117 
     | 
    
         | 
| 
       118 
     | 
    
         
            -
                      @to                 = to
         
     | 
| 
       119 
     | 
    
         
            -
                      @default_controller = controller
         
     | 
| 
       120 
     | 
    
         
            -
                      @default_action     = default_action
         
     | 
| 
      
 118 
     | 
    
         
            +
                      @to                 = intern(to)
         
     | 
| 
      
 119 
     | 
    
         
            +
                      @default_controller = intern(controller)
         
     | 
| 
      
 120 
     | 
    
         
            +
                      @default_action     = intern(default_action)
         
     | 
| 
       121 
121 
     | 
    
         
             
                      @ast                = ast
         
     | 
| 
       122 
122 
     | 
    
         
             
                      @anchor             = anchor
         
     | 
| 
       123 
123 
     | 
    
         
             
                      @via                = via
         
     | 
| 
       124 
124 
     | 
    
         
             
                      @internal           = options.delete(:internal)
         
     | 
| 
      
 125 
     | 
    
         
            +
                      @scope_options      = scope_options
         
     | 
| 
       125 
126 
     | 
    
         | 
| 
       126 
127 
     | 
    
         
             
                      path_params = ast.find_all(&:symbol?).map(&:to_sym)
         
     | 
| 
       127 
128 
     | 
    
         | 
| 
         @@ -161,7 +162,7 @@ module ActionDispatch 
     | 
|
| 
       161 
162 
     | 
    
         | 
| 
       162 
163 
     | 
    
         
             
                    def make_route(name, precedence)
         
     | 
| 
       163 
164 
     | 
    
         
             
                      Journey::Route.new(name, application, path, conditions, required_defaults,
         
     | 
| 
       164 
     | 
    
         
            -
                                         defaults, request_method, precedence, @internal)
         
     | 
| 
      
 165 
     | 
    
         
            +
                                         defaults, request_method, precedence, scope_options, @internal)
         
     | 
| 
       165 
166 
     | 
    
         
             
                    end
         
     | 
| 
       166 
167 
     | 
    
         | 
| 
       167 
168 
     | 
    
         
             
                    def application
         
     | 
| 
         @@ -222,6 +223,10 @@ module ActionDispatch 
     | 
|
| 
       222 
223 
     | 
    
         
             
                    private :build_path
         
     | 
| 
       223 
224 
     | 
    
         | 
| 
       224 
225 
     | 
    
         
             
                    private
         
     | 
| 
      
 226 
     | 
    
         
            +
                      def intern(object)
         
     | 
| 
      
 227 
     | 
    
         
            +
                        object.is_a?(String) ? -object : object
         
     | 
| 
      
 228 
     | 
    
         
            +
                      end
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
       225 
230 
     | 
    
         
             
                      def add_wildcard_options(options, formatted, path_ast)
         
     | 
| 
       226 
231 
     | 
    
         
             
                        # Add a constraint for wildcard route to make it non-greedy and match the
         
     | 
| 
       227 
232 
     | 
    
         
             
                        # optional format part of the route by default.
         
     | 
| 
         @@ -1141,6 +1146,10 @@ module ActionDispatch 
     | 
|
| 
       1141 
1146 
     | 
    
         
             
                      attr_reader :controller, :path, :param
         
     | 
| 
       1142 
1147 
     | 
    
         | 
| 
       1143 
1148 
     | 
    
         
             
                      def initialize(entities, api_only, shallow, options = {})
         
     | 
| 
      
 1149 
     | 
    
         
            +
                        if options[:param].to_s.include?(":")
         
     | 
| 
      
 1150 
     | 
    
         
            +
                          raise ArgumentError, ":param option can't contain colons"
         
     | 
| 
      
 1151 
     | 
    
         
            +
                        end
         
     | 
| 
      
 1152 
     | 
    
         
            +
             
     | 
| 
       1144 
1153 
     | 
    
         
             
                        @name       = entities.to_s
         
     | 
| 
       1145 
1154 
     | 
    
         
             
                        @path       = (options[:path] || @name).to_s
         
     | 
| 
       1146 
1155 
     | 
    
         
             
                        @controller = (options[:controller] || @name).to_s
         
     | 
| 
         @@ -1398,6 +1407,8 @@ module ActionDispatch 
     | 
|
| 
       1398 
1407 
     | 
    
         
             
                    #   as a comment on a blog post like <tt>/posts/a-long-permalink/comments/1234</tt>
         
     | 
| 
       1399 
1408 
     | 
    
         
             
                    #   to be shortened to just <tt>/comments/1234</tt>.
         
     | 
| 
       1400 
1409 
     | 
    
         
             
                    #
         
     | 
| 
      
 1410 
     | 
    
         
            +
                    #   Set <tt>shallow: false</tt> on a child resource to ignore a parent's shallow parameter.
         
     | 
| 
      
 1411 
     | 
    
         
            +
                    #
         
     | 
| 
       1401 
1412 
     | 
    
         
             
                    # [:shallow_path]
         
     | 
| 
       1402 
1413 
     | 
    
         
             
                    #   Prefixes nested shallow routes with the specified path.
         
     | 
| 
       1403 
1414 
     | 
    
         
             
                    #
         
     | 
| 
         @@ -1440,6 +1451,9 @@ module ActionDispatch 
     | 
|
| 
       1440 
1451 
     | 
    
         
             
                    #   Allows you to specify the default value for optional +format+
         
     | 
| 
       1441 
1452 
     | 
    
         
             
                    #   segment or disable it by supplying +false+.
         
     | 
| 
       1442 
1453 
     | 
    
         
             
                    #
         
     | 
| 
      
 1454 
     | 
    
         
            +
                    # [:param]
         
     | 
| 
      
 1455 
     | 
    
         
            +
                    #   Allows you to override the default param name of +:id+ in the URL.
         
     | 
| 
      
 1456 
     | 
    
         
            +
                    #
         
     | 
| 
       1443 
1457 
     | 
    
         
             
                    # === Examples
         
     | 
| 
       1444 
1458 
     | 
    
         
             
                    #
         
     | 
| 
       1445 
1459 
     | 
    
         
             
                    #   # routes call <tt>Admin::PostsController</tt>
         
     | 
| 
         @@ -1665,7 +1679,8 @@ module ActionDispatch 
     | 
|
| 
       1665 
1679 
     | 
    
         
             
                          return true
         
     | 
| 
       1666 
1680 
     | 
    
         
             
                        end
         
     | 
| 
       1667 
1681 
     | 
    
         | 
| 
       1668 
     | 
    
         
            -
                        if options 
     | 
| 
      
 1682 
     | 
    
         
            +
                        if options[:shallow]
         
     | 
| 
      
 1683 
     | 
    
         
            +
                          options.delete(:shallow)
         
     | 
| 
       1669 
1684 
     | 
    
         
             
                          shallow do
         
     | 
| 
       1670 
1685 
     | 
    
         
             
                            send(method, resources.pop, options, &block)
         
     | 
| 
       1671 
1686 
     | 
    
         
             
                          end
         
     | 
| 
         @@ -2059,7 +2074,7 @@ module ActionDispatch 
     | 
|
| 
       2059 
2074 
     | 
    
         
             
                    # of routing helpers, e.g:
         
     | 
| 
       2060 
2075 
     | 
    
         
             
                    #
         
     | 
| 
       2061 
2076 
     | 
    
         
             
                    #   direct :homepage do
         
     | 
| 
       2062 
     | 
    
         
            -
                    #     " 
     | 
| 
      
 2077 
     | 
    
         
            +
                    #     "https://rubyonrails.org"
         
     | 
| 
       2063 
2078 
     | 
    
         
             
                    #   end
         
     | 
| 
       2064 
2079 
     | 
    
         
             
                    #
         
     | 
| 
       2065 
2080 
     | 
    
         
             
                    #   direct :commentable do |model|
         
     | 
| 
         @@ -317,23 +317,21 @@ module ActionDispatch 
     | 
|
| 
       317 
317 
     | 
    
         
             
                      #
         
     | 
| 
       318 
318 
     | 
    
         
             
                      def define_url_helper(mod, route, name, opts, route_key, url_strategy)
         
     | 
| 
       319 
319 
     | 
    
         
             
                        helper = UrlHelper.create(route, opts, route_key, url_strategy)
         
     | 
| 
       320 
     | 
    
         
            -
                        mod. 
     | 
| 
       321 
     | 
    
         
            -
                           
     | 
| 
       322 
     | 
    
         
            -
             
     | 
| 
       323 
     | 
    
         
            -
                             
     | 
| 
       324 
     | 
    
         
            -
             
     | 
| 
       325 
     | 
    
         
            -
                               
     | 
| 
       326 
     | 
    
         
            -
             
     | 
| 
       327 
     | 
    
         
            -
                               
     | 
| 
       328 
     | 
    
         
            -
             
     | 
| 
       329 
     | 
    
         
            -
             
     | 
| 
       330 
     | 
    
         
            -
                            helper.call self, args, options
         
     | 
| 
       331 
     | 
    
         
            -
                          end
         
     | 
| 
      
 320 
     | 
    
         
            +
                        mod.define_method(name) do |*args|
         
     | 
| 
      
 321 
     | 
    
         
            +
                          last = args.last
         
     | 
| 
      
 322 
     | 
    
         
            +
                          options = \
         
     | 
| 
      
 323 
     | 
    
         
            +
                            case last
         
     | 
| 
      
 324 
     | 
    
         
            +
                            when Hash
         
     | 
| 
      
 325 
     | 
    
         
            +
                              args.pop
         
     | 
| 
      
 326 
     | 
    
         
            +
                            when ActionController::Parameters
         
     | 
| 
      
 327 
     | 
    
         
            +
                              args.pop.to_h
         
     | 
| 
      
 328 
     | 
    
         
            +
                            end
         
     | 
| 
      
 329 
     | 
    
         
            +
                          helper.call self, args, options
         
     | 
| 
       332 
330 
     | 
    
         
             
                        end
         
     | 
| 
       333 
331 
     | 
    
         
             
                      end
         
     | 
| 
       334 
332 
     | 
    
         
             
                  end
         
     | 
| 
       335 
333 
     | 
    
         | 
| 
       336 
     | 
    
         
            -
                  # strategy for building  
     | 
| 
      
 334 
     | 
    
         
            +
                  # strategy for building URLs to send to the client
         
     | 
| 
       337 
335 
     | 
    
         
             
                  PATH    = ->(options) { ActionDispatch::Http::URL.path_for(options) }
         
     | 
| 
       338 
336 
     | 
    
         
             
                  UNKNOWN = ->(options) { ActionDispatch::Http::URL.url_for(options) }
         
     | 
| 
       339 
337 
     | 
    
         | 
| 
         @@ -593,14 +591,14 @@ module ActionDispatch 
     | 
|
| 
       593 
591 
     | 
    
         
             
                    if route.segment_keys.include?(:controller)
         
     | 
| 
       594 
592 
     | 
    
         
             
                      ActiveSupport::Deprecation.warn(<<-MSG.squish)
         
     | 
| 
       595 
593 
     | 
    
         
             
                        Using a dynamic :controller segment in a route is deprecated and
         
     | 
| 
       596 
     | 
    
         
            -
                        will be removed in Rails 6. 
     | 
| 
      
 594 
     | 
    
         
            +
                        will be removed in Rails 6.1.
         
     | 
| 
       597 
595 
     | 
    
         
             
                      MSG
         
     | 
| 
       598 
596 
     | 
    
         
             
                    end
         
     | 
| 
       599 
597 
     | 
    
         | 
| 
       600 
598 
     | 
    
         
             
                    if route.segment_keys.include?(:action)
         
     | 
| 
       601 
599 
     | 
    
         
             
                      ActiveSupport::Deprecation.warn(<<-MSG.squish)
         
     | 
| 
       602 
600 
     | 
    
         
             
                        Using a dynamic :action segment in a route is deprecated and
         
     | 
| 
       603 
     | 
    
         
            -
                        will be removed in Rails 6. 
     | 
| 
      
 601 
     | 
    
         
            +
                        will be removed in Rails 6.1.
         
     | 
| 
       604 
602 
     | 
    
         
             
                      MSG
         
     | 
| 
       605 
603 
     | 
    
         
             
                    end
         
     | 
| 
       606 
604 
     | 
    
         | 
| 
         @@ -4,13 +4,13 @@ gem "capybara", ">= 2.15" 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
            require "capybara/dsl"
         
     | 
| 
       6 
6 
     | 
    
         
             
            require "capybara/minitest"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "selenium/webdriver"
         
     | 
| 
       7 
8 
     | 
    
         
             
            require "action_controller"
         
     | 
| 
       8 
9 
     | 
    
         
             
            require "action_dispatch/system_testing/driver"
         
     | 
| 
       9 
10 
     | 
    
         
             
            require "action_dispatch/system_testing/browser"
         
     | 
| 
       10 
11 
     | 
    
         
             
            require "action_dispatch/system_testing/server"
         
     | 
| 
       11 
12 
     | 
    
         
             
            require "action_dispatch/system_testing/test_helpers/screenshot_helper"
         
     | 
| 
       12 
13 
     | 
    
         
             
            require "action_dispatch/system_testing/test_helpers/setup_and_teardown"
         
     | 
| 
       13 
     | 
    
         
            -
            require "action_dispatch/system_testing/test_helpers/undef_methods"
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            module ActionDispatch
         
     | 
| 
       16 
16 
     | 
    
         
             
              # = System Testing
         
     | 
| 
         @@ -89,19 +89,47 @@ module ActionDispatch 
     | 
|
| 
       89 
89 
     | 
    
         
             
              #       { js_errors: true }
         
     | 
| 
       90 
90 
     | 
    
         
             
              #   end
         
     | 
| 
       91 
91 
     | 
    
         
             
              #
         
     | 
| 
      
 92 
     | 
    
         
            +
              # Some drivers require browser capabilities to be passed as a block instead
         
     | 
| 
      
 93 
     | 
    
         
            +
              # of through the +options+ hash.
         
     | 
| 
      
 94 
     | 
    
         
            +
              #
         
     | 
| 
      
 95 
     | 
    
         
            +
              # As an example, if you want to add mobile emulation on chrome, you'll have to
         
     | 
| 
      
 96 
     | 
    
         
            +
              # create an instance of selenium's +Chrome::Options+ object and add
         
     | 
| 
      
 97 
     | 
    
         
            +
              # capabilities with a block.
         
     | 
| 
      
 98 
     | 
    
         
            +
              #
         
     | 
| 
      
 99 
     | 
    
         
            +
              # The block will be passed an instance of <tt><Driver>::Options</tt> where you can
         
     | 
| 
      
 100 
     | 
    
         
            +
              # define the capabilities you want. Please refer to your driver documentation
         
     | 
| 
      
 101 
     | 
    
         
            +
              # to learn about supported options.
         
     | 
| 
      
 102 
     | 
    
         
            +
              #
         
     | 
| 
      
 103 
     | 
    
         
            +
              #   class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
         
     | 
| 
      
 104 
     | 
    
         
            +
              #     driven_by :selenium, using: :chrome, screen_size: [1024, 768] do |driver_option|
         
     | 
| 
      
 105 
     | 
    
         
            +
              #       driver_option.add_emulation(device_name: 'iPhone 6')
         
     | 
| 
      
 106 
     | 
    
         
            +
              #       driver_option.add_extension('path/to/chrome_extension.crx')
         
     | 
| 
      
 107 
     | 
    
         
            +
              #     end
         
     | 
| 
      
 108 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 109 
     | 
    
         
            +
              #
         
     | 
| 
       92 
110 
     | 
    
         
             
              # Because <tt>ActionDispatch::SystemTestCase</tt> is a shim between Capybara
         
     | 
| 
       93 
111 
     | 
    
         
             
              # and Rails, any driver that is supported by Capybara is supported by system
         
     | 
| 
       94 
112 
     | 
    
         
             
              # tests as long as you include the required gems and files.
         
     | 
| 
       95 
     | 
    
         
            -
              class SystemTestCase <  
     | 
| 
      
 113 
     | 
    
         
            +
              class SystemTestCase < ActiveSupport::TestCase
         
     | 
| 
       96 
114 
     | 
    
         
             
                include Capybara::DSL
         
     | 
| 
       97 
115 
     | 
    
         
             
                include Capybara::Minitest::Assertions
         
     | 
| 
       98 
116 
     | 
    
         
             
                include SystemTesting::TestHelpers::SetupAndTeardown
         
     | 
| 
       99 
117 
     | 
    
         
             
                include SystemTesting::TestHelpers::ScreenshotHelper
         
     | 
| 
       100 
     | 
    
         
            -
                include SystemTesting::TestHelpers::UndefMethods
         
     | 
| 
       101 
118 
     | 
    
         | 
| 
       102 
119 
     | 
    
         
             
                def initialize(*) # :nodoc:
         
     | 
| 
       103 
120 
     | 
    
         
             
                  super
         
     | 
| 
       104 
121 
     | 
    
         
             
                  self.class.driver.use
         
     | 
| 
      
 122 
     | 
    
         
            +
                  @proxy_route = if ActionDispatch.test_app
         
     | 
| 
      
 123 
     | 
    
         
            +
                    Class.new do
         
     | 
| 
      
 124 
     | 
    
         
            +
                      include ActionDispatch.test_app.routes.url_helpers
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
                      def url_options
         
     | 
| 
      
 127 
     | 
    
         
            +
                        default_url_options.merge(host: Capybara.app_host)
         
     | 
| 
      
 128 
     | 
    
         
            +
                      end
         
     | 
| 
      
 129 
     | 
    
         
            +
                    end.new
         
     | 
| 
      
 130 
     | 
    
         
            +
                  else
         
     | 
| 
      
 131 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 132 
     | 
    
         
            +
                  end
         
     | 
| 
       105 
133 
     | 
    
         
             
                end
         
     | 
| 
       106 
134 
     | 
    
         | 
| 
       107 
135 
     | 
    
         
             
                def self.start_application # :nodoc:
         
     | 
| 
         @@ -134,12 +162,22 @@ module ActionDispatch 
     | 
|
| 
       134 
162 
     | 
    
         
             
                #   driven_by :selenium, using: :firefox
         
     | 
| 
       135 
163 
     | 
    
         
             
                #
         
     | 
| 
       136 
164 
     | 
    
         
             
                #   driven_by :selenium, using: :headless_firefox
         
     | 
| 
       137 
     | 
    
         
            -
                def self.driven_by(driver, using: :chrome, screen_size: [1400, 1400], options: {})
         
     | 
| 
       138 
     | 
    
         
            -
                   
     | 
| 
      
 165 
     | 
    
         
            +
                def self.driven_by(driver, using: :chrome, screen_size: [1400, 1400], options: {}, &capabilities)
         
     | 
| 
      
 166 
     | 
    
         
            +
                  driver_options = { using: using, screen_size: screen_size, options: options }
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                  self.driver = SystemTesting::Driver.new(driver, driver_options, &capabilities)
         
     | 
| 
       139 
169 
     | 
    
         
             
                end
         
     | 
| 
       140 
170 
     | 
    
         | 
| 
       141 
171 
     | 
    
         
             
                driven_by :selenium
         
     | 
| 
       142 
172 
     | 
    
         | 
| 
      
 173 
     | 
    
         
            +
                def method_missing(method, *args, &block)
         
     | 
| 
      
 174 
     | 
    
         
            +
                  if @proxy_route.respond_to?(method)
         
     | 
| 
      
 175 
     | 
    
         
            +
                    @proxy_route.send(method, *args, &block)
         
     | 
| 
      
 176 
     | 
    
         
            +
                  else
         
     | 
| 
      
 177 
     | 
    
         
            +
                    super
         
     | 
| 
      
 178 
     | 
    
         
            +
                  end
         
     | 
| 
      
 179 
     | 
    
         
            +
                end
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
       143 
181 
     | 
    
         
             
                ActiveSupport.run_load_hooks(:action_dispatch_system_test_case, self)
         
     | 
| 
       144 
182 
     | 
    
         
             
              end
         
     | 
| 
       145 
183 
     | 
    
         | 
| 
         @@ -29,20 +29,51 @@ module ActionDispatch 
     | 
|
| 
       29 
29 
     | 
    
         
             
                    end
         
     | 
| 
       30 
30 
     | 
    
         
             
                  end
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
      
 32 
     | 
    
         
            +
                  def capabilities
         
     | 
| 
      
 33 
     | 
    
         
            +
                    @option ||=
         
     | 
| 
      
 34 
     | 
    
         
            +
                      case type
         
     | 
| 
      
 35 
     | 
    
         
            +
                      when :chrome
         
     | 
| 
      
 36 
     | 
    
         
            +
                        ::Selenium::WebDriver::Chrome::Options.new
         
     | 
| 
      
 37 
     | 
    
         
            +
                      when :firefox
         
     | 
| 
      
 38 
     | 
    
         
            +
                        ::Selenium::WebDriver::Firefox::Options.new
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  # driver_path can be configured as a proc. The webdrivers gem uses this
         
     | 
| 
      
 43 
     | 
    
         
            +
                  # proc to update web drivers. Running this proc early allows us to only
         
     | 
| 
      
 44 
     | 
    
         
            +
                  # update the webdriver once and avoid race conditions when using
         
     | 
| 
      
 45 
     | 
    
         
            +
                  # parallel tests.
         
     | 
| 
      
 46 
     | 
    
         
            +
                  def preload
         
     | 
| 
      
 47 
     | 
    
         
            +
                    case type
         
     | 
| 
      
 48 
     | 
    
         
            +
                    when :chrome
         
     | 
| 
      
 49 
     | 
    
         
            +
                      if ::Selenium::WebDriver::Service.respond_to? :driver_path=
         
     | 
| 
      
 50 
     | 
    
         
            +
                        ::Selenium::WebDriver::Chrome::Service.driver_path.try(:call)
         
     | 
| 
      
 51 
     | 
    
         
            +
                      else
         
     | 
| 
      
 52 
     | 
    
         
            +
                        # Selenium <= v3.141.0
         
     | 
| 
      
 53 
     | 
    
         
            +
                        ::Selenium::WebDriver::Chrome.driver_path
         
     | 
| 
      
 54 
     | 
    
         
            +
                      end
         
     | 
| 
      
 55 
     | 
    
         
            +
                    when :firefox
         
     | 
| 
      
 56 
     | 
    
         
            +
                      if ::Selenium::WebDriver::Service.respond_to? :driver_path=
         
     | 
| 
      
 57 
     | 
    
         
            +
                        ::Selenium::WebDriver::Firefox::Service.driver_path.try(:call)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      else
         
     | 
| 
      
 59 
     | 
    
         
            +
                        # Selenium <= v3.141.0
         
     | 
| 
      
 60 
     | 
    
         
            +
                        ::Selenium::WebDriver::Firefox.driver_path
         
     | 
| 
      
 61 
     | 
    
         
            +
                      end
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
       32 
65 
     | 
    
         
             
                  private
         
     | 
| 
       33 
66 
     | 
    
         
             
                    def headless_chrome_browser_options
         
     | 
| 
       34 
     | 
    
         
            -
                       
     | 
| 
       35 
     | 
    
         
            -
                       
     | 
| 
       36 
     | 
    
         
            -
                      options.args << "--disable-gpu" if Gem.win_platform?
         
     | 
| 
      
 67 
     | 
    
         
            +
                      capabilities.args << "--headless"
         
     | 
| 
      
 68 
     | 
    
         
            +
                      capabilities.args << "--disable-gpu" if Gem.win_platform?
         
     | 
| 
       37 
69 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                       
     | 
| 
      
 70 
     | 
    
         
            +
                      capabilities
         
     | 
| 
       39 
71 
     | 
    
         
             
                    end
         
     | 
| 
       40 
72 
     | 
    
         | 
| 
       41 
73 
     | 
    
         
             
                    def headless_firefox_browser_options
         
     | 
| 
       42 
     | 
    
         
            -
                       
     | 
| 
       43 
     | 
    
         
            -
                      options.args << "-headless"
         
     | 
| 
      
 74 
     | 
    
         
            +
                      capabilities.args << "-headless"
         
     | 
| 
       44 
75 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
                       
     | 
| 
      
 76 
     | 
    
         
            +
                      capabilities
         
     | 
| 
       46 
77 
     | 
    
         
             
                    end
         
     | 
| 
       47 
78 
     | 
    
         
             
                end
         
     | 
| 
       48 
79 
     | 
    
         
             
              end
         
     |