From: "luislavena (Luis Lavena)" Date: 2013-01-22T22:28:44+09:00 Subject: [ruby-core:51570] [ruby-trunk - Bug #4300] Merge keys not working as expected in psych yaml parser 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#issuecomment-12541499 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/comment/693341 =end -- http://bugs.ruby-lang.org/