From a47c84d584777238a6955e3a08436577c471af0f Mon Sep 17 00:00:00 2001 From: Xavier Noria Date: Fri, 15 Mar 2019 22:50:04 +0100 Subject: [PATCH] Engines are reloaded in Zeitwerk mode [closes #35618] --- activesupport/CHANGELOG.md | 4 +++ .../dependencies/zeitwerk_integration.rb | 3 +- .../application/zeitwerk_integration_test.rb | 33 +++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index 2610cc63a4..b2330f2c9d 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,7 @@ +* In Zeitwerk mode, engines are now managed by the `main` autoloader. Engines may reference application constants, if the application is reloaded and we do not reload engines, they won't use the reloaded application code. + + *Xavier Noria* + * Add support for supplying `locale` to `transliterate` and `parameterize`. I18n.backend.store_translations(:de, i18n: { transliterate: { rule: { "ΓΌ" => "ue" } } }) diff --git a/activesupport/lib/active_support/dependencies/zeitwerk_integration.rb b/activesupport/lib/active_support/dependencies/zeitwerk_integration.rb index 1e697e1ba5..e00307d257 100644 --- a/activesupport/lib/active_support/dependencies/zeitwerk_integration.rb +++ b/activesupport/lib/active_support/dependencies/zeitwerk_integration.rb @@ -71,8 +71,7 @@ def setup_autoloaders end def autoload_once?(autoload_path) - Dependencies.autoload_once_paths.include?(autoload_path) || - Gem.path.any? { |gem_path| autoload_path.to_s.start_with?(gem_path) } + Dependencies.autoload_once_paths.include?(autoload_path) end def freeze_autoload_paths diff --git a/railties/test/application/zeitwerk_integration_test.rb b/railties/test/application/zeitwerk_integration_test.rb index cddbf5a22d..c82b37d07d 100644 --- a/railties/test/application/zeitwerk_integration_test.rb +++ b/railties/test/application/zeitwerk_integration_test.rb @@ -149,22 +149,27 @@ class RESTfulController < ApplicationController assert $zeitwerk_integration_test_extras end - test "autoload paths that are below Gem.path go to the once autoloader" do - app_dir "extras" - add_to_config 'config.autoload_paths << "#{Rails.root}/extras"' - - # Mocks Gem.path to include the extras directory. - Gem.singleton_class.prepend( - Module.new do - def path - super + ["#{Rails.root}/extras"] - end - end - ) + test "autoload_paths are set as root dirs of main, and in the same order" do boot - assert_not_includes Rails.autoloaders.main.dirs, "#{app_path}/extras" - assert_includes Rails.autoloaders.once.dirs, "#{app_path}/extras" + existing_autoload_paths = deps.autoload_paths.select { |dir| File.directory?(dir) } + assert_equal existing_autoload_paths, Rails.autoloaders.main.dirs + end + + test "autoload_once_paths go to the once autoloader, and in the same order" do + extras = %w(e1 e2 e3) + extras.each do |extra| + app_dir extra + add_to_config %(config.autoload_once_paths << "\#{Rails.root}/#{extra}") + end + + boot + + extras = extras.map { |extra| "#{app_path}/#{extra}" } + extras.each do |extra| + assert_not_includes Rails.autoloaders.main.dirs, extra + end + assert_equal extras, Rails.autoloaders.once.dirs end test "clear reloads the main autoloader, and does not reload the once one" do -- GitLab