lib/hanami/slice/router.rb in hanami-2.0.0.beta4 vs lib/hanami/slice/router.rb in hanami-2.0.0.rc1
- old
+ new
@@ -1,62 +1,84 @@
# frozen_string_literal: true
require "hanami/router"
-require_relative "routing/middleware/stack"
module Hanami
class Slice
- # Hanami app router
+ # `Hanami::Router` subclass with enhancements for use within Hanami apps.
+ #
+ # This is loaded from Hanami apps and slices and made available as their
+ # {Hanami::Slice::ClassMethods#router router}.
+ #
+ # @api private
# @since 2.0.0
class Router < ::Hanami::Router
# @api private
+ # @since 2.0.0
attr_reader :middleware_stack
+ # @api private
# @since 2.0.0
+ attr_reader :path_prefix
+
# @api private
- def initialize(routes:, middleware_stack: Routing::Middleware::Stack.new, **kwargs, &blk)
+ # @since 2.0.0
+ def initialize(routes:, middleware_stack: Routing::Middleware::Stack.new, prefix: ::Hanami::Router::DEFAULT_PREFIX, **kwargs, &blk)
+ @path_prefix = Hanami::Router::Prefix.new(prefix)
@middleware_stack = middleware_stack
instance_eval(&blk)
super(**kwargs, &routes)
end
- # @since 2.0.0
# @api private
+ # @since 2.0.0
def freeze
return self if frozen?
remove_instance_variable(:@middleware_stack)
super
end
- # @since 2.0.0
# @api private
- def use(...)
- middleware_stack.use(...)
- end
-
# @since 2.0.0
- # @api private
- def scope(*args, &blk)
- middleware_stack.with(args.first) do
- super
- end
+ def use(*args, **kwargs, &blk)
+ middleware_stack.use(*args, **kwargs.merge(path_prefix: path_prefix.to_s), &blk)
end
+ # Yields a block for routes to resolve their action components from the given slice.
+ #
+ # An optional URL prefix may be supplied with `at:`.
+ #
+ # @example
+ # # config/routes.rb
+ #
+ # module MyApp
+ # class Routes < Hanami::Routes
+ # slice :admin, at: "/admin" do
+ # # Will route to the "actions.posts.index" component in Admin::Slice
+ # get "posts", to: "posts.index"
+ # end
+ # end
+ # end
+ #
+ # @param slice_name [Symbol] the slice's name
+ # @param at [String, nil] optional URL prefix for the routes
+ #
+ # @api public
# @since 2.0.0
def slice(slice_name, at:, &blk)
blk ||= @resolver.find_slice(slice_name).routes
prev_resolver = @resolver
@resolver = @resolver.to_slice(slice_name)
- scope(prefixed_path(at), &blk)
+ scope(at, &blk)
ensure
@resolver = prev_resolver
end
- # @since 2.0.0
# @api private
+ # @since 2.0.0
def to_rack_app
middleware_stack.to_rack_app(self)
end
end
end