<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>5Valleys Blog</title>
    <link>http://5Valleys.com/tags/#{params[:tag_id]/posts</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Rails, Software Development, Western Montana, and other incoherent ramblings.</description>
    <item>
      <title>CramDex - Studying Flash Cards Intelligently</title>
      <description>There's this project I've been wanting to do for some time now, but haven't been able to due to a much bigger project that keeps dragging out and taking much longer to complete that I originally hoped. I finally decided to just take a break from that other project for a while and hammer this little thing out... and, it's done(ish). &lt;a href='http://www.5valleys.com/posts/59-CramDex-Studying-Flash-Cards-Intelligently'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 10 May 2008 16:54:07 -0600</pubDate>
      <link>http://www.5valleys.com/posts/59-CramDex-Studying-Flash-Cards-Intelligently</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>CramDex</category>
    </item>
    <item>
      <title>ICandy</title>
      <description>At my day job we have several Rails apps that we've built and continue to maintain and enhance. We often add features that are usable in all of our applications, so although they're often initially developed in one app or another, they quickly get turned into plugins that we can share across all of our apps. &lt;a href='http://www.5valleys.com/posts/58-ICandy'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 10 May 2008 16:19:04 -0600</pubDate>
      <link>http://www.5valleys.com/posts/58-ICandy</link>
      <author>jsgarvin</author>
      <category>ICandy</category>
      <category>Rails</category>
      <category>Testing</category>
    </item>
    <item>
      <title>GateKeeper + attachment_fu</title>
      <description>I recently added attachment_fu to a personal Rails project that was already using GateKeeper and ran into some stumbling blocks. It took me some time to dig into attachment_fu's inner workings and some experimentation to figure out the best way to get to the two plugins to play nice together, so here's some tips for anyone else who might try this themselves someday. &lt;a href='http://www.5valleys.com/posts/56-GateKeeper-attachment-fu'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 03 May 2008 00:20:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/56-GateKeeper-attachment-fu</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>GateKeeper</category>
      <category>Security</category>
    </item>
    <item>
      <title>Getting Started with GateKeeper</title>
      <description>I've noticed in my site logs people are searching the Interweb Tubes for "GateKeeper" combined with other keywords that suggest they're looking for some better examples on how to use it, so I figured maybe I'd write something up to try to help. &lt;a href='http://www.5valleys.com/posts/53-Getting-Started-with-GateKeeper'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 19 Apr 2008 07:41:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/53-Getting-Started-with-GateKeeper</link>
      <author>jsgarvin</author>
      <category>Security</category>
      <category>GateKeeper</category>
      <category>Rails</category>
    </item>
    <item>
      <title>ARID 0.5 Released</title>
      <description>I've just released ARID 0.5. This is a minor update with some small bug fixes and optimizations. &lt;a href='http://www.5valleys.com/posts/51-ARID-0-5-Released'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sun, 13 Apr 2008 19:07:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/51-ARID-0-5-Released</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>ARID</category>
      <category>Testing</category>
      <category>Ajax</category>
    </item>
    <item>
      <title>Cross Site Sniper 0.3.1</title>
      <description>I've just release version 0.3.1 of Cross Site Sniper.  This is a minor bug fix update. &lt;a href='http://www.5valleys.com/posts/50-Cross-Site-Sniper-0-3-1'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Fri, 11 Apr 2008 10:43:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/50-Cross-Site-Sniper-0-3-1</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>XSS</category>
      <category>Security</category>
    </item>
    <item>
      <title>Announcing GateKeeper 0.2</title>
      <description>GateKeeper 0.2 is now available. This version traverses eagerly loaded associations and checks read permissions on each loaded object for the current user. &lt;a href='http://www.5valleys.com/posts/42-Announcing-GateKeeper-0-2'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Tue, 18 Mar 2008 22:14:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/42-Announcing-GateKeeper-0-2</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>GateKeeper</category>
      <category>Security</category>
    </item>
    <item>
      <title>5Valleys Jumps on the OpenID Bandwagon</title>
      <description>Well, it was a little more work than I'd originally anticipated, but 5Valleys is now both my personal OpenID server and a consumer for visitors wishing to use OpenID to identify themselves when posting comments. &lt;a href='http://www.5valleys.com/posts/41-5Valleys-Jumps-on-the-OpenID-Bandwagon'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 15 Mar 2008 19:25:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/41-5Valleys-Jumps-on-the-OpenID-Bandwagon</link>
      <author>jsgarvin</author>
      <category>OpenID</category>
      <category>Missoula</category>
      <category>Rails</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>RSS Feed URLs to Change</title>
      <description>Anyone subscribed to an RSS feed for this blog should update their feed URLs. The old ones should still be working for now, but it won't be long until I remove support for them and only support the new ones. So, consider yourselves warned. &lt;a href='http://www.5valleys.com/posts/39-RSS-Feed-URLs-to-Change'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 08 Mar 2008 16:22:00 -0700</pubDate>
      <link>http://www.5valleys.com/posts/39-RSS-Feed-URLs-to-Change</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>REST</category>
      <category>RSS</category>
    </item>
    <item>
      <title>Announcing GateKeeper -- Model Level Security &amp;amp; Permissions Management</title>
      <description>I'm pleased to announce the official release of my latest Rails plugin "GateKeeper". GateKeeper started life as a library in one of my big personal Rails projects where I've been experimenting with multiple methods of setting, managing and enforcing access and security permissions for specific models. This project has lots of users with different security access levels to other user's data based on their roles and relationships to each other. I think this latest experiment was a huge success, so I immediately decided to give it away to you ('cause you're all that and more). &lt;a href='http://www.5valleys.com/posts/34-Announcing-GateKeeper-Model-Level-Security-amp-Permissions-Management'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Thu, 06 Mar 2008 09:09:00 -0700</pubDate>
      <link>http://www.5valleys.com/posts/34-Announcing-GateKeeper-Model-Level-Security-amp-Permissions-Management</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>GateKeeper</category>
      <category>Security</category>
    </item>
    <item>
      <title>Cross Site Sniper 0.3</title>
      <description>I released CrossSiteSniper version 0.3 today with one small enhancement. &lt;a href='http://www.5valleys.com/posts/36-Cross-Site-Sniper-0-3'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Wed, 05 Mar 2008 20:04:21 -0700</pubDate>
      <link>http://www.5valleys.com/posts/36-Cross-Site-Sniper-0-3</link>
      <author>jsgarvin</author>
      <category>XSS</category>
      <category>Rails</category>
      <category>Security</category>
    </item>
    <item>
      <title>Cross Site Sniper, A Rails XSS Defense Plugin</title>
      <description>Cross Site Scripting aka (XSS) is a common concern for web developers. In fact, anybody developing an interactive website, small or large, should be concerned about and guard against it.

