MetaInspector en GitHub

Mi gema MetaInspector ahora se encuentra alojada en GitHub en lugar de RubyForge.

MetaInspector es una gema ruby a la que le das una URL, la visita y te devuelve un hash con su título, description, keywords y enlaces. Muy sencillita y básica, y con códigos por pulir y mejorar… se trataba sólo de probar a hacer una gema.

Ahora he descubierto GitHub y me encanta el concepto de “Social Code Hosting”. Espero recibir colaboraciones al código pronto!

Más info en code.jaimeiniesta.com/metainspector

Euruko 2009, en Barcelona

My entry to the ruby logo contest
Ya es oficial!

La candidatura que hemos presentado desde el Spanish Ruby Users Group para organizar la Euruko 2009 en Barcelona ha sido aceptada.

Comienza un largo trabajo de organización para traernos la mejor conferencia de Ruby a casa… Seguiremos informando!

Creative Commons License photo credit: dandiemer

Euruko 2009 en Madrid?

Euruko 2009Euruko 2008 acaba de finalizar. Ahora toca decidir en qué ciudad se celebrará Euruko 2009. La cosa está entre Madrid y Cracovia.

Ayuda a decidir apuntandote al grupo de Euruko en Facebook.

Ruby Baby

En la cuarta entrega de esta semana especial dedicada a Ruby, vamos con un tema sesentero… Ruby Baby, de Dion and The Belmonts.

de este temazo hay una versión sudamericana que no tiene desperdicio:

Ruby Baby, de Dion and The Belmonts
Ah now said I love a girl and-a Ruby is her name

This girl don’t love me but I love ‘er just the same

(Whoa, oh, oh, oh, oh), Ruby, Ruby, I’m-a want ya
Like a ghost I’m-a gonna haunt ya
Ruby, Ruby, Ruby will you be mine?, sometime

Ah each time I see you, baby my heart cries

I tell ya I’m gonna steal you away from all those guys

Whoa, oh, oh, oh, oh, from the happy day I met ya
Now I made a bet that I was goin’ to get ya
Ruby, Ruby, Ruby will you be mine?

“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)

{”Hey-hey ” interspersed with “Oh, oh, oh, oh”}

“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)}
Well, I tell ya

Now I love this girl I said-a Ruby is her name

When this girl looks at me she just sets my soul aflame

Whoa, oh, oh, oh, oh, I got some hugs and-a kisses, too
Yeah and now I’m gonna give-a them all to you
Now, listen, now Ruby, Ruby, when will you be mine?

“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Ruby, Ruby, Ruby, baby)
“Hey-hey ” overlaid with (Oh, oh, oh, oh)

Ah listen, listen, listen, now
Ruby, Ruby, Ruby, Ruby will you be mine?

Ruby Red

Hoy es miércoles y estoy ochentero… enter Marc Almond…

Ruby Red, de Marc Almond
Well it seems you have a heart
I saw it once so I know it’s true
You let it out on Sundays when
You let it beat me black and blue
When you went and stole my heart
I saw it go so I know it’s true
It was a ruby, ruby, ruby red
It was the most precious gift
I could give to you

It was as red as the sun in the evening sky
It was as red as the fire in a panther’s eye
It was as red as the rose under the summer sun
Like a fire from a killer’s gun

Ruby, ruby red
Shine a light onto this boy’s bed
There’s a street lamp glowing in my head
Oh, Ruby, ruby, ruby red

Well it seems you have a soul
You let it go so I know it’s true
It was a ruby, ruby, ruby red
It keeps me warm when I’m feeling sad and blue
Well you went and stole my heart
I saw it go so I know it’s true
I wrapped it up in a bouquet of barbed wire
It was the wickedest gift I could give to you

It was as red as the sun in the evening sky
It was as red as the fire in a panther’s eye
It was as red as the rose under the summer sun
Like a fire from a killer’s gun

Ruby, ruby red
Shine a light onto this boy’s bed
There’s a street lamp glowing in my head
Oh, Ruby, ruby, ruby red

Oh just like Johnny Rio baby
I need to be desired
I give up looking for my past
For the ones I left behind
Ruby red, ruby red, hey, hey, hey

Ruby, ruby red
Shine a light onto this boy’s bed
There’s a street lamp glowing in my head
Oh, Ruby, ruby, ruby red

