Acts_as_ferret i testowanie

Poniżej mały hack dla osób korzystających z acts_as_ferret testujących w dodatku zachowanie Ferret’a.

Problem: Domyślne ustawienia pluginu acts_as_ferret tworzą indeks w katalogu index/development lub index/test po uruchomienu. Plugin acts_as_ferret domyślnie ustawia indeks na dysku i nie oferuje możliwości konfiguracji (Ferret oferuje indeks na dysku lub w pamięci). Indeks na dysku po pierwsze jest wolniejszy od indeksu w pamięci a po drugie sprawia, że ZenTest - autotest wykrywa zmianę na dysku podczas testowania i co chwilę uruchamia cały zestaw testów.
To wszystko sprawia, że testowanie acts_as_ferret nie należy do przyjemnych.

Wykorzystując otwarte klasy Rubiego napisałem mały hack który podmienia niektóre ustawienia acts_as_ferret w efekcie tworząć indeks w pamięci - co rozwiązuje powyższy problem. Ostrzegam, że to jest hack a nie poprawne rozwiązanie problemu (ta funkcjonalność powinna być zaimplementowana w kodzie pluginu a nie na zewnątrz w poniższy sposób. Nie miałem za bardzo czasu na wysyłanie łatek do acts_as_ferret, zresztą od niedawna przerzuciłem się na Sphinx’a

ferret_setup.rb:

[code=ruby]# A hack to force Ferret to use in memory index and not write anything on the disk

module ActsAsFerret

def self.ensure_directory(dir)
# Do nothing
end

class LocalIndex

def initialize(aaf_configuration)
  aaf_configuration[:ferret].delete(:path)
  super
end

def ensure_index_exists
  # Do nothing
end

end

module ActMethods

protected
def find_last_index_version(dir)
  dir
end

end

end[/code]
Powyższy kod najlepiej załadować w pliku test_helper (lub spec_helper), np.:

require File.expand_path(File.dirname(__FILE__)) + '/ferret_setup'