actionpack 8.0.1 → 8.0.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +40 -0
- data/lib/action_controller/metal/live.rb +6 -2
- data/lib/action_controller/metal/params_wrapper.rb +3 -3
- data/lib/action_controller/metal/request_forgery_protection.rb +3 -1
- data/lib/action_controller/metal/strong_parameters.rb +1 -4
- data/lib/action_controller/test_case.rb +8 -0
- data/lib/action_dispatch/http/request.rb +4 -3
- data/lib/action_dispatch/journey/formatter.rb +8 -3
- data/lib/action_dispatch/middleware/executor.rb +5 -2
- data/lib/action_dispatch/routing/mapper.rb +7 -6
- data/lib/action_dispatch/testing/assertions/routing.rb +12 -8
- data/lib/action_dispatch/testing/integration.rb +2 -2
- data/lib/action_pack/gem_version.rb +1 -1
- metadata +12 -15
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 14abb1a6b812efa40da31cf30c3171405982457ed80984d231dae2af352f43f4
         | 
| 4 | 
            +
              data.tar.gz: 3e934fe98cf59aa4727eb76b0f13567861fe01c04dbc6cd9c4e313b165a0a64e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: dde2e5f17a6d54ae692f64ec2d05a3dc8e54d4fb30d97dd4b1fa3e4c7363d1132facf04286c1b3f25ffdb78f8302eafa7a6c13d027b890589813e4e60e6f5e77
         | 
| 7 | 
            +
              data.tar.gz: 773181339ec3539e73607f4e1588082893c3ac38d54e6c32a930ccf85bcffb41c95ad568a6bbe00bbc41967f98ed964d3200880a3c1f7b1dbfafeef405d8b1b5
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,43 @@ | |
| 1 | 
            +
            ## Rails 8.0.2 (March 12, 2025) ##
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            *   No changes.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            ## Rails 8.0.2 (March 12, 2025) ##
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            *   Improve `with_routing` test helper to not rebuild the middleware stack.
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                Otherwise some middleware configuration could be lost.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                *Édouard Chin*
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            *   Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                This makes it easier to locate the source of the problem, especially for routes drawn by gems.
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                Before:
         | 
| 19 | 
            +
                ```
         | 
| 20 | 
            +
                :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
         | 
| 21 | 
            +
                ```
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                After:
         | 
| 24 | 
            +
                ```
         | 
| 25 | 
            +
                Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
         | 
| 26 | 
            +
                ```
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                *Jeremy Green*
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            *   Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                Prevents various security scanners from causing exceptions.
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                *Martin Emde*
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            *   Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                *Jean Boussier*
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 1 41 | 
             
            ## Rails 8.0.1 (December 13, 2024) ##
         | 
| 2 42 |  | 
| 3 43 | 
             
            *   Add `ActionDispatch::Request::Session#store` method to conform Rack spec.
         | 
| @@ -307,9 +307,8 @@ module ActionController | |
| 307 307 | 
             
                          error = e
         | 
| 308 308 | 
             
                        end
         | 
| 309 309 | 
             
                      ensure
         | 
| 310 | 
            -
                        # Ensure we clean up any thread locals we copied so that the thread can reused.
         | 
| 311 310 | 
             
                        ActiveSupport::IsolatedExecutionState.clear
         | 
| 312 | 
            -
                        locals | 
| 311 | 
            +
                        clean_up_thread_locals(locals, t2)
         | 
| 313 312 |  | 
| 314 313 | 
             
                        @_response.commit!
         | 
| 315 314 | 
             
                      end
         | 
| @@ -383,6 +382,11 @@ module ActionController | |
| 383 382 | 
             
                    end
         | 
| 384 383 | 
             
                  end
         | 
| 385 384 |  | 
| 385 | 
            +
                  # Ensure we clean up any thread locals we copied so that the thread can reused.
         | 
| 386 | 
            +
                  def clean_up_thread_locals(locals, thread) # :nodoc:
         | 
| 387 | 
            +
                    locals.each { |k, _| thread[k] = nil }
         | 
