Techioz Blog

クラス外で Thor オプションを解析する

概要

Thor クラスとそのインスタンスを制御できないため、Thor クラスの外でいくつかの Thor オプションを再度解析したいと考えています。残念ながら、parse 関数は argv から値を取得するためのものではありません。私がすでに探していたもの:

以下を希望します:

Class Mycli < Thor
  def someOptions
    option :aaaa, aliases: :a, type: :string,
    desc: "AAAAAAAAAAAAAA"
  option :bbbb, aliases: :b, type: :string,
    desc: "BBBBBBBBBBBBBB"
  end
...
end

# code having control on:
options = Mycli.someOptions
r = options.parse_arg($ARGV)  # ["-a" "stringA", "-b", "stringB"]
p r[:a]  # "StringA"

解決策

もしかしたら私が質問を誤解しているのかもしれませんが、なぜこれに thor が必要なのかわかりません。

代わりに、OptionParser を使用するだけで、目的の結果を達成できます。

単純な例は次のようになります

require 'optparse'
options = {}
OptionParser.new do |opts|
  opts.on('-aNAME', '--aaaa=AVALUE')
  opts.on('-b', '--bbbb=BVALUE')
end.parse!(into: options)

p options[:aaaa]

ただし、用途を拡張することもできます。

require 'optparse'
class MyCli
  attr_reader :options

  def initialize
    @options = {}
  end

  def [](elem)
    options[elem]
  end

  def parse(options)
    _parser.parse!(options)
  end

  private

  def _parser
    OptionParser.new do |opts|
      opts.on('-aNAME', '--aaaa=AVALUE') do |v|
        options[:a] = v
      end

      opts.on('-b', '--bbbb=BVALUE') do |v|
        options[:b] = v
      end
    end
  end
end

r = MyCli.new
r.parse(ARGV)
p r[:a]

次に、ruby mycli.rb -a stringA -b stringB として呼び出すと、「stringA」が STDOUT に出力されます。