2010-09-14 5 views
2

Je trouve mon moi faire souvent:Comment gérer les répertoires ou fichiers à l'aide OptionParser

optparse = OptionParser.new do |opts| 
    options[:directory] = "/tmp/" 
    opts.on('-d','--dir DIR', String, 'Directory to put the output in.') do |x| 
    raise "No such directory" unless File.directory?(x) 
    options[:directory] = x 
    end 
end 

Il serait plus agréable si je pouvais spécifier Dir ou Pathname au lieu de String. Y a-t-il un modèle ou ma façon Ruby-esque de faire cela?

Répondre

5

Vous pouvez configurer OptionParser d'accepter (par exemple) un Pathname

require 'optparse' 
require 'pathname' 

OptionParser.accept(Pathname) do |pn| 
    begin 
    Pathname.new(pn) if pn 
    # code to verify existence 
    rescue ArgumentError 
    raise OptionParser::InvalidArgument, s 
    end 
end 

Ensuite, vous pouvez changer votre code à

opts.on('-d','--dir DIR',Pathname, 'Directory to put the output in.') do |x| 
+0

Merci! Cela répond non seulement à ma question, mais donne un bon exemple de comment étendre optparse pour accepter plus de choses! –

0

Si vous cherchez une façon Ruby-esque de le faire, je recommanderais d'essayer Trollop.

Depuis la version 1.1o, vous pouvez utiliser le type :io qui accepte un nom de fichier, un URI ou les chaînes stdin ou -.

require 'trollop' 
opts = Trollop::options do 
    opt :source, "Source file (or URI) to print", 
     :type => :io, 
     :required => true 
end 
opts[:source].each { |l| puts "> #{l.chomp}" } 

Si vous avez besoin du chemin, ce n'est pas ce que vous cherchez. Mais si vous cherchez à lire le fichier, alors c'est un moyen puissant de l'abstraire.

+0

Je ne savais pas catin. Soigné! Je cherchais des réponses spécifiques à optparse, mais je regarderai cela dans le futur. :-) –

Questions connexes