[Ruby 1.9 - Bug #5358][Open] YAML 中のタグの扱いについて

Issue #5358 has been reported by Sho H…


Bug #5358: YAML 中のタグの扱いについて

Author: Sho H.
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.2p290

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 はグローバルタグとして扱われていない

Issue #5358 has been updated by Aaron P…

Category set to ext
Assignee set to Aaron P.
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 >


Bug #5358: YAML 中のタグの扱いについて

Author: Sho H.
Status: Open
Priority: Normal
Assignee: Aaron P.
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.2p290

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 はグローバルタグとして扱われていない

Issue #5358 has been updated by Sho H…

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

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

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

Bug #5358: YAML 中のタグの扱いについて

Author: Sho H.
Status: Open
Priority: Normal
Assignee: Aaron P.
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.2p290

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 はグローバルタグとして扱われていない

Issue #5358 has been updated by ayumin (Ayumu AIZAWA).

Status changed from Assigned to Closed

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


Bug #5358: YAML 中のタグの扱いについて

Author: sho-h (Sho H.)
Status: Closed
Priority: Normal
Assignee: tenderlovemaking (Aaron P.)
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.2p290

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 はグローバルタグとして扱われていない

Issue #5358 has been updated by sho-h (Sho H.).

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

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

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

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

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

library yaml (Ruby 1.9.3)


Bug #5358: YAML 中のタグの扱いについて

Author: sho-h (Sho H.)
Status: Closed
Priority: Normal
Assignee: tenderlovemaking (Aaron P.)
Category: ext
Target version: 1.9.3
ruby -v: ruby 1.9.2p290

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 はグローバルタグとして扱われていない