What's this site?
Running RSpec on Heroku
Originally from Apr 02, 2010Recently, 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.
Camels smell freaking terrible but I'm no hater.
While most mammals are still just sharing pictures, Ben is freaking Social Networking over here. Get with the program. Please choose a venue to contact him from the fine selection below.
