こんな時に便利
- ymlの設定ファイルでマージ(継承?)の記述がちゃんと書けているのか確認したい時、出力できると便利
- 後述するサンプルファイルであれば出力せずともイメージできるのですが、ネストが深いとかファイル自体がそもそも長いとかってなると出力できると便利です
サンプルのymlファイル
sample.yml
default: &default
host: '10.0.0.1'
port: 8080
content_type: 'application/json'
account:
name: 'default'
password: 'default'
test: &test
<<: *default
account:
name: 'admin'
password: 'admin'
# development環境設定はtest環境設定を使いまわす
development:
<<: *test
staging:
<<: *default
production:
<<: *default
コード
yml_to_json_print.rb
require 'pp'
require 'yaml'
require 'json'
require 'optparse'
argv_options = ARGV.getopts('f:', 'file:')
file_path = argv_options['f'] || argv_options['file']
yaml = YAML.load_file(file_path)
puts JSON.pretty_generate(yaml)
出力結果
$ ruby yaml_to_json_print.rb -f sample.yml
{
"default": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
},
"test": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "admin",
"password": "admin"
}
},
"development": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "admin",
"password": "admin"
}
},
"staging": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
},
"production": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
}
}
追記
-
@iyuuyaさんに教えていただいた
to_yaml
メソッドも加えてみました。JSONとお好みで。
追記2
-
@iyuuyaさんに教えていただいた
to_yaml
メソッドを使用して確認をしていたところ、マージのしかたによっては下記のような表示になりました。 - JSON形式であれば問題無いようです。
- 本文のサンプルyamlファイル、コード、出力結果の項目をJSON一本に戻しました。
- 原因はまだ調べていません。どなたか教えて!
コード
require 'pp'
require 'yaml'
require 'json'
require 'optparse'
argv_options = ARGV.getopts('f:t:', 'file:type:')
type = argv_options['t'] || argv_options['type']
file_path = argv_options['f'] || argv_options['file']
yaml = YAML.load_file(file_path)
case type
when 'yml' || 'yaml'
puts yaml.to_yaml
when 'json'
puts JSON.pretty_generate(yaml)
else
puts yaml.to_yaml
end
サンプルyamlファイル
sample.yml
default: &default
host: '10.0.0.1'
port: 8080
content_type: 'application/json'
account:
name: 'default'
password: 'default'
test: &test
<<: *default
account:
name: 'admin'
password: 'admin'
# development環境設定はtest環境設定を使いまわす
development:
<<: *test
staging:
<<: *default
production:
<<: *default
出力結果
$ ruby yaml_to_json_print.rb -f sample.yml -type yml
---
default:
host: 10.0.0.1
port: 8080
content_type: application/json
account: &2
name: default
password: default
test:
host: 10.0.0.1
port: 8080
content_type: application/json
account: &1
name: admin
password: admin
development:
host: 10.0.0.1
port: 8080
content_type: application/json
account: *1
staging:
host: 10.0.0.1
port: 8080
content_type: application/json
account: *2
production:
host: 10.0.0.1
port: 8080
content_type: application/json
account: *2
$ ruby yaml_to_json_printer.rb -f sample.yml -t json
{
"default": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
},
"test": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "admin",
"password": "admin"
}
},
"development": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "admin",
"password": "admin"
}
},
"staging": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
},
"production": {
"host": "10.0.0.1",
"port": 8080,
"content_type": "application/json",
"account": {
"name": "default",
"password": "default"
}
}
}