Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > yamlライブラリ > YAMLモジュール

module YAML

クラスの継承リスト: YAML

Abstract

YAML (YAML Ain't Markup Language) を扱うモジュールです。

参考

* YAML Specification

* YAML4R

* Ruby with YAMLhttp://www.namikilab.tuat.ac.jp/~sasada/prog/yaml.html * Rubyist Magazinehttp://jp.rubyist.net/magazine/

モジュール関数

add_builtin_type(type_re) {|type, val| ...}

yaml.org,2002ドメインに属しているクラスをYAMLに追加し そのクラスを見つけたときの操作を指定します。

[PARAM] type_re:
加えるクラスを指定する。
[PARAM] type:
YAMLドメインとクラスの文字列
[PARAM] val:
YAMLデータ構造
require 'yaml'

str1=<<EOT
--- !ruby.yaml.org,2002/Rational 5/6
EOT
str2=<<EOT
--- !yaml.org,2002/Rational 3/4
EOT

p YAML.load(str1)
#=> #<YAML::DomainType:0x2b07528 @type_id="Rational", @domain="ruby.yaml.org,2002", @value="5/6">

p YAML.load(str2)
#=> #<YAML::DomainType:0x2b0767c @type_id="Rational", @domain="yaml.org,2002", @value="3/4">

YAML.add_builtin_type("Rational"){|type, val|
  md = val.split(/\//)
  Rational.new!(md[0].to_i, md[1].to_i)
}

p YAML.load(str1)
#=> #<YAML::DomainType:0x2b06fec @type_id="Rational", @domain="ruby.yaml.org,2002", @value="5/6">
## 前回と変化なし

rt = YAML.load(str2)
p rt + 0.25
#=> 1.0
add_domain_type(domain, type_re) {|type, val| ...}

YAMLドメインに属しているクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。

[PARAM] domain:
YAMLのドメインを文字列で指定する。
[PARAM] type_re:
加えるクラスを指定する。
[PARAM] type:
YAMLドメインとクラスの文字列
[PARAM] val:
YAMLデータ構造
require 'yaml'

class Person
  attr_accessor :name, :age
end

str=<<EOT
--- !Qjitsu.com,2007-05-04/Person
name: eiji
age: 33
EOT

YAML.each_document(str){|obj|
  p obj
}
#=> #<YAML::DomainType:0x2b07974 @type_id="Person", @domain="Qjitsu.com,2007-05-04", @value={"name"=>"eiji", "age"=>33}>
#
YAML.add_domain_type( "Qjitsu.com,2007-05-04", "Person" ) { |type, val|
  YAML.object_maker( Person, val )
}
YAML.each_document(str){|obj|
  p obj
}
#=> #<Person:0x2b0762c @age=33, @name="eiji">
add_private_type(type_re) {|type, val| ...}

プライベートタイプのクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。

[PARAM] type_re:
プライベートタイプのクラスを文字列で指定します。
[PARAM] type:
YAMLドメインとクラスの文字列
[PARAM] val:
YAMLデータ構造
require 'yaml'

class Person ; end

str1=<<EOT
--- !!Person
name: taro
country: Japan
capital: Tokyo
EOT

YAML.each_document(str1){|obj|
  p obj
}
#=> #<YAML::PrivateType:0x2b07a14 @type_id="Person", @value={"name"=>"taro", "country"=>"Japan", "capital"=>"Tokyo"}>
YAML.add_private_type("Person"){|type, val|
  YAML.object_maker(Person, val)
}
YAML.each_document(str1){|obj|
  p obj
}
#=> #<Person:0x2b07640 @country="Japan", @capital="Tokyo", @name="taro">

str2=<<EOT
--- !Qjitsu.com,2007-05-04/Person
name: eiji
age: 33
--- !!Person
name: ichiro
country: Japan
capital: Tokyo
EOT

YAML.each_document(str2){|obj|
  p obj
}
#=> #<YAML::DomainType:0x2b071a4 @type_id="Person", @domain="Qjitsu.com,2007-05-04", @value={"name"=>"eiji", "age"=>33}>
#=> #<Person:0x2b06eac @country="Japan", @capital="Tokyo", @name="ichiro">
add_ruby_type(type_re) {|type, val| ...}

rubyタイプのクラスをYAMLに追加し、 そのクラスを見つけたときの操作を指定します。

[PARAM] type_re:
rubyタイプのクラスを文字列で指定します。
[PARAM] type:
YAMLドメインとクラスの文字列
[PARAM] val:
YAMLデータ構造
require 'yaml'

class Dog
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

str1=<<EOT
--- !ruby/Dog
name: pochi
--- !!Dog
age: 0.5
--- !Qjitsu.com,2007-05-06/Dog
preference: apple
EOT


YAML.add_ruby_type("Dog") do |type, val|
  YAML.object_maker(Dog, val)
end

YAML.each_document(str1){|dog|
  p dog.class
  p dog.respond_to?(:name)
}
#=> Dog
#=> true
#=> YAML::PrivateType
#=> false
#=> YAML::DomainType
#=> false
detect_implicit(val)

文字列のタイプを検知する

[PARAM] val:
判定されるオブジェクト
require 'yaml'

p YAML.detect_implicit("")
#=> "null"
p YAML.detect_implicit("Cat")
#=> "str"
p YAML.detect_implicit(10)
#=> ""
p YAML.detect_implicit([3, "5"])
#=> ""
p YAML.detect_implicit(nil)
#=> ""
dump(obj, io = nil)

与えられた obj を YAML フォーマットに変換し、io に書き込みます。 io が与えられていない場合は、YAML フォーマットの文字列を返します。

[PARAM] obj:
YAMLフォーマットに変換されるオブジェクト
[PARAM] io:
出力先のIOオブジェクト
YAML.dump( ['badger', 'elephant', 'tiger'],
           File.open('sample.yml', 'w')    )
dump_stream(*objs)

与えられた objs を順に YAML フォーマットに変換していき、一つの文字列にまとめたものを返します。

[PARAM] objs:
YAMLフォーマットに変換されるオブジェクト
require "yaml"
puts YAML.dump_stream( "hoge\nfoo", [1,2], {"foo" => "bar"} )
--- |-
hoge
foo
---
- 1
- 2
---
foo: bar
each_document(io) {|obj| ...}
load_documents(io) {|obj| ...}

与えられた io から YAML フォーマットの文書をすべて順に読み込み Ruby のオブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。

[PARAM] io:
YAMLフォーマットの文書の読み込み先のIOオブジェクト
# sample.yml
- apple
- banana
- carrot
---
foo: bar

#!/usr/bin/env ruby
require "yaml"
File.open( 'sample.yml' ) do |io|
  YAML.load_documents(io){|y|
    p y
  }
end
#=>   ["apple", "banana", "carrot"]
#=>   {"foo"=>"bar"}
each_node(io) {|obj| ...}

与えられた io から YAML フォーマットの文書をすべて順に読み込み YAML::Syck::Mapオブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。

[PARAM] YAML:

フォーマットの文書の IO オブジェクト

food:
 - apple
 - banana
 - carrot
---
foo: bar
# end of test.yml

require 'yaml'

File.open( 'test.yml' ) do |io|
  YAML.each_node(io) do |y|
    p y.transform
  end
end
#=> {"food"=>["apple", "banana", "carrot"]}
#=> {"foo"=>"bar"}
load(io)
load(str)

YAML フォーマットの文書を読み込み Ruby のオブジェクトを生成して返します。 引数として IO オブジェクトと文字列を受け付けます。 io や 文字列が複数の YAML ドキュメントを含んでいても、最初のものしか Ruby のオブジェクトに変換しません。

[PARAM] io:
YAMLフォーマットの文書の読み込み先のIOオブジェクト
[PARAM] str:
YAMLフォーマットの文書の読み込み先の文字列
$ ruby-1.8 -ryaml -e '
p YAML.load(<<HERE)
- apple
- banana
- carrot
---
foo: bar
HERE
'
["apple", "banana", "carrot"]
load_file(file)

与えられた名前のファイルから YAML フォーマットの文書を読み込み Ruby のオブジェクトを生成して返します。 ファイルが複数の YAML ドキュメントを含んでいても、 最初のものしか Ruby のオブジェクトに変換しません。

[PARAM] file:
YAMLフォーマットのファイル
---
- Monday
-
 - 国語
 - 算数
 - 理科
 - 社会
 - 体育
---
- Friday
-
 - 体育
 - 算数
 - 理科
 - 国語
 - 社会
#end of jikanwari.yaml

require 'yaml'

puts YAML.load_file('jikanwari.yaml').join(",")

#=> Monday,国語,算数,理科,社会,体育
load_stream(io)

与えられた io から YAML フォーマットの文書を すべて順に読み込んで Ruby のオブジェクトに変換していき、 それらオブジェクトを含んだ YAML::Stream を返します。

[PARAM] io:
YAML フォーマットの文書のIOオブジェクトもしくは文字列
require 'yaml'

class Dog
  attr_accessor :name
  def initialize(name)
    @name = name
  end
end

str1=<<EOT
--- !ruby/Dog
name: pochi
--- !!Dog
age: 0.5
EOT

YAML.add_ruby_type("Dog") do |type, val|
  Dog.new(val["name"])
end

ys = YAML.load_stream(str1)
p ys
#=> #<YAML::Stream:0x2b079d8 @options={}, @documents=[#<Dog:0x2b079c4 @name="pochi">, #<YAML::PrivateType:0x2b07780 @value={"age"=>0.5}, @type_id="Dog">]>
ys.edit(1, Dog.new("tama"))
p ys.documents
#=> [#<Dog:0x2b079b0 @name="pochi">, #<Dog:0x2b0762c @name="tama">]
object_maker(obj_class, val)

与えられたobj_class クラスに、valハッシュをインスタンス変数として追加し obj_classクラスのインスタンスを生成して返します。

[PARAM] obj_class:
クラスを指定する
[PARAM] val:
ハッシュを指定する。obj_classのインスタンス変数作成に使用される
require 'yaml'

class Cat; end

YAML.load_documents(DATA){|y|
  p YAML.object_maker(Cat, y)
}

__END__
name: taro
age: 13
---
name: jiro
age: 23
---
name: saburo
age: 8
# end of sample

結果
#=> #<Cat:0xb7ccb174 @name="taro", @age=13>
#=> #<Cat:0xb7ccafa8 @name="jiro", @age=23>
#=> #<Cat:0xb7ccaad0 @name="saburo", @age=8>
parse(io)

与えられた io から YAML フォーマットの文書をパースし YAML::Syck::Nodeオブジェクトに変換します。 複数のドキュメントを読み込む場合は、YAML.#parse_documents を使用します。

[PARAM] io:
YAMLフォーマットのIOオブジェクトもしくは文字列
#!/usr/bin/env ruby

require 'yaml'

doc = YAML.parse(DATA)
doc.search("//name").each {|node|
  p node
}

__END__
cat:
 - name: taro
   age: 7
 - name: jiro
   age: 23
---
dog:
 shiba:
  - name: goro
    age: 3
  - name: rokuro
    age: 1
# end of sample
#=> "/cat/0/name"
#=> "/cat/1/name"
# dog は読み込まない
parse_documents(io) {|obj| ...}

与えられた io から YAML フォーマットの文書をパースし YAML::Syck::Nodeオブジェクトに変換し、 生成したオブジェクトを引数としてブロックを評価していきます。

[PARAM] YAML:
フォーマットの文書のIOオブジェクトもしくは文字列
require 'yaml'

YAML.parse_documents(DATA){|doc|
  doc.search('/dog//name').each {|node|
    p node
  }
  p "-->"
}

__END__
cat:
 - name: taro
   age: 7
 - name: jiro
   age: 23
---
dog:
 shiba:
  - name: goro
    age: 3
  - name: rokuro
    age: 1
# end of sample

#=> "-->"
#=> "/dog/shiba/0/name"
#=> "/dog/shiba/1/name"
#=> "-->"
parse_file(file_path)

file_pathのファイルから一つのYAMLドキュメントをパースし、 YAML::Syck::Nodeオブジェクトを返します。

[PARAM] file_path:
YAMLドキュメントが書かれたファイルへのパスを文字列で指定する
cat:
 - name: taro
   age: 7
 - name: jiro
   age: 23
---
dog:
 shiba:
  - name: goro
    age: 3
  - name: rokuro
    age: 1
# end of sample.yaml

require 'yaml'

tree = YAML.parse_file("sample.yaml")
p tree.transform

#=> {"cat"=>[{"name"=>"taro", "age"=>7}, {"name"=>"jiro", "age"=>23}]}
quick_emit(oid, opts={}) {|obj| ...}
read_type_class(type, obj_class)
tagurize(val)
transfer
try_implicit(obj)

定数

DEFAULTS

YAMLのデフォルトの設定のハッシュです。 Ruby 1.8.3 以降では変更できません。

下記のオプションがあります。

{
 :SortKeys=>false,
 :UseFold=>false,
 :AnchorFormat=>"id%03d",
 :Encoding=>:None,
 :Indent=>2,
 :ExplicitTypes=>false,
 :UseHeader=>false,
 :WidthType=>"absolute",
 :UseVersion=>false,
 :BestWidth=>80,
 :Version=>"1.0",
 :UseBlock=>false
}

Methods

Classes