| 388 | 
            +
                  end
         | 
| 389 | 
            +
             | 
| 386 390 | 
             
                  def self.live_thread_pool_executor
         | 
| 387 391 | 
             
                    @live_thread_pool_executor ||= Concurrent::CachedThreadPool.new(name: "action_controller.live")
         | 
| 388 392 | 
             
                  end
         | 
| @@ -198,14 +198,14 @@ module ActionController | |
| 198 198 | 
             
                  #       # enables the parameter wrapper for XML format
         | 
| 199 199 | 
             
                  #
         | 
| 200 200 | 
             
                  #     wrap_parameters :person
         | 
| 201 | 
            -
                  #       # wraps parameters into  | 
| 201 | 
            +
                  #       # wraps parameters into params[:person] hash
         | 
| 202 202 | 
             
                  #
         | 
| 203 203 | 
             
                  #     wrap_parameters Person
         | 
| 204 204 | 
             
                  #       # wraps parameters by determining the wrapper key from Person class
         | 
| 205 | 
            -
                  #       # ( | 
| 205 | 
            +
                  #       # (:person, in this case) and the list of attribute names
         | 
| 206 206 | 
             
                  #
         | 
| 207 207 | 
             
                  #     wrap_parameters include: [:username, :title]
         | 
| 208 | 
            -
                  #       # wraps only  | 
| 208 | 
            +
                  #       # wraps only :username and :title attributes from parameters.
         | 
| 209 209 | 
             
                  #
         | 
| 210 210 | 
             
                  #     wrap_parameters false
         | 
| 211 211 | 
             
                  #       # disables parameters wrapping for this controller altogether.
         | 
| @@ -142,6 +142,7 @@ module ActionController # :nodoc: | |
| 142 142 | 
             
                  #
         | 
| 143 143 | 
             
                  #
         | 
| 144 144 | 
             
                  # Built-in unverified request handling methods are:
         | 
| 145 | 
            +
                  #
         | 
| 145 146 | 
             
                  # *   `:exception` - Raises ActionController::InvalidAuthenticityToken
         | 
| 146 147 | 
             
                  #     exception.
         | 
| 147 148 | 
             
                  # *   `:reset_session` - Resets the session.
         | 
| @@ -170,6 +171,7 @@ module ActionController # :nodoc: | |
| 170 171 | 
             
                  #
         | 
| 171 172 | 
             
                  #
         | 
| 172 173 | 
             
                  # Built-in session token strategies are:
         | 
| 174 | 
            +
                  #
         | 
| 173 175 | 
             
                  # *   `:session` - Store the CSRF token in the session.  Used as default if
         | 
| 174 176 | 
             
                  #     `:store` option is not specified.
         | 
| 175 177 | 
             
                  # *   `:cookie` - Store the CSRF token in an encrypted cookie.
         | 
| @@ -498,7 +500,7 @@ module ActionController # :nodoc: | |
| 498 500 | 
             
                  # Checks the client's masked token to see if it matches the session token.
         | 
| 499 501 | 
             
                  # Essentially the inverse of `masked_authenticity_token`.
         | 
| 500 502 | 
             
                  def valid_authenticity_token?(session, encoded_masked_token) # :doc:
         | 
| 501 | 
            -
                    if encoded_masked_token. | 
| 503 | 
            +
                    if !encoded_masked_token.is_a?(String) || encoded_masked_token.empty?
         | 
| 502 504 | 
             
                      return false
         | 
| 503 505 | 
             
                    end
         | 
| 504 506 |  | 
| @@ -765,7 +765,7 @@ module ActionController | |
| 765 765 | 
             
                #
         | 
| 766 766 | 
             
                #     params = ActionController::Parameters.new(tags: ["rails", "parameters"])
         | 
| 767 767 | 
             
                #     permitted = params.expect(tags: [])
         | 
| 768 | 
            -
                #     permitted | 
| 768 | 
            +
                #     permitted                 # => ["rails", "parameters"]
         | 
