optparseを使ってみた

ARGVとOptionsParserの仕様を以下のコードで確認してみました。ARGVはOptionParser#parse!するとオプション分はシフトするみたいですね。


$ ruby --version
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]

#!/usr/bin/env ruby
require "test/unit"
class OptionParserTests < Test::Unit::TestCase
  
  def test_argc
     assert_equal "0\n", `./argc.rb `
     assert_equal "1\n", `./argc.rb -l`
     assert_equal "2\n", `./argc.rb -l -c`
  end 
  def test_options
     assert_equal "{:local=>true}\n", `./optparse.rb -l`
     assert_equal "{:local=>true}\n", `./optparse.rb --local`
     assert_equal "{:local=>true, :code=>true}\n", `./optparse.rb -lc`
     assert_equal "{:local=>true, :code=>true}\n", `./optparse.rb -l -c`
     assert_equal "{:local=>true, :code=>true}\n", `./optparse.rb --local --code`
  end
  
  def test_argc
     assert_equal "0\n", `./optparse.rb -la`
     assert_equal "0\n", `./optparse.rb -lca`
     assert_equal "0\n", `./optparse.rb -l -c -a`
     assert_equal "1\n", `./optparse.rb --local --code -a ARG0` 
     assert_equal "3\n", `./optparse.rb --local --code -a ARG0 ARG1 ARG2` 
  end

  def test_options_with_value
     assert_equal "{:local=>true, :value=>3}\n", `./optparse.rb -lv 3`
     assert_equal "{:local=>true, :pair=>[12, 0]}\n", `./optparse.rb -lp 12 34`
     assert_equal "{:local=>true, :novalue=>true}\n", `./optparse.rb -ln 12 `
  end
 
end
#!/usr/bin/env ruby
#argc.rb
puts ARGV.size
#!/usr/bin/env ruby
#optparse.rb
require "optparse"

def process_args
  options = {}
  OptionParser.new do |opts|
    opts.banner = "validate-url options:"
    opts.on '-h', '--help', 'Display this help' do
      puts opts
      exit
    end
    opts.on '-l', '--local', 'from local file' do
      options[:local] = true
    end
    opts.on '-c', '--code', 'print out response code' do
      options[:code] = true
    end
    opts.on '-a', '--argc', 'print out ARGV.size' do
      options[:argc] = true
    end
    opts.on '-v', '--value VALUE', 'option with value' do |v|
      options[:value] = v.to_i
    end
    opts.on '-p', '--position X Y', 'option with 2 values' do |x, y|
      options[:pair] = [x.to_i, y.to_i]
    end
    opts.on '-n', '--novalue', 'option with 2 values' do |x|
      options[:novalue] = x
    end
 
    opts.parse!
  end
  options
end

def main
  options = process_args
  puts (options[:argc])? ARGV.size : options
end

main