From 52d6d87926ee26fafde9527b91753e0bcba52d99 Mon Sep 17 00:00:00 2001 From: Tim Riley Date: Sun, 6 Feb 2022 22:39:37 +1100 Subject: [PATCH] Allow Zeitwerk::Loader#setup to be run externally This is useful if external integrating systems (e.g. Hanami) want to make `#setup` call at a different time. --- lib/dry/system/plugins.rb | 8 ++++---- lib/dry/system/plugins/env.rb | 3 ++- lib/dry/system/plugins/zeitwerk.rb | 28 +++++++++++++++++----------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/dry/system/plugins.rb b/lib/dry/system/plugins.rb index 07824bc20..e05f6fc36 100644 --- a/lib/dry/system/plugins.rb +++ b/lib/dry/system/plugins.rb @@ -21,8 +21,8 @@ def initialize(name, mod, &block) end # @api private - def apply_to(system, options) - system.extend(stateful? ? mod.new(options) : mod) + def apply_to(system, **options) + system.extend(stateful? ? mod.new(**options) : mod) system.instance_eval(&block) if block system end @@ -90,13 +90,13 @@ def self.loaded_dependencies # @return [self] # # @api public - def use(name, options = {}) + def use(name, **options) return self if enabled_plugins.include?(name) raise PluginNotFoundError, name unless (plugin = Plugins.registry[name]) plugin.load_dependencies - plugin.apply_to(self, options) + plugin.apply_to(self, **options) enabled_plugins << name diff --git a/lib/dry/system/plugins/env.rb b/lib/dry/system/plugins/env.rb index 4aba4c038..c1ea620e8 100644 --- a/lib/dry/system/plugins/env.rb +++ b/lib/dry/system/plugins/env.rb @@ -10,8 +10,9 @@ class Env < Module attr_reader :options # @api private - def initialize(options) + def initialize(**options) @options = options + super() end def inferrer diff --git a/lib/dry/system/plugins/zeitwerk.rb b/lib/dry/system/plugins/zeitwerk.rb index a28bcfe6d..5ca614791 100644 --- a/lib/dry/system/plugins/zeitwerk.rb +++ b/lib/dry/system/plugins/zeitwerk.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "dry/system/constants" -require "dry/system/plugins/zeitwerk/compat_inflector" module Dry module System @@ -10,15 +9,22 @@ module Plugins class Zeitwerk < Module # @api private def self.dependencies - ["dry/system/loader/autoloading", {"zeitwerk" => "zeitwerk"}] + [ + "dry/system/loader/autoloading", + "dry/system/plugins/zeitwerk/compat_inflector", + {"zeitwerk" => "zeitwerk"} + ] end # @api private - attr_reader :options + attr_reader :loader, :setup, :eager_load, :debug # @api private - def initialize(options) - @options = options + def initialize(loader: nil, setup: true, eager_load: nil, debug: false) + @loader = loader || ::Zeitwerk::Loader.new + @setup = setup + @eager_load = eager_load + @debug = debug super() end @@ -26,7 +32,7 @@ def initialize(options) def extended(system) system.setting :autoloader, reader: true - system.config.autoloader = options.fetch(:loader) { ::Zeitwerk::Loader.new } + system.config.autoloader = loader system.config.component_dirs.loader = Dry::System::Loader::Autoloading system.config.component_dirs.add_to_load_path = false @@ -42,7 +48,7 @@ def setup_autoloader(system) push_component_dirs_to_loader(system, system.autoloader) - system.autoloader.setup + system.autoloader.setup if setup system.after(:finalize) { system.autoloader.eager_load } if eager_load?(system) @@ -55,7 +61,7 @@ def setup_autoloader(system) def configure_loader(loader, system) loader.tag = system.config.name || system.name unless loader.tag loader.inflector = CompatInflector.new(system.config) - loader.logger = method(:puts) if options[:debug] + loader.logger = method(:puts) if debug end # Add component dirs to the zeitwerk loader @@ -93,9 +99,9 @@ def get_or_define_module(parent_mod, name) end def eager_load?(system) - options.fetch(:eager_load) { - system.config.respond_to?(:env) && system.config.env == :production - } + return eager_load unless eager_load.nil? + + system.config.respond_to?(:env) && system.config.env == :production end end end