クラス外で 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 に出力されます。
例