車輪の再発明臭がヤバイが、コマンドラインの引数のパーサを作ったのでrubygemsに登録した。はじめてgem登録した。

gemでインストールできる。

gem update --system
gem install ArgsParser


newgemコマンドでgemを作ってrubygems.orgに登録し、一応rspecでtestも書いた
gemはrubyforge.orgで公開するのが普通だったけど、2年ぐらい前からgithubでgemが作れる様になったので新しいプロジェクトはみんなgithubに行って、2009年秋?頃にgithubでgemがビルドできなくなったからかrubygems.orgでやってねという事になったらしい。


なのでリポジトリはいつも使っているmercurialにしてbitbucket.orgで公開する事にした。
shokai / argsparser-ruby / overview — bitbucket.org


既にgemにはいくつかCのgetopt風なARGVのparserがあるけど、なんとなくインタフェースが好きじゃないので自分が欲しい物を作った。

  1. –help -debug等のオプションの有無を判別する
  2. -x 320 -y 240 等のパラメータ(key value)を取得する
  3. -hと-helpのように省略名称が関連づけられていれば同じ物として扱う
  4. -helpと—helpのようなハイフンの数の違いを無視して、全て :help でアクセスできる
  5. ruby math.rb add -a 10 -b 25 の”add”のような、第一引数を取り出す
  6. パラメータ名にコメント文を付ける(-helpで起動した時の引数の説明文に使う)
という機能に絞ってある。



parseすると、第一引数(String)とパラメータ(Hash)が返ってくる。第一引数がない(いきなりパラメータが来た)場合は、第一引数はnilになる。
example.rb
#!/usr/bin/env ruby
require 'rubygems'
require 'ArgsParser'

# 必要なパラメータ名を登録する
parser = ArgsParser.parser
parser.bind(:help, :h, "show help") # name, shortname, comment for help
parser.bind(:frame, :f, "frame image (required)")
parser.bind(:message, :m, "message (required)")
parser.bind(:size, :s, "size (required)")
parser.comment(:min, "minimum size") # add comment for help
parser.comment(:max, "maximum size")
parser.comment(:debug, "debug mode")


# parseして、引数が足りてるか、help表示指定が無いかチェック
first, params = parser.parse(ARGV)

if parser.has_option(:help) or !parser.has_params([:frame, :message, :size])
  puts parser.help
  puts 'e.g.  ruby example.rb -f frame.png -m "hello world" -s 320x240 -debug'
  exit 1
end

if first
  puts 'first arg : ' + first # 第一引数
end

if parser.has_param(:size)
  puts 'size : ' + params[:size] # -sでも-sizeでも :size でアクセスできる
end

# 全ての引数を表示
p params


実行してみる
ruby example.rb hoge -f frame.png -m "hello world" -s 320x240 -debug
結果
first arg : hoge
size : 320x240
{:message=>"hello world", :size=>"320x240", :debug=>true, :frame=>"frame.png"}