parser argumentparser arg_parser add_argument ruby optparse optionparser

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 .