Usando OptionParser para analisar comandos em Ruby

Um empresário com um notebook

Imagens TongRo/Imagens Getty





No artigo discutindo os recursos do OptionParser discutimos algumas das razões que tornam o uso de OptionParser em Rubi preferível a olhar através do ARGV manualmente para analisar comandos à mão. Agora é hora de aprender a usar OptionParser e seus recursos.

O código clichê a seguir será usado para todos os exemplos neste tutorial. Para tentar qualquer um dos exemplos, basta colocar o opt.on bloco ao lado do comentário TODO. A execução do programa imprimirá o estado das opções e do ARGV, permitindo que você examine os efeitos de suas opções.



#!/usr/bin/env ruby
requer 'optparse'
requer 'pp'
# Este hash conterá todas as opções
# analisado a partir da linha de comando por
# OptionParser.
opções = {}
optparse = OptionParser.new do|opts|
# TODO: Coloque as opções de linha de comando aqui
# Isso exibe a tela de ajuda, todos os programas são
# assumida para ter esta opção.
opts.on( '-h', '--help', 'Exibir esta tela' ) do
coloca opções
saída
fim
fim
# Analisa a linha de comando. Lembre-se que existem duas formas
# do método de análise. O método 'parse' simplesmente analisa
# ARGV, enquanto o 'analisar!' método analisa ARGV e remove
# quaisquer opções encontradas lá, bem como quaisquer parâmetros para
# as opções. O que resta é a lista de arquivos para redimensionar.
optparse.parse!
pp 'Opções:', opções
pp 'ARGV:', ARGV

Interruptor Simples

Um switch simples é um argumento sem formulários opcionais ou sem parâmetros. O efeito será simplesmente definir um sinalizador nas opções cerquilha . Nenhum outro parâmetro será passado para o sobre método.

opções[:simples] = false
opts.on( '-s', '--simple', 'Argumento simples') do
opções[:simples] = verdadeiro
fim

Switch com parâmetro obrigatório

Os comutadores que recebem um parâmetro só precisam indicar o nome do parâmetro na forma longa do comutador. Por exemplo, '-f', '--arquivo ARQUIVO' significa que a opção -f ou --file recebe um único parâmetro chamado FILE, e esse parâmetro é obrigatório. Você não pode usar -f ou --file sem também passar um parâmetro.



opções[:mand] = ''
opts.on( '-m', '--mandatory FILE', 'Argumento obrigatório' ) do|f|
opções[:mand] = f
fim

Interruptor com parâmetro opcional

Os parâmetros do switch não precisam ser obrigatórios, eles podem ser opcionais. Para declarar um parâmetro switch opcional, coloque seu nome entre colchetes na descrição do switch. Por exemplo, '--logfile [FILE]' significa que o parâmetro FILE é opcional. Se não for fornecido, o programa assumirá um padrão sensato, como um arquivo chamado log.txt.

No exemplo, o idioma a = b || c é usado. Isso é apenas um atalho para 'a = b, mas se b for falso ou nil, a = c'.

opções[:opt] = false
opts.on( '-o', '--opcional [OPT]', 'Argumento opcional' ) do|f|
opções[:opt] = f || 'nada'
fim

Converter automaticamente para flutuante

OptionParser pode converter automaticamente argumentos para alguns tipos. Um desses tipos é o Float. Para converter automaticamente seus argumentos em um switch para Float, passe Float para o sobre após as strings de descrição do switch.

As conversões automáticas são úteis. Eles não apenas economizam a etapa de converter a string para o tipo desejado, mas também verificam o formato para você e lançarão uma exceção se for formatado incorretamente.



opções[:float] = 0,0
opts.on( '-f', '--float NUM', Float, 'Convert to float' ) do|f|
opções[:float] = f
fim

Alguns outros tipos que OptionParser pode converter para incluir automaticamente Time e Integer.

Listas de Argumentos

Os argumentos podem ser interpretados como listas. Isso pode ser visto como uma conversão para uma matriz, conforme você converteu para Float. Embora sua string de opções possa definir o parâmetro a ser chamado de 'a,b,c', OptionParser permitirá cegamente qualquer número de elementos na lista. Portanto, se você precisar de um número específico de elementos, verifique você mesmo o comprimento do array.



opções[:lista] = []
opts.on( '-l', '--list a,b,c', Array, 'Lista de parâmetros' ) do|l|
opções[:lista] = l
fim

Conjunto de argumentos

Às vezes, faz sentido restringir os argumentos de um switch a algumas opções. Por exemplo, a opção a seguir terá apenas um único parâmetro obrigatório, e o parâmetro deve ser um dos sim , Não ou pode ser . Se o parâmetro for qualquer outra coisa, uma exceção será lançada.

Para fazer isso, passe uma lista de parâmetros aceitáveis ​​como símbolos após as strings de descrição do switch.



opções[:set] = :sim
opts.on( '-s', '--set OPT', [:sim, :não, :talvez], 'Parâmetros de um conjunto' ) do|s|
opções[:set] = s
fim

Formulários Negados

Os switches podem ter uma forma negada. O interruptor --negado pode ter um que faça o efeito oposto, chamado --não negado . Para descrever isso na string de descrição do switch, coloque a parte alternativa entre colchetes: --[não-]negado . Se o primeiro formulário for encontrado, true será passado para o bloco e false será bloqueado se o segundo formulário for encontrado.

opções[:neg] = false
opts.on( '-n', '--[no-]negated', 'Formulários negados' ) do|n|
opções[:neg] = n
fim