Skip navigation.
Home Home

La hora de la verdad con Ruby on Rails

Experiencias e informes
Experiencias e informes

La versión 0.1 de SprintTracker contenía únicamente funcionalidades típicas de los artículos de Rails. La hora de la verdad ha llegado al proponerme implementar las funcionalidades que había sugerido para la versión 0.2 y 0.3. Las más importantes son:

  • Gráficas Burndown de los sprints
  • Reordenación jerárquica de las páginas de administración de proyectos, sprints y tareas. Esto ha permitido mejorar mucho la usabilidad de SprintTracker
  • Páginas de edición rápida para añadir todas las reestimaciones de un día concreto o para una tarea concreta. Esto es fundamental si, como estoy haciendo yo últimamente, usas una hoja excel para llevar el seguimiento del proyecto
  • Otras mejoras menores: borrado en cascada de proyectos, sprints y tareas, validación a medida de reestimaciones (no puede haber dos para la misma tarea y día), etc.

En la captura de pantalla se muestra la vista de un sprint en la que se aprecian varias de estas funcionalidades.


Tras implementar estas funconalidades he liberado SprintTracker v0.3 y creo que ya empieza a ser una aplicación lista para ser usada. Para ellas no había ningún artículo que me guiara y ello me ha obligado a aprender mucho más sobre Rails y sobre todo a manejarme con las referencias online imprescindibles para todo desarrollador de Rails:

Adicionalmente he tenido la suerte de poder hacerme con una copia del libro Agile Web Development with Rails y sin duda lo recomiendo a todo el que esté interesado en aprender Rails.

En el camino hacia SprintTracker v0.3 me he encontrado con:

  • Mis primeros problemas con Rails (en realidad con una librería) que me hicieron perder tiempo sin avance alguno
  • Una nueva release de Rails (la versión 1.1 y luego la revisión 1.1.1)
  • Los diferentes tipos de pruebas que pueden hacerse en Ruby y cómo sacar partido de ellos

En este y los siguientes posts resumiré como implementé las principales funcionalidades mencionadas así como los problemas que encontré y sus soluciones.

Gráficas en Rails y mis primeros problemas

Las gráficas burndown fue la primera funcionalidad con la que me puse, dado que resultaba también la más atractiva. Después de googlear un poco llegué a la conclusión de que las dos librerías sugeridas por iferrer en un comentario al primero de los posts de esta serie eran las más apropiadas: Gruff y SVG::Graph. En primera instancia me decanté por la primera dado que parece la más usada y además genera PNG en lugar de SVG por lo que el rango de navegadores en que funcionaría será mayor.
Esta librería requería de algunas aplicaciones nativas, pero con apt-get no me supuso mucho problema. La instalación debía realizarse con los siguientes comandos:

$ sudo apt-get install imagemagick librmagick-ruby1.8
$ gem install gruff

Sin embargo después de 3 horas probando no conseguí que gruff encontrara imagemagick o alguna de sus librerías. Probé de todo, desde instalarlas por distintos métodos hasta copiarlas a los directorios lib y vendor sin ningún éxito. Lo que me ha resultado más frustrante es la poca documentación que encontré sobre problemas de instalación de esta librería o sobre instalación librerías en general de ruby (lo reconozco, eché de menos los JAR de java). Si alguien ha usado esta librería y puede echarme una mano se lo agradecería. De momento tuve que renunciar a usarla y pasarme a la segunda de las candidatas.

La instalación de SVG::Graph fue bastante más placentera. En primer lugar tuve que instalar librexml-ruby:

$ sudo apt-get install librexml-ruby

Posteriormente me bajé las fuentes de SVG:Graph y ejecuté el script de instalación, que no hace más que copiar los ficheros Ruby al directorio adecuado dentro del load path de ruby:

$ ./install.rb

Una vez hecho esto tuve que decidir donde mostraría la gráfica y pensé que en la vista de un sprint junto con un listado de sus tareas era el mejor lugar. El código HTML para insertar la imagen SVG es:

  <object data="<%= url_for(:controller => 'burndown', :action => 'graph', 
                            :params => {:id => @sprint} ) %>"
          width="640" height="480"
          type="image/svg+xml" />

Como puede observarse en este código, decidí crear un controlador específico para gráficas, aunque de momento sólo tenga una. El código del método graph es:

  def graph
    puts "Creating graph por sprint #{params[:id]}"
    sprint = Sprint.find(params[:id])
    return if sprint.tasks.size == 0
    graphFilePath = ''
    Tempfile.open("graph.svg") do |aFile|
      title = "Plot"
      data1 = sprint.ideal_progress
      data2 = sprint.real_progress  
      
      graph = SVG::Graph::Plot.new( {
        :width => 640, height => 480, :graph_title => title,
        :show_graph_title => true, :no_css => true, :key => true,
        :scale_x_integers => true, :scale_y_integers => true,
        :min_x_value => 0, :min_y_value => 0,
        :show_data_labels => true, :show_x_guidelines => true,
        :show_x_title => true, :x_title => "Time (days)",
        :show_y_title => true, :y_title => "Effort (hours)",
        :y_title_text_direction => :bt,
      })
      graph.add_data(:data => data1,:title => "Ideal")
      graph.add_data(:data => data2,:title => "Real")
      aFile << graph.burn
      graphFilePath = aFile.path
    end
    send_file graphFilePath, :type => 'image/svg+xml', :disposition => 'inline'
  end

En este código puede apreciarse las instrucciones necesarias para construir la gráfica a partir de dos arrays de puntos de posición. Estos arrays se crean en los métodos sprint.ideal_progress y sprint.real_progress y han supuesto los priméros métodos con lógica medianamente compleja en el modelo de dominio. Para implementarlos emplee por primera vez el sistema de pruebas de Rails que es bastante bueno. Pero todo eso os lo cuento en el próximo post.

Últimas notas

Siguiendo con el experimento de contar las horas he calculado (con la ayuda de karm, claro) que he estado unas 24 horas adicionales para implementar estas funcionalidades. Esto incluye el tiempo usando las referencias online, pero no el tiempo en leer el libro Agile Web Development with Rails. En total llevo unas 25 horas de desarrollo mas unas 16 horas de aprendizaje.

Por último quería agradeceros los comentarios que haceis a todos mis posts. Es gracias a ellos que me animo a seguir escribiendo. Respecto a esto, quería proponeros que los que no teneis cuenta firmarais con vuestro nombre o un apodo para hacer más fácil identificar de quien es cada comentario y hacer así más sencillo mantener conversaciones.

Un saludo y hasta los próximos posts, en los que quiero hablar de pruebas en Rails y de como fui implementando el resto de funcionalides.

Genial

Muchas gracias por contarnos esto y liberar la explicacion.... y recuerda, la mayoria de la gente q lee esto es novata en rails asi que cuanto mas te explayes en la explicacion de todo mas te lo vamos a agradecer.