Convert to Zeitwerk for code loading (#402)

- Add zeitwerk to the gemspec
- Add `lib/hanami-controller.rb` so the gem follows a conventional structure
- Set up the Zeitwerk loader inside `lib/hanami/action.rb` (call it `.gem_loader` instead of `.loader` like we have done in other gems, since `Hanami::Action` is a class with other responsibilities, and `loader` is too generic a term)
- Move conditional requires below the `gem_loader.setup` line to ensure any internal autoloader work
- Remove all now-unneeded manual requires for files inside the gem
This commit is contained in:
Tim Riley 2022-11-14 21:28:11 +11:00 committed by GitHub
parent f66d91beef
commit 2e025d26c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 43 additions and 69 deletions

View File

@ -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"

3
lib/hanami-controller.rb Normal file
View File

@ -0,0 +1,3 @@
# frozen_string_literal: true
require_relative "hanami/controller"

View File

@ -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

View File

@ -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

View File

@ -1,7 +1,5 @@
# frozen_string_literal: true
require "hanami/action/cache/directives"
module Hanami
class Action
module Cache

View File

@ -1,7 +1,5 @@
# frozen_string_literal: true
require "hanami/action/cache/cache_control"
module Hanami
class Action
module Cache

View File

@ -1,7 +1,6 @@
# frozen_string_literal: true
require "dry/configurable"
require_relative "mime"
module Hanami
class Action

View File

@ -1,6 +1,5 @@
# frozen_string_literal: true
require "hanami/action/base_params"
require "hanami/validations/form"
module Hanami

View File

@ -1,6 +1,5 @@
# frozen_string_literal: true
require "hanami/action/flash"
require "rack/mime"
require "rack/request"
require "rack/utils"

View File

@ -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

View File

@ -1,7 +1,5 @@
# frozen_string_literal: true
require "hanami/action/flash"
module Hanami
class Action
# Session support for actions.

View File

@ -1,6 +1,6 @@
# frozen_string_literal: true
require "hanami/action/params"
require_relative "params"
module Hanami
class Action

View File

@ -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

View File

@ -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

View File

@ -1,7 +1,6 @@
# frozen_string_literal: true
require "hanami/router"
require "hanami/action/cache"
module CacheControl
class Default < Hanami::Action

View File

@ -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")

View File

@ -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"

View File

@ -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) {

View File

@ -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) { {} }

View File

@ -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

View File

@ -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(