2010-07-26 4 views
1

Je construis un pipeline spécialisé, et fondamentalement, chaque étape du pipeline implique de prendre un fichier en entrée et de créer un fichier différent en sortie. Tous les fichiers ne se trouvent pas dans le même répertoire, tous les fichiers de sortie ont un format différent et, comme j'utilise plusieurs programmes différents, des actions différentes doivent être prises pour apaiser les différents programmes.Bonne façon de gérer de nombreux fichiers différents?

Cela a conduit à une gestion de fichiers compliquée dans mon code, et plus j'essaie d'organiser les répertoires de fichiers, plus il devient moche. À peu près toutes les classes implique une sorte de code comme le suivant:

@fileName = File.basename(file) 
@dataPath = "#{$path}/../data/" 

MzmlToOther.new("mgf", "#{@dataPath}/spectra/#{@fileName}.mzML", 1, false).convert 

system("wine readw.exe --mzXML #{@file}.raw #{$path}../data/spectra/#{File.basename(@file + ".raw", ".raw")}.mzXML 2>/dev/null") 

fileName = "#{$path}../data/" + parts[0] + parts[1][6..parts[1].length-1].chomp(".pep.xml") 

Y at-il une sorte de modèle de conception, ou bijou rubis, ou quelque chose à nettoyer ça? J'aime écrire du code propre, alors ça commence vraiment à me déranger.

+0

S'il n'y a pas de gemme rubis, vous pouvez toujours en créer un. – Adrian

+1

Vous pouvez également demander cela dans [BioStar] (http://biostar.stackexchange.com/), qui est un site Q and A bioinformatique spécifique. –

Répondre

1

Vous pouvez utiliser un fichier Makefile.

Make est essentiel un DSL conçu pour gérer la conversion d'un type de fichier à un autre type via l'exécution d'un programme externe. En bonus, il ne traitera que les étapes nécessaires à la mise à jour incrémentielle de votre sortie si un ensemble de fichiers source change.

Si vous voulez vraiment utiliser Ruby, essayez un fichier rake. Rake va le faire, et c'est toujours Ruby.

+0

Comme je l'ai mentionné, il s'agit d'un pipeline * spécialisé *. Il y a beaucoup plus de choses que ce qu'un Makefile seul pourrait faire. –

+1

@Jesse J Depuis un Makefile peut exécuter des scripts externes arbitraires, je doute vraiment que vous ayez quelque chose qu'il ne peut pas faire. Depuis, tu sais, c'est Turing-complet. Mais ma réponse mentionne aussi Rake - qui vous permet d'avoir du code Ruby arbitraire intercalé dans vos cibles. – Borealid

1

Vous pouvez rendre cela aussi sophistiqué que vous le souhaitez, mais ce script de base fera correspondre un suffixe de fichier à une méthode que vous pourrez ensuite appeler avec le chemin du fichier.

# a conversion method can be used for each file type if you want to 
# make the code more readable or if you need to rearrange filenames. 
def htm_convert file 
    "HTML #{file}" 
end 

# file suffix as key, lambda as value, the last uses an external method 
routines = { 
    :log => lambda {|file| puts "LOG #{file}"}, 
    :rb => lambda {|file| puts "RUBY #{file}"}, 
    :haml => lambda {|file| puts "HAML #{file}"}, 
    :htm => lambda {|file| puts htm_convert(file) } 
} 

# this loops recursively through the directory and sub folders 
Dir['**/*.*'].each do |f| 
    suffix = f.split(".")[-1] 
    if routine = routines[suffix.to_sym] 
    routine.call(f) 
    else 
    puts "UNPROCESSED -- #{f}" 
    end 
end 
Questions connexes