sengiri_yamlとは?
巨大なyamlファイルを1要素単位に分割したり、逆に分割されたyamlファイルを連結して1つの Hash
や Array
として扱うためのgemです。
キャベツの千切りみたいにyamlを細切りにすることをイメージしたgemです。1
使い方
yamlの分割
元ファイル
/path/to/fat.yml
- data1: data1
value: 1
- data2: data2
value: 2
sengiri_yaml
コマンドで分割
$ sengiri_yaml "/path/to/fat.yml" "/path/to/fat_dir"
- 1つ目の引数が元ファイル
- 2つ目の引数が出力先のディレクトリ
分割後は下記のようなymlが作られます
/path/to/data1.yml
---
- data1: data1
value: 1
/path/to/data2.yml
---
- data2: data2
value: 2
例では Array
の分割ですが、Hash
にも対応しています
分割されたyamlを読み込み
SengiriYaml.load_dir
でディレクトリにある分割されたyamlファイルをまとめて読み込みます。
merged_data = SengiriYaml.load_dir("/path/to/fat_dir")
# => [{"data1" => "data1", "value" => 1}, {"data2" => "data2", "value" => 2}]
rubicureでの使用例
元々はrubucureの900行近くあったyamlファイルをいい感じに分割していい感じに読み込むために作りました。
現在のyamlファイル 2
読み込んでいる箇所 3
lib/rubicure/girl.rb
# @return [Hash] content of config/girls/*.yml
def config
unless @config
@config = SengiriYaml.load_dir("#{File.dirname(__FILE__)}/../../config/girls").deep_symbolize_keys
end
@config
end
当時のリファクタリングの様子 4
- config_file = "#{File.dirname(__FILE__)}/../../config/girls.yml"
- @@config = YAML.load_file(config_file).deep_symbolize_keys
+ @@config = SengiriYaml.load_dir("#{File.dirname(__FILE__)}/../../config/girls").deep_symbolize_keys
yaml分割後に YAML.load_file
してるところを SengiriYaml.load_dir
にするだけで動きます。