2011-04-07 98 views
0

我目前正在写一个小程序,该手表目录,并添加视频文件转换队列。我已经能够实现(使用resque)。简单的红宝石插件/扩展架构

但是添加到转换队列之前,我想触发基于文件的具体行动。

如:

  • 下降根据文件名
  • 重命名文件
  • 复制(不添加到队列)的特定文件的某些文件

因此,我要运行一对夫妇在添加之前发生的帮助者。我希望他们以特定的顺序执行,并且我希望它可以很容易地添加其他帮助程序。

我想了想,然后看起来像这样的方式:

每一个助手是一个Ruby类的一套方法:

  • 运行(执行助手)
  • NEW_NAME(返回新的文件名,如果它改变)以下助手来运行并防止增加了 队列
  • 停止(防止)

所有佣工应存放在一个目录下,并将按字母顺序(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) 

所以我的问题是:

是有一种优雅的红宝石的方式?

回答

0

关闭我的头顶,我可以说,一个可行的办法是将有每个文件追加到PROC /λ对象的全局阵列。所以,一个辅助文件的一个例子是:

$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的流利程度如何,所以如果你不明白我使用的语法,请说明一下。

+0

是的,我明白了。不过,我不知道这是否是线程安全的。当多个线程同时启动转换时,写入全局变量听起来不是一个好主意。 – leifg 2011-04-26 22:38:14