Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | CLI | Make Configration Easy | Reading External Configuration from Files

概要

書籍 Build Awesome Command-Line Applications in Ruby2

Make Configration Easy

詳細

外部設定ファイルを利用すると、ユーザーはコマンドラインの引数やオプションを与えることなく
アプリケーションの振る舞いを制御できる。

例えばあるオプションや引数を毎回指定して利用するようなケースが考えられるなら、
その内容を設定可能にしてあれば設定ファイルに1度設定すれば次回から短いコマンドでの
実行が可能になる。

Using YAML as as Configuration File Format

外部設定ファイルのフォーマットとしてYAMLファイルを使用します。
YAMLXMLに比べて記述内容が簡潔でシンプルなフォーマットです。

Reading Defaults from a YAML-Based Configration File

YAMLファイルに各ユーザーがカスタマイズしたデフォルト値を設定し、
その内容を読み込みます。
これにより、ユーザーがよく利用する設定をオプションや引数に指定する必要がなくなりました。

Generating a YAML Configuration File for Users

YAMLファイルは読みやすく、書きやすいですが正確な内容を記述するのは少し難しいです。
そのため、ユーザーに設定可能な全てのオプションを含んだYAMLファイルのひな形の生成機能を提供します。
各オプションにはデフォルト値を設定しておきます。

サンプル仕様

「OptionParserを利用した使いやすいCLIインターフェース(http://d.hatena.ne.jp/tbpg/20140526/1401109608)」で紹介したOptionParserを
使用した文字列を大文字か小文字に変換して出力するアプリケーションの仕様に設定ファイルを追加します。

この例では、コマンド実行時に設定ファイルがなければ自動でYAMLファイルを生成しています。
よくある例としては、initサブコマンドが用意されていて、実行すると設定ファイルや初期ディレクトリが一括で出力されるようなケースです。
例えば rspec --init など。

サンプルコード

require 'optparse'
require 'pp'
require 'yaml'

CONFIG = 'up_down_converter.yml'

if File.exists?(CONFIG)
  options = YAML.load(File.read(CONFIG))
else
  options = {
    upcase: false,
    downcase: false,
  }
  File.open(CONFIG, 'w:utf-8') { |f|f.print options.to_yaml }
end

opts = OptionParser.new do |opts|
  opts.on("-u", "--upcase", "大文字に変換します"){ |v| options[:upcase] = true }
  opts.on("-d", "--downcase", "小文字に変換します"){ |v| options[:downcase] = true }
  opts.program_name = "up_down_converter"
  opts.version = "0.0.1"
  opts.banner = <<-EOS
テキストを大文字か小文字に変換して出力します。

Usage: #{opts.program_name} [options] text
  EOS
end
opts.parse!(ARGV)
pp options

text = ARGV.first

exit false if text.nil? || text.empty?

if options[:upcase]
  puts text.upcase
elsif options[:downcase]
  puts text.downcase
else
  puts text
end

設定ファイル初期出力時の内容

up_down_converter.yml

---
:upcase: false
:downcase: false

出力

設定ファイル変更前

$ ruby 1.rb HoGe
{:upcase=>false, :downcase=>false}
HoGe
$ ruby 1.rb HoGe -u
{:upcase=>true, :downcase=>false}
HOGE
$ ruby 1.rb HoGe -d
{:upcase=>false, :downcase=>true}
hoge

設定ファイルで小文字変換を有効にしてみます。
up_down_converter.yml

---
:upcase: false
:downcase: true

設定ファイル変更後

$ ruby 1.rb HoGe
{:upcase=>false, :downcase=>true}
hoge
$ ruby 1.rb HoGe -u
{:upcase=>true, :downcase=>true}
HOGE
$ ruby 1.rb HoGe -d
{:upcase=>false, :downcase=>true}
hoge