Monday, July 02, 2007

Marrying Autotest with RSpec on Gnome

For those that don't know marrying Autotest with RSpec is a God send and I highly recommend it for pure Ruby as well as Rails application development.

On the Mac OS X and KDE desktop environments there are builtin Autotest extensions that visually flag erroneous or successful RSpec runs with a standard desktop notification message.

For Gnome users on Linux running Autotest with RSpec you may have seen a couple of ${HOME}/.autotest customizations out there that don't work with RSpec v1.x+.

Below is my ${HOME}/.autotest that works with RSpec 1.0.5:


require('autotest/redgreen')
require('autotest/timestamp')

module Autotest::GnomeNotify

# Time notification will be displayed before disappearing automatically
EXPIRATION_IN_SECONDS = 3
ERROR_STOCK_ICON = "gtk-dialog-error"
SUCCESS_STOCK_ICON = "gtk-dialog-info"

RE_RSPEC_SUMMARY = Regexp.new(/(\d+) examples, (\d+) failure/)

class << self
# Convenience method to send an error notification message
#
# [stock_icon] Stock icon name of icon to display
# [title] Notification message title
# [message] Core message for the notification
def notify(stock_icon, title, message)
options = "-t #{EXPIRATION_IN_SECONDS * 2500} -i #{stock_icon}"
system "notify-send #{options} '#{title}' '#{message}'"
end

def compose_message(at)
specs, failures = 0, 0
at.results.scan(RE_RSPEC_SUMMARY) do |s, f|
specs = s.to_i
failures = f.to_i
end
"#{specs} specs, #{failures} failures"
end
end

Autotest.add_hook :red do |at|
notify ERROR_STOCK_ICON, "Some specs failed.", compose_message(at)
end

Autotest.add_hook :green do |at|
notify SUCCESS_STOCK_ICON, "All specs passed. Have a beer!", compose_message(at)
end
end

I assume there this will work with RSpec 1.x, but I have only tested with RSpec 1.0.5.

Enjoy!

1 comments:

Ikai Lan said...

Hey, this ROCKS! Why should OS X users have all the fun?