Class: Hanami::Router
- Inherits:
-
Object
- Object
- Hanami::Router
- Defined in:
- lib/hanami/router.rb,
lib/hanami/router/leaf.rb,
lib/hanami/router/node.rb,
lib/hanami/router/trie.rb,
lib/hanami/router/block.rb,
lib/hanami/router/route.rb,
lib/hanami/router/errors.rb,
lib/hanami/router/params.rb,
lib/hanami/router/prefix.rb,
lib/hanami/router/segment.rb,
lib/hanami/router/version.rb,
lib/hanami/router/redirect.rb,
lib/hanami/router/constants.rb,
lib/hanami/router/inspector.rb,
lib/hanami/router/rack_utils.rb,
lib/hanami/router/url_helpers.rb,
lib/hanami/router/globbed_path.rb,
lib/hanami/router/mounted_path.rb,
lib/hanami/router/formatter/csv.rb,
lib/hanami/router/recognized_route.rb,
lib/hanami/router/formatter/human_friendly.rb
Overview
Rack compatible, lightweight and fast HTTP Router.
Defined Under Namespace
Modules: Formatter Classes: Block, Error, GlobbedPath, Inspector, InvalidRouteExpansionError, Leaf, MissingEndpointError, MissingRouteError, MountedPath, Node, NotRoutableEndpointError, Params, Prefix, RecognizedRoute, Redirect, Route, Segment, Trie, UnknownHTTPStatusCodeError, UrlHelpers
Constant Summary collapse
- VERSION =
Returns the hanami-router version.
"2.3.0"- ROUTER_PARSED_BODY =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
"router.parsed_body"
Instance Attribute Summary collapse
-
#inspector ⇒ Hanami::Router::Inspector
readonly
Routes inspector.
-
#url_helpers ⇒ Object
readonly
private
URL helpers for other Hanami integrations.
Class Method Summary collapse
-
.define(&blk) ⇒ Proc
Returns the given block as it is.
- .rack_3? ⇒ Boolean private
Instance Method Summary collapse
-
#call(env) ⇒ Array
Resolve the given Rack env to a registered endpoint and invokes it.
-
#delete(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts DELETE requests for the given path.
- #fixed(env) ⇒ Object private
-
#get(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts GET requests for the given path.
- #globbed_or_mounted(env) ⇒ Object private
-
#initialize(base_url: DEFAULT_BASE_URL, prefix: DEFAULT_PREFIX, resolver: DEFAULT_RESOLVER, not_allowed: NOT_ALLOWED, not_found: NOT_FOUND, block_context: nil, inspector: nil, &blk) ⇒ Hanami::Router
constructor
Initialize the router.
-
#link(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts LINK requests for the given path.
-
#mount(app, at:, **constraints) ⇒ Object
Mount a Rack application at the specified path.
- #not_allowed(env) ⇒ Object private
- #not_found(env) ⇒ Object private
-
#options(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts OPTIONS requests for the given path.
-
#patch(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts PATCH requests for the given path.
-
#path(name, variables = {}) ⇒ String
Generate an relative URL for a specified named route.
-
#post(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts POST requests for the given path.
-
#put(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts PUT requests for the given path.
-
#recognize(env, params = {}, options = {}) ⇒ Hanami::Routing::RecognizedRoute
Recognize the given env, path, or name and return a route for testing inspection.
-
#redirect(path, to: nil, as: nil, code: DEFAULT_REDIRECT_CODE) ⇒ Object
Defines a route that redirects the incoming request to another path.
-
#root(to: nil, &blk) ⇒ Object
Defines a named root route (a GET route for “/”).
-
#scope(path, as: nil, &blk) ⇒ Object
Defines a routing scope.
-
#trace(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts TRACE requests for the given path.
-
#unlink(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts UNLINK requests for the given path.
-
#url(name, variables = {}) ⇒ URI::HTTP, URI::HTTPS
Generate an absolute URL for a specified named route.
- #variable(env) ⇒ Object private
Constructor Details
#initialize(base_url: DEFAULT_BASE_URL, prefix: DEFAULT_PREFIX, resolver: DEFAULT_RESOLVER, not_allowed: NOT_ALLOWED, not_found: NOT_FOUND, block_context: nil, inspector: nil, &blk) ⇒ Hanami::Router
Initialize the router
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/hanami/router.rb', line 78 def initialize(base_url: DEFAULT_BASE_URL, prefix: DEFAULT_PREFIX, resolver: DEFAULT_RESOLVER, not_allowed: NOT_ALLOWED, not_found: NOT_FOUND, block_context: nil, inspector: nil, &blk) # rubocop:disable Layout/LineLength # TODO: verify if Prefix can handle both name and path prefix @path_prefix = Prefix.new(prefix) @name_prefix = Prefix.new("") @url_helpers = UrlHelpers.new(base_url) @base_url = base_url @resolver = resolver @not_allowed = not_allowed @not_found = not_found @block_context = block_context @fixed = {} @variable = {} @globs_and_mounts = [] @blk = blk @inspector = inspector instance_eval(&blk) if blk end |
Instance Attribute Details
#inspector ⇒ Hanami::Router::Inspector (readonly)
Routes inspector
38 39 40 |
# File 'lib/hanami/router.rb', line 38 def inspector @inspector end |
#url_helpers ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
URL helpers for other Hanami integrations
31 32 33 |
# File 'lib/hanami/router.rb', line 31 def url_helpers @url_helpers end |
Class Method Details
.define(&blk) ⇒ Proc
Returns the given block as it is.
53 54 55 |
# File 'lib/hanami/router.rb', line 53 def self.define(&blk) blk end |
.rack_3? ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
7 8 9 |
# File 'lib/hanami/router/rack_utils.rb', line 7 def self.rack_3? defined?(Rack::Headers) end |
Instance Method Details
#call(env) ⇒ Array
Resolve the given Rack env to a registered endpoint and invokes it.
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/hanami/router.rb', line 103 def call(env) endpoint, params = lookup(env) unless endpoint return not_allowed(env) || not_found(env) end # Rack 3 no longer requires "rack.input" to be rewindable. Force input to be rewindable to # maintain Rack 2 behavior while we're still supporting both. if (input = env[::Rack::RACK_INPUT]) && !input.respond_to?(:rewind) env[::Rack::RACK_INPUT] = Rack::RewindableInput.new(input) end endpoint.call( _params(env, params) ).to_a end |
#delete(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts DELETE requests for the given path.
301 302 303 |
# File 'lib/hanami/router.rb', line 301 def delete(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::DELETE, path, to, as, constraints, &blk) end |
#fixed(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
644 645 646 |
# File 'lib/hanami/router.rb', line 644 def fixed(env) @fixed.dig(env[::Rack::REQUEST_METHOD], env[::Rack::PATH_INFO]) end |
#get(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts GET requests for the given path. It also defines a route to accept HEAD requests.
224 225 226 227 |
# File 'lib/hanami/router.rb', line 224 def get(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::GET, path, to, as, constraints, &blk) add_route(::Rack::HEAD, path, to, as, constraints, &blk) end |
#globbed_or_mounted(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
656 657 658 659 660 661 662 663 |
# File 'lib/hanami/router.rb', line 656 def globbed_or_mounted(env) @globs_and_mounts.each do |path| result = path.endpoint_and_params(env) return result unless result.empty? end nil end |
#link(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts LINK requests for the given path.
358 359 360 |
# File 'lib/hanami/router.rb', line 358 def link(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::LINK, path, to, as, constraints, &blk) end |
#mount(app, at:, **constraints) ⇒ Object
Mount a Rack application at the specified path. All the requests starting with the specified path, will be forwarded to the given application.
All the other methods (eg ‘#get`) support callable objects, but they restrict the range of the acceptable HTTP verb. Mounting an application with #mount doesn’t apply this kind of restriction at the router level, but let the application to decide.
455 456 457 458 459 460 461 462 463 |
# File 'lib/hanami/router.rb', line 455 def mount(app, at:, **constraints) path = prefixed_path(at) prefix = Segment.fabricate(path, **constraints) @globs_and_mounts << MountedPath.new(prefix, @resolver.call(path, app)) if inspect? @inspector.add_route(Route.new(http_method: "*", path: at, to: app, constraints: constraints)) end end |
#not_allowed(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
667 668 669 670 671 672 |
# File 'lib/hanami/router.rb', line 667 def not_allowed(env) allowed_http_methods = _not_allowed_fixed(env) || _not_allowed_variable(env) return if allowed_http_methods.nil? @not_allowed.call(env, allowed_http_methods) end |
#not_found(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
676 677 678 |
# File 'lib/hanami/router.rb', line 676 def not_found(env) @not_found.call(env) end |
#options(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts OPTIONS requests for the given path.
339 340 341 |
# File 'lib/hanami/router.rb', line 339 def (path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::OPTIONS, path, to, as, constraints, &blk) end |
#patch(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts PATCH requests for the given path.
263 264 265 |
# File 'lib/hanami/router.rb', line 263 def patch(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::PATCH, path, to, as, constraints, &blk) end |
#path(name, variables = {}) ⇒ String
Generate an relative URL for a specified named route. The additional arguments will be used to compose the relative URL - in
case it has tokens to match - and for compose the query string.
491 492 493 |
# File 'lib/hanami/router.rb', line 491 def path(name, variables = {}) url_helpers.path(name, variables) end |
#post(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts POST requests for the given path.
244 245 246 |
# File 'lib/hanami/router.rb', line 244 def post(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::POST, path, to, as, constraints, &blk) end |
#put(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts PUT requests for the given path.
282 283 284 |
# File 'lib/hanami/router.rb', line 282 def put(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::PUT, path, to, as, constraints, &blk) end |
#recognize(env, params = {}, options = {}) ⇒ Hanami::Routing::RecognizedRoute
Recognize the given env, path, or name and return a route for testing inspection.
If the route cannot be recognized, it still returns an object for testing inspection.
633 634 635 636 637 638 639 640 |
# File 'lib/hanami/router.rb', line 633 def recognize(env, params = {}, = {}) require "hanami/router/recognized_route" env = env_for(env, params, ) endpoint, params = lookup(env) RecognizedRoute.new(endpoint, _params(env, params)) end |
#redirect(path, to: nil, as: nil, code: DEFAULT_REDIRECT_CODE) ⇒ Object
Defines a route that redirects the incoming request to another path.
395 396 397 |
# File 'lib/hanami/router.rb', line 395 def redirect(path, to: nil, as: nil, code: DEFAULT_REDIRECT_CODE) get(path, to: _redirect(to, code), as: as) end |
#root(to: nil, &blk) ⇒ Object
Defines a named root route (a GET route for “/”)
159 160 161 |
# File 'lib/hanami/router.rb', line 159 def root(to: nil, &blk) get(ROOT_PATH, to: to, as: :root, &blk) end |
#scope(path, as: nil, &blk) ⇒ Object
Defines a routing scope. Routes defined in the context of a scope, inherit the given path as path prefix and as a named routes prefix.
420 421 422 423 424 425 426 427 428 429 430 431 432 |
# File 'lib/hanami/router.rb', line 420 def scope(path, as: nil, &blk) path_prefix = @path_prefix name_prefix = @name_prefix begin @path_prefix = @path_prefix.join(path.to_s) @name_prefix = @name_prefix.join((as || path).to_s) instance_eval(&blk) ensure @path_prefix = path_prefix @name_prefix = name_prefix end end |
#trace(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts TRACE requests for the given path.
320 321 322 |
# File 'lib/hanami/router.rb', line 320 def trace(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::TRACE, path, to, as, constraints, &blk) end |
#unlink(path, to: nil, as: nil, **constraints, &blk) ⇒ Object
Defines a route that accepts UNLINK requests for the given path.
377 378 379 |
# File 'lib/hanami/router.rb', line 377 def unlink(path, to: nil, as: nil, **constraints, &blk) add_route(::Rack::UNLINK, path, to, as, constraints, &blk) end |
#url(name, variables = {}) ⇒ URI::HTTP, URI::HTTPS
Generate an absolute URL for a specified named route. The additional arguments will be used to compose the relative URL - in
case it has tokens to match - and for compose the query string.
521 522 523 |
# File 'lib/hanami/router.rb', line 521 def url(name, variables = {}) url_helpers.url(name, variables) end |
#variable(env) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
650 651 652 |
# File 'lib/hanami/router.rb', line 650 def variable(env) @variable[env[::Rack::REQUEST_METHOD]]&.find(env[::Rack::PATH_INFO]) end |