* lib/yaml/rubytypes.rb: support Rational and Complex as 1.8

does.  a patch from Hiroshi Moriyama in [ruby-dev:36899].

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@20126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2008-11-06 22:36:07 +00:00
parent 1d8b7bc624
commit 1343680398
3 changed files with 67 additions and 0 deletions

View File

@ -1,3 +1,8 @@
Fri Nov 7 07:32:55 2008 Yukihiro Matsumoto <matz@ruby-lang.org>
* lib/yaml/rubytypes.rb: support Rational and Complex as 1.8
does. a patch from Hiroshi Moriyama in [ruby-dev:36899].
Fri Nov 7 07:12:06 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread_pthread.c (thread_timer): uses pthread_cond_timedwait always

View File

@ -379,6 +379,44 @@ class Float
end
end
class Rational
yaml_as "tag:ruby.yaml.org,2002:object:Rational"
def Rational.yaml_new( klass, tag, val )
if val.is_a? String
Rational( val )
else
Rational( val['numerator'], val['denominator'] )
end
end
def to_yaml( opts = {} )
YAML::quick_emit( self, opts ) do |out|
out.map( taguri, nil ) do |map|
map.add( 'denominator', denominator )
map.add( 'numerator', numerator )
end
end
end
end
class Complex
yaml_as "tag:ruby.yaml.org,2002:object:Complex"
def Complex.yaml_new( klass, tag, val )
if val.is_a? String
Complex( val )
else
Complex( val['real'], val['image'] )
end
end
def to_yaml( opts = {} )
YAML::quick_emit( self, opts ) do |out|
out.map( taguri, nil ) do |map|
map.add( 'image', imaginary )
map.add( 'real', real )
end
end
end
end
class TrueClass
yaml_as "tag:yaml.org,2002:bool#yes"
def to_yaml( opts = {} )

View File

@ -1107,6 +1107,30 @@ EOY
end
def test_ruby_rational
assert_to_yaml( Rational(1, 2), <<EOY )
--- !ruby/object:Rational
numerator: 1
denominator: 2
EOY
# Read YAML dumped by the ruby 1.8.3.
assert_to_yaml( Rational(1, 2), "!ruby/object:Rational 1/2\n" )
assert_raise( ArgumentError ) { YAML.load("!ruby/object:Rational INVALID/RATIONAL\n") }
end
def test_ruby_complex
assert_to_yaml( Complex(3, 4), <<EOY )
--- !ruby/object:Complex
image: 4
real: 3
EOY
# Read YAML dumped by the ruby 1.8.3.
assert_to_yaml( Complex(3, 4), "!ruby/object:Complex 3+4i\n" )
assert_raise( ArgumentError ) { YAML.load("!ruby/object:Complex INVALID+COMPLEXi\n") }
end
def test_emitting_indicators
assert_to_yaml( "Hi, from Object 1. You passed: please, pretty please", <<EOY
--- "Hi, from Object 1. You passed: please, pretty please"