jueves, 5 de marzo de 2009

El principio de la mínima sorpresa

Me dice un amigo que tiene un problema con el plugin acts_as_feeder. Tiene un modelo en el que ha incluido ese comportamiento y a la hora de lanzar la carga sobre una de sus instancias el sistema canta por soleares.

Escarbando, escarbando llegamos a que el casque ocurre al ejecutar el método open pasándole como parámetro un StringIO. Ese parámetro es el resultado de ejecutar también open pasándole la URL de un feed.

Ponemos trazas y vemos que al primer open le llega un String, como esperábamos; pero al segundo le llega unas veces un Tempfile y otras un StringIO. El primer caso funciona pero el segundo no y, además, lo que ocurre no tiene sentido.

Pues sí lo tiene. Sólo nos queda mirar qué hace el método open de open-uri y observamos este pedazo de código:

217 StringMax = 10240
218 def <<(str)
219 @io << str
220 @size += str.length
221 if StringIO === @io && StringMax < @size
222 require 'tempfile'
223 io = Tempfile.new('open-uri')
224 io.binmode
225 Meta.init io, @io if Meta === @io
226 io << @io.string
227 @io = io
228 end
229 end


Ahí la llevas. Si se trae más de 10Kb te lo mete en un Tempfile; si no, te devuelve un StringIO.

Y claro, esto ha dejado de funcionar al meter un blog nuevo en la BD. Por eso el proceso que lee no trae casi nada y de ahí todo el problema.

¿Me sorprende? No. El principio de la mínima sorpresa vuelve a triunfar.

Salud y rocanrol.

Navega, velero mío,
sin temor, que ni enemigo navío,
ni tormenta, ni bonanza
tu rumbo a torcer alcanza,
ni a sujetar tu valor.

Veinte presas hemos hecho
a despecho del inglés,
y han rendido sus pendones
cien naciones a mis pies.

Que es mi barco mi tesoro,
que es mi dios la libertad,
mi ley, la fuerza y el viento,
mi única patria, la mar.