Delay loading Zeitwerk

This commit is contained in:
Xavier Noria 2022-01-05 12:59:49 +01:00
parent 55765121ad
commit 9b61af8179
5 changed files with 48 additions and 47 deletions

View File

@ -12,7 +12,6 @@ require "active_support/core_ext/object/blank"
require "rails/application"
require "rails/version"
require "rails/autoloaders"
require "active_support/railtie"
require "action_dispatch/railtie"
@ -115,7 +114,7 @@ module Rails
end
def autoloaders
Autoloaders
application.autoloaders
end
end
end

View File

@ -10,6 +10,7 @@ require "active_support/hash_with_indifferent_access"
require "active_support/configuration_file"
require "rails/engine"
require "rails/secrets"
require "rails/autoloaders"
module Rails
# An Engine with the responsibility of coordinating the whole boot process.
@ -95,7 +96,7 @@ module Rails
attr_accessor :assets, :sandbox
alias_method :sandbox?, :sandbox
attr_reader :reloaders, :reloader, :executor
attr_reader :reloaders, :reloader, :executor, :autoloaders
delegate :default_url_options, :default_url_options=, to: :routes
@ -117,6 +118,8 @@ module Rails
@reloader = Class.new(ActiveSupport::Reloader)
@reloader.executor = @executor
@autoloaders = Rails::Autoloaders.new
# are these actually used?
@initial_variable_values = initial_variable_values
@block = block

View File

@ -1,6 +1,5 @@
# frozen_string_literal: true
require "zeitwerk"
require "active_support/core_ext/string/inflections"
require "active_support/core_ext/array/conversions"
require "active_support/descendants_tracker"

View File

@ -1,44 +1,48 @@
# frozen_string_literal: true
require "zeitwerk"
module Rails
module Autoloaders # :nodoc:
class Autoloaders # :nodoc:
require_relative "autoloaders/inflector"
class << self
include Enumerable
include Enumerable
def main
@main ||= Zeitwerk::Loader.new.tap do |loader|
loader.tag = "rails.main"
loader.inflector = Inflector
end
end
attr_reader :main, :once
def once
@once ||= Zeitwerk::Loader.new.tap do |loader|
loader.tag = "rails.once"
loader.inflector = Inflector
end
end
def initialize
# This `require` delays loading the library on purpose.
#
# In Rails 7.0.0, railties/lib/rails.rb loaded Zeitwerk as a side-effect,
# but a couple of edge cases related to Bundler and Bootsnap showed up.
# They had to do with order of decoration of `Kernel#require`, something
# the three of them do.
#
# Delaying this `require` up to this point is a convenient trade-off.
require "zeitwerk"
def each
yield main
yield once
end
@main = Zeitwerk::Loader.new
@main.tag = "rails.main"
@main.inflector = Inflector
def logger=(logger)
each { |loader| loader.logger = logger }
end
@once = Zeitwerk::Loader.new
@once.tag = "rails.once"
@once.inflector = Inflector
end
def log!
each(&:log!)
end
def each
yield main
yield once
end
def zeitwerk_enabled?
true
end
def logger=(logger)
each { |loader| loader.logger = logger }
end
def log!
each(&:log!)
end
def zeitwerk_enabled?
true
end
end
end

View File

@ -2,20 +2,16 @@
require "active_support/inflector"
module Rails
module Autoloaders
module Inflector # :nodoc:
# Concurrent::Map is not needed. This is a private class, and overrides
# must be defined while the application boots.
@overrides = {}
module Rails::Autoloaders::Inflector # :nodoc:
# Concurrent::Map is not needed. This is a private class, and overrides
# must be defined while the application boots.
@overrides = {}
def self.camelize(basename, _abspath)
@overrides[basename] || basename.camelize
end
def self.camelize(basename, _abspath)
@overrides[basename] || basename.camelize
end
def self.inflect(overrides)
@overrides.merge!(overrides)
end
end
def self.inflect(overrides)
@overrides.merge!(overrides)
end
end