OptConfig は高機能なオプションパーサです。UNIX のコマンドライン引数で与えられたオプションをパースしたり、設定ファイルからパラメータを取得できます。
使用例:
o = OptConfig.new o.option "p", "port", :format=>1..65535, :default=>12345, :description=>"port number (%s)" o.option "n", "dry-run", :description=>"do not execute" argv = ["--port", "999", "other", "args"] o.parse! argv o["port"] # => 999 o["dry-run"] # => nil argv # => ["other", "args"]
オプション定義
option メソッドでオプション名の定義を行ないます。オプション名は1文字以上の英数字、または英数字で始まる2文字以上の英数字, _, - です。
複数記述することで同じオプションに複数の名前を与えることができます。
次の記述は同じオプションに対して "x", "hoge" という2つの名前をつけています。
o = OptConfig.new o.option "x", "hoge"
パース
parse メソッドは引数に与えられた配列をパースします。
"-" プレフィックスで1文字のオプション、"--" プレフィックスで2文字以上のオプションを指定したとみなします。
parse メソッドはオプションでない要素のみから構成される配列を返します。
オプションでない要素が途中にあっても最後までパースします。
o = OptConfig.new o.option "a" o.option "b" o.option "c" o.parse ["-a", "-b", "-c", "123", "abc"] # => ["123", "abc"] o.parse ["-a", "123", "-b", "abc", "-c"] # => ["123", "abc"]
parse の代わりに parse! を使用すると引数の配列を書き換えます。
arg = ["-a", "-b", "123"] o.parse! arg arg # => ["123"]
パース後は [ ] でオプションが指定されたかどうか確認できます。
o.parse ["-a", "123"] o["a"] # => true o["b"] # => nil
"--" があるとそれ以降はオプションと解釈されません。
o.parse ["-a", "123", "--", "-b"] # => ["123", "-b"] o["a"] # => true o["b"] # => nil
1文字のオプションは一つの文字列内にまとめて記述できます。
o = OptConfig.new o.option "a" o.option "b" o.option "c" o.parse ["-abc"] o["a"] # => true o["b"] # => true o["c"] # => true
オプションの引数
オプションに引数が必要な場合は、:argument=>true を指定します。パース後の [] で引数の値が取り出せます。
1文字のオプションの場合は、オプション名に続く文字列をオプションの引数とみなします。オプション名の後に文字列がない場合は、配列の次の要素を引数とみなします。
o = OptConfig.new o.option "a", :argument=>true o.option "b" o.option "c" o.parse ["-abc"] o["a"] # => "bc" o["b"] # => nil o["c"] # => nil o.parse ["-a", "-b", "-c"] o["a"] # => "-b" o["b"] # => nil o["c"] # => true
2文字以上のオプションの場合は、オプション名に続けて「=値」で引数を指定できます。「=値」の指定がない場合は、配列の次の要素を引数とみなします。
o = OptConfig.new o.option "hoge", :argument=>true o.parse ["--hoge=123"] o["hoge"] # => "123" o.parse ["--hoge", "123"] o["hoge"] # => "123"
:argument=>:optional を指定すると、引数は必須ではないが指定されればその値を採用するという動きになります。
この場合はオプション名と同じ文字列で引数を記述する必要があります。
o = OptConfig.new o.option "h", "hoge", :argument=>:optional o.parse ["-h", "123"] o["hoge"] # => true o.parse ["-h123"] o["hoge"] # => "123" o.parse ["--hoge", "123"] o["hoge"] # => true o.parse ["--hoge=123"] o["hoge"] # => "123"
引数の形式
:format を指定してオプションの引数の形式を制限することができます。
:format 指定時は :argument=>true は省略できます。
:format には StringValidator の規則が使用できます。
以下の記述は port オプションの引数が 1〜65535 の範囲の整数であることを意味します。
o = OptConfig.new o.option "hostname", :format=>/\A[a-z0-9.-]\z/i o.option "port", :format=>1..65535 o.parse ["--hostname=localhost", "--port=123"] o["hostname"] # => "localhost" o["port"] # => 123 o.parse ["--port=abc"] # raise OptConfig::InvalidArgument
Boolean
:format=>:boolean は真偽値を表わす特別な指定です。
引数に "1", "true", "enable", "yes", "y", "on" が与えられた場合は true に、"0", "false", "disable", "no", "n", "off" が与えられた場合は false になります。
o = OptConfig.new o.option "flag1", :format=>:boolean o.option "flag2", :format=>:boolean o.parse ["--flag1=yes", "--flag2=off"] o["flag1"] # => true o["flag2"] # => false
「no-」プレフィックス
引数を必要としないオプションは「no-」をつけることで値を反転できます。
o = OptConfig.new o.option "flag1" o.option "flag2" o.parse ["--no-flag1", "--flag2"] o["flag1"] # => false o["flag2"] # => true
他にも色々ありますが、続きはまた今度。