Tratando parâmetros de linha de comando em Ruby
Estou concluindo a primeira versão de uma gem em Ruby onde preciso tratar uma série de parâmetros passados na linha de comando. A aplicação é um fork de uma outra que utiliza a biblioteca GetoptLong, mas eu achei esta um pouco complicada ou trabalhosa e resolvi substitui-la pela OptionParser.
Um resumo do uso da biblioteca é o seguinte:
Primeiro carregue a biblioteca:
require 'optparse'
Em seguida deve-se instanciar um novo objeto OptionParser e configurar as propriedades gerais:
options = OptionParser.new do |opts|
# A propriedade banner é a primeira linha mostrada quando se chama
# o programa com a opção -h ou -? que, aliás, já são tratadas pela
# própria biblioteca e não devem ser sobrepostas.
opts.banner = "Usage: #{EXECUTABLE} [options]"
# EXECUTABLE é uma constante do meu programa com o nome do executável
# A propriedade <version> pode ser chamada para mostrar a linha
# conforme configurada a seguir.
opts.version = " #{EXECUTABLE} version '#{VERSION}'"
# VERSION é uma constante do meu programa que contém a versão.
# A propriedade separator permite incluir linhas em branco ou texto
# entre conjuntos de opções que serão listadas de acordo com a
# seqüência de configuração neste bloco.
opts.separator ""
opts.separator "Opções obrigatórias:"
Ainda dentro do bloco de configuração do objeto, deve-se inserir cada uma das opções e definir um bloco que executa os comandos necessário para tratar os dados (se houver) quando a opção vier na linha de comando.
# O formato geral do método <on> é nome curto da opção,
# nome longo, descrição e ainda o formato para conversão
# da String (default) recebida. Apenas o primeiro é obrigatório.
opts.on("-f", "--file FILE", "Arquivo para processar.") do |val|
# Comandos deste bloco serão processados em caso de
# recebimento do parâmetro. Neste caso, o nome do arquivo
# será armazenado na variável <val>
puts val
end
opts.on("-v", "--version", "Mostra a versão do programa.") do |val|
# Neste caso não tratamos um valor passado, visto que não é
# necessário, apenas imprimimos os dados armazenados anteriormente
# na propriedade geral <version>.
puts opts.version
end
end #options
Para processar a linha de comando deve ser chamado o método <parse>, que executará casa bloco de comando dos parâmetros recebidos pelo programa e retornará o restante dos dados recebidos.
demais_dados = options.parse(ARGV) # ARGV é a constante que recebe os parâmetros da linha de comando no Ruby.
Caso a linha de comando seja:
$meuprograma -f MEUARQUIVO OUTRO1 OUTRO2
- MEUARQUIVO será atribuído à variavel val do bloco de comando da opção.
- demais_dados será um vetor com OUTRO1 e OUTRO2 como elementos.
Existem um número maior de propriedades e métodos que podem ser estudados aqui.
Postarei futuramente sobre novas características que achar interessante desta biblioteca