| 769 769 | 
             
                #     permitted.is_a?(Array)    # => true
         | 
| 770 770 | 
             
                #     permitted.size            # => 2
         | 
| 771 771 | 
             
                #
         | 
| @@ -1287,9 +1287,6 @@ module ActionController | |
| 1287 1287 | 
             
                    keys - params.keys - always_permitted_parameters
         | 
| 1288 1288 | 
             
                  end
         | 
| 1289 1289 |  | 
| 1290 | 
            -
                  #
         | 
| 1291 | 
            -
                  # --- Filtering ----------------------------------------------------------
         | 
| 1292 | 
            -
                  #
         | 
| 1293 1290 | 
             
                  # This is a list of permitted scalar types that includes the ones supported in
         | 
| 1294 1291 | 
             
                  # XML and JSON requests.
         | 
| 1295 1292 | 
             
                  #
         | 
| @@ -29,6 +29,14 @@ module ActionController | |
| 29 29 | 
             
                  yield
         | 
| 30 30 | 
             
                end
         | 
| 31 31 |  | 
| 32 | 
            +
                # Because of the above, we need to prevent the clearing of thread locals, since
         | 
| 33 | 
            +
                # no new thread is actually spawned in the test environment.
         | 
| 34 | 
            +
                alias_method :original_clean_up_thread_locals, :clean_up_thread_locals
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                silence_redefinition_of_method :clean_up_thread_locals
         | 
| 37 | 
            +
                def clean_up_thread_locals(*args) # :nodoc:
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 32 40 | 
             
                # Avoid a deadlock from the queue filling up
         | 
| 33 41 | 
             
                Buffer.queue_size = nil
         | 
| 34 42 | 
             
              end
         | 
| @@ -139,7 +139,7 @@ module ActionDispatch | |
| 139 139 |  | 
| 140 140 | 
             
                # Populate the HTTP method lookup cache.
         | 
| 141 141 | 
             
                HTTP_METHODS.each { |method|
         | 
| 142 | 
            -
                  HTTP_METHOD_LOOKUP[method] = method.underscore.to_sym
         | 
| 142 | 
            +
                  HTTP_METHOD_LOOKUP[method] = method.downcase.underscore.to_sym
         | 
| 143 143 | 
             
                }
         | 
| 144 144 |  | 
| 145 145 | 
             
                alias raw_request_method request_method # :nodoc:
         | 
| @@ -243,8 +243,9 @@ module ActionDispatch | |
| 243 243 | 
             
                #
         | 
| 244 244 | 
             
                #     send_early_hints("link" => "</style.css>; rel=preload; as=style,</script.js>; rel=preload")
         | 
| 245 245 | 
             
                #
         | 
| 246 | 
            -
                # If you are using  | 
| 247 | 
            -
                #  | 
| 246 | 
            +
                # If you are using {javascript_include_tag}[rdoc-ref:ActionView::Helpers::AssetTagHelper#javascript_include_tag]
         | 
| 247 | 
            +
                # or {stylesheet_link_tag}[rdoc-ref:ActionView::Helpers::AssetTagHelper#stylesheet_link_tag]
         | 
| 248 | 
            +
                # the Early Hints headers are included by default if supported.
         | 
| 248 249 | 
             
                def send_early_hints(links)
         | 
| 249 250 | 
             
                  env["rack.early_hints"]&.call(links)
         | 
| 250 251 | 
             
                end
         | 
| @@ -60,8 +60,13 @@ module ActionDispatch | |
| 60 60 |  | 
| 61 61 | 
             
                  def generate(name, options, path_parameters)
         | 
| 62 62 | 
             
                    original_options = options.dup
         | 
| 63 | 
            -
                    path_params = options.delete(:path_params) | 
| 64 | 
            -
                     | 
| 63 | 
            +
                    path_params = options.delete(:path_params)
         | 
| 64 | 
            +
                    if path_params.is_a?(Hash)
         | 
| 65 | 
            +
                      options = path_params.merge(options)
         | 
| 66 | 
            +
                    else
         | 
