ruby - argumentparser - arguments parser python
Usando OptionParser de Ruby para analizar sub-comandos (4)
GLI es el camino a seguir, https://github.com/davetron5000/gli . Un extracto de un tutorial:
#!/usr/bin/env ruby
require ''gli''
require ''hacer''
include GLI::App
program_desc ''A simple todo list''
flag [:t,:tasklist], :default_value => File.join(ENV[''HOME''],''.todolist'')
pre do |global_options,command,options,args|
$todo_list = Hacer::Todolist.new(global_options[:tasklist])
end
command :add do |c|
c.action do |global_options,options,args|
$todo_list.create(args)
end
end
command :list do |c|
c.action do
$todo_list.list.each do |todo|
printf("%5d - %s/n",todo.todo_id,todo.text)
end
end
end
command :done do |c|
c.action do |global_options,options,args|
id = args.shift.to_i
$todo_list.list.each do |todo|
$todo_list.complete(todo) if todo.todo_id == id
end
end
end
exit run(ARGV)
Puede encontrar el tutorial en http://davetron5000.github.io/gli/ .
Me gustaría poder usar el OptionParser de Ruby para analizar los subcomandos del formulario
COMMAND [GLOBAL FLAGS] [SUB-COMMAND [SUB-COMMAND FLAGS]]
me gusta:
git branch -a
gem list foo
Sé que podría cambiar a una biblioteca de analizador de opciones diferente (como Trollop), pero me interesa aprender a hacer esto desde OptionParser, ya que me gustaría aprender mejor la biblioteca.
¿Algun consejo?
Lo averigué. Necesito usar OptionParser#order!
. Analizará todas las opciones desde el inicio de ARGV
hasta que encuentre una no-opción (que no es un argumento de opción), eliminando todo lo que procesa de ARGV
, y luego se cerrará.
Así que solo necesito hacer algo como:
global = OptionParser.new do |opts|
# ...
end
subcommands = {
''foo'' => OptionParser.new do |opts|
# ...
end,
# ...
''baz'' => OptionParser.new do |opts|
# ...
end
}
global.order!
subcommands[ARGV.shift].order!
Parece que la sintaxis de OptionParser ha cambiado algo. Tuve que usar lo siguiente para que la matriz de argumentos tuviera todas las opciones no analizadas por el objeto opts.
begin
opts.order!(arguments)
rescue OptionParser::InvalidOption => io
# Prepend the invalid option onto the arguments array
arguments = io.recover(arguments)
rescue => e
raise "Argument parsing failed: #{e.to_s()}"
end
También hay otras gemas que puedes ver, como main .