summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb2
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb3
-rw-r--r--test/psych/test_class.rb12
4 files changed, 19 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 4549ce219f..6f0813f9e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Jun 9 09:05:04 2011 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: Ruby classes can be loaded
+ from YAML files.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: Ruby classes can be
+ dumped to YAML files.
+ * test/psych/test_class.rb: corresponding test.
+
Wed Jun 8 21:38:57 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
* cont.c (root_fiber_alloc): set root fiber's status RUNNING.
diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb
index f8b15859e1..cb0afd26ba 100644
--- a/ext/psych/lib/psych/visitors/to_ruby.rb
+++ b/ext/psych/lib/psych/visitors/to_ruby.rb
@@ -57,6 +57,8 @@ module Psych
Complex(o.value)
when "!ruby/object:Rational"
Rational(o.value)
+ when "!ruby/class"
+ resolve_class o.value
when "tag:yaml.org,2002:float", "!float"
Float(@ss.tokenize(o.value))
when "!ruby/regexp"
diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb
index 6f90377ec8..de35c7678b 100644
--- a/ext/psych/lib/psych/visitors/yaml_tree.rb
+++ b/ext/psych/lib/psych/visitors/yaml_tree.rb
@@ -247,7 +247,8 @@ module Psych
end
def visit_Class o
- raise TypeError, "can't dump anonymous class #{o.class}"
+ raise TypeError, "can't dump anonymous class: #{o}" unless o.name
+ @emitter.scalar o.name, nil, '!ruby/class', false, false, Nodes::Scalar::SINGLE_QUOTED
end
def visit_Range o
diff --git a/test/psych/test_class.rb b/test/psych/test_class.rb
index cba88ba75b..8fd4ad0952 100644
--- a/test/psych/test_class.rb
+++ b/test/psych/test_class.rb
@@ -2,16 +2,18 @@ require 'psych/helper'
module Psych
class TestClass < TestCase
- def test_cycle
+ def test_cycle_anonymous_class
assert_raises(::TypeError) do
- assert_cycle(TestClass)
+ assert_cycle(Class.new)
end
end
+ def test_cycle
+ assert_cycle(TestClass)
+ end
+
def test_dump
- assert_raises(::TypeError) do
- Psych.dump TestClass
- end
+ Psych.dump TestClass
end
end
end