2011-04-07 8 views
0

私は現在、ディレクトリを監視してビデオファイルを変換キューに追加する小さなプログラムを作成しています。私はそれを達成することができました(resqueを使用して)。シンプルなルビープラグイン/拡張アーキテクチャ

変換キューに追加する前に、ファイル名に基づいて特定のアクションをトリガーします。

例:

  • ドロップ
  • コピー
  • 名前変更ファイルのファイル名に応じて特定のファイルを(キューに追加しない)特定のファイル

は、そのため私は、カップルを実行したいです追加の前にヘルパーの私はそれらを特定の順序で実行したい、私はそれが他のヘルパーを追加することは容易でありたい。

私はそれについて考えた方法は次のようになります。

すべてのヘルパーは、メソッドのセットを持つルビークラスです:

  • 実行(ヘルパーを実行)
  • NEW_NAME(リターン新しいファイル名が変更された場合)
  • stop(実行するヘルパーの実行を防止し、 キューに追加できないように)

すべてのヘルパーは、1つのディレクトリに格納され、アルファベット順(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/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がどれほど流暢であるのかも分かっていないので、私が使用している構文を理解していなければ、そう言います。

+0

はい私は考えを得る。しかし、それはスレッドセーフなのだろうかと思います。複数のスレッドが一度に変換を開始すると、グローバル変数での書き込みは良い考えではありません。 – leifg

関連する問題