Bug #21193
openInherited callback returns `nil` for `Object.const_source_location`
Description
Since https://github.com/ruby/ruby/pull/12927 the inherited callback no longer can access the Object.const_source_location
. A simplified reproduction is the following:
class A
def self.inherited(other)
super
p Object.const_source_location(other.name)
end
end
class B < A
end
Prior to this change Object.const_source_location(other.name)
would return ["test.rb", 8]
and now returns nil
.
Shopify's application uses the inherited
callback to load configuration classes and since it's unable to find these classes they aren't loaded when they are called. It's not clear if this was intended or if there's a workaround. In chatting with folks at GitHub, they have a similar issue (although that case sounds less straightforward). A more accurate example of what we have (I did strip this down a bunch too):
def self.inherited(config)
return super unless config.superclass == Config
if (class_name = config.name) &&
(config_location = Object.const_source_location(class_name)) &&
(parent_dirname = File.dirname(config_location[0]))
config_dirname = File.join(parent_dirname, "config")
config.autoload(:Something, File.join(config_dirname, "something.rb"))
end
super
end
Original issue: https://bugs.ruby-lang.org/issues/21143
cc/ @byroot (Jean Boussier) @fxn