From: eregontp@... Date: 2020-05-29T10:13:07+00:00 Subject: [ruby-core:98567] [Ruby master Feature#16832] Use #name rather than #inspect to build "uninitialized constant" error messages Issue #16832 has been updated by Eregon (Benoit Daloze). FWIW it also applies to missing methods and other NameError, which sounds nice but would deserve a spec in `spec/ruby/core/exception/name_error_spec.rb`: ``` $ ruby -e 'c=Class.new { def self.name; "MyClass"; end }; c.foo' master: -e:1:in `
': undefined method `foo' for MyClass:Class (NoMethodError) 2.7.1: -e:1:in `
': undefined method `foo' for # (NoMethodError) ``` ---------------------------------------- Feature #16832: Use #name rather than #inspect to build "uninitialized constant" error messages https://bugs.ruby-lang.org/issues/16832#change-85864 * Author: byroot (Jean Boussier) * Status: Closed * Priority: Normal ---------------------------------------- While debugging a bug in Rails (https://github.com/rails/rails/pull/37632#issuecomment-623387954) I noticed `NameError` calls `inspect` on the `const_get` receiver to build its error message. The problem is that some libraries such as Active Record have been redefining `inspect` for years to provide human readable information, e.g.: ``` >> Shipit::Stack.inspect => "Shipit::Stack (call 'Shipit::Stack.connection' to establish a connection)" >> Shipit::Stack.connection; nil >> Shipit::Stack.inspect => "Shipit::Stack(id: integer, environment: string, ...)" ``` Which makes for fairly unhelpful error messages: ``` >> Shipit::Stack.const_get(:Foo) Traceback (most recent call last): 2: from (irb):4 1: from (irb):4:in `const_get' NameError (uninitialized constant #::Foo) ``` So perhaps it's Active Record that is at fault here, but from my understanding since the goal is to display the constant path that was requested, `name` is much more likely to return a relevant constant name. Proposed patch: https://github.com/ruby/ruby/pull/3080 -- https://bugs.ruby-lang.org/ Unsubscribe: