Tbpgr Blog

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

Ruby | CLI | Play Well with Others | Provide a Pretty-Printing Option

概要

書籍 Build Awesome Command-Line Applications in Ruby2

Play Well with Others

詳細

CLIアプリケーションは、他のアプリケーション向けの「機械的に読み取りやすいデータ」と
「人間が読みやすいデータ」の両面をサポートすることが重要です。

この両面をサポートする最も簡単な方法は、コマンドラインオプションの
スイッチかフラグで両方の出力を切り替えることです。

サンプル仕様

下記記事のサンプルの仕様をベースにします。年齢の表示部分のみを利用します。
Ruby | CLI | Be Easy to Use | Thorを利用した使いやすいCommand suitインターフェース
http://d.hatena.ne.jp/tbpg/20140526/1401109675

サンプルコード

require 'csv'
require 'thor'
require 'pp'

class PersonViewer < Thor
  package_name "person_viewer"
  VERSION = "0.0.1"
  PERSONALS = './personals.csv'
  class_option :help, type: :boolean, aliases: '-h', desc: 'ヘルプを表示します'
  class_option :version, type: :boolean, desc: 'バージョンを表示します'

  desc "年齢を表示します", "年齢を表示します"
  option :pretty_print, {type: :boolean, aliases: '-p', desc: "人間向けの出力フォーマットにする"}
  def age
    if options[:pretty_print]
      read_csv.each { |row|puts "#{row[:firstname]} #{row[:lastname]}#{row[:age]}歳です" }
    else
      read_csv.each { |row|puts row[:age] }
    end
  end

  desc 'バージョンを表示します', 'バージョンを表示します'
  def version
    puts VERSION
  end

  def self.banner(task, namespace = false, subcommand = true)
      super
  end

  private
    def read_csv
      CSV.table(PERSONALS)
    end
end
PersonViewer.start(ARGV)

データ取得元csv

firstname,lastname,age
kazuo,tanaka,34
ken,sato,54
ichiro,suzuki,45

出力

# p オプションなしでプログラム向けのフォーマットに
$ ruby personal.rb age
34
54
45

# p オプションで人間向けのフォーマットに
$ ruby personal.rb age -p
kazuo tanakaは34歳です
ken satoは54歳です
ichiro suzukiは45歳です