web-dev-qa-db-ja.com

OptionParserの生成方法には引数が必要

以下のコードは機能しますが、必須パラメーターのネイティブOptionParser構文に必須引数を構築する場合、fetchを使用して必須引数の引数エラーを手動で発生させます。

# ocra script.rb -- --type=value
options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("--type [TYPE]",String, [:gl, :time], "Select Exception file type (gl, time)") do |t|
    options["type"] = t
  end

  opts.on("--company [TYPE]",String, [:jaxon, :doric], "Select Company (jaxon, doric)") do |t|
    options["company"] = t
  end

end.parse!

opts = {}
opts['type'] = options.fetch('type') do
  raise ArgumentError,"no 'type' option specified  as a parameter (gl or time)"
end

opts['company'] = options.fetch('company') do
  raise ArgumentError,"no 'company' option specified  as a parameter (doric or jaxon)"
end
20
lukemh

Ruby OptionParserで必要なスイッチ(引数ではない)をどのように指定しますか?

つまり、オプションを必須にする方法はないようです(結局、オプションと呼ばれます)。

現在スローしているArgumentErrorではなく、発生する可能性のあるOptionParser::MissingArgument例外があります。

13
Mario Visic

同じ状況に直面して、私はこのようなオプションになりました。すべての必須オプションが提供されていない場合は、定義したオプションに基づいてOptionParserによって生成されたユーザーフレンドリーなヘルプテキストを出力します。例外をスローしてスタックトレースをユーザーに出力するよりもすっきりします。

options = {}
option_parser = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} --data-dir DATA_DIR [options]"

  # A non-mandatory option
  opts.on('-p', '--port PORT', Integer, 'Override port number') do |v|
    options[:port] = v
  end

  # My mandatory option
  opts.on('-d', '--data-dir DATA_DIR', '[Mandatory] Specify the path to the data dir.') do |d|
    options[:data_dir] = d
  end
end

option_parser.parse!

if options[:data_dir].nil?
  puts option_parser.help
  exit 1
end
0
Per Lundberg