LoginSignup
10
5

More than 5 years have passed since last update.

yamlを千切り「sengiri_yaml」

Posted at

sengiri_yamlとは?

巨大なyamlファイルを1要素単位に分割したり、逆に分割されたyamlファイルを連結して1つの HashArray として扱うための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

image

読み込んでいる箇所 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 にするだけで動きます。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5