| 67 | 
            +
                      path_params = nil
         | 
| 68 | 
            +
                      options = options.dup
         | 
| 69 | 
            +
                    end
         | 
| 65 70 | 
             
                    constraints = path_parameters.merge(options)
         | 
| 66 71 | 
             
                    missing_keys = nil
         | 
| 67 72 |  | 
| @@ -79,7 +84,7 @@ module ActionDispatch | |
| 79 84 | 
             
                        # top-level params' normal behavior of generating query_params should be
         | 
| 80 85 | 
             
                        # preserved even if the same key is also a bind_param
         | 
| 81 86 | 
             
                        parameterized_parts.key?(key) || route.defaults.key?(key) ||
         | 
| 82 | 
            -
                          (path_params | 
| 87 | 
            +
                          (path_params&.key?(key) && !original_options.key?(key))
         | 
| 83 88 | 
             
                      end
         | 
| 84 89 |  | 
| 85 90 | 
             
                      defaults       = route.defaults
         | 
| @@ -21,8 +21,11 @@ module ActionDispatch | |
| 21 21 | 
             
                    end
         | 
| 22 22 |  | 
| 23 23 | 
             
                    returned = response << ::Rack::BodyProxy.new(response.pop) { state.complete! }
         | 
| 24 | 
            -
                  rescue => error
         | 
| 25 | 
            -
                     | 
| 24 | 
            +
                  rescue Exception => error
         | 
| 25 | 
            +
                    request = ActionDispatch::Request.new env
         | 
| 26 | 
            +
                    backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
         | 
| 27 | 
            +
                    wrapper = ExceptionWrapper.new(backtrace_cleaner, error)
         | 
| 28 | 
            +
                    @executor.error_reporter.report(wrapper.unwrapped_exception, handled: false, source: "application.action_dispatch")
         | 
| 26 29 | 
             
                    raise
         | 
| 27 30 | 
             
                  ensure
         | 
| 28 31 | 
             
                    state.complete! unless returned
         | 
| @@ -840,7 +840,7 @@ module ActionDispatch | |
| 840 840 | 
             
                    #
         | 
| 841 841 | 
             
                    # Takes same options as `Base#match` and `Resources#resources`.
         | 
| 842 842 | 
             
                    #
         | 
| 843 | 
            -
                    #     # route /posts (without the prefix /admin) to  | 
| 843 | 
            +
                    #     # route /posts (without the prefix /admin) to Admin::PostsController
         | 
| 844 844 | 
             
                    #     scope module: "admin" do
         | 
| 845 845 | 
             
                    #       resources :posts
         | 
| 846 846 | 
             
                    #     end
         | 
| @@ -850,7 +850,7 @@ module ActionDispatch | |
| 850 850 | 
             
                    #       resources :posts
         | 
| 851 851 | 
             
                    #     end
         | 
| 852 852 | 
             
                    #
         | 
| 853 | 
            -
                    #     # prefix the routing helper name:  | 
| 853 | 
            +
                    #     # prefix the routing helper name: sekret_posts_path instead of posts_path
         | 
| 854 854 | 
             
                    #     scope as: "sekret" do
         | 
| 855 855 | 
             
                    #       resources :posts
         | 
| 856 856 | 
             
                    #     end
         | 
| @@ -949,12 +949,12 @@ module ActionDispatch | |
| 949 949 | 
             
                    #       resources :posts
         | 
| 950 950 | 
             
                    #     end
         | 
| 951 951 | 
             
                    #
         | 
| 952 | 
            -
                    #     # maps to  | 
| 952 | 
            +
                    #     # maps to Sekret::PostsController rather than Admin::PostsController
         | 
| 953 953 | 
             
                    #     namespace :admin, module: "sekret" do
         | 
| 954 954 | 
             
                    #       resources :posts
         | 
| 955 955 | 
             
                    #     end
         | 
| 956 956 | 
             
                    #
         | 
| 957 | 
            -
                    #     # generates  | 
| 957 | 
            +
                    #     # generates sekret_posts_path rather than admin_posts_path
         | 
| 958 958 | 
             
                    #     namespace :admin, as: "sekret" do
         | 
| 959 959 | 
             
                    #       resources :posts
         | 
| 960 960 | 
             
                    #     end
         | 
| @@ -1181,7 +1181,8 @@ module ActionDispatch | |
| 1181 1181 |  | 
| 1182 1182 | 
             
                        valid_actions = self.class.default_actions(false) # ignore api_only for this validation
         | 
| 1183 1183 | 
             
                        if invalid_actions = invalid_only_except_options(options, valid_actions).presence
         | 
| 1184 | 
            -
                           | 
| 1184 | 
            +
                          error_prefix = "Route `resource#{"s" unless singleton?} :#{entities}`"
         | 
| 1185 | 
            +
                          raise ArgumentError, "#{error_prefix} - :only and :except must include only #{valid_actions}, but also included #{invalid_actions}"
         | 
| 1185 1186 | 
             
                        end
         | 
| 1186 1187 |  | 
| 1187 1188 | 
             
                        @name       = entities.to_s
         | 
| @@ -1509,7 +1510,7 @@ module ActionDispatch | |
| 1509 1510 | 
             
                    #
         | 
| 1510 1511 | 
             
                    # ### Examples
         | 
| 1511 1512 | 
             
                    #
         | 
| 1512 | 
            -
                    #     # routes call  | 
| 1513 | 
            +
                    #     # routes call Admin::PostsController
         | 
| 1513 1514 | 
             
                    #     resources :posts, module: "admin"
         | 
| 1514 1515 | 
             
                    #
         | 
| 1515 1516 | 
             
                    #     # resource actions are at /admin/posts.
         | 
| @@ -5,6 +5,7 @@ | |
| 5 5 | 
             
            require "uri"
         | 
| 6 6 | 
             
            require "active_support/core_ext/hash/indifferent_access"
         | 
| 7 7 | 
             
            require "active_support/core_ext/string/access"
         | 
| 8 | 
            +
            require "active_support/core_ext/module/redefine_method"
         | 
| 8 9 | 
             
            require "action_controller/metal/exceptions"
         | 
| 9 10 |  | 
| 10 11 | 
             
            module ActionDispatch
         | 
| @@ -20,38 +21,43 @@ module ActionDispatch | |
| 20 21 | 
             
                    module ClassMethods
         | 
| 21 22 | 
             
                      def with_routing(&block)
         | 
| 22 23 | 
             
                        old_routes = nil
         | 
| 24 | 
            +
                        old_routes_call_method = nil
         | 
| 23 25 | 
             
                        old_integration_session = nil
         | 
| 24 26 |  | 
| 25 27 | 
             
                        setup do
         | 
| 26 28 | 
             
                          old_routes = app.routes
         | 
| 29 | 
            +
                          old_routes_call_method = old_routes.method(:call)
         | 
| 27 30 | 
             
                          old_integration_session = integration_session
         | 
| 28 31 | 
             
                          create_routes(&block)
         | 
| 29 32 | 
             
                        end
         | 
| 30 33 |  | 
| 31 34 | 
             
                        teardown do
         | 
| 32 | 
            -
                          reset_routes(old_routes, old_integration_session)
         | 
| 35 | 
            +
                          reset_routes(old_routes, old_routes_call_method, old_integration_session)
         | 
| 33 36 | 
             
                        end
         | 
| 34 37 | 
             
                      end
         | 
| 35 38 | 
             
                    end
         | 
| 36 39 |  | 
| 37 40 | 
             
                    def with_routing(&block)
         | 
| 38 41 | 
             
                      old_routes = app.routes
         | 
| 42 | 
            +
                      old_routes_call_method = old_routes.method(:call)
         | 
| 39 43 | 
             
                      old_integration_session = integration_session
         | 
| 40 44 | 
             
                      create_routes(&block)
         | 
| 41 45 | 
             
                    ensure
         | 
| 42 | 
            -
                      reset_routes(old_routes, old_integration_session)
         | 
| 46 | 
            +
                      reset_routes(old_routes, old_routes_call_method, old_integration_session)
         | 
| 43 47 | 
             
                    end
         | 
| 44 48 |  | 
| 45 49 | 
             
                    private
         | 
| 46 50 | 
             
                      def create_routes
         | 
| 47 51 | 
             
                        app = self.app
         | 
| 48 52 | 
             
                        routes = ActionDispatch::Routing::RouteSet.new
         | 
| 49 | 
            -
             | 
| 53 | 
            +
             | 
| 54 | 
            +
                        @original_routes ||= app.routes
         | 
| 55 | 
            +
                        @original_routes.singleton_class.redefine_method(:call, &routes.method(:call))
         | 
| 56 | 
            +
             | 
| 50 57 | 
             
                        https = integration_session.https?
         | 
| 51 58 | 
             
                        host = integration_session.host
         | 
| 52 59 |  | 
| 53 60 | 
             
                        app.instance_variable_set(:@routes, routes)
         | 
| 54 | 
            -
                        app.instance_variable_set(:@app, rack_app)
         | 
| 55 61 | 
             
                        @integration_session = Class.new(ActionDispatch::Integration::Session) do
         | 
| 56 62 | 
             
                          include app.routes.url_helpers
         | 
| 57 63 | 
             
                          include app.routes.mounted_helpers
         | 
| @@ -63,11 +69,9 @@ module ActionDispatch | |
| 63 69 | 
             
                        yield routes
         | 
| 64 70 | 
             
                      end
         | 
| 65 71 |  | 
| 66 | 
            -
                      def reset_routes(old_routes, old_integration_session)
         | 
| 67 | 
            -
                        old_rack_app = app.config.middleware.build(old_routes)
         | 
| 68 | 
            -
             | 
| 72 | 
            +
                      def reset_routes(old_routes, old_routes_call_method, old_integration_session)
         | 
| 69 73 | 
             
                        app.instance_variable_set(:@routes, old_routes)
         | 
| 70 | 
            -
                         | 
| 74 | 
            +
                        @original_routes.singleton_class.redefine_method(:call, &old_routes_call_method)
         | 
| 71 75 | 
             
                        @integration_session = old_integration_session
         | 
| 72 76 | 
             
                        @routes = old_routes
         | 
| 73 77 | 
             
                      end
         | 
| @@ -549,7 +549,7 @@ module ActionDispatch | |
| 549 549 | 
             
              #         https!(false)
         | 
| 550 550 | 
             
              #         get "/articles/all"
         | 
| 551 551 | 
             
              #         assert_response :success
         | 
| 552 | 
            -
              #          | 
| 552 | 
            +
              #         assert_dom 'h1', 'Articles'
         | 
| 553 553 | 
             
              #       end
         | 
| 554 554 | 
             
              #     end
         | 
| 555 555 | 
             
              #
         | 
| @@ -588,7 +588,7 @@ module ActionDispatch | |
| 588 588 | 
             
              #           def browses_site
         | 
| 589 589 | 
             
              #             get "/products/all"
         | 
| 590 590 | 
             
              #             assert_response :success
         | 
| 591 | 
            -
              #              | 
| 591 | 
            +
              #             assert_dom 'h1', 'Products'
         | 
| 592 592 | 
             
              #           end
         | 
| 593 593 | 
             
              #         end
         | 
| 594 594 | 
             
              #
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: actionpack
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 8.0. | 
| 4 | 
            +
              version: 8.0.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - David Heinemeier Hansson
         | 
| 8 | 
            -
            autorequire: 
         | 
| 9 8 | 
             
            bindir: bin
         | 
| 10 9 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 10 | 
            +
            date: 2025-03-12 00:00:00.000000000 Z
         | 
| 12 11 | 
             
            dependencies:
         | 
| 13 12 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 13 | 
             
              name: activesupport
         | 
| @@ -16,14 +15,14 @@ dependencies: | |
| 16 15 | 
             
                requirements:
         | 
| 17 16 | 
             
                - - '='
         | 
| 18 17 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: 8.0. | 
| 18 | 
            +
                    version: 8.0.2
         | 
| 20 19 | 
             
              type: :runtime
         | 
| 21 20 | 
             
              prerelease: false
         | 
| 22 21 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 22 | 
             
                requirements:
         | 
| 24 23 | 
             
                - - '='
         | 
| 25 24 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: 8.0. | 
| 25 | 
            +
                    version: 8.0.2
         | 
| 27 26 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 27 | 
             
              name: nokogiri
         | 
| 29 28 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -128,28 +127,28 @@ dependencies: | |
| 128 127 | 
             
                requirements:
         | 
| 129 128 | 
             
                - - '='
         | 
| 130 129 | 
             
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: 8.0. | 
| 130 | 
            +
                    version: 8.0.2
         | 
| 132 131 | 
             
              type: :runtime
         | 
| 133 132 | 
             
              prerelease: false
         | 
| 134 133 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 134 | 
             
                requirements:
         | 
| 136 135 | 
             
                - - '='
         | 
| 137 136 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: 8.0. | 
| 137 | 
            +
                    version: 8.0.2
         | 
| 139 138 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 140 139 | 
             
              name: activemodel
         | 
| 141 140 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 141 | 
             
                requirements:
         | 
| 143 142 | 
             
                - - '='
         | 
| 144 143 | 
             
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version: 8.0. | 
| 144 | 
            +
                    version: 8.0.2
         | 
| 146 145 | 
             
              type: :development
         | 
| 147 146 | 
             
              prerelease: false
         | 
| 148 147 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 148 | 
             
                requirements:
         | 
| 150 149 | 
             
                - - '='
         | 
| 151 150 | 
             
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version: 8.0. | 
| 151 | 
            +
                    version: 8.0.2
         | 
| 153 152 | 
             
            description: Web apps on Rails. Simple, battle-tested conventions for building and
         | 
| 154 153 | 
             
              testing MVC web applications. Works with any Rack-compatible server.
         | 
| 155 154 | 
             
            email: david@loudthinking.com
         | 
| @@ -350,12 +349,11 @@ licenses: | |
| 350 349 | 
             
            - MIT
         | 
| 351 350 | 
             
            metadata:
         | 
| 352 351 | 
             
              bug_tracker_uri: https://github.com/rails/rails/issues
         | 
| 353 | 
            -
              changelog_uri: https://github.com/rails/rails/blob/v8.0. | 
| 354 | 
            -
              documentation_uri: https://api.rubyonrails.org/v8.0. | 
| 352 | 
            +
              changelog_uri: https://github.com/rails/rails/blob/v8.0.2/actionpack/CHANGELOG.md
         | 
| 353 | 
            +
              documentation_uri: https://api.rubyonrails.org/v8.0.2/
         | 
| 355 354 | 
             
              mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
         | 
| 356 | 
            -
              source_code_uri: https://github.com/rails/rails/tree/v8.0. | 
| 355 | 
            +
              source_code_uri: https://github.com/rails/rails/tree/v8.0.2/actionpack
         | 
| 357 356 | 
             
              rubygems_mfa_required: 'true'
         | 
| 358 | 
            -
            post_install_message: 
         | 
| 359 357 | 
             
            rdoc_options: []
         | 
| 360 358 | 
             
            require_paths:
         | 
| 361 359 | 
             
            - lib
         | 
| @@ -371,8 +369,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 371 369 | 
             
                  version: '0'
         | 
| 372 370 | 
             
            requirements:
         | 
| 373 371 | 
             
            - none
         | 
| 374 | 
            -
            rubygems_version: 3. | 
| 375 | 
            -
            signing_key: 
         | 
| 372 | 
            +
            rubygems_version: 3.6.2
         | 
| 376 373 | 
             
            specification_version: 4
         | 
| 377 374 | 
             
            summary: Web-flow and rendering framework putting the VC in MVC (part of Rails).
         | 
| 378 375 | 
             
            test_files: []
         |