What exactly is XSS? &lt;a href='http://www.5valleys.com/posts/33-Cross-Site-Sniper-A-Rails-XSS-Defense-Plugin'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Wed, 30 Jan 2008 23:17:00 -0700</pubDate>
      <link>http://www.5valleys.com/posts/33-Cross-Site-Sniper-A-Rails-XSS-Defense-Plugin</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>XSS</category>
      <category>Security</category>
    </item>
    <item>
      <title>ARID 0.4 Release Party</title>
      <description>ARID has a new home of it's own on RubyForge, and version 0.4 and improved documentation is now available.

ARID (ActiveResourceIntegrationDSL) is a Ruby on Rails plugin providing methods for simple and DRY integration testing of conventions-compliant RESTful Rails applications.

This version contains significant changes to how test methods are formatted and is NOT backwards compatible with tests for
prior versions. &lt;a href='http://www.5valleys.com/posts/25-ARID-0-4-Release-Party'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 13 Oct 2007 15:04:00 -0600</pubDate>
      <link>http://www.5valleys.com/posts/25-ARID-0-4-Release-Party</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>ARID</category>
      <category>Testing</category>
      <category>REST</category>
    </item>
    <item>
      <title>Special RAILS_ENV for Cron</title>
      <description>I have a site with a cron that runs a Rake task every minute to do a few maintenance tasks.
