Improve the logic that detects non-autoloaded constants
If you require `nokogiri` from `app/models/user.rb`, dependencies.rb does not mark `Nokogiri` as an autoloaded constant, as expected. But the logic to detect these non-autoloaded constants is incomplete. See the tests defined in the patch for some cases incorrectly handled.
This commit is contained in:
parent
3295e23755
commit
e302725751
@ -103,6 +103,8 @@ class WatchStack
|
||||
# parent.rb then requires namespace/child.rb, the stack will look like
|
||||
# [[Object], [Namespace]].
|
||||
|
||||
attr_reader :watching
|
||||
|
||||
def initialize
|
||||
@watching = []
|
||||
@stack = Hash.new { |h, k| h[k] = [] }
|
||||
@ -254,7 +256,9 @@ def require_dependency(file_name, message = "No such file to load -- %s.rb")
|
||||
|
||||
def load_dependency(file)
|
||||
if Dependencies.load? && Dependencies.constant_watch_stack.watching?
|
||||
Dependencies.new_constants_in(Object) { yield }
|
||||
descs = Dependencies.constant_watch_stack.watching.flatten.uniq
|
||||
|
||||
Dependencies.new_constants_in(*descs) { yield }
|
||||
else
|
||||
yield
|
||||
end
|
||||
|
@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require "dependencies/module_folder/lib_class"
|
||||
|
||||
module ModuleFolder
|
||||
class NestedWithRequire
|
||||
end
|
||||
end
|
@ -0,0 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class NestedWithRequireParent
|
||||
ModuleFolder::NestedWithRequire
|
||||
end
|
@ -0,0 +1,8 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
ConstFromLib = 1
|
||||
|
||||
module ModuleFolder
|
||||
class LibClass
|
||||
end
|
||||
end
|
@ -282,6 +282,32 @@ def test_module_with_nested_inline_class
|
||||
remove_constants(:ModuleFolder)
|
||||
end
|
||||
|
||||
def test_module_with_nested_class_requiring_lib_class
|
||||
with_autoloading_fixtures do
|
||||
ModuleFolder::NestedWithRequire
|
||||
|
||||
assert defined?(ModuleFolder::LibClass)
|
||||
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ModuleFolder::LibClass")
|
||||
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ConstFromLib")
|
||||
end
|
||||
ensure
|
||||
remove_constants(:ModuleFolder)
|
||||
remove_constants(:ConstFromLib)
|
||||
end
|
||||
|
||||
def test_module_with_nested_class_and_parent_requiring_lib_class
|
||||
with_autoloading_fixtures do
|
||||
NestedWithRequireParent
|
||||
|
||||
assert defined?(ModuleFolder::LibClass)
|
||||
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ModuleFolder::LibClass")
|
||||
assert_not ActiveSupport::Dependencies.autoloaded_constants.include?("ConstFromLib")
|
||||
end
|
||||
ensure
|
||||
remove_constants(:ModuleFolder)
|
||||
remove_constants(:ConstFromLib)
|
||||
end
|
||||
|
||||
def test_directories_may_manifest_as_nested_classes
|
||||
with_autoloading_fixtures do
|
||||
assert_kind_of Class, ClassFolder
|
||||
|
Loading…
Reference in New Issue
Block a user