diff --git a/lib/zeitwerk/loader.rb b/lib/zeitwerk/loader.rb index 460a714..330bf6a 100644 --- a/lib/zeitwerk/loader.rb +++ b/lib/zeitwerk/loader.rb @@ -230,53 +230,53 @@ def reload setup end - # @sig (String | Pathname) -> String? - def cpath_expected_at(path) - abspath = File.expand_path(path) + # @sig (String | Pathname) -> String? + def cpath_expected_at(path) + abspath = File.expand_path(path) - raise Zeitwerk::Error.new("#{abspath} does not exist") unless File.exist?(abspath) + raise Zeitwerk::Error.new("#{abspath} does not exist") unless File.exist?(abspath) - return unless dir?(abspath) || ruby?(abspath) - return if ignored_path?(abspath) + return unless dir?(abspath) || ruby?(abspath) + return if ignored_path?(abspath) - paths = [] + paths = [] - if ruby?(abspath) - basename = File.basename(abspath, ".rb") - return if hidden?(basename) + if ruby?(abspath) + basename = File.basename(abspath, ".rb") + return if hidden?(basename) - paths << [basename, abspath] - walk_up_from = File.dirname(abspath) - else - walk_up_from = abspath - end - - root_namespace = nil + paths << [basename, abspath] + walk_up_from = File.dirname(abspath) + else + walk_up_from = abspath + end - walk_up(walk_up_from) do |dir| - break if root_namespace = roots[dir] - return if ignored_path?(dir) + root_namespace = nil - basename = File.basename(dir) - return if hidden?(basename) + walk_up(walk_up_from) do |dir| + break if root_namespace = roots[dir] + return if ignored_path?(dir) - paths << [basename, abspath] unless collapse?(dir) - end + basename = File.basename(dir) + return if hidden?(basename) - return unless root_namespace + paths << [basename, abspath] unless collapse?(dir) + end - if paths.empty? - real_mod_name(root_namespace) - else - cnames = paths.reverse_each.map { |b, a| cname_for(b, a) } + return unless root_namespace - if root_namespace == Object - cnames.join("::") + if paths.empty? + real_mod_name(root_namespace) else - "#{real_mod_name(root_namespace)}::#{cnames.join("::")}" + cnames = paths.reverse_each.map { |b, a| cname_for(b, a) } + + if root_namespace == Object + cnames.join("::") + else + "#{real_mod_name(root_namespace)}::#{cnames.join("::")}" + end end end - end # Says if the given constant path would be unloaded on reload. This # predicate returns `false` if reloading is disabled.