Как работать с каталогами или файлами с помощью OptionParser - PullRequest
2 голосов
/ 15 сентября 2010

Я часто делаю это сам:

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

Было бы лучше, если бы я мог указать Dir или Pathname вместо String. Есть шаблон или мой Ruby-esque способ сделать это?

Ответы [ 2 ]

5 голосов
/ 15 сентября 2010

Вы можете настроить OptionParser для принятия (например) пути

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

Тогда вы можете изменить свой код на

opts.on('-d','--dir DIR',Pathname, 'Directory to put the output in.') do |x|
0 голосов
/ 15 сентября 2010

Если вы ищете Ruby-esque способ сделать это, я бы рекомендовал попробовать Trollop .

Начиная с версии 1.1o, вы можете использовать тип :io, который принимает имя файла, URI или строки stdin или -.

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}" }

Если вам нужен путь, то это не то, что вы ищете. Но если вы хотите прочитать файл, это мощный способ абстрагировать его.

...