From 0fce087328805b6812a8fd2be36b4eef6cc6614d Mon Sep 17 00:00:00 2001 From: why Date: Thu, 22 May 2003 17:56:30 +0000 Subject: * lib/token.c: single- and double-quoted root-level fix. * lib/yaml.rb (YAML::object_maker): can create object attributes (such as found in Exception class) * lib/yaml/rubytypes.rb: roundtripping of Exception and subclasses. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@3856 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/yaml/rubytypes.rb | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'lib/yaml') diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb index a67023763..92aee82da 100644 --- a/lib/yaml/rubytypes.rb +++ b/lib/yaml/rubytypes.rb @@ -1,5 +1,4 @@ require 'date' -require 'yaml/constants' # # Type conversions # @@ -241,6 +240,38 @@ array_proc = Proc.new { |type, val| YAML.add_builtin_type( 'seq', &array_proc ) YAML.add_ruby_type( 'array', &array_proc ) +# +# Exception#to_yaml +# +class Exception + def is_complex_yaml? + true + end + def to_yaml_type + "!ruby/exception:#{self.class}" + end + def to_yaml( opts = {} ) + YAML::quick_emit( self.object_id, opts ) { |out| + out.map( self.to_yaml_type ) { |map| + map.add( 'message', self.message ) + to_yaml_properties.each { |m| + map.add( m[1..-1], instance_eval( m ) ) + } + } + } + end +end + +YAML.add_ruby_type( 'exception' ) { |type, val| + type, obj_class = YAML.read_type_class( type, Exception ) + o = YAML.object_maker( obj_class, { 'mesg' => val.delete( 'message' ) }, true ) + val.each_pair { |k,v| + o.instance_eval "@#{k} = v" + } + o +} + + # # String#to_yaml # @@ -274,7 +305,7 @@ class String "''" elsif YAML.detect_implicit( self ) != 'str' "\"#{YAML.escape( self )}\"" - elsif self =~ /#{YAML::ESCAPE_CHAR}|[#{YAML::SPACE_INDICATORS}]( |\n|$)|\'/ + elsif self =~ /#{YAML::ESCAPE_CHAR}|[#{YAML::SPACE_INDICATORS}] |\n|\'/ "\"#{YAML.escape( self )}\"" elsif self =~ /^[^#{YAML::WORD_CHAR}]/ "\"#{YAML.escape( self )}\"" -- cgit