miércoles, 9 de marzo de 2016

Ruby sin rails: parser de opciones en el script

El siguiente es un script de ejemplo de cómo se usa un parser de opciones en nuestros scripts de ruby. Un poco más abajo explicamos las cuestiones más relevantes. Usamos la gema optparse. Si tienes dudas sobre cómo instalar la gema para usarla en un script, puede serte útil el post de uso de gemas sin Rails.

require 'optparse'                                                                                             

options = {}
options[:fichero] = ""
options[:lineas] = -1

OptionParser.new { |opts|
    opts.banner = "Usage: #{File.basename($0)} -l  -f "

    opts.on( '-l', '--lineas N', 'lineas del fichero') do |arg|
        options[:lineas] = arg.to_i
    end

    opts.on( '-f', '--file FILENAME', 'fichero a tratar') do |arg|
        options[:fichero] = arg
    end

}.parse!

puts "Opciones: fichero = #{options[:fichero]}, lineas=#{options[:lineas]}"

# Resto del script
# ...
#Fin del script



Uso normal del script

$ ruby test_parse.rb -f prueba.txt
Opciones: fichero = prueba.txt, lineas=-1
Queda a juicio del programador considerar si el script debe o no seguir en base a los valores que han quedado en las variables. Este comentario me lo puedo ahorrar, pero lo destaco para distinguir entre una opción incorrecta y un valor incorrecto de una opción que si existe.

Ayuda del script (-h)

El parse hace cosas automáticamente. Suelen ser el tipo de cosas que todos deberíamos gestionar cuando creamos nuestros scripts. La principal es la ayuda. Observa la linea del script

opts.banner = "Usage: #{File.basename($0)} -l  -f "


Indicando el "usage" en la forma anterior, el resto lo hace el parser. Lo comprobamos indicando con "-h".

$ ruby test_parse.rb -h                                                      
Usage: test_parse.rb -l -f                                                                   
   -l, --lineas  N                  líneas del fichero  
   -f, --file FILENAME              fichero a leer



Errores del parser

Cuando la opción no está incluida entre las declaradas obtenemos un error que nos informa de ello. Además observa que el script no continúa y que la variable "$?" informa del error.

$ ruby test_parse.rb -i 10
test_parse.rb:23:in `
': invalid option: -i (OptionParser::InvalidOption) $ echo $? 1


No hay comentarios:

Publicar un comentario