A user reported a problem and I went to look at the production log file to investigate, only to discover another problem. The cron task was quickly filling up the production log file. I have the environment.rb setting to rotate the logs, so it wasn't filling the server, but also meant that when I needed to go look at the logs, I only had about an hours worth, and the problem occurred an hour and a half ago. All log entries from the time the problem occurred had already been rotated out of existence. So, here's the solution I came up with. &lt;a href='http://www.5valleys.com/posts/22-Special-RAILS-ENV-for-Cron'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Tue, 04 Sep 2007 23:02:08 -0600</pubDate>
      <link>http://www.5valleys.com/posts/22-Special-RAILS-ENV-for-Cron</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>Cron</category>
    </item>
    <item>
      <title>FCKeditor with remote_form_for</title>
      <description>Holy cow, I just blew nearly an entire day trying to fix one stupid little problem with FCKEditor and remote_form_for.  Had a lot of trouble finding the right answer online anywhere, so now that I've got it figured out, I'm posting here so hopefully the next person won't have as much trouble as I did. &lt;a href='http://www.5valleys.com/posts/21-FCKeditor-with-remote-form-for'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sun, 19 Aug 2007 17:14:13 -0600</pubDate>
      <link>http://www.5valleys.com/posts/21-FCKeditor-with-remote-form-for</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>Ajax</category>
    </item>
    <item>
      <title>ARID 0.3 Released</title>
      <description>ARID (ActiveResourceIntegrationDsl) version 0.3 is released for your testing pleasure. Yes Cliff, that's a nested acronym. You know you love it! This one isn't a major update. I added some more documentation to the README, and fixed a bug that wouldn't allow tests to
access the index action on controllers. I'm using this plugin quite extensively on a project at the day job now. 
 &lt;a href='http://www.5valleys.com/posts/18-ARID-0-3-Released'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Wed, 27 Jun 2007 20:59:58 -0600</pubDate>
      <link>http://www.5valleys.com/posts/18-ARID-0-3-Released</link>
      <author>jsgarvin</author>
      <category>ARID</category>
      <category>Rails</category>
    </item>
    <item>
      <title>Keep your Integration Tests DRY with ARID (ActiveResourceIntegrationDsl)</title>
      <description>
I just released version 0.2 of ARID (ActiveResourceIntegrationDsl) [formerly known as RestfulCrudIntegrationTester].  I've been working with this on three different projects for the past week and so far am very happy with it.

Besides the name change, there's a couple major enhancements.
 &lt;a href='http://www.5valleys.com/posts/17-Keep-your-Integration-Tests-DRY-with-ARID-ActiveResourceIntegrationDsl-'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Fri, 22 Jun 2007 20:02:23 -0600</pubDate>
      <link>http://www.5valleys.com/posts/17-Keep-your-Integration-Tests-DRY-with-ARID-ActiveResourceIntegrationDsl-</link>
      <author>jsgarvin</author>
      <category>Ruby</category>
      <category>Rails</category>
      <category>ARID</category>
      <category>Testing</category>
    </item>
    <item>
      <title>It Just Works</title>
      <description>When working with Rails full time, it's easy to grow accustomed to the fact that when you do things right, other things "just work" without you doing anything else. &lt;a href='http://www.5valleys.com/posts/16-It-Just-Works'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Tue, 19 Jun 2007 19:45:49 -0600</pubDate>
      <link>http://www.5valleys.com/posts/16-It-Just-Works</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>REST</category>
      <category>ARID</category>
      <category>Testing</category>
    </item>
    <item>
      <title>First Plugin Released and Site Makeover</title>
      <description>Took a little time today to give the site a makeover, and fix some small bugs.  I still don't claim to have any eye for aesthetics, but I think this probably looks a lot nicer than before. Clean &amp; simple.

