0

DSLでコマンドライン引数をparseできるargs_parserをアップデートした

まずgithub pagesでサイトを作った。

args_parser for Ruby
くわしくは上を見ればわかる。


アップデート内容

コマンドライン引数をparseした後に、validationやfilterをかけれるようになった。
parser側で入力値がチェックできるので、アプリ側でめんどうくさい処理をしなくて済む。

parseスタイルが増えた。
% rackup config.ru --port 5000 --env development
のような–key valueの他に、
% gem install twitter --version=3.7.0
みたいなイコールでつなぐスタイルも選択できる。
自分でスタイルを追加する事もできるようになってる。

順に解説する。

Validator / Filter

filterとvalidatorを追加した。こう書く。

require 'args_parser'
parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u, :default => "http://shokai.org"
arg :help, 'show help', :alias => :h

filter :url do |v|
v.to_s.strip
end

validate :url, "invalid URL" do |v|
v =~ /^https?:\/\/.+$/
end
end
parse後にvalidateブロックが走って引数がチェックされる。
上の例だと引数 –url が正規表現に合わない時にエラーを起こす。


filterは、文字列を小文字にするとか、小数だったら整数に丸めるみたいな下準備に使う。
validateとfilterは何個でも書ける。


validator内のエラーはデフォルトでは
Error: invalid URL (--url hasadfttp://shokai.org)
がSTDERRに表示されて、exit 1される。


これはon_validate_error や on_filter_error を書いておけば横取りできる。exit 1されたくない時にどうぞ。

require 'args_parser'
parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u, :default => "http://shokai.org"
arg :help, 'show help', :alias => :h

filter :url do |v|
v.to_s.strip
end

on_filter_error do |err, name, value|
STDERR.puts "filter error : #{err.class} #{name}=#{value}"
end

validate :url, "invalid URL" do |v|
v =~ /^https?:\/\/.+$/
end

on_validate_error do |err, name, value|
STDERR.puts "validate error : #{err.class} #{name}=#{value}"
end
end

横取り結果
validate error : ArgsParser::ValidationError url=hasadfttp://shokai.org


Style

ArgsParser#parseを呼び出す部分、ブロックしか渡さないと:defaultのstyleが使われる。

parser = ArgsParser.parse ARGV do
しかしコレだとハイフンが頭に付く文字列を引数として渡せない(負の数とか)
そういう時は別のスタイルを選べる。

:style => :equalを渡すとスタイルが変わる。

parser = ArgsParser.parse ARGV, :style => :equal do

2種類のスタイルは
https://github.com/shokai/args_parser/tree/master/lib/args_parser/styles
に入っている。

自分でスタイルを作るときは、parse_style_スタイル名(argv)を定義したArgsParser::Parserを読み込んでからArgsParser#parseを呼べばいい。

0

args_parserを使うとRubyでコマンドラインアプリ作るのにとても便利

args_parserというgemを作りました。
2年前に作ったArgsParserをバージョンアップしていたら互換性が無くなってきたので名前を変えた。
optparseよりもすっきり書けると思う。


■インストール

gem install args_parser


■使い方
試しに、「webページのURLを指定してダウンロードする」アプリを作ってみる。
こういう風に使えるのを作る。
ruby download_webpage.rb -url http://example.com -o out.html


download_webpage.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'args_parser'

parser = ArgsParser.parse ARGV do
arg :url, 'URL', :alias => :u
arg :output, 'output file', :alias => :o, :default => 'out.html'
arg :verbose, 'verbose mode'
arg :help, 'show help', :alias => :h
end

if parser.has_option? :help or !parser.has_param?(:url, :output)
STDERR.puts parser.help
STDERR.puts "e.g. ruby #{$0} -url http://example.com -o out.html"
exit 1
end

require 'open-uri'
puts 'download..' if parser[:verbose]
data = open(parser[:url]).read
puts data if parser[:verbose]

open(parser[:output], 'w+') do |f|
f.write data
end
puts "saved! => #{parser[:output]}"


こんな感じで実行できる。