hanami-router 2.2.0 → 2.3.0.beta2
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 +15 -0
 - data/README.md +12 -5
 - data/hanami-router.gemspec +4 -3
 - data/lib/hanami/middleware/body_parser/class_interface.rb +4 -2
 - data/lib/hanami/middleware/body_parser/form_parser.rb +2 -0
 - data/lib/hanami/middleware/body_parser.rb +4 -3
 - data/lib/hanami/router/block.rb +1 -0
 - data/lib/hanami/router/leaf.rb +2 -11
 - data/lib/hanami/router/rack_utils.rb +11 -0
 - data/lib/hanami/router/trie.rb +8 -4
 - data/lib/hanami/router/version.rb +1 -1
 - data/lib/hanami/router.rb +36 -8
 - metadata +23 -11
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5c9e51f6dddcf337224f949ca5f28c79b82702f6743a9aef5fbecdfebd5efcb9
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3d02dfc438dac3cd1f07a62934c0c81059db209123a1a0f7a639c30885013a63
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 27585ee48b5a0070bf60044676b7c6473093b139c6d92a34bc204df51e87acb643933e9cc92a38ace8ad31da701f58db480dad0da288bf21270376613e192a1f
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6e170d49fd689cad6fe447cf8bb1e93c76e50254751a108c85bf8b0c07c269673aa617f99a87197a1d7d89b169297ca6b752bea994c118663613b431535ba601
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -2,6 +2,21 @@ 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Rack compatible HTTP router for Ruby
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
            ## v2.3.0.beta2 - 2025-10-17
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            - [Kyle Plump] Improve runtime performance by building mustermann matchers when routes are first built. This corrects a performance regression introduced with the fixes in v2.2.0. (#279)
         
     | 
| 
      
 10 
     | 
    
         
            +
            - Drop support for Ruby 3.1
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            ## v2.3.0.beta1 - 2025-10-03
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            ### Changed
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            - [Kyle Plump, Tim Riley] Support Rack 3 in addition to Rack 2 (#277)
         
     | 
| 
      
 17 
     | 
    
         
            +
            - [Sven Schwyn] Convert -, +, ~, and . to underscore in URL helper names (#280)
         
     | 
| 
      
 18 
     | 
    
         
            +
            - [inouire] Allow redirects to absolute URLs: `redirect "/redirect", to: "https://hanamirb.org/"` (#282)
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
       5 
20 
     | 
    
         
             
            ## v2.2.0 - 2024-11-05
         
     | 
| 
       6 
21 
     | 
    
         | 
| 
       7 
22 
     | 
    
         
             
            ### Changed
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -157,6 +157,8 @@ end 
     | 
|
| 
       157 
157 
     | 
    
         
             
            Hanami::Router.new do
         
     | 
| 
       158 
158 
     | 
    
         
             
              get "/redirect_destination", to: ->(env) { [200, {}, ["Redirect destination!"]] }
         
     | 
| 
       159 
159 
     | 
    
         
             
              redirect "/legacy",          to: "/redirect_destination"
         
     | 
| 
      
 160 
     | 
    
         
            +
              redirect "/learn-more",      to: "https://hanamirb.org/"
         
     | 
| 
      
 161 
     | 
    
         
            +
              redirect "/chat",            to: URI("xmpp://myapp.net/")
         
     | 
| 
       160 
162 
     | 
    
         
             
            end
         
     | 
| 
       161 
163 
     | 
    
         
             
            ```
         
     | 
| 
       162 
164 
     | 
    
         | 
| 
         @@ -349,12 +351,17 @@ __Hanami::Router__ uses [Semantic Versioning 2.0.0](http://semver.org) 
     | 
|
| 
       349 
351 
     | 
    
         | 
| 
       350 
352 
     | 
    
         
             
            ## Contributing
         
     | 
| 
       351 
353 
     | 
    
         | 
| 
       352 
     | 
    
         
            -
            1. Fork it
         
     | 
| 
      
 354 
     | 
    
         
            +
            1. Fork this repo to your account and clone it locally (`git clone git@github.com:your-pseudo/your-cloned-repo.git`)
         
     | 
| 
       353 
355 
     | 
    
         
             
            2. Create your feature branch (`git checkout -b my-new-feature`)
         
     | 
| 
       354 
     | 
    
         
            -
            3.  
     | 
| 
       355 
     | 
    
         
            -
            4.  
     | 
| 
       356 
     | 
    
         
            -
            5.  
     | 
| 
      
 356 
     | 
    
         
            +
            3. Install the dependencies (`bundle install`)
         
     | 
| 
      
 357 
     | 
    
         
            +
            4. Run tests, they should all pass (`./script/ci`)
         
     | 
| 
      
 358 
     | 
    
         
            +
            5. Make your changes & check that the tests still pass. Add some test cases if needed.
         
     | 
| 
      
 359 
     | 
    
         
            +
            6. Commit your changes (`git commit -am 'Add some feature'`)
         
     | 
| 
      
 360 
     | 
    
         
            +
            7. Push to the branch (`git push origin my-new-feature`)
         
     | 
| 
      
 361 
     | 
    
         
            +
            8. Create new Pull Request on Github with some context on what you're trying to fix or to improve with this contribution
         
     | 
| 
      
 362 
     | 
    
         
            +
             
     | 
| 
      
 363 
     | 
    
         
            +
            Thank you for contributing! 
         
     | 
| 
       357 
364 
     | 
    
         | 
| 
       358 
365 
     | 
    
         
             
            ## Copyright
         
     | 
| 
       359 
366 
     | 
    
         | 
| 
       360 
     | 
    
         
            -
            Copyright © 2014– 
     | 
| 
      
 367 
     | 
    
         
            +
            Copyright © 2014–2025 Hanami Team – Released under MIT License
         
     | 
    
        data/hanami-router.gemspec
    CHANGED
    
    | 
         @@ -18,15 +18,16 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       18 
18 
     | 
    
         
             
              spec.executables   = []
         
     | 
| 
       19 
19 
     | 
    
         
             
              spec.require_paths = ["lib"]
         
     | 
| 
       20 
20 
     | 
    
         
             
              spec.metadata["rubygems_mfa_required"] = "true"
         
     | 
| 
       21 
     | 
    
         
            -
              spec.required_ruby_version = ">= 3. 
     | 
| 
      
 21 
     | 
    
         
            +
              spec.required_ruby_version = ">= 3.2"
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
              spec.add_dependency "rack",               " 
     | 
| 
      
 23 
     | 
    
         
            +
              spec.add_dependency "rack",               ">= 2.0"
         
     | 
| 
       24 
24 
     | 
    
         
             
              spec.add_dependency "mustermann",         "~> 3.0"
         
     | 
| 
       25 
25 
     | 
    
         
             
              spec.add_dependency "mustermann-contrib", "~> 3.0"
         
     | 
| 
      
 26 
     | 
    
         
            +
              spec.add_dependency "csv",                "~> 3.3"
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
              spec.add_development_dependency "bundler",   ">= 1.6", "< 3"
         
     | 
| 
       28 
29 
     | 
    
         
             
              spec.add_development_dependency "rake",      "~> 13"
         
     | 
| 
       29 
     | 
    
         
            -
              spec.add_development_dependency "rack-test", "~>  
     | 
| 
      
 30 
     | 
    
         
            +
              spec.add_development_dependency "rack-test", "~> 2.0"
         
     | 
| 
       30 
31 
     | 
    
         
             
              spec.add_development_dependency "rspec",     "~> 3.8"
         
     | 
| 
       31 
32 
     | 
    
         | 
| 
       32 
33 
     | 
    
         
             
              spec.add_development_dependency "rubocop", "~> 1.0"
         
     | 
| 
         @@ -100,11 +100,13 @@ module Hanami 
     | 
|
| 
       100 
100 
     | 
    
         | 
| 
       101 
101 
     | 
    
         
             
                      begin
         
     | 
| 
       102 
102 
     | 
    
         
             
                        require "hanami/middleware/body_parser/#{parser_name}_parser"
         
     | 
| 
       103 
     | 
    
         
            -
                      rescue LoadError 
     | 
| 
      
 103 
     | 
    
         
            +
                      rescue LoadError
         
     | 
| 
      
 104 
     | 
    
         
            +
                      end
         
     | 
| 
       104 
105 
     | 
    
         | 
| 
       105 
106 
     | 
    
         
             
                      begin
         
     | 
| 
       106 
107 
     | 
    
         
             
                        parser = load_parser!("#{classify(parser_name)}Parser")
         
     | 
| 
       107 
     | 
    
         
            -
                      rescue NameError 
     | 
| 
      
 108 
     | 
    
         
            +
                      rescue NameError
         
     | 
| 
      
 109 
     | 
    
         
            +
                      end
         
     | 
| 
       108 
110 
     | 
    
         | 
| 
       109 
111 
     | 
    
         
             
                      parser
         
     | 
| 
       110 
112 
     | 
    
         
             
                    ensure
         
     | 
| 
         @@ -30,6 +30,8 @@ module Hanami 
     | 
|
| 
       30 
30 
     | 
    
         
             
                    # @since 2.0.1
         
     | 
| 
       31 
31 
     | 
    
         
             
                    # @api private
         
     | 
| 
       32 
32 
     | 
    
         
             
                    def parse(*, env)
         
     | 
| 
      
 33 
     | 
    
         
            +
                      # Rewind to ensure successful parsing (required for Rack 3's `.parse_multipart`).
         
     | 
| 
      
 34 
     | 
    
         
            +
                      env[::Rack::RACK_INPUT].rewind if env[::Rack::RACK_INPUT].respond_to?(:rewind)
         
     | 
| 
       33 
35 
     | 
    
         
             
                      ::Rack::Multipart.parse_multipart(env)
         
     | 
| 
       34 
36 
     | 
    
         
             
                    rescue StandardError => exception
         
     | 
| 
       35 
37 
     | 
    
         
             
                      raise BodyParsingError.new(exception.message)
         
     | 
| 
         @@ -39,10 +39,11 @@ module Hanami 
     | 
|
| 
       39 
39 
     | 
    
         
             
                  end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
                  def call(env)
         
     | 
| 
       42 
     | 
    
         
            -
                    body = env[RACK_INPUT] 
     | 
| 
       43 
     | 
    
         
            -
                    return @app.call(env) if body.empty?
         
     | 
| 
      
 42 
     | 
    
         
            +
                    body = env[RACK_INPUT]&.read
         
     | 
| 
      
 43 
     | 
    
         
            +
                    return @app.call(env) if body.nil? || body.empty?
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
     | 
    
         
            -
                     
     | 
| 
      
 45 
     | 
    
         
            +
                    # Somebody might try to read this stream
         
     | 
| 
      
 46 
     | 
    
         
            +
                    Rack::RewindableInput.new(env[RACK_INPUT]).rewind
         
     | 
| 
       46 
47 
     | 
    
         | 
| 
       47 
48 
     | 
    
         
             
                    if (parser = @parsers[media_type(env)])
         
     | 
| 
       48 
49 
     | 
    
         
             
                      env[Router::ROUTER_PARSED_BODY] = parser.parse(body, env)
         
     | 
    
        data/lib/hanami/router/block.rb
    CHANGED
    
    
    
        data/lib/hanami/router/leaf.rb
    CHANGED
    
    | 
         @@ -9,15 +9,14 @@ module Hanami 
     | 
|
| 
       9 
9 
     | 
    
         
             
                  #
         
     | 
| 
       10 
10 
     | 
    
         
             
                  # @api private
         
     | 
| 
       11 
11 
     | 
    
         
             
                  # @since 2.2.0
         
     | 
| 
       12 
     | 
    
         
            -
                  attr_reader :to, :params
         
     | 
| 
      
 12 
     | 
    
         
            +
                  attr_reader :to, :params, :matcher
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
                  # @api private
         
     | 
| 
       15 
15 
     | 
    
         
             
                  # @since 2.2.0
         
     | 
| 
       16 
16 
     | 
    
         
             
                  def initialize(route, to, constraints)
         
     | 
| 
       17 
     | 
    
         
            -
                    @route = route
         
     | 
| 
       18 
17 
     | 
    
         
             
                    @to = to
         
     | 
| 
       19 
     | 
    
         
            -
                    @constraints = constraints
         
     | 
| 
       20 
18 
     | 
    
         
             
                    @params = nil
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @matcher = Mustermann.new(route, type: :rails, version: "5.0", capture: constraints)
         
     | 
| 
       21 
20 
     | 
    
         
             
                  end
         
     | 
| 
       22 
21 
     | 
    
         | 
| 
       23 
22 
     | 
    
         
             
                  # @api private
         
     | 
| 
         @@ -29,14 +28,6 @@ module Hanami 
     | 
|
| 
       29 
28 
     | 
    
         | 
| 
       30 
29 
     | 
    
         
             
                    match
         
     | 
| 
       31 
30 
     | 
    
         
             
                  end
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                  private
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
                  # @api private
         
     | 
| 
       36 
     | 
    
         
            -
                  # @since 2.2.0
         
     | 
| 
       37 
     | 
    
         
            -
                  def matcher
         
     | 
| 
       38 
     | 
    
         
            -
                    @matcher ||= Mustermann.new(@route, type: :rails, version: "5.0", capture: @constraints)
         
     | 
| 
       39 
     | 
    
         
            -
                  end
         
     | 
| 
       40 
31 
     | 
    
         
             
                end
         
     | 
| 
       41 
32 
     | 
    
         
             
              end
         
     | 
| 
       42 
33 
     | 
    
         
             
            end
         
     | 
    
        data/lib/hanami/router/trie.rb
    CHANGED
    
    | 
         @@ -17,6 +17,7 @@ module Hanami 
     | 
|
| 
       17 
17 
     | 
    
         
             
                  # @since 2.0.0
         
     | 
| 
       18 
18 
     | 
    
         
             
                  def initialize
         
     | 
| 
       19 
19 
     | 
    
         
             
                    @root = Node.new
         
     | 
| 
      
 20 
     | 
    
         
            +
                    @segments_map = {}
         
     | 
| 
       20 
21 
     | 
    
         
             
                  end
         
     | 
| 
       21 
22 
     | 
    
         | 
| 
       22 
23 
     | 
    
         
             
                  # @api private
         
     | 
| 
         @@ -47,15 +48,18 @@ module Hanami 
     | 
|
| 
       47 
48 
     | 
    
         | 
| 
       48 
49 
     | 
    
         
             
                  # @api private
         
     | 
| 
       49 
50 
     | 
    
         
             
                  # @since 2.0.0
         
     | 
| 
       50 
     | 
    
         
            -
                  SEGMENT_SEPARATOR =  
     | 
| 
      
 51 
     | 
    
         
            +
                  SEGMENT_SEPARATOR = "/"
         
     | 
| 
       51 
52 
     | 
    
         
             
                  private_constant :SEGMENT_SEPARATOR
         
     | 
| 
       52 
53 
     | 
    
         | 
| 
       53 
54 
     | 
    
         
             
                  # @api private
         
     | 
| 
       54 
55 
     | 
    
         
             
                  # @since 2.2.0
         
     | 
| 
       55 
56 
     | 
    
         
             
                  def segments_from(path)
         
     | 
| 
       56 
     | 
    
         
            -
                     
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                     
     | 
| 
      
 57 
     | 
    
         
            +
                    if @segments_map[path]
         
     | 
| 
      
 58 
     | 
    
         
            +
                      @segments_map[path]
         
     | 
| 
      
 59 
     | 
    
         
            +
                    else
         
     | 
| 
      
 60 
     | 
    
         
            +
                      _, *segments = path.split(SEGMENT_SEPARATOR)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      @segments_map[path] = segments
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end
         
     | 
| 
       59 
63 
     | 
    
         
             
                  end
         
     | 
| 
       60 
64 
     | 
    
         
             
                end
         
     | 
| 
       61 
65 
     | 
    
         
             
              end
         
     | 
    
        data/lib/hanami/router.rb
    CHANGED
    
    | 
         @@ -22,6 +22,7 @@ module Hanami 
     | 
|
| 
       22 
22 
     | 
    
         
             
                require "hanami/router/url_helpers"
         
     | 
| 
       23 
23 
     | 
    
         
             
                require "hanami/router/globbed_path"
         
     | 
| 
       24 
24 
     | 
    
         
             
                require "hanami/router/mounted_path"
         
     | 
| 
      
 25 
     | 
    
         
            +
                require "hanami/router/rack_utils"
         
     | 
| 
       25 
26 
     | 
    
         | 
| 
       26 
27 
     | 
    
         
             
                # URL helpers for other Hanami integrations
         
     | 
| 
       27 
28 
     | 
    
         
             
                #
         
     | 
| 
         @@ -106,6 +107,14 @@ module Hanami 
     | 
|
| 
       106 
107 
     | 
    
         
             
                    return not_allowed(env) || not_found(env)
         
     | 
| 
       107 
108 
     | 
    
         
             
                  end
         
     | 
| 
       108 
109 
     | 
    
         | 
| 
      
 110 
     | 
    
         
            +
                  # Rack 3 no longer requires "rack.input" to be rewindable. Force input to be
         
     | 
| 
      
 111 
     | 
    
         
            +
                  # rewindable to maintain Rack 2 behavior.
         
     | 
| 
      
 112 
     | 
    
         
            +
                  #
         
     | 
| 
      
 113 
     | 
    
         
            +
                  # @since 2.2.0
         
     | 
| 
      
 114 
     | 
    
         
            +
                  if Hanami::Router.rack_3? && env[::Rack::RACK_INPUT]
         
     | 
| 
      
 115 
     | 
    
         
            +
                    env[::Rack::RACK_INPUT] = Rack::RewindableInput.new(env[::Rack::RACK_INPUT])
         
     | 
| 
      
 116 
     | 
    
         
            +
                  end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
       109 
118 
     | 
    
         
             
                  endpoint.call(
         
     | 
| 
       110 
119 
     | 
    
         
             
                    _params(env, params)
         
     | 
| 
       111 
120 
     | 
    
         
             
                  ).to_a
         
     | 
| 
         @@ -693,6 +702,10 @@ module Hanami 
     | 
|
| 
       693 
702 
     | 
    
         
             
                # @api private
         
     | 
| 
       694 
703 
     | 
    
         
             
                PREFIXED_NAME_SEPARATOR = "_"
         
     | 
| 
       695 
704 
     | 
    
         | 
| 
      
 705 
     | 
    
         
            +
                # @since x.x.x
         
     | 
| 
      
 706 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 707 
     | 
    
         
            +
                UNDERSCORED_NAME_REGEXP = /[-+~.]/
         
     | 
| 
      
 708 
     | 
    
         
            +
             
     | 
| 
       696 
709 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       697 
710 
     | 
    
         
             
                # @api private
         
     | 
| 
       698 
711 
     | 
    
         
             
                ROOT_PATH = "/"
         
     | 
| 
         @@ -739,7 +752,11 @@ module Hanami 
     | 
|
| 
       739 
752 
     | 
    
         | 
| 
       740 
753 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       741 
754 
     | 
    
         
             
                # @api private
         
     | 
| 
       742 
     | 
    
         
            -
                HTTP_HEADER_LOCATION = "Location"
         
     | 
| 
      
 755 
     | 
    
         
            +
                HTTP_HEADER_LOCATION = Hanami::Router.rack_3? ? "location" : "Location"
         
     | 
| 
      
 756 
     | 
    
         
            +
             
     | 
| 
      
 757 
     | 
    
         
            +
                # @since 2.2.0
         
     | 
| 
      
 758 
     | 
    
         
            +
                # @api private
         
     | 
| 
      
 759 
     | 
    
         
            +
                HTTP_HEADER_ALLOW = Hanami::Router.rack_3? ? "allow" : "Allow"
         
     | 
| 
       743 
760 
     | 
    
         | 
| 
       744 
761 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       745 
762 
     | 
    
         
             
                # @api private
         
     | 
| 
         @@ -762,7 +779,7 @@ module Hanami 
     | 
|
| 
       762 
779 
     | 
    
         
             
                    HTTP_STATUS_NOT_ALLOWED,
         
     | 
| 
       763 
780 
     | 
    
         
             
                    {
         
     | 
| 
       764 
781 
     | 
    
         
             
                      ::Rack::CONTENT_LENGTH => HTTP_BODY_NOT_ALLOWED_LENGTH,
         
     | 
| 
       765 
     | 
    
         
            -
                       
     | 
| 
      
 782 
     | 
    
         
            +
                      HTTP_HEADER_ALLOW => allowed_http_methods.join(", ")
         
     | 
| 
       766 
783 
     | 
    
         
             
                    },
         
     | 
| 
       767 
784 
     | 
    
         
             
                    [HTTP_BODY_NOT_ALLOWED]
         
     | 
| 
       768 
785 
     | 
    
         
             
                  ]
         
     | 
| 
         @@ -774,12 +791,13 @@ module Hanami 
     | 
|
| 
       774 
791 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       775 
792 
     | 
    
         
             
                NOT_FOUND = ->(*) {
         
     | 
| 
       776 
793 
     | 
    
         
             
                  [HTTP_STATUS_NOT_FOUND, {::Rack::CONTENT_LENGTH => HTTP_BODY_NOT_FOUND_LENGTH}, [HTTP_BODY_NOT_FOUND]]
         
     | 
| 
       777 
     | 
    
         
            -
                } 
     | 
| 
      
 794 
     | 
    
         
            +
                }
         
     | 
| 
       778 
795 
     | 
    
         | 
| 
       779 
796 
     | 
    
         
             
                # @since 2.0.0
         
     | 
| 
       780 
797 
     | 
    
         
             
                # @api private
         
     | 
| 
       781 
798 
     | 
    
         
             
                def lookup(env)
         
     | 
| 
       782 
799 
     | 
    
         
             
                  endpoint = fixed(env)
         
     | 
| 
      
 800 
     | 
    
         
            +
             
     | 
| 
       783 
801 
     | 
    
         
             
                  return [endpoint, {}] if endpoint
         
     | 
| 
       784 
802 
     | 
    
         | 
| 
       785 
803 
     | 
    
         
             
                  variable(env) || globbed_or_mounted(env)
         
     | 
| 
         @@ -800,7 +818,7 @@ module Hanami 
     | 
|
| 
       800 
818 
     | 
    
         
             
                  end
         
     | 
| 
       801 
819 
     | 
    
         | 
| 
       802 
820 
     | 
    
         
             
                  if as
         
     | 
| 
       803 
     | 
    
         
            -
                    as =  
     | 
| 
      
 821 
     | 
    
         
            +
                    as = prefixed_underscored_name(as)
         
     | 
| 
       804 
822 
     | 
    
         
             
                    add_named_route(path, as, constraints)
         
     | 
| 
       805 
823 
     | 
    
         
             
                  end
         
     | 
| 
       806 
824 
     | 
    
         | 
| 
         @@ -872,10 +890,13 @@ module Hanami 
     | 
|
| 
       872 
890 
     | 
    
         
             
                  @path_prefix.join(path).to_s
         
     | 
| 
       873 
891 
     | 
    
         
             
                end
         
     | 
| 
       874 
892 
     | 
    
         | 
| 
       875 
     | 
    
         
            -
                # @since  
     | 
| 
      
 893 
     | 
    
         
            +
                # @since x.x.x
         
     | 
| 
       876 
894 
     | 
    
         
             
                # @api private
         
     | 
| 
       877 
     | 
    
         
            -
                def  
     | 
| 
       878 
     | 
    
         
            -
                  @name_prefix 
     | 
| 
      
 895 
     | 
    
         
            +
                def prefixed_underscored_name(name)
         
     | 
| 
      
 896 
     | 
    
         
            +
                  @name_prefix
         
     | 
| 
      
 897 
     | 
    
         
            +
                    .relative_join(name, PREFIXED_NAME_SEPARATOR)
         
     | 
| 
      
 898 
     | 
    
         
            +
                    .gsub(UNDERSCORED_NAME_REGEXP, "_")
         
     | 
| 
      
 899 
     | 
    
         
            +
                    .to_sym
         
     | 
| 
       879 
900 
     | 
    
         
             
                end
         
     | 
| 
       880 
901 
     | 
    
         | 
| 
       881 
902 
     | 
    
         
             
                # Returns a new instance of Hanami::Router with the modified options.
         
     | 
| 
         @@ -907,7 +928,13 @@ module Hanami 
     | 
|
| 
       907 
928 
     | 
    
         
             
                    raise UnknownHTTPStatusCodeError.new(code)
         
     | 
| 
       908 
929 
     | 
    
         
             
                  end
         
     | 
| 
       909 
930 
     | 
    
         | 
| 
       910 
     | 
    
         
            -
                  destination =  
     | 
| 
      
 931 
     | 
    
         
            +
                  destination = if to.is_a?(URI)
         
     | 
| 
      
 932 
     | 
    
         
            +
                                  to.to_s
         
     | 
| 
      
 933 
     | 
    
         
            +
                                elsif to.start_with?("http://") || to.start_with?("https://")
         
     | 
| 
      
 934 
     | 
    
         
            +
                                  to
         
     | 
| 
      
 935 
     | 
    
         
            +
                                else
         
     | 
| 
      
 936 
     | 
    
         
            +
                                  prefixed_path(to)
         
     | 
| 
      
 937 
     | 
    
         
            +
                                end
         
     | 
| 
       911 
938 
     | 
    
         
             
                  Redirect.new(destination, code, ->(*) { [code, {HTTP_HEADER_LOCATION => destination}, [body]] })
         
     | 
| 
       912 
939 
     | 
    
         
             
                end
         
     | 
| 
       913 
940 
     | 
    
         | 
| 
         @@ -925,6 +952,7 @@ module Hanami 
     | 
|
| 
       925 
952 
     | 
    
         
             
                  env[PARAMS].merge!(::Rack::Utils.parse_nested_query(env[::Rack::QUERY_STRING]))
         
     | 
| 
       926 
953 
     | 
    
         
             
                  env[PARAMS].merge!(params)
         
     | 
| 
       927 
954 
     | 
    
         
             
                  env[PARAMS] = Params.deep_symbolize(env[PARAMS])
         
     | 
| 
      
 955 
     | 
    
         
            +
             
     | 
| 
       928 
956 
     | 
    
         
             
                  env
         
     | 
| 
       929 
957 
     | 
    
         
             
                end
         
     | 
| 
       930 
958 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,27 +1,26 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: hanami-router
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.3.0.beta2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Luca Guidi
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire:
         
     | 
| 
       9 
8 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
9 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 10 
     | 
    
         
            +
            date: 1980-01-02 00:00:00.000000000 Z
         
     | 
| 
       12 
11 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
12 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
13 
     | 
    
         
             
              name: rack
         
     | 
| 
       15 
14 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       16 
15 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
     | 
    
         
            -
                - - " 
     | 
| 
      
 16 
     | 
    
         
            +
                - - ">="
         
     | 
| 
       18 
17 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
18 
     | 
    
         
             
                    version: '2.0'
         
     | 
| 
       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 
25 
     | 
    
         
             
                    version: '2.0'
         
     | 
| 
       27 
26 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
         @@ -52,6 +51,20 @@ dependencies: 
     | 
|
| 
       52 
51 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       53 
52 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
53 
     | 
    
         
             
                    version: '3.0'
         
     | 
| 
      
 54 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 55 
     | 
    
         
            +
              name: csv
         
     | 
| 
      
 56 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 57 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 58 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 59 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 60 
     | 
    
         
            +
                    version: '3.3'
         
     | 
| 
      
 61 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 62 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 63 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 64 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 65 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 67 
     | 
    
         
            +
                    version: '3.3'
         
     | 
| 
       55 
68 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       56 
69 
     | 
    
         
             
              name: bundler
         
     | 
| 
       57 
70 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -92,14 +105,14 @@ dependencies: 
     | 
|
| 
       92 
105 
     | 
    
         
             
                requirements:
         
     | 
| 
       93 
106 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       94 
107 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       95 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 108 
     | 
    
         
            +
                    version: '2.0'
         
     | 
| 
       96 
109 
     | 
    
         
             
              type: :development
         
     | 
| 
       97 
110 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       98 
111 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       99 
112 
     | 
    
         
             
                requirements:
         
     | 
| 
       100 
113 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       101 
114 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       102 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 115 
     | 
    
         
            +
                    version: '2.0'
         
     | 
| 
       103 
116 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       104 
117 
     | 
    
         
             
              name: rspec
         
     | 
| 
       105 
118 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -176,6 +189,7 @@ files: 
     | 
|
| 
       176 
189 
     | 
    
         
             
            - lib/hanami/router/node.rb
         
     | 
| 
       177 
190 
     | 
    
         
             
            - lib/hanami/router/params.rb
         
     | 
| 
       178 
191 
     | 
    
         
             
            - lib/hanami/router/prefix.rb
         
     | 
| 
      
 192 
     | 
    
         
            +
            - lib/hanami/router/rack_utils.rb
         
     | 
| 
       179 
193 
     | 
    
         
             
            - lib/hanami/router/recognized_route.rb
         
     | 
| 
       180 
194 
     | 
    
         
             
            - lib/hanami/router/redirect.rb
         
     | 
| 
       181 
195 
     | 
    
         
             
            - lib/hanami/router/route.rb
         
     | 
| 
         @@ -188,7 +202,6 @@ licenses: 
     | 
|
| 
       188 
202 
     | 
    
         
             
            - MIT
         
     | 
| 
       189 
203 
     | 
    
         
             
            metadata:
         
     | 
| 
       190 
204 
     | 
    
         
             
              rubygems_mfa_required: 'true'
         
     | 
| 
       191 
     | 
    
         
            -
            post_install_message:
         
     | 
| 
       192 
205 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       193 
206 
     | 
    
         
             
            require_paths:
         
     | 
| 
       194 
207 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -196,15 +209,14 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       196 
209 
     | 
    
         
             
              requirements:
         
     | 
| 
       197 
210 
     | 
    
         
             
              - - ">="
         
     | 
| 
       198 
211 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       199 
     | 
    
         
            -
                  version: '3. 
     | 
| 
      
 212 
     | 
    
         
            +
                  version: '3.2'
         
     | 
| 
       200 
213 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       201 
214 
     | 
    
         
             
              requirements:
         
     | 
| 
       202 
215 
     | 
    
         
             
              - - ">="
         
     | 
| 
       203 
216 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       204 
217 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       205 
218 
     | 
    
         
             
            requirements: []
         
     | 
| 
       206 
     | 
    
         
            -
            rubygems_version: 3. 
     | 
| 
       207 
     | 
    
         
            -
            signing_key:
         
     | 
| 
      
 219 
     | 
    
         
            +
            rubygems_version: 3.6.9
         
     | 
| 
       208 
220 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       209 
221 
     | 
    
         
             
            summary: Rack compatible HTTP router for Ruby and Hanami
         
     | 
| 
       210 
222 
     | 
    
         
             
            test_files: []
         
     |