I also released my first public Rails plugin this morning (with the wildly clever name of RestfulCrudIntegrationTester), a whole 36 hours sooner than I thought I would yesterday.

I've just finally started delving into Integration Testing (yah, I know, I'm a little late to the party.) I was writing tests for two different projects (one at home and one at work) and noticed even though they were very different projects, I was duplicating a lot of low level integration test code. So... I extracted it out into a plugin.

Now, on both projects, and any others I use the plugin in, I can just say things like...

new_session_as('jon','Exc3l1ent_p@s5w0rd!') do |jon|
  jon.updates_article(1,{:article =&gt; {:subject =&gt; 'New Subject'}})
end

And then the Plugin will go try to login as that user (using the sessions_controller), and exercise both the edit and update actions in the articles_controller, as well as confirm that the edit form has the correct action, method, and input elements for a RESTful update.

Note, that the plugin is only for very RESTful controllers (if you didn't get that already), and it makes a few big assumptions on how your Rails app works. I tried to make sure the assumptions followed Rails conventions as much as possible.
 
Some of the initial code came from Jamis Buck's post on the subject from over a year ago, (yah, yah, late to the party) so thanks to Jamis for getting me started on the right path.

Strangly, as long as Integration Testing has been around, I didn't find any existing plugins to provide this kind of basic framework. So, I'm hoping I didn't waste time reinventing the wheel, and instead have found an unfilled need and provided a worthwhile contribution to the Rails community. Time will tell on that.

Here's the complete README file from the 0.1 version of plugin.

RestfulCrudIntegrationTester
============================
Provides a framework of common integration
tests for RESTful CRUD interactions.

How To Use
==========
class ArticleTest &lt; ActionController::IntegrationTest
  include RestfulCrudIntegrationTester
  
  def test_some_article_functionality
  	new_session_as('jonnyg','testing123') do |jon|
      params = {
      	:article =&gt; {
      		:title =&gt; 'Foo Bites Bar',
      		:content =&gt; 'Bar was bitten by Foo yesterday.' 
      	}
      }
      jon.creates_story(params)
      params = {:article =&gt; {:title =&gt; 'Bar Bitten Badly'}}
      jon.updates_story(1,params)
      jon.reads_story(1)
      jon.deletes_story(1)
    end
  end
end

Assumptions
===========
The plugin makes certain assumptions about your application.
Some of these can be bypassed or overridden if your app does
not conform.

* you have appropriate map.resources lines in your routes.rb
	for any controllers you intend to test with these methods.
* sessions_path helper method returns the path to a controller
	that controls user logins. (Provided automatically by
	Rails if you have a sessions_controller and routes.rb
	includes "map.resources :sessions".)
	@ Override by adding your own sessions_path method to
	application_helper
	
* your sessions controller accepts parameters in the form of...
	{:user =&gt; {:username =&gt; 'xxx', :password =&gt; 'yyy'}}
	@ Override by providing your own new_session_as method
		that generates an appropriate session for your app
		with the user provided.

Provided Methods
================
-Create Sessions-
-----------------
new_session:
	creates generic session (i.e. user not logged into your site).
	
	#example
	new_session do |guest|
		#guest.does_things here
	end
	
new_session_as:
	creates session as user with provided username and password.
	
	***assumes that you have a 'sessions_controller' and that it
	takes params in the form of... 
	{:user =&gt; {:username =&gt; 'xxx', :password =&gt; 'yyy'}}
	
-Do CRUD-
---------
All CRUD tasks can be passed a block to do additional assertions
sess.reads_():
	performs a GET to _path()
	asserts a :success response
	yields if you passed a block containing more assertions
	
sess.creates_():
	performs a GET to new__path
	asserts a :success response
	asserts page contains a form with a _path action
		and a 'post' method.
	asserts form contains appropriately named input elements
		for each of the  you provided.
		i.e. 'person[first_name]'
	performs a POST to _path passing 
	yields if you passed a block containing more assertions
	if you did NOT pass a block
		asserts a :redirect response
		follows redirect
		asserts a :success response
	
	
sess.updates_(,)
	performs a GET to edit__path()
	asserts a :success response
	asserts page contains a form with a _path action
		and a 'post' method.
        asserts form contains a hidden input field named '_method'
    	        and a value of 'put'.
	asserts form contains appropriately named input elements
		for each of the  you provided.
		i.e. 'person[first_name]'
	performs a PUT to _path passing 
	yields if you passed a block containing more assertions
	if you did NOT pass a block
		asserts a :redirect response
		follows redirect
		asserts a :success response
		
sess.deletes_():
	performs a DELETE to _path()
	yields if you passed a block containing more assertions
	if you did NOT pass a block
		asserts a :redirect response
		follows redirect
		asserts a :success response
 &lt;a href='http://www.5valleys.com/posts/15-First-Plugin-Released-and-Site-Makeover'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 16 Jun 2007 19:16:19 -0600</pubDate>
      <link>http://www.5valleys.com/posts/15-First-Plugin-Released-and-Site-Makeover</link>
      <author>jsgarvin</author>
      <category>Testing</category>
      <category>Rails</category>
      <category>ARID</category>
      <category>Ruby</category>
    </item>
    <item>
      <title>RESTful Ajax.InPlaceEditor with Rails</title>
      <description>A project at the day job has me implementing some in pace editing. A quick search of the web found this page with a nice helper method that does all the hard work for me.  Problem was, we're using RESTful routes and I was getting errors.  Looking through the comments on the above linked blog post it was obvious I wasn't the only one having problems. Some more research and I think I've got it solved.  Two options need to be added to the :ajax section of the options.

:ajax =&gt; {
  :ajaxOptions =&gt; "{ method: 'put' }",
  :paramName =&gt; "'my_model[my_field]'"
}

REST expects updates to be sent as a PUT, not a POST, which is what the browser wants to do by default, hence the necessity of the first option.

Next, paramName seems to be an undocumented option that I found only after digging through the Prototype source code. That changes the name of the text field in the form, so that it plays nicely with Rails apps.  Obviousl,y you'll need to change 'my_model[my_field]' to the appropriate model and field names.  Notice the nested double and single quotes... these are IMPORTANT!

With those two options added to the rest, it seems to work like a charm. &lt;a href='http://www.5valleys.com/posts/14-RESTful-Ajax-InPlaceEditor-with-Rails'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Fri, 01 Jun 2007 13:38:56 -0600</pubDate>
      <link>http://www.5valleys.com/posts/14-RESTful-Ajax-InPlaceEditor-with-Rails</link>
      <author>jsgarvin</author>
      <category>REST</category>
      <category>Ajax</category>
      <category>InPlaceEditor</category>
      <category>Rails</category>
    </item>
    <item>
      <title>New Record, and RailsConf</title>
      <description>Got the power bill today, and you'll never guess what happened.

Ok, maybe you will. I thought I was doing a pretty bad job at unplugging the router and stuff when not in use the past month, so I didn't think I'd beat my previous record of 114 KwH. But I guess I was doing better than I thought, 'cause the latest bill shows that I'm just 3 away from the magical double digits. That's 102 KwH for an entire month.  According to some of the stuff I've read lately, that's what the average inefficient homeowner uses in just two or three days. I'm not sure what to expect from the next bill. I broke down and ran the dryer a  couple times since the end of that billing period, but I was also out of town for 5 days at RailsConf, and unplugged just about every damn thing I could before I left, so... we'll have to wait and see.

Speaking of RailsConf, part of my motivation for setting up this blog was to occasionally talk about Rails, which I have yet to do, so, here goes.

Thanks to the day job for paying all the registration fees and travel expenses for RailsConf. Considering I work for a non-profit now (and my previous job at a much bigger company would have done no such thing), that's pretty fucking amazing. Since this was the first conference of this sort I've been to, I wasn't sure what to expect. I was just one among lots and lots of geeks, and that wasn't surprising. But I think I expected more of the presentations to be low level "Let's dissect some code together" kind of things, and some of them certainly were. But there were also a lot of high level theory presentations that weren't even Rails specific. So, I think that kind of disappointed me. But that just means if I go next year I'll be a more discriminating about which presentations I go to.

One of my favorite presentations though was Josh Sussers's presentation on contributing to Rails Source. I'll not bore anyone with the details, but Josh gave point by point directions to get started and made it seem very easy to take part (assuming you can code), with the hardest part being having the patience to wait for someone to review your submissions. I guess there's a backlog of hundreds of tickets and patches waiting to be reviewed. I managed to corner Josh at the final reception in the lobby and get some tips. His big suggestion was to find a submitted patch that didn't come with a test. Then, write a test case that proves the patch fixes something, and add that to the ticket.  So, that night back at the hotel I figured I'd browse around the rails bug tracking site and see what I could find.  Well, before I knew it, 7 minutes before midnight Pacific Time, I'd submitted my first patch to Rails Source. So, now the waiting game begins. 

There was one more thing that surprised me at RailsConf... a marching band... or at least that's what they called themselves. Twasn't anything like the marching band I was in in High School. &lt;a href='http://www.5valleys.com/posts/12-New-Record-and-RailsConf'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Tue, 22 May 2007 21:06:57 -0600</pubDate>
      <link>http://www.5valleys.com/posts/12-New-Record-and-RailsConf</link>
      <author>jsgarvin</author>
      <category>Energy</category>
      <category>RailsConf</category>
      <category>Ruby</category>
      <category>Rails</category>
    </item>
    <item>
      <title>Note To Self: Eclipse on Ubuntu - Java Link</title>
      <description>Note to self;  To get Eclipse to recognize the Rails plugins in Feisty,..

Install sun-java6-jre package
cd /usr/lib/jvm
sudo mv java-gcj java-gcj.old
sudo ln -s java-6-sun-1.6.0.00 java-gcj

 &lt;a href='http://www.5valleys.com/posts/11-Note-To-Self-Eclipse-on-Ubuntu-Java-Link'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sat, 12 May 2007 09:33:22 -0600</pubDate>
      <link>http://www.5valleys.com/posts/11-Note-To-Self-Eclipse-on-Ubuntu-Java-Link</link>
      <author>jsgarvin</author>
      <category>Rails</category>
      <category>Ubuntu</category>
    </item>
    <item>
      <title>OpenCongress.org</title>
      <description>Somehow I just recently managed to stumble on OpenCongress.org. It seems to have more info and better organized than VoteSmart.org (which is still a good site, don't get me wrong).

OC appears to have tons of RSS/Atom feeds available (which is how it should be), and I mean TONS!!!

For instance, there are 4178 'issue areas' defined by the 'Congressional Research Service' that get assigned to bills. Basically, they're 'tags'. Yes, that's right, the US Government is using tags. Who says politicians aren't hip? You can subscribe to the feed for any one of the tags, errr, issue areas. So, if "Gerrymandering" is a particularly important political issue to you, then it's absurdly easy to keep track of what congress is doing about it.

There are even feeds to alert you when a particular bill or congress person you're interested in gets mentioned in the news, or somebody's blog.

And there's a lot more, but the coolest thing about OpenCongress.org, is that it's powered by Rails.

 So, keep track of your representativs, and don't forget to let them know how they're doing. &lt;a href='http://www.5valleys.com/posts/7-OpenCongress-org'&gt;continue...&lt;/a&gt;</description>
      <pubDate>Sun, 22 Apr 2007 11:18:29 -0600</pubDate>
      <link>http://www.5valleys.com/posts/7-OpenCongress-org</link>
      <author>jsgarvin</author>
      <category>Politics</category>
      <category>Rails</category>
      <category>RSS</category>
    </item>
  </channel>
</rss>
