Cuidado que Find no es una clase, sino un módulo.

O sea, no es para usarlo directamente... normalmente es para incorporarlo en
una clase (para componer comportamiento). Lo mismo con FileTest.

Me parece que lo que querés hacer lo podés hacer sólo usando File y Dir...

Básicamente, vos querés agarrar todos los archivos a partir de un root dado
(recursivamente) y calcularle el MD5:

Dir.new(directorio).map do |fullpath|
>   [name, Digest::MD5.hexdigest(File.read(fullpath))]
> end
>

El problema es que (1) si bien Dir es Enumerable, enumera sólo los hijos
directo (no rescursivamente) y (2) "fullpath" no quedaría realmente el path
completo... Por lo tanto hice esto, ver qué opinan:

class TraversableDir
>   include Enumerable
>   def initialize(*args, &block)
>     @dir = Dir.new *args, &block
>   end
>   def each(&block)
>     @dir.each do |name|
>       unless ['.', '..'].include? name
>         fullpath = self.fullpath(name)
>         case
>           when File.directory?(fullpath)
>             TraversableDir.new(fullpath).each &block
>           when File.file?(fullpath)
>             block.call fullpath
>           else
>             p "Ojo ni dir ni file: #{fullpath} (hay que hacer algo?)"
>         end
>       end
>     end
>   end
>   def fullpath(name)
>     File.expand_path "[EMAIL PROTECTED]/#{name}"
>   end
> end
>

Entonces queda:

> TraversableDir.new(directorio).map do |fullpath|
>   [name, Digest::MD5.hexdigest(File.read(fullpath))]
> end
>

Lo que te daria un array de esta forma:

> [
>   [ "/path/a1", "ABDCE" ],
>   [ "/path/a2", "DEADBEEF" ]
> ]
>

Que es un idiom usado en Ruby (es similar a un Hash pero a veces se usa así,
por ejemplo cuando no necesitás acceder a un elemento, sino que lo vas a
iterar).

On 8/31/07, Damian Janowski <[EMAIL PROTECTED]> wrote:
>
> On 8/31/07, Martin Sagastume <[EMAIL PROTECTED]> wrote:
> > Excelente, eso era lo que necesitaba...muchas gracias!!
> >
> > Estuve mirando si el "API" de Rails...creo que no vi eso :P  ..una
> > cosa que me llamó la atención es que la clase Find tenga programado el
> > método find  ...como que es medio desprolijo el hecho de tener un
> > metodo que se llame igual que la clase (ya que en ruby no es el
> > constructor)  Buscar.buscar  en lugar de Buscador.buscar o algo asi
> > ...  es por algo en especial ?
>
> Nu sé :)
>
> Pero me parece que suele pasar con esas pequeñas funcionalidades que
> son casi "helper" y muchas veces quedan como métodos de clase, etc.
>
> Por ejemplo: Iconv.iconv
>
> Saludos!
> _______________________________________________
> Ruby mailing list
> [email protected]
> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a