Wednesday, January 23, 2008

Shout out to Rails Envy & More Autotest Love

Thanks to the Rails Envy Podcast for mentioning my note on autotest configuration. Another aspect I enjoy about using the verbose flag is that autotest tells you exactly what has triggered the re-test. Kind of a fun way to look under the hood of your testing system:
[["app/controllers/admin/users_controller.rb", Wed Jan 23 14:06:10 -0600 2008]]
/usr/local/bin/ruby -S script/spec -O spec/spec.opts spec/controllers/other_inboxes_controller_spec.rb spec/controllers/admin/users_controller_spec.rb
If you like that, you might also be interested in the autotest timestamp plugin, which stamps autotest runs like so:
# Waiting at 2008-01-23 14:06:17
All you have to do is uncomment this line in your ~/.autotest file:
require 'autotest/timestamp'

Wednesday, January 16, 2008

Autotest with verbose flag on

I followed a tip from David Chelimsky's blog and began running autotest with the -v flag for verbosity.  When you first run it, you get a bunch of lines like this:
Dunno! spec/other_inbox_spec_helpers.rb
Dunno! app/views/layouts/main/_footer.erb
Which show all the files for which autotest doesn't have a mapping.  With ZenTest 3.8.0 out, it's easy to add mappings (which tell autotest which tests to run when a matching file changes) and exceptions (which tell autotest which files to ignore).  You can also set up .autotest files for particular projects, or for your whole development machine (~/.autotest).

Here's an example of a per-project .autotest I use, sitting in the Rails root directory.  I've got a custom spec helper and I want to rerun all my tests if this file ever changes:
Autotest.add_hook :initialize do |at|
%w{ domain_regexp perfdata coverage reports }.each { |exception| at.add_exception(exception) }

at.add_mapping(/spec\/app_spec_helper.rb/) do |_, m|
at.files_matching %r%^spec/(controllers|helpers|lib|models|views)/.*\.rb$%

And here's part of my site-wide .autotest file, mostly cribbed from David's blog, where I'm ignoring other kinds of cruft that pile up in projects.  Also note the mapping for spec/defaults.rb, a file I commonly setup in my specs containing default parameters for different models.
Autotest.add_hook :initialize do |at|
%w{.hg .git .svn stories tmtags Rakefile Capfile README spec/spec.opts spec/rcov.opts vendor/gems autotest svn-commit .DS_Store }.each {|exception|at.add_exception(exception)}

at.add_mapping(/spec\/defaults.rb/) do |f, _|
at.files_matching %r%^spec/(controllers|helpers|lib|models|views)/.*\.rb$%


Tuesday, January 8, 2008

Presenter classes help with Rails complexity

A few weeks back I gave a talk at a Bmore on Rails meeting all about Presenter classes, which I learned about from Jay Fields.  I can't claim any authorship of this idea, but it's been very helpful to me, so I thought I'd share some of my examples here plus a bit of extra code I wrote to make Presenter integration with ActiveRecord a bit more fun.

Presenters allow you to extract the logic needed for complex views (especially views that require the use of more than one model) into a separate, easily testable class.  This helps you write clean code and skinny controllers, among other benefits. 

1) The key background material is here:

2) I extended Jay Fields' code by adding methods to combine error messages from different models:

3) An example Presenter, combining a User object and an Account object into a Preference presenter, is here:

4) An example controller, using the Preference presenter, is here:

Also, Jay wrote an excellent recipe for Advanced Rails Recipes that covers this technique.

Thursday, January 3, 2008

Dynamic Content Caching Recipe

hello everyone,

Pragmatic Programmers just released an updated beta version of Advanced Rails Recipes which contains another recipe that I contributed, this one about dynamic content caching. I've built a few sites that had a lot of static content, with only bit of dynamic content on each page (usually a signout button, or an admin link). In these cases, I was able to use page caching with a little bit of Javascript that looks for a cookie in the client browser and alters the page accordingly. The book is shaping up great and I'm learning a lot by reading other recipes, so definitely check it out!

Wednesday, January 2, 2008

Improv and personal transformation

In summer 2007 Towson Unitarian Universalist Church asked me to speak at one of their services about my experiences as an improv theater director, teacher, and performer.  Rather than tell them how great improv is, I decided to share what I think improv reveals about the human condition.  They were nice enough to tape the talk and give me a copy, which I present here for all eternity, in MP3 format (it's about 19 minutes long).

UPDATE: I had this speech transcribed by The transcript wants some editing and translation, but if you just feel like skimming instead of listening to the audio, it's pretty good (PDF file).