It’s interesting how you can sometimes notice something through someone else’s eyes that you’d previously overlooked. This week i have been mostly working with my apprentice Despo on a Rails project. Despo noticed that running specs in Rails takes a long time to initialize, which something i am well aware of but i guess i’ve sort of got used to it.
So we decided to do something about it. The first thing we did was set up Spork. If you want to know how to do that i recommend this post by Chris: How to get Spork working NOW on Rails 3, Rspec 2 and Cucumber.
As Chris mentioned at the end of that post, autotest and autotest-growl play well with Spork, so that is what we did next. The results can be quite nice!
Autotest notices which files have changed and starts running the relevant specs:
Growl can be configured to show failure messages in red:
Success messages are shown in green:
Growl can also show when specs are pending:
How did we achieve this?
Firstly you will need to install the gems
autotest-growl. Either include them in a bundle, or install them system-wide if you want to use them across all projects.
If you use RVM for different versions of ruby you might find this command useful:
for version in $(rvm list strings); do rvm use $version@global && gem install autotest && gem install autotest-growl; done
Secondly you will need a
.autotest file. You can either put it in your project’s root directory, or in your home directory
Here is mine so you can see what it looks like:
Autotest::Growl::image_dir = File.join(ENV['HOME'], '.autotest_images')
Autotest::Growl::show_modified_files = true
Autotest.add_hook :initialize do |autotest|
%w(.git .DS_Store db log tmp).each do |exception|
autotest.order = :random
Thirdly you will need to install Growl and configure it to your liking. I have mine set to Music Video because it’s so impossible to miss!
The only trouble with the Music Video style is it can only display one message at a time, so i make it fade in and last for just 1 second. Happily, with growl colouring, you don’t really need to read the message – the colour tells you immediately what happened.
The colours you need to set are:
- Very Low for passed
- Moderate for pending
- Normal for info
- Emergency for failed (or syntax error)
Here is my Growl configuration:
Finally, if you want cute pictures to come up with your growl messages, you simply need to put them in
~/.autotest_images – named passed.png, pending.png, info.png, failed.png and error.png.
Now, of course, you need to know how to run it!
With Rails 3 you need
With Rails 2 it’s
If you only want to run specs and not features, just take away the
But what about FSEvent?
The normal behaviour for autotest is to constantly poll your filesystem looking for changes. This is wasteful as it will use a lot of CPU and drain your battery, but there is an alternative. From Mac OSX 10.5 onwards an FSEvent service reports modified files.
To make use of FSEvent, you should be able to just install the
autotest-fsevent gem and
require 'autotest/fsevent' in your
Unfortunately, when i tried it, the mere presence of the autotest-fsevent gem seems to cause the specs not to run. It notices changes but doesn’t do anything about them. So if anyone can help me to understand what’s up with that, i would be grateful!
In the mean time, i’m just trying to remember to stop autotest whenever i’ve finished using it.