What's this site?


Running RSpec on Heroku

Recently, while working on my rdf-do gem, a simple SQL backend for RDF.rb, I wanted to make sure it worked on Heroku. Easier said than done--Heroku demands a webapp, and RSpec hates that. But I fought it and fixed it.

First, in the root of your gem repository, add a Gemfile and a config.ru (examples are at the end). Then commit them, heroku create, and push. You'll need to push from master initially; heroku won't let you push to master from another branch until it already exists:

$ git commit -m "heroku stuff" Gemfile config.ru
$ heroku create mygemname
$ git push heroku master

Now, we don't want this Heroku stuff cluttering up our repository in general. So make a heroku branch and clean up your master. You'll never need to push the Heroku branch to github or anything.

$ git branch heroku
$ git reset --hard HEAD^1

You can update your heroku branch, and your app, whenever it is you want to test, by merging master and pushing your heroku branch to Heroku's master branch:

$ git checkout heroku
$ git merge master
$ git push heroku heroku:master

Poof! Now you're running your config.ru application. In my case, I wanted to run RSpec and get the html output. The config.ru I am using for my RDF::DataObjects gem is:

# sample heroku rackup

$:.unshift(Dir.glob("./.bundle/gems/bundler/gems/rdf-spec*gemspec*/lib").first)

require 'spec'

app = proc do |env|

    io = StringIO.new

    basename = File.basename(env['REQUEST_PATH'])
    if basename.empty?
      files = Dir.glob(File.dirname(__FILE__) + '/spec/*.spec')
    else
      files = ['spec/' + basename + ".spec"] unless basename =~ /spec$/
    end

    options = ['--format','html',files].flatten
    puts "I couldn't find #{options.last}" unless File.exists?(options.last)

    parser = ::Spec::Runner::OptionParser.new(io, io)
    parser.order!(options)
    opts = parser.options
    ::Spec::Runner.use opts
    opts.run_examples

  [ 200, {'Content-Type' => 'text/html'}, io.string ]
end


run app

There's nothing special about the gemfile:

# Gemfile
source 'http://rubygems.org'
gem 'rdf-spec'
gem 'pg'
gem 'sqlite3'
gem 'data_objects'
gem 'do_sqlite3'
gem 'do_postgres'
gem 'rdf'
gem 'rspec'

This will run any test at appname.heroku.com/spec-file-name. For example, my rdf-do gem has a spec/sqlite3.spec file. You can see the output at http://rdfdo.heroku.com/sqlite3, or below, where a screenshot is perhaps embedded; I'm not a specialist here.

RSpec results
Uploaded with plasq's Skitch!