Alias a métodos de un Module

Estoy trabajando en una aplicación Web basada RubyOnRails que lee RSS feeds, para ello estoy usando el gem FeedTools (0.2.22 la versión más reciente hasta hoy).

Para los unit tests estoy usando RSS feeds almacenados en archivos, para optimizar la ejecución de los tests y no tener que procesarlos accediéndolos en internet.

Sin embargo me acabo de dar cuenta que FeedTools tiene un bug con urls del tipo file:// en plataformas windows (mi plataforma de desarrollo).

Como el bug en FeedTools solo me afecta durante los tests y unicamente en plataformas windows, hice el siguiente workaround mientras el bug es corregido.

Al archivo /test/test_helper.rb le agrego estas líneas:

RUBY:
  1. # Patch to feed_tools 0.2.22 normalize_url in windows platform
  2. if RUBY_PLATFORM =~ /mswin/
  3. require 'feed_tools'
  4.  
  5. class <<FeedTools
  6. alias :_normalize_url :normalize_url
  7.  
  8. def FeedTools.normalize_url(url)
  9. normalized_url = FeedTools._normalize_url(url)
  10. normalized_url.gsub!(/^file:\/\/\//, "file://")
  11. end
  12. end
  13. end

El workaround es sencillo, simplemente creo un alias para el método "problema" (para poder seguir usandolo) y luego corrijo el problema en cuestión.

El punto interesante acá es que como el método al cual le quiero crear un alias es de un Module, debo cambiar la clase donde el método está definido. Los métodos definidos a nivel de clases (Class) y módulos (Module) son básicamente métodos singleton (en Ruby "todo" es un objeto). Por tanto para poder hacer lo que quiero debo abrir el singleton del objeto Module FeedTools. Por eso es la construcción del tipo:

RUBY:
  1. class <<FeedTools
  2. ...

Si los métodos estuviesen definidos a nivel de instancia de una clase, bastaría con el enfoque clásico de los alias:

RUBY:
  1. Class FeedTools
  2. alias :_normalize_url :normalize_url
  3.  
  4. def normalize_url(url)
  5. normalized_url = FeedTools._normalize_url(url)
  6. normalized_url.gsub!(/^file:\/\/\//, "file://")
  7. end
  8.  
  9. end


2 Respuestas a “Alias a métodos de un Module”

  1. 1 Aníbal Rojas

    Lo que más me gusta es que el workaround es sencillo y te permite seguir con tu desarrollo sin que el hecho de testear no se convierta en un estorbo...

  2. 2 Bob Aman

    Thanks for the workaround. I just updated FeedTools to fix the actual problem. You should be able to get it from Subversion now.


RSS feeds

Suscríbete a nuestros RSS Feeds