It was the most precious jewel
I could give to you
Colour me red when I’m feeling blue
The colour of a kiss
In a young girl’s dream
The mark of a guillotine
A drop of blood from a single thorn
Red wet sheets in the afternoon
A red light leading to my tomb
Ruby red all around my room

Ruby, ruby red
Oh shine a light onto this boy’s bed
Oh, ruby, ruby, ruby red

Ruby Tuesday

Si hoy es martes, en nuestra semana musical toca… Ruby Tuesday…

Ruby Tuesday, de los Rolling Stones
She would never say where she came from
Yesterday dont matter if its gone
While the sun is bright
Or in the darkest night
No one knows
She comes and goes

Goodbye, ruby tuesday
Who could hang a name on you?
When you change with every new day
Still Im gonna miss you…

Dont question why she needs to be so free
Shell tell you its the only way to be
She just cant be chained
To a life where nothings gained
And nothings lost
At such a cost

Theres no time to lose, I heard her say
Catch your dreams before they slip away
Dying all the time
Lose your dreams
And you will lose your mind.
Aint life unkind?

Goodbye, ruby tuesday
Who could hang a name on you?
When you change with every new day
Still Im gonna miss you…

Ruby Ruby Ruby Ruby!!!

Comenzamos la semana con un poco de música… Escucha esto y seguro que te animas a venir a la Euruko!

Ruby, de Kaiser Chiefs

Let it never be said, the romance is dead
Cos there’s so little else occupying my head
There is nothing I need except the function to breathe
But I’m not really fussed, doesn’t matter to me

Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa
Do ya, do ya, do ya, do ya
Ahaa-ahaa-ahaa
Know what ya doing, doing to me?
Ahaa-ahaa-ahaa
Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa

Due to lack of interest tomorrow is cancelled
Let the clocks be reset and the pendulums held
Cos there’s nothing at all except the space in between
Finding out what you’re called and repeating your name

Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa
Do ya, do ya, do ya, do ya

Ahaa-ahaa-ahaa
Know what ya doing, doing to me?
Ahaa-ahaa-ahaa
Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa, aaaa

Could it be, could it be that you’re joking with me
And you don’t really see you with me
Could it be, could it be that you’re joking with me
And you don’t really see you with me

Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa
Do ya, do ya, do ya, do ya
Ahaa-ahaa-ahaa
Know what ya doing, doing to me?
Ahaa-ahaa-ahaa
Ruby, Ruby, Ruby, Ruby
Ahaa-ahaa-ahaa
Do ya, do ya, do ya, do ya
Ahaa-ahaa-ahaa (Da da da, da da da)
Know what ya doing, doing to me?
Ahaa-ahaa-ahaa, aaaa

Pásate al desarrollo guiado por tests

Cada vez que voy a una reunión de programadores Rails suelo preguntar para ver cuántos están empleando testing automatizado en sus aplicaciones, y aunque cada vez lo va usando más gente, en la actualidad no llega a 1/3 del total el número de programadores que los ha incorporado como práctica habitual en sus desarrollos.

El desarrollo guiado por tests (TDD, Test Driven Development) es una técnica de desarrollo de software mediante la cual trabajamos en iteraciones cortas cubiertas por tests automáticos que cubren la nueva funcionalidad que queremos en nuestra aplicación. Lo interesante del tema es que primero escribimos el test y después programamos la funcionalidad, hasta que el test pase con éxito. Cuando no se nos ocurren más casos en los que los tests fallen, hemos acabado con la programación.

Un ejemplo muy sencillo: supongamos que estamos programando un comercio electrónico y queremos que el modelo Producto tenga un método precio_con_iva que nos devuelva… el precio con IVA. Lo podemos comprobar con un test unitario como el siguiente:

def test_precio_con_iva
  @producto = Producto.new(:precio_base => 100)
  assert_equal 116, @producto.precio_con_iva
end

Los tests consisten básicamente en eso… líneas tipo “assert…” que comprueban cosas. En este caso, que el precio con iva del producto recién creado cuyo precio base es 100, es igual (equal) a 116.

Creado el test, si lo pasamos fallará porque no existe ese método… lo siguiente sería definirlo en el modelo, y si lo hacemos bien (y devuelve 116 en este caso), pasará el test. Ya tendremos entonces la nueva funcionalidad programada, y un test más en nuestro saco que nos alertará en caso de que más adelante esa funcionalidad no funcione como esperamos.

