Bug #5358

YAML 中のタグの扱いについて

Added by Sho Hashimoto over 2 years ago. Updated almost 2 years ago.

[ruby-dev:44529]
Status:Closed
Priority:Normal
Assignee:Aaron Patterson
Category:ext
Target version:1.9.3
ruby -v:ruby 1.9.2p290 Backport:

Description

http://yaml.org/ によると、以下はいずれも同じグローバルタグを指定してると思うのですが、結果が異なります。

YAML.load("--- !tag:yaml.org,2002:str foo")
# => #:str", @value="foo">

YAML.load("--- !!str foo")
# => #

一方、以下はいずれも同じ結果になります。

YAML.load("--- foo") # => "foo"
YAML.load("--- !str foo") # => "foo"
YAML.load("--- !tag:yaml.org,2002:str foo") # => "foo"

これらについて、もしかして以下のバグがあるのではないでしょうか。

  • !str は間違ってグローバルタグとして扱われている
  • !tag:yaml.org,2002 は間違ってグローバルタグとして扱われている
  • !!str はグローバルタグとして扱われていない

History

#1 Updated by Aaron Patterson over 2 years ago

  • Category set to ext
  • Assignee set to Aaron Patterson
  • Target version set to 1.9.3

これは syck のバグです。Ruby 1.9.2 で最初に require 'psych' と書いてから、require 'yaml' と書けば、バグは発生しません。

例:

ruby-1.9.2-p290 :001 > RUBYVERSION
=> "1.9.2"
ruby-1.9.2-p290 :002 > require 'psych'
=> true
ruby-1.9.2-p290 :003 > require 'yaml'
=> true
ruby-1.9.2-p290 :004 > YAML.load("--- foo")
=> "foo"
ruby-1.9.2-p290 :005 > YAML.load("--- !str foo")
=> "foo"
ruby-1.9.2-p290 :006 > YAML.load("--- !tag:yaml.org,2002:str foo")
=> "foo"
ruby-1.9.2-p290 :007 > YAML.load("--- !!str foo")
=> "foo"
ruby-1.9.2-p290 :008 > YAML.load("--- !tag:yaml.org,2002:str foo")
Psych::SyntaxError: couldn't parse YAML at line 1 column 24
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in parse'
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:148:in
parse
stream'
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:119:in parse'
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/psych.rb:106:in
load'
from (irb):8
from /Users/aaron/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `'
ruby-1.9.2-p290 :009 >

Ruby 1.9.3 を使ったら、require 'yaml' だけで良いです。

例:

ruby-1.9.3-head :001 > RUBYVERSION
=> "1.9.3"
ruby-1.9.3-head :002 > require 'yaml'
=> true
ruby-1.9.3-head :003 > YAML.load("--- foo")
=> "foo"
ruby-1.9.3-head :004 > YAML.load("--- !str foo")
=> "foo"
ruby-1.9.3-head :005 > YAML.load("--- !tag:yaml.org,2002:str foo")
=> "foo"
ruby-1.9.3-head :006 > YAML.load("--- !!str foo")
=> "foo"
ruby-1.9.3-head :007 > YAML.load("--- !tag:yaml.org,2002:str foo")
Psych::SyntaxError: (): couldn't parse YAML at line 0 column 24
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:154:in parse'
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:154:in
parse
stream'
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:125:in parse'
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/lib/ruby/1.9.1/psych.rb:112:in
load'
from (irb):7
from /Users/aaron/.rvm/rubies/ruby-1.9.3-head/bin/irb:16:in `'
ruby-1.9.3-head :008 >

#2 Updated by Sho Hashimoto over 2 years ago

ありがとうございます。確かに教えてもらった通りになりました。

上記はつまり以下という事でいいですか?

  • !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
  • !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)

#3 Updated by Shyouhei Urabe about 2 years ago

  • Status changed from Open to Assigned

#4 Updated by Ayumu AIZAWA almost 2 years ago

  • Status changed from Assigned to Closed

報告者が納得されているようなのでこのチケットはCloseします。

#5 Updated by Sho Hashimoto almost 2 years ago

アーロンさんにご返信をいただいてないので納得というと何ともですが、close していただくのは問題ありません。

私としては、以下の質問に対してRubyの仕様として公式なご回答が頂けるとるりまに反映しやすいくらいでした。

上記はつまり以下という事でいいですか?
* !str は Ruby では特別扱いする(ただのローカルタグとして扱う)
* !tag:yaml.org,2002:str foo は Ruby では特別扱いする(扱わない)

以下の「注意点」に上記が書いてありますので、間違いにお気づきの方がいらっしゃいましたら、るりまのチケットとして別途発行してやってくださいませ。:)

http://doc.ruby-lang.org/ja/1.9.3/library/yaml.html

Also available in: Atom PDF