Forum: Ruby-core Merge keys not working as expected in psych yaml parser

E7cff3cfd41c495e1012227d7dc24202?d=identicon&s=25 Luis Lavena (luislavena)
on 2013-01-22 14:29
(Received via mailing list)
Issue #4300 has been updated by luislavena (Luis Lavena).

Description updated

firedev (Nick O) wrote:
> Sorry but this isn't fixed as of Ruby 1.9.3p374 (2013-01-15 revision 38858)
>
> https://github.com/tenderlove/psych/issues/8#issue...

This is not backported to 1.9.3, this is fixed in trunk.

Please submit a backport request indicating the original issue, the
revisions that needs to be backported and assign to usa.

Thank you.
----------------------------------------
Bug #4300: Merge keys not working as expected in psych yaml parser
https://bugs.ruby-lang.org/issues/4300#change-35528

Author: wr0ngway (Matthew Conway)
Status: Closed
Priority: Normal
Assignee: tenderlovemaking (Aaron Patterson)
Category: ext
Target version:
ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365)
[x86_64-darwin10.6.0]


=begin
 Psych doesn't seem to support merge keys (
http://yaml.org/type/merge.html ) with alias/anchor the same way that
syck does.  I'm not sure if this is intentional or not, but its a pretty
useful behavior so I'm filing a bug.  Basically, while psych does allow
one to use a merge key to pull a aliased mapping into another mapping,
it does not allow one to add other items to that mapping.  Very
frequently I have a map that is mostly in common amongst a number of
keys, with a subkey that differs, and this bug makes it impossible to
achieve this behavior with psych.

 For the yaml snippet below:

 foo: &foo
   hello: world
 bar:
   << : *foo
   baz: boo

 syck produces: {"foo"=>{"hello"=>"world"}, "bar"=>{"hello"=>"world",
"baz"=>"boo"}}

 psych produces: {"foo"=>{"hello"=>"world"}, "bar"=>{"hello"=>"world"}}

 Note that in the yaml 1.1 spec ( http://yaml.org/spec/1.1/#id902561 )
it says "Note that an alias node must not specify any properties or
content, as these were already specified at the first occurrence of the
node.", however I think this should only apply when doing something like
"bar: *foo". When using a merge key, you are creating a new node (which
you don't add to), but merging it into a different mapping node - which
you should be able to add to.

 For reference, also submitted at
https://github.com/tenderlove/psych/issues#issue/8...
=end
This topic is locked and can not be replied to.