Evidentemente, deberíamos escribir más casos de prueba, con distintos escenarios: productos sin precio, productos con otro tipo de IVA, etc., etc. Recordemos: cuando no se nos ocurren más casos de prueba que fallen, hemos terminado de programar.

Mediante los tests podemos comprobar muchos tipos de condiciones: comparar valores de campos, contar el total de registros de un modelo para ver si hay diferencia (antes / después) de una acción, verificar si es nil… pero incluso podemos testear los controladores para ver el tipo de respuesta (ok, redirect, etc.) e incluso el HTML generado por las vistas para verificar que existe determinada tag, etc., etc.

Otro aspecto interesante es intentar seguir la ley del mínimo esfuerzo, que es una de las cosas que nos enseña nuestra madre Naturaleza (las rocas ruedan cuesta abajo, no cuesta arriba) y una vez se rompen los tests, programar lo mínimo que necesitemos para que todo vuelva a funcionar. Primero, haz que vuelva a funcionar. Después, si quieres ya te podrás entretener en refactorizar tu código para que esté más optimizado. Si se te ocurren nuevos casos, recuerda primero escribir el test y después programar.

Entre las muchas ventajas de Ruby on Rails hay que destacar que viene muy bien preparado para crear los tests: conforme vamos creando modelos y controladores, se van creando los tests correspondientes dentro de la carpeta test… Echa un vistazo ahí dentro y verás algunas cosas:

  • Fixtures. Para tus datos de prueba. Ahí definirás unos pocos datos de prueba para realizar los tests.
  • Unit. Los tests unitarios, que prueban la funcionalidad de los modelos.
  • Functional. Los tests funcionales, para testear controladores.
  • Integration. Para los tests de integración, con lo que puedes simular una sesión de usuario que se pasea por varios controladores y cómo se relacionan unos con otros.
  • Mocks. Nos permite simular el funcionamiento de otras partes de la aplicación, normalmente para conseguir una respuesta más rápida y controlada. Por ejemplo en mi aplicación Pagerankalert.com la uso para comprobar el PageRank que me devuelve Google… en lugar de consultar directamente a Google, en algunos de mis tests establezco el PR esperado. Así puedo testear incluso si no tengo conexión a Internet pq estoy trabajando en modo offline.

Desde nuestra aplicación Rails podemos ejecutar tests puntuales, o toda la batería de tests… y mediante la utilidad autotest que proporciona la gema ZenTest, podemos tener un demonio que estará vigilando constantemente nuestra aplicación en desarrollo. Cada vez que modifiquemos un archivo, ejecutará los tests asociados a él para comprobar si nuestros cambios han hecho que deje de funcionar algún test. En ese caso nos informará del error, y una vez que lo corrijamos volverá a pasar toda la batería de tests completa y seguirá vigilando nuestros pasos.

Por último, mencionar otras herramientas de test externas a Rails pero también muy interesantes y necesarias:

  • Watir / Firewatir. Permite testear desde dentro del navegador, esto es, lanzar una instancia del navegador mediante un script, rellenar campos, pulsar botones, enviar formularios y comprobar los textos de la página. Interesante para poder probar eventos Javascript, AJAX…
  • Mechanize. Simula navegación por páginas desde consola, mediante scripts de Ruby podemos indicar que visite tal página, rellene formularios, los envíe, pulse enlaces, compruebe textos… Es interesante pq una de las limitaciones de Watir es que sólo puede abrir un navegador a la vez; mientras que con mechanize puedes lanzar el mismo script en paralelo y por ejemplo simular 50 usuarios subiendo fotos a una aplicación…

En resumen, para mí la diferencia fundamental entre seguir el desarrollo guiado por tests y no hacerlo es la paz mental que consigues, la confianza en la calidad de tu programación. Cuando ves que se han ejecutado 500, 1000… tests y todos han ido bien, sientes que lo tienes todo bajo control.

Cuando algo falla, si antes de corregirlo lo cubres con un test, ya sabes que para la siguiente ocasión eso no fallará. Y cuando tocas un código en un sitio y eso hace que falle en otro que no recordabas que estaba relacionado, das las gracias al TDD por haberte avisado de algo que no se te había ocurrido que podía fallar.

¡Animate y pásate al TDD!