Skip to content

Commit

Permalink
Merge pull request #69 from ManageIQ/register_strings_for_use_in_aliases
Browse files Browse the repository at this point in the history
From yaml, register a newly created String with aliases.  To yaml, register Strings containing ivars with aliases.
  • Loading branch information
tenderlove committed Jul 13, 2012
2 parents 81ff3de + 4027c6d commit 2b4f76f
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 1 deletion.
1 change: 1 addition & 0 deletions lib/psych/visitors/to_ruby.rb
Expand Up @@ -148,6 +148,7 @@ def visit_Psych_Nodes_Mapping o

if klass
string = klass.allocate.replace string
register(o, string)
end

init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o)
Expand Down
2 changes: 1 addition & 1 deletion lib/psych/visitors/yaml_tree.rb
Expand Up @@ -254,7 +254,7 @@ def visit_String o
maptag = '!ruby/string'
maptag << ":#{o.class}" unless o.class == ::String

@emitter.start_mapping nil, maptag, false, Nodes::Mapping::BLOCK
register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK)
@emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY
@emitter.scalar str, nil, tag, plain, quote, style

Expand Down
70 changes: 70 additions & 0 deletions test/psych/test_alias_and_anchor.rb
@@ -1,5 +1,13 @@
require 'psych/helper'

class ObjectWithInstanceVariables
attr_accessor :var1, :var2
end

class SubStringWithInstanceVariables < String
attr_accessor :var1
end

module Psych
class TestAliasAndAnchor < TestCase
def test_mri_compatibility
Expand All @@ -14,6 +22,40 @@ def test_mri_compatibility
result.each {|el| assert_same(result[0], el) }
end

def test_mri_compatibility_object_with_ivars
yaml = <<EOYAML
---
- &id001 !ruby/object:ObjectWithInstanceVariables
var1: test1
var2: test2
- *id001
- *id001
EOYAML

result = Psych.load yaml
result.each do |el|
assert_same(result[0], el)
assert_equal('test1', el.var1)
assert_equal('test2', el.var2)
end
end

def test_mri_compatibility_substring_with_ivars
yaml = <<EOYAML
---
- &id001 !str:SubStringWithInstanceVariables
str: test
"@var1": test
- *id001
- *id001
EOYAML
result = Psych.load yaml
result.each do |el|
assert_same(result[0], el)
assert_equal('test', el.var1)
end
end

def test_anchor_alias_round_trip
o = Object.new
original = [o,o,o]
Expand All @@ -22,5 +64,33 @@ def test_anchor_alias_round_trip
result = Psych.load yaml
result.each {|el| assert_same(result[0], el) }
end

def test_anchor_alias_round_trip_object_with_ivars
o = ObjectWithInstanceVariables.new
o.var1 = 'test1'
o.var2 = 'test2'
original = [o,o,o]

yaml = Psych.dump original
result = Psych.load yaml
result.each do |el|
assert_same(result[0], el)
assert_equal('test1', el.var1)
assert_equal('test2', el.var2)
end
end

def test_anchor_alias_round_trip_substring_with_ivars
o = SubStringWithInstanceVariables.new
o.var1 = 'test'
original = [o,o,o]

yaml = Psych.dump original
result = Psych.load yaml
result.each do |el|
assert_same(result[0], el)
assert_equal('test', el.var1)
end
end
end
end

0 comments on commit 2b4f76f

Please sign in to comment.