Taking queues from Adam Wiggin’s first commit to his Rush project, simply a design document and some specs, and Err the Blog’s post about BDD and generating specs from YAML, I’ve written a small Rake task that will take a single file design document in YAML and separate it out into the components you specify. For example:
spec/design.yml
Website Integration:
- should be able to log in from the front page and land at your profile
OpenID module:
- should accept an OpenID URL
- should return an error message if the URL cannot be reached
User:
- should have a valid user name
- should return an error if creating a duplicate user name is attemptedAnd then:
rake design
Takes the section headers, and flattens them as the filenames. So this particular design creates three different files, website_integration_spec.rb, openid_module_spec.rb, and user_spec.rb. They’ll look like this:
spec/user_spec.rb
require File.dirname(__FILE__) + '/spec_helper' describe 'User' do it 'should have a valid user name' it 'should return an error if creating a duplicate user name is attempted' end
And just like that, you have your specs, ready to go!
Here it is:
Please note that it will destroy those files if they already exist, replacing them! I really don’t care if you lose your existing specs! Back them up if you want to try this! You have been warned! This is more of a technique for a brand new project, anyway.
Also, please note that I’ve embedded the rake task as a GitHub Gist paste, so feel free to fork it and modify it. I’d be interested in seeing cleaner, more interesting implementations of my 30-second hack. Additionally, please choose view raw if you want to copy it, seeing as how GitHub seems to bork on a newline character in the code snippet.

2 Comments
Sounds useful! How about making it a Thor task instead of a Rake task, so it’s available system wide and can be updated nicely? At the moment you have to create the rakefile in each new project where you want to use it, right?
I haven’t taken a look at Thor, but maybe I could do something like that. Honestly I was thinking something along the lines of sake, for GitHub. But we’ll see what happens.