Bug #7893

Issues with loading YAML and respond_to_missing?

Added by Lee Jarvis about 1 year ago. Updated about 1 year ago.

[ruby-core:52575]
Status:Rejected
Priority:Normal
Assignee:Aaron Patterson
Category:ext
Target version:-
ruby -v:1.9.3p385 Backport:

Description

This is perhaps not a bug, I could be missing something, but shouldn't the following code work?

require 'yaml'

class Person
  def initialize(name)
    @attributes = { name: name }
  end

  def method_missing(m, *args, &block)
    @attributes.key?(m) ? @attributes[m] : super
  end

  def respond_to_missing?(m, include_private = false)
    @attributes.key?(m) || super
  end
end

dump = YAML.dump Person.new("lee")
load = YAML.load dump

The YAML.dump appears to work as expected, yet when I attempt to load the dump back, I get the following exception:

/Users/lee/bin/rb:15:in `respond_to_missing?': undefined method `key?' for nil:NilClass (NoMethodError)
  from /Users/lee/.rubies/1.9.3-p385/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:291:in `respond_to?'
  from /Users/lee/.rubies/1.9.3-p385/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:291:in `init_with'
  from /Users/lee/.rubies/1.9.3-p385/lib/ruby/1.9.1/psych/visitors/to_ruby.rb:284:in `revive'

However doing the same thing with JSON for example, works fine: https://gist.github.com/injekt/0a4aa3e25f09ae2f8cba

History

#1 Updated by Hans Mackowiak about 1 year ago

the problem is in yaml: toruby.rb "if o.respondto?(:initwith)" so eigher you need to define a initwith method or

def respondtomissing?(m, include_private = false)
(@attributes && @attributes.key?(m)) || super
end

#2 Updated by Eric Hodel about 1 year ago

  • Category changed from core to ext
  • Status changed from Open to Rejected
  • Assignee set to Aaron Patterson

As Hanmac noted, this exception is possible with Person.allocate.respond_to? which is exactly what Psych does.

Perhaps Psych needs some documentation improvement around dump and load.

Also available in: Atom PDF