Jan 05 Aplicacion Rack para ejecutar Specs/Features en el navegador

tags: rack rspec | comments

Rack: una Interface Ruby para Webservers

Rack provee una interface minima, modular y adaptable para desarrollar aplicaciones web en Ruby. Envuelve las peticiones HTTP y responde en la manera mas simple posible, unifica y destila la API para servidores web, frameworks web, y software entre ellos (los llamados middleware) en una simple llamada a un metodo.

Una aplicacion Rack es an objeto Ruby (no una clase) que responde a call. Este recibe exactamente un paramatro, el environment y retorna un Array de exactamente tres valores: el estado HTTP, las cabeceras HTTP, y el cuerpo de la respuesta.

Rack viene con varios Handlers Soportados, entre ellos: Mongrel, Thin y Phusion Passenger. Los Adapters soportados incluyen: Merb, Sinatra y Rails debe venir con Rack en Rails 3. Lee mas en la pagina de Rack

Con esto dicho, Rack califica como una opcion muy valida para hacer apps web super ligeras.

App minima para ejecutar Specs directamente en el browser

Encuentro util ver los Specs en el formato HTML para:

  • dar a los desarrolladores una idea general rapida de la logica que un Spec garantiza.

si esto se porta para que ejecute features de Cucumber en el browser ganas:

  • el Valor de dar a tus Clientes la posibilidad de navegar la lista de Caracteristicas del Producto.

La aplicacion es simplemente una envoltura a la CGI de scripts para recorrer el directorio spec y ejecutar los archivos spec.rb que reciden alli. La app luce asi (fijate en el metodo call):

require 'rubygems'
require 'rack/request'
require 'rack/response'

module Rack
  class RSpecHTML

    def call(env)
      req = Request.new(env)
      root = Dir.getwd
      path = req.env['PATH_INFO']
      if path =~ /.rb$/
        # hacer click en un archivo .rb lo ejecuta con spec
        spec_file = "spec/#{path}".gsub('//', '/')
        result = `spec #{spec_file} -f h`
        #TODO mostrar stderr de consola
        result = 'sorry, there was a problem!' if result.empty?
      else
        # o mostramos los contenidos 
        result = "contents of directory<br/>"
        Dir.entries("spec/#{path}").sort.each do |file|
          file_path = "#{path}/#{file}".gsub('//', '/')
          result << "<a href='#{file_path}'>#{file}</a><br/>"
        end
      end

      res = Response.new
      res.write "<title>specs on #{root}</title>"
      res.write "<ul>clicking on<li>directory: browses in</li>
                 <li>spec file: runs `spec SPEC_FILE -f h`</li></ul><br/>"
      res.write "path = #{path}<br/>"
      res.write result
      res.finish
    end

  end
end

if $0 == __FILE__
  require 'rack'
  require 'rack/showexceptions'
  Rack::Handler::WEBrick.run 
    Rack::ShowExceptions.new(Rack::Lint.new(Rack::RSpecHTML.new)),
    :Port => 9292
end

Lo que estamos haciendo simplemente es parsear la url y si termina en .rb la ejecutamos con spec si no es un directorio y entramos.

Copia el script en tu directorio RAILS_ROOT/spec y ejecutalo con:

$ ruby -Ilib spec/rack_rspec_html.rb

ahora visita http://localhost:9292 para ver tus Specs en el navegador!

El codigo esta disponible como un gist en github.

Actualizacion

He adicionado soporte para ver/ejecutar cucumber features a la app, miralo en el gist

Ahora mismo puedes:

  • ver tus directorios spec/ y features/
  • ejecutar tus specs y features radicadas alli

he movido los gists a un repo normal de github rack rspec html

blog comments powered by Disqus