Debes conocer la OptionParser, analizando las opciones de la línea de comandos a la manera de Ruby

Ruby viene equipado con una herramienta potente y flexible para analizar las opciones de línea de comandos, OptionParser. Una vez que aprenda a utilizarlo, no tendrá que volver a consultar ARGV manualmente. OptionParser tiene una serie de características que lo hacen muy atractivo para los programadores de Ruby. Si alguna vez has analizado las opciones a mano en Ruby o C, o con la función getoptlong C, verás lo bienvenidos que son algunos de estos cambios.

 

  • OptionParser es DRY. Sólo tiene que escribir el modificador de la línea de comandos, sus argumentos, el código que se ejecutará cuando se encuentre y la descripción del modificador de la línea de comandos una vez en el script. OptionParser generará automáticamente pantallas de ayuda a partir de esta descripción, así como inferir todo sobre el argumento a partir de su descripción. Por ejemplo, sabrá que la opción --file[FILE] es opcional, y toma un solo argumento. Además, sabrá que --[-no]-verboso es realmente dos opciones, y aceptará ambas formas.
  • OptionParser convertirá automáticamente las opciones a una clase específica. Si la opción toma un número entero, puede convertir cualquier cadena pasada en la línea de comandos en un número entero. Esto reduce la tediosa tarea de analizar las opciones de la línea de comandos.
  • Todo está muy contenido. Todas las opciones están en el mismo lugar, y el efecto de la opción es justo al lado de la definición de la opción. Si hay que añadir opciones, cambiarlas o simplemente alguien quiere ver lo que hace, sólo hay un lugar para buscar. Una vez analizada la línea de comandos, un único Hash u OpenStruct contendrá los resultados.

Ya es suficiente, ¡muéstrame un poco de código!

Así que aquí tienes un ejemplo sencillo de cómo usar OptionParser. No utiliza ninguna de las características avanzadas, sólo las básicas. Hay tres opciones, y una de ellas tiene un parámetro. Todas las opciones son obligatorias. Existen las opciones -v/--verbose y -q/--quick, así como la opción -l/--logfile FILE. Además, el script toma una lista de archivos independientes de las opciones.

 

 #!/usr/bin/env ruby

# A script that will pretend to resize a number of images

require 'optparse'

# This hash will hold all of the options

# parsed from the command-line by

# OptionParser.

options = {}

optparse = OptionParser.new do|opts|

  # Set a banner, displayed at the top

  # of the help screen.

  opts.banner = "Usage: optparse1.rb [options] file1 file2 ..."

  # Define the options, and what they do

  options[:verbose] = false

  opts.on( '-v', '--verbose', 'Output more information' ) do

    options[:verbose] = true

  end

  options[:quick] = false

  opts.on( '-q', '--quick', 'Perform the task quickly' ) do

    options[:quick] = true

  end

  options[:logfile] = nil

  opts.on( '-l', '--logfile FILE', 'Write log to FILE' ) do|file|

    options[:logfile] = file

  end

  # This displays the help screen, all programs are

  # assumed to have this option.

  opts.on( '-h', '--help', 'Display this screen' ) do

    puts opts

    exit

  end

end

# Parse the command-line. Remember there are two forms

# of the parse method. The 'parse' method simply parses

# ARGV, while the 'parse!' method parses ARGV and removes

# any options found there, as well as any parameters for

# the options. What's left is the list of files to resize.

optparse.parse!

puts "Being verbose" if options[:verbose]

puts "Being quick" if options[:quick]

puts "Logging to file #{options[:logfile]}" if options[:logfile]

ARGV.each do|f|

  puts "Resizing image #{f}..."

  sleep 0.5

end

Examen del código

Para empezar, se requiere la librería optparse. Recuerda, esto no es una joya. Viene con Ruby, así que no hay necesidad de instalar una gema o requerir rubygems antes de optparse.

 

Hay dos objetos interesantes en este guión. El primero son las opciones, declaradas en el ámbito más alto. Es un simple hachís vacío. Cuando se definen las opciones, escriben sus valores predeterminados en este hash. Por ejemplo, el comportamiento por defecto es que este script no sea verboso, por lo que las opciones[:verboso] están configuradas como false. Cuando se encuentran opciones en la línea de comandos, cambian los valores de las opciones para reflejar su efecto. Por ejemplo, cuando se encuentra -v/--verbose, asignará true a las opciones[:verbose].

 

El segundo objeto interesante es optparse. Este es el objeto OptionParser en sí mismo. Cuando construyes este objeto, le pasas un bloque. Este bloque se ejecuta durante la construcción y construirá una lista de opciones en las estructuras de datos internas, y se preparará para analizar todo. Es en este bloque donde ocurre toda la magia. Aquí se definen todas las opciones.

Definición de opciones

Cada opción sigue el mismo patrón. Primero escriba el valor por defecto en el hash. Esto ocurrirá tan pronto como se construya el OptionParser. A continuación, se llama el método on, que define la opción en sí. Existen varias formas de este método, pero sólo una se utiliza aquí. Los otros formularios permiten definir conversiones de tipo automáticas y conjuntos de valores a los que se limita una opción. Los tres argumentos utilizados aquí son la forma corta, la forma larga y la descripción de la opción.

 

El método on deducirá un número de cosas de la forma larga. Una cosa es deducir es la presencia de cualquier parámetro. Si hay algún parámetro presente en la opción, éste lo pasará como parámetro al bloque.

 

Si la opción se encuentra en la línea de comandos, se ejecuta el bloque pasado al método on. Aquí, los bloques no hacen mucho, sólo establecen valores en el hash de opciones. Se podría hacer más, como comprobar que existe un archivo al que se hace referencia, etc. Si hay algún error, se pueden lanzar excepciones desde estos bloques.

Finalmente, se analiza la línea de comandos. Esto sucede llamando al método parse! en un objeto OptionParser. En realidad hay dos formas de este método, ¡parse y parse! Como implica la versión con el signo de exclamación, es destructiva. No sólo analiza la línea de comandos, sino que elimina todas las opciones encontradas en ARGV. Esto es importante, ya que sólo dejará la lista de archivos suministrados después de las opciones en ARGV.

(0 votes)