Ruby OptionParser
da admin il gennaio 9, 2010
Qualche volta è necessario far si che un utente possa utilizzare i parametri passati da shell per interagire con il software (soprattutto se il software non dispone di GUI).
Oggi vedremo in breve come utilizzare la classe OptionParser [1] & [2] per fare quanto descritto sopra.
Da prima introduciamo un semplice esempio di codice:
#!/usr/bin/env ruby require 'optparse' require 'pp' options={} parser = OptionParser.new { |op| op.on ('-h', '--help', 'Display this screen') do puts op exit end } parser.parse!
Come avrete forse capito dall’esempio per aggiungere l’analisi per un nuovo parametro bisogna usare il metodo on(), vediamo un pochino meglio cosa possiamo fare.
Flag Semplice
Il parametro semplice è quello in cui non sono richiesti argomenti aggiuntivi, serve tipicamente per settare un flag e può essere dichiarato come segue:
options[:flag] = false op.on('-f','--flag',"Setta flag a true") do options[:flag]=true end
Flag con parametro richiesto
Quando è richiesto un parametro bisogna specificare nel formato esteso dell’opzione il nome del parametro. Per esempio, “-f”, “–file FILE” vuol dire con -f o –file è necessario specificare un parametro chiamato FILE, questo parametro è obbligatorio.
options[:mand]="" op.on('-m','--mandatory FILE',"Parametro obbligatorio") do |f| options[:mand]=f end
Flag con parametro opzionale
I parametri non devono essere necessariamente obbligatori, potrebbero essere ad esempio opzionali. Per dichiarare un parametro opzionale basta specificarne il nome racchiuso tra parentesi quadre. Per esempio “–logfile [FILE]” intende il parametro FILE come opzionale. Se non specificato, il programma considererà il valore di default.
options[:opt] = false op.on('-o','--optional [OPT]',"Parametro opzionale") do |f| options[:opt] = f || "default" end
Convertire automaticamente a float
OptionParser può convertire automaticamente gli argomenti in alcuni tipi base. Uno di questi tipi è il Float. Per convertire automaticamente gli argomenti in Float, basta passare Float al metodo on.
La conversione automatica è utile. Non solo vi fa risparmiare tempo convertendo lei la stringa, ma controlla anche che il formato sia corretto altrimenti solleva un eccezione.
options[:float] = 0.0 opts.on( '-f', '--float NUM', Float, "Convertito a float" ) do |f| options[:float] = f end
Tra i tipi convertiti automaticamente da OptionParser vi sono anche Time e Integer.
Lista di parametri
I parametri possono essere interpretati come una lista. Si potrebbe convertire il tutto in array. Non ostante la stringa dei parametri viene chiamata “a,b,c”, OptionParser accetterà un numero qualsiasi di elementi. Quindi, se necessitate di un numero specifico di elementi, assicuratevi di controllare la lunghezza dell’array.
options[:list] = [] opts.on( '-l', '--list a,b,c', Array, "Lista di parametri" ) do|l| options[:list] = l end
Set di parametri
Qualche volta a senso restringere i parametri di un flag ad un numero limitato. Per esempio, il flag seguente accetta un solo parametro obbligatorio, e il parametro dovrà essere o yes o no o maybe. Se il parametro è un’altro qualsiasi, viene tornata un eccezione.
Per fare questo basta passare una lista dei parametri accettabili come simboli al metodo on.
options[:set] = :yes opts.on( '-s', '--set OPT', [:yes, :no, :maybe], "Parametri da un set" ) do |s| options[:set] = s end
Forma negata
I Flag possono avere una forma negata. Al Flag --negated può corrisponderne uno con l’effetto opposto, chiamato --no-negated. Per descrivere questo caso, piazzate la porzione alternativa tra parentesi quadre nella trascrizione estesa del flag: --[no-]negated. Se viene ricevuta la prima forma allora il blocco ritorna true, se si ha un match sulla seconda il blocco ritorna false.
options[:neg] = false opts.on( '-n', '--[no-]negated', "Forma negata" ) do |n| options[:neg] = n end
[1] http://ruby-doc.org/stdlib/libdoc/optparse/rdoc/classes/OptionParser.html
[2] http://ruby-doc.org/stdlib/libdoc/optparse/rdoc/index.html
Lascia un commento