Project

General

Profile

Actions

Bug #5358

closed

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

Added by sho-h (Sho Hashimoto) about 13 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.2p290
Backport:
[ruby-dev:44529]

Description

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

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

=> #<YAML::DomainType:0xf71d4780 @domain="yaml.org,2002", @type_id="tag:yaml.org,2002:str", @value="foo">

YAML.load("--- !!str foo")

=> #<YAML::PrivateType:0xf71e0a44 @type_id="str", @value="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 はグローバルタグとして扱われていない

Updated by tenderlovemaking (Aaron Patterson) about 13 years ago

  • Category set to ext
  • Assignee set to tenderlovemaking (Aaron Patterson)
  • Target version set to 1.9.3

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

例:

ruby-1.9.2-p290 :001 > RUBY_VERSION
=> "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 > RUBY_VERSION
=> "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 >

Updated by sho-h (Sho Hashimoto) about 13 years ago

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

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

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

Updated by shyouhei (Shyouhei Urabe) over 12 years ago

  • Status changed from Open to Assigned

Updated by ayumin (Ayumu AIZAWA) over 12 years ago

  • Status changed from Assigned to Closed

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

Updated by sho-h (Sho Hashimoto) over 12 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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0