простой плагин ruby ​​/ архитектура расширения - PullRequest
0 голосов
/ 08 апреля 2011

В настоящее время я пишу небольшую программу, которая просматривает каталог и добавляет видеофайлы в очередь преобразования. Я смог добиться этого (используя resque).

Но перед добавлением в очередь преобразования я хочу инициировать определенные действия на основе имени файла.

например:

  • удалить (не добавлять в очередь) определенные файлы в соответствии с именем файла
  • переименовывать файлы
  • копировать определенные файлы

Поэтому я хочу запустить пару помощников, прежде чем произойдет добавление. Я хочу, чтобы они выполнялись в определенном порядке, и я хочу, чтобы было легко добавить других помощников.

То, как я об этом думал, тогда выглядело бы так:

Каждый помощник - это класс ruby ​​с набором методов:

  • run (выполняет помощник)
  • new_name (возвращает новое имя файла, если оно изменилось)
  • stop (предотвращает запуск следующих помощников и предотвращает добавление в Очередь)

Все помощники должны храниться в одном каталоге и работать в алфавитном порядке (ext / 00_helper1.rb, ext / 01_helper2.rb ...).

псевдокод будет выглядеть так:

filename = <parameter>
stop = false

for each file in ext/*.rb
 obj = asClass(file).new_instance(filename)
 obj.run
 if (obj.new_name) filename = obj.new_name
 if (obj.stop) 
  stop = true 
  break
 end
end

if not stop add_to_queue(filename)

Итак, мой вопрос:

Есть ли элегантный рубиновый способ?

1 Ответ

0 голосов
/ 08 апреля 2011

Сверху головы я могу сказать, что возможный способ - иметь глобальный массив объектов Proc / lambda, к которому добавляется каждый файл. Таким образом, пример вспомогательного файла будет:

$helpers << Proc.new do |filename|
  case filename
    when /.foo$/ then :stop
    when /.bar$/ then filename.sub(/.bar$/, '.baz') # and presumably rename the actual file as well ...
  end
end

И тогда ваш основной файл будет выглядеть примерно так:

$helpers = []

filename = <parameter>
stop = false

Dir.new(<helperdir>).entries.each do |name|
  require name
  result = $helpers.last.call(name)
  if result == :stop
    stop = true
    break
  end
  # using respond_to? :to_s would probably be better, but in this example :stop would match this criteria as well as strings
  filename = result if result.is_a? String
end

Я не проверял ничего из этого, но, надеюсь, вы можете получить общее представление. Я также понятия не имею, насколько хорошо вы владеете Ruby, поэтому, если вы не понимаете синтаксис, который я использую, просто скажите.

...