diff --git a/hanami-controller.gemspec b/hanami-controller.gemspec index 9f6d2f4..605fd0e 100644 --- a/hanami-controller.gemspec +++ b/hanami-controller.gemspec @@ -20,9 +20,10 @@ Gem::Specification.new do |spec| spec.metadata["rubygems_mfa_required"] = "true" spec.required_ruby_version = ">= 3.0" - spec.add_dependency "rack", "~> 2.0" + spec.add_dependency "rack", "~> 2.0" spec.add_dependency "hanami-utils", "~> 2.0.0.rc1" spec.add_dependency "dry-configurable", "~> 1.0", "< 2" + spec.add_dependency "zeitwerk", "~> 2.6" spec.add_development_dependency "bundler", ">= 1.6", "< 3" spec.add_development_dependency "rack-test", "~> 2.0" diff --git a/lib/hanami-controller.rb b/lib/hanami-controller.rb new file mode 100644 index 0000000..1adfe6d --- /dev/null +++ b/lib/hanami-controller.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +require_relative "hanami/controller" diff --git a/lib/hanami/action.rb b/lib/hanami/action.rb index 844ad64..d53f5f4 100644 --- a/lib/hanami/action.rb +++ b/lib/hanami/action.rb @@ -1,29 +1,15 @@ # frozen_string_literal: true -begin - require "dry/core" - require "dry/types" - require "hanami/validations" - require "hanami/action/validatable" -rescue LoadError # rubocop:disable Lint/SuppressedException -end - require "dry/configurable" -require "hanami/utils/callbacks" require "hanami/utils" -require "hanami/utils/string" +require "hanami/utils/callbacks" require "hanami/utils/kernel" +require "hanami/utils/string" require "rack" require "rack/utils" +require "zeitwerk" -require_relative "action/config" require_relative "action/constants" -require_relative "action/base_params" -require_relative "action/halt" -require_relative "action/mime" -require_relative "action/rack/file" -require_relative "action/request" -require_relative "action/response" require_relative "action/errors" module Hanami @@ -42,6 +28,32 @@ module Hanami # # @api public class Action + # @since 2.0.0 + # @api private + def self.gem_loader + @gem_loader ||= Zeitwerk::Loader.new.tap do |loader| + root = File.expand_path("..", __dir__) + loader.tag = "hanami-controller" + loader.inflector = Zeitwerk::GemInflector.new("#{root}/hanami-controller.rb") + loader.push_dir(root) + loader.ignore( + "#{root}/hanami-controller.rb", + "#{root}/hanami/controller/version.rb", + "#{root}/hanami/action/{constants,errors,params,validatable}.rb" + ) + loader.inflector.inflect("csrf_protection" => "CSRFProtection") + end + end + + gem_loader.setup + + # Make conditional requires after Zeitwerk setup so any internal autoloading works as expected + begin + require "hanami/validations" + require_relative "action/validatable" + rescue LoadError # rubocop:disable Lint/SuppressedException + end + extend Dry::Configurable(config_class: Config) # See {Config} for individual setting accessor API docs diff --git a/lib/hanami/action/cache.rb b/lib/hanami/action/cache.rb index b249286..5873610 100644 --- a/lib/hanami/action/cache.rb +++ b/lib/hanami/action/cache.rb @@ -1,9 +1,5 @@ # frozen_string_literal: true -require "hanami/action/cache/cache_control" -require "hanami/action/cache/expires" -require "hanami/action/cache/conditional_get" - module Hanami class Action # Cache type API diff --git a/lib/hanami/action/cache/cache_control.rb b/lib/hanami/action/cache/cache_control.rb index 35a6fb8..8eee3db 100644 --- a/lib/hanami/action/cache/cache_control.rb +++ b/lib/hanami/action/cache/cache_control.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "hanami/action/cache/directives" - module Hanami class Action module Cache diff --git a/lib/hanami/action/cache/expires.rb b/lib/hanami/action/cache/expires.rb index 550989d..4866f1d 100644 --- a/lib/hanami/action/cache/expires.rb +++ b/lib/hanami/action/cache/expires.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "hanami/action/cache/cache_control" - module Hanami class Action module Cache diff --git a/lib/hanami/action/config.rb b/lib/hanami/action/config.rb index 08fce72..84c225d 100644 --- a/lib/hanami/action/config.rb +++ b/lib/hanami/action/config.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "dry/configurable" -require_relative "mime" module Hanami class Action diff --git a/lib/hanami/action/params.rb b/lib/hanami/action/params.rb index fe8f0d0..21c7835 100644 --- a/lib/hanami/action/params.rb +++ b/lib/hanami/action/params.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "hanami/action/base_params" require "hanami/validations/form" module Hanami diff --git a/lib/hanami/action/request.rb b/lib/hanami/action/request.rb index 9aad6ab..b9128bd 100644 --- a/lib/hanami/action/request.rb +++ b/lib/hanami/action/request.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "hanami/action/flash" require "rack/mime" require "rack/request" require "rack/utils" diff --git a/lib/hanami/action/response.rb b/lib/hanami/action/response.rb index e15960f..4c94713 100644 --- a/lib/hanami/action/response.rb +++ b/lib/hanami/action/response.rb @@ -3,11 +3,6 @@ require "rack" require "rack/response" require "hanami/utils/kernel" -require "hanami/action/halt" -require "hanami/action/cookie_jar" -require "hanami/action/cache/cache_control" -require "hanami/action/cache/expires" -require "hanami/action/cache/conditional_get" require_relative "errors" module Hanami diff --git a/lib/hanami/action/session.rb b/lib/hanami/action/session.rb index e0c1718..7d2fdde 100644 --- a/lib/hanami/action/session.rb +++ b/lib/hanami/action/session.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "hanami/action/flash" - module Hanami class Action # Session support for actions. diff --git a/lib/hanami/action/validatable.rb b/lib/hanami/action/validatable.rb index 61c3dfe..6eaceb6 100644 --- a/lib/hanami/action/validatable.rb +++ b/lib/hanami/action/validatable.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -require "hanami/action/params" +require_relative "params" module Hanami class Action diff --git a/lib/hanami/controller.rb b/lib/hanami/controller.rb index 69bb308..e8cac75 100644 --- a/lib/hanami/controller.rb +++ b/lib/hanami/controller.rb @@ -9,22 +9,10 @@ require "hanami/controller/version" module Hanami # A set of logically grouped actions # - # @since 0.1.0 - # # @see Hanami::Action # - # @example - # require "hanami/controller" - # - # module Articles - # class Index < Hanami::Action - # # ... - # end - # - # class Show < Hanami::Action - # # ... - # end - # end + # @since 0.1.0 + # @api public module Controller end end diff --git a/lib/hanami/controller/version.rb b/lib/hanami/controller/version.rb index 8458413..dbc6a45 100644 --- a/lib/hanami/controller/version.rb +++ b/lib/hanami/controller/version.rb @@ -2,6 +2,11 @@ module Hanami module Controller + # The current hanami-controller version. + # + # @return [String] + # + # @since 0.1.0 # @api public VERSION = "2.0.0.rc1" end diff --git a/spec/integration/hanami/controller/cache_spec.rb b/spec/integration/hanami/controller/cache_spec.rb index 6be74aa..681e90d 100644 --- a/spec/integration/hanami/controller/cache_spec.rb +++ b/spec/integration/hanami/controller/cache_spec.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "hanami/router" -require "hanami/action/cache" module CacheControl class Default < Hanami::Action diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e677394..9600399 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -3,8 +3,6 @@ $LOAD_PATH.unshift "lib" require "hanami/utils" require "hanami/devtools/unit" -require "hanami/controller" -require "hanami/action/cookies" -require "hanami/action/session" +require "hanami/action" Hanami::Utils.require!("spec/support") diff --git a/spec/support/fixtures.rb b/spec/support/fixtures.rb index 34abb1e..a06c1e0 100644 --- a/spec/support/fixtures.rb +++ b/spec/support/fixtures.rb @@ -5,10 +5,6 @@ require "digest/md5" require "hanami/router" require "hanami/middleware/body_parser" require "hanami/utils/escape" -require "hanami/action/params" -require "hanami/action/cookies" -require "hanami/action/session" -require "hanami/action/cache" require_relative "./renderer" require_relative "./validations" diff --git a/spec/unit/hanami/action/csrf_protection_spec.rb b/spec/unit/hanami/action/csrf_protection_spec.rb index 1e4ee7e..8008642 100644 --- a/spec/unit/hanami/action/csrf_protection_spec.rb +++ b/spec/unit/hanami/action/csrf_protection_spec.rb @@ -1,8 +1,5 @@ # frozen_string_literal: true -require "hanami/action" -require "hanami/action/csrf_protection" - RSpec.describe Hanami::Action::CSRFProtection do subject(:action) { Class.new(Hanami::Action) { diff --git a/spec/unit/hanami/action/flash_spec.rb b/spec/unit/hanami/action/flash_spec.rb index e9e6f58..6d6cec0 100644 --- a/spec/unit/hanami/action/flash_spec.rb +++ b/spec/unit/hanami/action/flash_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "hanami/action/flash" - RSpec.describe Hanami::Action::Flash do let(:flash) { described_class.new(input_hash) } let(:input_hash) { {} } diff --git a/spec/unit/hanami/action/request_spec.rb b/spec/unit/hanami/action/request_spec.rb index dc52491..f157995 100644 --- a/spec/unit/hanami/action/request_spec.rb +++ b/spec/unit/hanami/action/request_spec.rb @@ -1,7 +1,5 @@ # frozen_string_literal: true -require "hanami/action/request" - RSpec.describe Hanami::Action::Request do describe "#body" do it "exposes the raw body of the request" do diff --git a/spec/unit/hanami/action/response/session_spec.rb b/spec/unit/hanami/action/response/session_spec.rb index 399f4df..22f00d1 100644 --- a/spec/unit/hanami/action/response/session_spec.rb +++ b/spec/unit/hanami/action/response/session_spec.rb @@ -1,8 +1,5 @@ # frozen_string_literal: true -require "hanami/action/response" -require "hanami/action/request" - RSpec.describe Hanami::Action::Response, "session features" do subject(:response) { described_class.new(