<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/shoulda/gem/proc_extensions.rb</filename>
    </added>
    <added>
      <filename>lib/shoulda/gem/shoulda.rb</filename>
    </added>
    <added>
      <filename>test/other/context_test.rb</filename>
    </added>
    <added>
      <filename>test/other/helpers_test.rb</filename>
    </added>
    <added>
      <filename>test/other/private_helpers_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -10,7 +10,7 @@ Assertions:: Many common rails testing idioms have been distilled into a set of
 
 = Usage
 
-=== Context Helpers (Shoulda::Context)
+=== Context Helpers (ThoughtBot::Shoulda::Context)
 
 Stop killing your fingers with all of those underscores...  Name your tests with plain sentences!
 
@@ -43,7 +43,7 @@ Produces the following test methods:
 
 So readable!
 
-=== ActiveRecord Tests (Shoulda::ActiveRecord)
+=== ActiveRecord Tests (ThoughtBot::Shoulda::ActiveRecord)
 
 Quick macro tests for your ActiveRecord associations and validations:
 
@@ -73,7 +73,7 @@ Quick macro tests for your ActiveRecord associations and validations:
 
 Makes TDD so much easier.
 
-=== Controller Tests (Shoulda::Controller::ClassMethods)
+=== Controller Tests (ThoughtBot::Shoulda::Controller::ClassMethods)
 
 Macros to test the most common controller patterns...
 
@@ -105,7 +105,7 @@ Test entire controllers in a few lines...
 
 should_be_restful generates 40 tests on the fly, for both html and xml requests.
 
-=== Helpful Assertions (Shoulda::General)
+=== Helpful Assertions (ThoughtBot::Shoulda::General)
 
 More to come here, but have fun with what's there.
 </diff>
      <filename>README.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ require 'rake/rdoctask'
 
 Rake::TestTask.new do |t|
   t.libs &lt;&lt; 'lib'
-  t.pattern = 'test/**/*_test.rb'
+  t.pattern = 'test/{unit,functional,other}/**/*_test.rb'
   t.verbose = false
 end
 </diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,144 +1,43 @@
-require 'shoulda/context'
+require 'shoulda/gem/shoulda'
 require 'shoulda/private_helpers'
 require 'shoulda/general'
+require 'shoulda/active_record_helpers'
+require 'shoulda/controller_tests/controller_tests.rb'
 require 'yaml'
 
-require 'shoulda/active_record_helpers'                if defined?(ActiveRecord)
-require 'shoulda/controller_tests/controller_tests.rb' if defined?(ActionController)
-
-config_files = []
-config_files &lt;&lt; &quot;shoulda.conf&quot;
-config_files &lt;&lt; File.join(&quot;test&quot;, &quot;shoulda.conf&quot;)
-config_files &lt;&lt; File.join(RAILS_ROOT, &quot;test&quot;, &quot;shoulda.conf&quot;) if defined?(RAILS_ROOT) 
-config_files &lt;&lt; File.join(ENV[&quot;HOME&quot;], &quot;.shoulda.conf&quot;)       if ENV[&quot;HOME&quot;]
-
 shoulda_options = {}
-config_files.each do |file|
-  shoulda_options.merge!(YAML.load_file(file).symbolize_keys) if File.exists? file
-end
 
-require 'shoulda/color' if shoulda_options[:color]
+possible_config_paths = []
+possible_config_paths &lt;&lt; File.join(ENV[&quot;HOME&quot;], &quot;.shoulda.conf&quot;)       if ENV[&quot;HOME&quot;]
+possible_config_paths &lt;&lt; &quot;shoulda.conf&quot;
+possible_config_paths &lt;&lt; File.join(&quot;test&quot;, &quot;shoulda.conf&quot;)
+possible_config_paths &lt;&lt; File.join(RAILS_ROOT, &quot;test&quot;, &quot;shoulda.conf&quot;) if defined?(RAILS_ROOT) 
 
-module Shoulda
-  class &lt;&lt; self
-    attr_accessor :current_context
+possible_config_paths.each do |config_file|
+  if File.exists? config_file
+    shoulda_options = YAML.load_file(config_file).symbolize_keys
+    break
   end
+end
 
-  # Should statements are just syntactic sugar over normal Test::Unit test methods.  A should block 
-  # contains all the normal code and assertions you're used to seeing, with the added benefit that 
-  # they can be wrapped inside context blocks (see below).
-  #
-  # == Example:
-  #
-  #  class UserTest &lt;&lt; Test::Unit::TestCase
-  #    
-  #    def setup
-  #      @user = User.new(&quot;John&quot;, &quot;Doe&quot;)
-  #    end
-  #
-  #    should &quot;return its full name&quot;
-  #      assert_equal 'John Doe', @user.full_name
-  #    end
-  #  
-  #  end
-  #   
-  # ...will produce the following test:
-  # * &lt;tt&gt;&quot;test: User should return its full name. &quot;&lt;/tt&gt;
-  #
-  # Note: The part before &lt;tt&gt;should&lt;/tt&gt; in the test name is gleamed from the name of the Test::Unit class.
-
-  def should(name, &amp;blk)
-    should_eventually(name) &amp;&amp; return unless block_given?
-    
-    if Shoulda.current_context
-      Shoulda.current_context.should(name, &amp;blk)
-    else
-      context_name = self.name.gsub(/Test/, &quot;&quot;)
-      context = Shoulda::Context.new(context_name, self) do
-        should(name, &amp;blk)
-      end
-      context.build
-    end
-  end
+require 'shoulda/color' if shoulda_options[:color]
 
-  # Just like should, but never runs, and instead prints a differed message in the Test::Unit output.
-  def should_eventually(name, &amp;blk)
-    context_name = self.name.gsub(/Test/, &quot;&quot;)
-    context = Shoulda::Context.new(context_name, self) do
-      should_eventually(name, &amp;blk)
-    end
-    context.build
-  end
+module Test # :nodoc: all
+  module Unit 
+    class TestCase
 
-  # A context block groups should statements under a common set of setup/teardown methods.  
-  # Context blocks can be arbitrarily nested, and can do wonders for improving the maintainability
-  # and readability of your test code.
-  #
-  # A context block can contain setup, should, should_eventually, and teardown blocks.
-  #
-  #  class UserTest &lt;&lt; Test::Unit::TestCase
-  #    context &quot;A User instance&quot; do
-  #      setup do
-  #        @user = User.find(:first)
-  #      end
-  #    
-  #      should &quot;return its full name&quot;
-  #        assert_equal 'John Doe', @user.full_name
-  #      end
-  #    end
-  #  end
-  #
-  # This code will produce the method &lt;tt&gt;&quot;test: A User instance should return its full name. &quot;&lt;/tt&gt;.
-  #
-  # Contexts may be nested.  Nested contexts run their setup blocks from out to in before each 
-  # should statement.  They then run their teardown blocks from in to out after each should statement.
-  #
-  #  class UserTest &lt;&lt; Test::Unit::TestCase
-  #    context &quot;A User instance&quot; do
-  #      setup do
-  #        @user = User.find(:first)
-  #      end
-  #    
-  #      should &quot;return its full name&quot;
-  #        assert_equal 'John Doe', @user.full_name
-  #      end
-  #    
-  #      context &quot;with a profile&quot; do
-  #        setup do
-  #          @user.profile = Profile.find(:first)
-  #        end
-  #      
-  #        should &quot;return true when sent :has_profile?&quot;
-  #          assert @user.has_profile?
-  #        end
-  #      end
-  #    end
-  #  end
-  #
-  # This code will produce the following methods 
-  # * &lt;tt&gt;&quot;test: A User instance should return its full name. &quot;&lt;/tt&gt;
-  # * &lt;tt&gt;&quot;test: A User instance with a profile should return true when sent :has_profile?. &quot;&lt;/tt&gt;
-  #
-  # &lt;b&gt;Just like should statements, a context block can exist next to normal &lt;tt&gt;def test_the_old_way; end&lt;/tt&gt; 
-  # tests&lt;/b&gt;.  This means you do not have to fully commit to the context/should syntax in a test file.
+      include ThoughtBot::Shoulda::General
+      include ThoughtBot::Shoulda::Controller
 
-  def context(name, &amp;blk)
-    if Shoulda.current_context
-      Shoulda.current_context.context(name, &amp;blk)
-    else
-      context = Shoulda::Context.new(name, self, &amp;blk)
-      context.build
+      extend ThoughtBot::Shoulda::ActiveRecord
     end
   end
 end
 
-module Test # :nodoc: all
-  module Unit 
-    class TestCase
-      include Shoulda::General
-      include Shoulda::Controller
-      extend  Shoulda::ActiveRecord
+module ActionController #:nodoc: all
+  module Integration
+    class Session 
+      include ThoughtBot::Shoulda::General
     end
   end
 end
-</diff>
      <filename>lib/shoulda.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,602 +1,604 @@
-module Shoulda
-  # = Macro test helpers for your active record models
-  #
-  # These helpers will test most of the validations and associations for your ActiveRecord models.
-  #
-  #   class UserTest &lt; Test::Unit::TestCase
-  #     should_require_attributes :name, :phone_number
-  #     should_not_allow_values_for :phone_number, &quot;abcd&quot;, &quot;1234&quot;
-  #     should_allow_values_for :phone_number, &quot;(123) 456-7890&quot;
-  #     
-  #     should_protect_attributes :password
-  #     
-  #     should_have_one :profile
-  #     should_have_many :dogs
-  #     should_have_many :messes, :through =&gt; :dogs
-  #     should_belong_to :lover
-  #   end
-  #
-  # For all of these helpers, the last parameter may be a hash of options.
-  #
-  module ActiveRecord
-    # Ensures that the model cannot be saved if one of the attributes listed is not present.
-    #
-    # Options:
-    # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/blank/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_require_attributes :name, :phone_number
-    #
-    def should_require_attributes(*attributes)
-      message = get_options!(attributes, :message)
-      message ||= /blank/
-      klass = model_class
-      
-      attributes.each do |attribute|
-        should &quot;require #{attribute} to be set&quot; do
-          object = klass.new
-          object.send(&quot;#{attribute}=&quot;, nil)
-          assert !object.valid?, &quot;#{klass.name} does not require #{attribute}.&quot;
-          assert object.errors.on(attribute), &quot;#{klass.name} does not require #{attribute}.&quot;
-          assert_contains(object.errors.on(attribute), message)
+module ThoughtBot # :nodoc:
+  module Shoulda # :nodoc:
+    # = Macro test helpers for your active record models
+    #
+    # These helpers will test most of the validations and associations for your ActiveRecord models.
+    #
+    #   class UserTest &lt; Test::Unit::TestCase
+    #     should_require_attributes :name, :phone_number
+    #     should_not_allow_values_for :phone_number, &quot;abcd&quot;, &quot;1234&quot;
+    #     should_allow_values_for :phone_number, &quot;(123) 456-7890&quot;
+    #     
+    #     should_protect_attributes :password
+    #     
+    #     should_have_one :profile
+    #     should_have_many :dogs
+    #     should_have_many :messes, :through =&gt; :dogs
+    #     should_belong_to :lover
+    #   end
+    #
+    # For all of these helpers, the last parameter may be a hash of options.
+    #
+    module ActiveRecord
+      # Ensures that the model cannot be saved if one of the attributes listed is not present.
+      #
+      # Options:
+      # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/blank/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_require_attributes :name, :phone_number
+      #
+      def should_require_attributes(*attributes)
+        message = get_options!(attributes, :message)
+        message ||= /blank/
+        klass = model_class
+        
+        attributes.each do |attribute|
+          should &quot;require #{attribute} to be set&quot; do
+            object = klass.new
+            object.send(&quot;#{attribute}=&quot;, nil)
+            assert !object.valid?, &quot;#{klass.name} does not require #{attribute}.&quot;
+            assert object.errors.on(attribute), &quot;#{klass.name} does not require #{attribute}.&quot;
+            assert_contains(object.errors.on(attribute), message)
+          end
         end
       end
-    end
 
-    # Ensures that the model cannot be saved if one of the attributes listed is not unique.
-    # Requires an existing record
-    #
-    # Options:
-    # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/taken/&lt;/tt&gt;
-    # * &lt;tt&gt;:scoped_to&lt;/tt&gt; - field(s) to scope the uniqueness to.
-    #
-    # Examples:
-    #   should_require_unique_attributes :keyword, :username
-    #   should_require_unique_attributes :name, :message =&gt; &quot;O NOES! SOMEONE STOELED YER NAME!&quot;
-    #   should_require_unique_attributes :email, :scoped_to =&gt; :name
-    #   should_require_unique_attributes :address, :scoped_to =&gt; [:first_name, :last_name]
-    #
-    def should_require_unique_attributes(*attributes)
-      message, scope = get_options!(attributes, :message, :scoped_to)
-      scope = [*scope].compact
-      message ||= /taken/
-      
-      klass = model_class
-      attributes.each do |attribute|
-        attribute = attribute.to_sym
-        should &quot;require unique value for #{attribute}#{&quot; scoped to #{scope.join(', ')}&quot; if scope}&quot; do
-          assert existing = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object = klass.new
-          
-          object.send(:&quot;#{attribute}=&quot;, existing.send(attribute))
-          if !scope.blank?
-            scope.each do |s|
-              assert_respond_to object, :&quot;#{s}=&quot;, &quot;#{klass.name} doesn't seem to have a #{s} attribute.&quot;
-              object.send(:&quot;#{s}=&quot;, existing.send(s))
+      # Ensures that the model cannot be saved if one of the attributes listed is not unique.
+      # Requires an existing record
+      #
+      # Options:
+      # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/taken/&lt;/tt&gt;
+      # * &lt;tt&gt;:scoped_to&lt;/tt&gt; - field(s) to scope the uniqueness to.
+      #
+      # Examples:
+      #   should_require_unique_attributes :keyword, :username
+      #   should_require_unique_attributes :name, :message =&gt; &quot;O NOES! SOMEONE STOELED YER NAME!&quot;
+      #   should_require_unique_attributes :email, :scoped_to =&gt; :name
+      #   should_require_unique_attributes :address, :scoped_to =&gt; [:first_name, :last_name]
+      #
+      def should_require_unique_attributes(*attributes)
+        message, scope = get_options!(attributes, :message, :scoped_to)
+        scope = [*scope].compact
+        message ||= /taken/
+        
+        klass = model_class
+        attributes.each do |attribute|
+          attribute = attribute.to_sym
+          should &quot;require unique value for #{attribute}#{&quot; scoped to #{scope.join(', ')}&quot; if scope}&quot; do
+            assert existing = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object = klass.new
+            
+            object.send(:&quot;#{attribute}=&quot;, existing.send(attribute))
+            if !scope.blank?
+              scope.each do |s|
+                assert_respond_to object, :&quot;#{s}=&quot;, &quot;#{klass.name} doesn't seem to have a #{s} attribute.&quot;
+                object.send(:&quot;#{s}=&quot;, existing.send(s))
+              end
             end
-          end
-          
-          assert !object.valid?, &quot;#{klass.name} does not require a unique value for #{attribute}.&quot;
-          assert object.errors.on(attribute), &quot;#{klass.name} does not require a unique value for #{attribute}.&quot;
-          
-          assert_contains(object.errors.on(attribute), message)
-          
-          # Now test that the object is valid when changing the scoped attribute
-          # TODO:  There is a chance that we could change the scoped field
-          # to a value that's already taken.  An alternative implementation
-          # could actually find all values for scope and create a unique
-          # one.  
-          if !scope.blank?
-            scope.each do |s|
-              # Assume the scope is a foreign key if the field is nil
-              object.send(:&quot;#{s}=&quot;, existing.send(s).nil? ? 1 : existing.send(s).next)
+            
+            assert !object.valid?, &quot;#{klass.name} does not require a unique value for #{attribute}.&quot;
+            assert object.errors.on(attribute), &quot;#{klass.name} does not require a unique value for #{attribute}.&quot;
+            
+            assert_contains(object.errors.on(attribute), message)
+            
+            # Now test that the object is valid when changing the scoped attribute
+            # TODO:  There is a chance that we could change the scoped field
+            # to a value that's already taken.  An alternative implementation
+            # could actually find all values for scope and create a unique
+            # one.  
+            if !scope.blank?
+              scope.each do |s|
+                # Assume the scope is a foreign key if the field is nil
+                object.send(:&quot;#{s}=&quot;, existing.send(s).nil? ? 1 : existing.send(s).next)
+              end
+
+              object.errors.clear
+              object.valid?
+              scope.each do |s|
+                assert_does_not_contain(object.errors.on(attribute), message, 
+                                        &quot;after :#{s} set to #{object.send(s.to_sym)}&quot;)
+              end
             end
+          end
+        end
+      end
 
-            object.errors.clear
-            object.valid?
-            scope.each do |s|
-              assert_does_not_contain(object.errors.on(attribute), message, 
-                                      &quot;after :#{s} set to #{object.send(s.to_sym)}&quot;)
-            end
+      # Ensures that the attribute cannot be set on mass update.
+      # Requires an existing record.
+      #
+      #   should_protect_attributes :password, :admin_flag
+      #
+      def should_protect_attributes(*attributes)
+        get_options!(attributes)
+        klass = model_class
+
+        attributes.each do |attribute|
+          attribute = attribute.to_sym
+          should &quot;protect #{attribute} from mass updates&quot; do
+            protected = klass.protected_attributes || []
+            accessible = klass.accessible_attributes || []
+
+            assert protected.include?(attribute.to_s) || !accessible.include?(attribute.to_s),
+                   (accessible.empty? ?
+                     &quot;#{klass} is protecting #{protected.to_a.to_sentence}, but not #{attribute}.&quot; :
+                     &quot;#{klass} has made #{attribute} accessible&quot;)
+          end
+        end
+      end
+  
+      # Ensures that the attribute cannot be set to the given values
+      # Requires an existing record
+      #
+      # Options:
+      # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/invalid/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_not_allow_values_for :isbn, &quot;bad 1&quot;, &quot;bad 2&quot;
+      #
+      def should_not_allow_values_for(attribute, *bad_values)
+        message = get_options!(bad_values, :message)
+        message ||= /invalid/
+        klass = model_class
+        bad_values.each do |v|
+          should &quot;not allow #{attribute} to be set to #{v.inspect}&quot; do
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, v)
+            assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{v}\&quot;&quot;
+            assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{v}\&quot;&quot;
+            assert_contains(object.errors.on(attribute), message, &quot;when set to \&quot;#{v}\&quot;&quot;)
+          end
+        end
+      end
+  
+      # Ensures that the attribute can be set to the given values.
+      # Requires an existing record
+      #
+      # Example:
+      #   should_allow_values_for :isbn, &quot;isbn 1 2345 6789 0&quot;, &quot;ISBN 1-2345-6789-0&quot;
+      #
+      def should_allow_values_for(attribute, *good_values)
+        get_options!(good_values)
+        klass = model_class
+        good_values.each do |v|
+          should &quot;allow #{attribute} to be set to #{v.inspect}&quot; do
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, v)
+            object.save
+            assert_nil object.errors.on(attribute)
           end
         end
       end
-    end
 
-    # Ensures that the attribute cannot be set on mass update.
-    # Requires an existing record.
-    #
-    #   should_protect_attributes :password, :admin_flag
-    #
-    def should_protect_attributes(*attributes)
-      get_options!(attributes)
-      klass = model_class
+      # Ensures that the length of the attribute is in the given range
+      # Requires an existing record
+      #
+      # Options:
+      # * &lt;tt&gt;:short_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/short/&lt;/tt&gt;
+      # * &lt;tt&gt;:long_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/long/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_ensure_length_in_range :password, (6..20)
+      #
+      def should_ensure_length_in_range(attribute, range, opts = {})
+        short_message, long_message = get_options!([opts], :short_message, :long_message)
+        short_message ||= /short/
+        long_message  ||= /long/
+        
+        klass = model_class
+        min_length = range.first
+        max_length = range.last
+        same_length = (min_length == max_length)
+
+        if min_length &gt; 0
+          should &quot;not allow #{attribute} to be less than #{min_length} chars long&quot; do
+            min_value = &quot;x&quot; * (min_length - 1)
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, min_value)
+            assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{min_value}\&quot;&quot;
+            assert object.errors.on(attribute), 
+                   &quot;There are no errors set on #{attribute} after being set to \&quot;#{min_value}\&quot;&quot;
+            assert_contains(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+          end
+        end
 
-      attributes.each do |attribute|
-        attribute = attribute.to_sym
-        should &quot;protect #{attribute} from mass updates&quot; do
-          protected = klass.protected_attributes || []
-          accessible = klass.accessible_attributes || []
+        if min_length &gt; 0
+          should &quot;allow #{attribute} to be exactly #{min_length} chars long&quot; do
+            min_value = &quot;x&quot; * min_length
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, min_value)
+            object.save
+            assert_does_not_contain(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+          end
+        end
+    
+        should &quot;not allow #{attribute} to be more than #{max_length} chars long&quot; do
+          max_value = &quot;x&quot; * (max_length + 1)
+          assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+          object.send(&quot;#{attribute}=&quot;, max_value)
+          assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{max_value}\&quot;&quot;
+          assert object.errors.on(attribute), 
+                 &quot;There are no errors set on #{attribute} after being set to \&quot;#{max_value}\&quot;&quot;
+          assert_contains(object.errors.on(attribute), long_message, &quot;when set to \&quot;#{max_value}\&quot;&quot;)
+        end
 
-          assert protected.include?(attribute.to_s) || !accessible.include?(attribute.to_s),
-                 (accessible.empty? ?
-                   &quot;#{klass} is protecting #{protected.to_a.to_sentence}, but not #{attribute}.&quot; :
-                   &quot;#{klass} has made #{attribute} accessible&quot;)
+        unless same_length
+          should &quot;allow #{attribute} to be exactly #{max_length} chars long&quot; do
+            max_value = &quot;x&quot; * max_length
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, max_value)
+            object.save
+            assert_does_not_contain(object.errors.on(attribute), long_message, &quot;when set to \&quot;#{max_value}\&quot;&quot;)
+          end
+        end
+      end  
+      
+     # Ensures that the length of the attribute is at least a certain length
+     # Requires an existing record
+     #
+     # Options:
+     # * &lt;tt&gt;:short_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+     #   Regexp or string.  Default = &lt;tt&gt;/short/&lt;/tt&gt;
+     #
+     # Example:
+     #   should_ensure_length_at_least :name, 3
+     #
+     def should_ensure_length_at_least(attribute, min_length, opts = {})
+        short_message = get_options!([opts], :short_message)
+        short_message ||= /short/
+     
+        klass = model_class
+     
+        if min_length &gt; 0
+          min_value = &quot;x&quot; * (min_length - 1)
+          should &quot;not allow #{attribute} to be less than #{min_length} chars long&quot; do
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(&quot;#{attribute}=&quot;, min_value)
+            assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{min_value}\&quot;&quot;
+            assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{min_value}\&quot;&quot;
+            assert_contains(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+          end
+        end
+        should &quot;allow #{attribute} to be at least #{min_length} chars long&quot; do
+          valid_value = &quot;x&quot; * (min_length)
+          assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+          object.send(&quot;#{attribute}=&quot;, valid_value)
+          assert object.save, &quot;Could not save #{klass} with #{attribute} set to \&quot;#{valid_value}\&quot;&quot;
         end
       end
-    end
 
-    # Ensures that the attribute cannot be set to the given values
-    # Requires an existing record
-    #
-    # Options:
-    # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/invalid/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_not_allow_values_for :isbn, &quot;bad 1&quot;, &quot;bad 2&quot;
-    #
-    def should_not_allow_values_for(attribute, *bad_values)
-      message = get_options!(bad_values, :message)
-      message ||= /invalid/
-      klass = model_class
-      bad_values.each do |v|
-        should &quot;not allow #{attribute} to be set to #{v.inspect}&quot; do
+      # Ensure that the attribute is in the range specified
+      # Requires an existing record
+      #
+      # Options:
+      # * &lt;tt&gt;:low_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/included/&lt;/tt&gt;
+      # * &lt;tt&gt;:high_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/included/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_ensure_value_in_range :age, (0..100)
+      #
+      def should_ensure_value_in_range(attribute, range, opts = {})
+        low_message, high_message = get_options!([opts], :low_message, :high_message)
+        low_message  ||= /included/
+        high_message ||= /included/
+        
+        klass = model_class
+        min   = range.first
+        max   = range.last
+
+        should &quot;not allow #{attribute} to be less than #{min}&quot; do
+          v = min - 1
           assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
           object.send(&quot;#{attribute}=&quot;, v)
           assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{v}\&quot;&quot;
           assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{v}\&quot;&quot;
-          assert_contains(object.errors.on(attribute), message, &quot;when set to \&quot;#{v}\&quot;&quot;)
+          assert_contains(object.errors.on(attribute), low_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
         end
-      end
-    end
 
-    # Ensures that the attribute can be set to the given values.
-    # Requires an existing record
-    #
-    # Example:
-    #   should_allow_values_for :isbn, &quot;isbn 1 2345 6789 0&quot;, &quot;ISBN 1-2345-6789-0&quot;
-    #
-    def should_allow_values_for(attribute, *good_values)
-      get_options!(good_values)
-      klass = model_class
-      good_values.each do |v|
-        should &quot;allow #{attribute} to be set to #{v.inspect}&quot; do
+        should &quot;allow #{attribute} to be #{min}&quot; do
+          v = min
           assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
           object.send(&quot;#{attribute}=&quot;, v)
           object.save
-          assert_nil object.errors.on(attribute)
-        end
-      end
-    end
-
-    # Ensures that the length of the attribute is in the given range
-    # Requires an existing record
-    #
-    # Options:
-    # * &lt;tt&gt;:short_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/short/&lt;/tt&gt;
-    # * &lt;tt&gt;:long_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/long/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_ensure_length_in_range :password, (6..20)
-    #
-    def should_ensure_length_in_range(attribute, range, opts = {})
-      short_message, long_message = get_options!([opts], :short_message, :long_message)
-      short_message ||= /short/
-      long_message  ||= /long/
-      
-      klass = model_class
-      min_length = range.first
-      max_length = range.last
-      same_length = (min_length == max_length)
-
-      if min_length &gt; 0
-        should &quot;not allow #{attribute} to be less than #{min_length} chars long&quot; do
-          min_value = &quot;x&quot; * (min_length - 1)
-          assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object.send(&quot;#{attribute}=&quot;, min_value)
-          assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{min_value}\&quot;&quot;
-          assert object.errors.on(attribute), 
-                 &quot;There are no errors set on #{attribute} after being set to \&quot;#{min_value}\&quot;&quot;
-          assert_contains(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+          assert_does_not_contain(object.errors.on(attribute), low_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
         end
-      end
 
-      if min_length &gt; 0
-        should &quot;allow #{attribute} to be exactly #{min_length} chars long&quot; do
-          min_value = &quot;x&quot; * min_length
+        should &quot;not allow #{attribute} to be more than #{max}&quot; do
+          v = max + 1
           assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object.send(&quot;#{attribute}=&quot;, min_value)
-          object.save
-          assert_does_not_contain(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+          object.send(&quot;#{attribute}=&quot;, v)
+          assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{v}\&quot;&quot;
+          assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{v}\&quot;&quot;
+          assert_contains(object.errors.on(attribute), high_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
         end
-      end
-  
-      should &quot;not allow #{attribute} to be more than #{max_length} chars long&quot; do
-        max_value = &quot;x&quot; * (max_length + 1)
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, max_value)
-        assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{max_value}\&quot;&quot;
-        assert object.errors.on(attribute), 
-               &quot;There are no errors set on #{attribute} after being set to \&quot;#{max_value}\&quot;&quot;
-        assert_contains(object.errors.on(attribute), long_message, &quot;when set to \&quot;#{max_value}\&quot;&quot;)
-      end
 
-      unless same_length
-        should &quot;allow #{attribute} to be exactly #{max_length} chars long&quot; do
-          max_value = &quot;x&quot; * max_length
+        should &quot;allow #{attribute} to be #{max}&quot; do
+          v = max
           assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object.send(&quot;#{attribute}=&quot;, max_value)
+          object.send(&quot;#{attribute}=&quot;, v)
           object.save
-          assert_does_not_contain(object.errors.on(attribute), long_message, &quot;when set to \&quot;#{max_value}\&quot;&quot;)
+          assert_does_not_contain(object.errors.on(attribute), high_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
         end
-      end
-    end  
-    
-   # Ensures that the length of the attribute is at least a certain length
-   # Requires an existing record
-   #
-   # Options:
-   # * &lt;tt&gt;:short_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-   #   Regexp or string.  Default = &lt;tt&gt;/short/&lt;/tt&gt;
-   #
-   # Example:
-   #   should_ensure_length_at_least :name, 3
-   #
-   def should_ensure_length_at_least(attribute, min_length, opts = {})
-      short_message = get_options!([opts], :short_message)
-      short_message ||= /short/
-   
-      klass = model_class
-   
-      if min_length &gt; 0
-        min_value = &quot;x&quot; * (min_length - 1)
-        should &quot;not allow #{attribute} to be less than #{min_length} chars long&quot; do
-          assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object.send(&quot;#{attribute}=&quot;, min_value)
-          assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{min_value}\&quot;&quot;
-          assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{min_value}\&quot;&quot;
-          assert_contains(object.errors.on(attribute), short_message, &quot;when set to \&quot;#{min_value}\&quot;&quot;)
+      end    
+      
+      # Ensure that the attribute is numeric
+      # Requires an existing record
+      #
+      # Options:
+      # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/number/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_only_allow_numeric_values_for :age
+      #
+      def should_only_allow_numeric_values_for(*attributes)
+        message = get_options!(attributes, :message)
+        message ||= /number/
+        klass = model_class
+        attributes.each do |attribute|
+          attribute = attribute.to_sym
+          should &quot;only allow numeric values for #{attribute}&quot; do
+            assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
+            object.send(:&quot;#{attribute}=&quot;, &quot;abcd&quot;)
+            assert !object.valid?, &quot;Instance is still valid&quot;
+            assert_contains(object.errors.on(attribute), message)
+          end
         end
       end
-      should &quot;allow #{attribute} to be at least #{min_length} chars long&quot; do
-        valid_value = &quot;x&quot; * (min_length)
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, valid_value)
-        assert object.save, &quot;Could not save #{klass} with #{attribute} set to \&quot;#{valid_value}\&quot;&quot;
-      end
-    end
 
-    # Ensure that the attribute is in the range specified
-    # Requires an existing record
-    #
-    # Options:
-    # * &lt;tt&gt;:low_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/included/&lt;/tt&gt;
-    # * &lt;tt&gt;:high_message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/included/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_ensure_value_in_range :age, (0..100)
-    #
-    def should_ensure_value_in_range(attribute, range, opts = {})
-      low_message, high_message = get_options!([opts], :low_message, :high_message)
-      low_message  ||= /included/
-      high_message ||= /included/
-      
-      klass = model_class
-      min   = range.first
-      max   = range.last
-
-      should &quot;not allow #{attribute} to be less than #{min}&quot; do
-        v = min - 1
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, v)
-        assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{v}\&quot;&quot;
-        assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{v}\&quot;&quot;
-        assert_contains(object.errors.on(attribute), low_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
-      end
+      # Ensures that the has_many relationship exists.  Will also test that the
+      # associated table has the required columns.  Works with polymorphic
+      # associations.
+      # 
+      # Options:
+      # * &lt;tt&gt;:through&lt;/tt&gt; - association name for &lt;tt&gt;has_many :through&lt;/tt&gt;
+      # * &lt;tt&gt;:dependent&lt;/tt&gt; - tests that the association makes use of the dependent option.      
+      #
+      # Example:
+      #   should_have_many :friends
+      #   should_have_many :enemies, :through =&gt; :friends
+      #   should_have_many :enemies, :dependent =&gt; :destroy
+      #
+      def should_have_many(*associations)
+        through, dependent = get_options!(associations, :through, :dependent)
+        klass = model_class
+        associations.each do |association|
+          name = &quot;have many #{association}&quot;
+          name += &quot; through #{through}&quot; if through
+          name += &quot; dependent =&gt; #{dependent}&quot; if dependent
+          should name do
+            reflection = klass.reflect_on_association(association)
+            assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
+            assert_equal :has_many, reflection.macro
 
-      should &quot;allow #{attribute} to be #{min}&quot; do
-        v = min
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, v)
-        object.save
-        assert_does_not_contain(object.errors.on(attribute), low_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
-      end
+            associated_klass = (reflection.options[:class_name] || association.to_s.classify).constantize
 
-      should &quot;not allow #{attribute} to be more than #{max}&quot; do
-        v = max + 1
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, v)
-        assert !object.save, &quot;Saved #{klass} with #{attribute} set to \&quot;#{v}\&quot;&quot;
-        assert object.errors.on(attribute), &quot;There are no errors set on #{attribute} after being set to \&quot;#{v}\&quot;&quot;
-        assert_contains(object.errors.on(attribute), high_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
-      end
+            if through
+              through_reflection = klass.reflect_on_association(through)
+              assert through_reflection, &quot;#{klass.name} does not have any relationship to #{through}&quot;
+              assert_equal(through, reflection.options[:through])
+            end
 
-      should &quot;allow #{attribute} to be #{max}&quot; do
-        v = max
-        assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-        object.send(&quot;#{attribute}=&quot;, v)
-        object.save
-        assert_does_not_contain(object.errors.on(attribute), high_message, &quot;when set to \&quot;#{v}\&quot;&quot;)
-      end
-    end    
-    
-    # Ensure that the attribute is numeric
-    # Requires an existing record
-    #
-    # Options:
-    # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/number/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_only_allow_numeric_values_for :age
-    #
-    def should_only_allow_numeric_values_for(*attributes)
-      message = get_options!(attributes, :message)
-      message ||= /number/
-      klass = model_class
-      attributes.each do |attribute|
-        attribute = attribute.to_sym
-        should &quot;only allow numeric values for #{attribute}&quot; do
-          assert object = klass.find(:first), &quot;Can't find first #{klass}&quot;
-          object.send(:&quot;#{attribute}=&quot;, &quot;abcd&quot;)
-          assert !object.valid?, &quot;Instance is still valid&quot;
-          assert_contains(object.errors.on(attribute), message)
+            if dependent
+              assert_equal dependent.to_s, 
+                           reflection.options[:dependent].to_s, 
+                           &quot;#{associated_klass.name} should have #{dependent} dependency&quot;
+            end
+            
+            # Check for the existence of the foreign key on the other table
+            unless reflection.options[:through]
+              if reflection.options[:foreign_key]
+                fk = reflection.options[:foreign_key]
+              elsif reflection.options[:as]
+                fk = reflection.options[:as].to_s.foreign_key
+              else
+                fk = reflection.primary_key_name
+              end
+              
+              assert associated_klass.column_names.include?(fk.to_s),
+                     &quot;#{associated_klass.name} does not have a #{fk} foreign key.&quot;
+            end
+          end
         end
       end
-    end
-
-    # Ensures that the has_many relationship exists.  Will also test that the
-    # associated table has the required columns.  Works with polymorphic
-    # associations.
-    # 
-    # Options:
-    # * &lt;tt&gt;:through&lt;/tt&gt; - association name for &lt;tt&gt;has_many :through&lt;/tt&gt;
-    # * &lt;tt&gt;:dependent&lt;/tt&gt; - tests that the association makes use of the dependent option.      
-    #
-    # Example:
-    #   should_have_many :friends
-    #   should_have_many :enemies, :through =&gt; :friends
-    #   should_have_many :enemies, :dependent =&gt; :destroy
-    #
-    def should_have_many(*associations)
-      through, dependent = get_options!(associations, :through, :dependent)
-      klass = model_class
-      associations.each do |association|
-        name = &quot;have many #{association}&quot;
-        name += &quot; through #{through}&quot; if through
-        name += &quot; dependent =&gt; #{dependent}&quot; if dependent
-        should name do
-          reflection = klass.reflect_on_association(association)
-          assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
-          assert_equal :has_many, reflection.macro
-
-          associated_klass = (reflection.options[:class_name] || association.to_s.classify).constantize
 
-          if through
-            through_reflection = klass.reflect_on_association(through)
-            assert through_reflection, &quot;#{klass.name} does not have any relationship to #{through}&quot;
-            assert_equal(through, reflection.options[:through])
-          end
+      # Ensure that the has_one relationship exists.  Will also test that the
+      # associated table has the required columns.  Works with polymorphic
+      # associations.
+      #
+      # Example:
+      #   should_have_one :god # unless hindu
+      #
+      def should_have_one(*associations)
+        get_options!(associations)
+        klass = model_class
+        associations.each do |association|
+          should &quot;have one #{association}&quot; do
+            reflection = klass.reflect_on_association(association)
+            assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
+            assert_equal :has_one, reflection.macro
+            
+            associated_klass = (reflection.options[:class_name] || association.to_s.camelize).constantize
 
-          if dependent
-            assert_equal dependent.to_s, 
-                         reflection.options[:dependent].to_s, 
-                         &quot;#{associated_klass.name} should have #{dependent} dependency&quot;
-          end
-          
-          # Check for the existence of the foreign key on the other table
-          unless reflection.options[:through]
             if reflection.options[:foreign_key]
               fk = reflection.options[:foreign_key]
             elsif reflection.options[:as]
               fk = reflection.options[:as].to_s.foreign_key
+              fk_type = fk.gsub(/_id$/, '_type')
+              assert associated_klass.column_names.include?(fk_type), 
+                     &quot;#{associated_klass.name} does not have a #{fk_type} column.&quot;            
             else
-              fk = reflection.primary_key_name
+              fk = klass.name.foreign_key
             end
-            
-            assert associated_klass.column_names.include?(fk.to_s),
-                   &quot;#{associated_klass.name} does not have a #{fk} foreign key.&quot;
+            assert associated_klass.column_names.include?(fk.to_s), 
+                   &quot;#{associated_klass.name} does not have a #{fk} foreign key.&quot;            
           end
         end
       end
-    end
-
-    # Ensure that the has_one relationship exists.  Will also test that the
-    # associated table has the required columns.  Works with polymorphic
-    # associations.
-    #
-    # Example:
-    #   should_have_one :god # unless hindu
-    #
-    def should_have_one(*associations)
-      get_options!(associations)
-      klass = model_class
-      associations.each do |association|
-        should &quot;have one #{association}&quot; do
-          reflection = klass.reflect_on_association(association)
-          assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
-          assert_equal :has_one, reflection.macro
-          
-          associated_klass = (reflection.options[:class_name] || association.to_s.camelize).constantize
-
-          if reflection.options[:foreign_key]
-            fk = reflection.options[:foreign_key]
-          elsif reflection.options[:as]
-            fk = reflection.options[:as].to_s.foreign_key
-            fk_type = fk.gsub(/_id$/, '_type')
-            assert associated_klass.column_names.include?(fk_type), 
-                   &quot;#{associated_klass.name} does not have a #{fk_type} column.&quot;            
-          else
-            fk = klass.name.foreign_key
+  
+      # Ensures that the has_and_belongs_to_many relationship exists, and that the join
+      # table is in place.
+      #
+      #   should_have_and_belong_to_many :posts, :cars
+      #
+      def should_have_and_belong_to_many(*associations)
+        get_options!(associations)
+        klass = model_class
+
+        associations.each do |association|
+          should &quot;should have and belong to many #{association}&quot; do
+            reflection = klass.reflect_on_association(association)
+            assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
+            assert_equal :has_and_belongs_to_many, reflection.macro
+            table = reflection.options[:join_table]
+            assert ::ActiveRecord::Base.connection.tables.include?(table), &quot;table #{table} doesn't exist&quot;
           end
-          assert associated_klass.column_names.include?(fk.to_s), 
-                 &quot;#{associated_klass.name} does not have a #{fk} foreign key.&quot;            
         end
       end
-    end
-
-    # Ensures that the has_and_belongs_to_many relationship exists, and that the join
-    # table is in place.
-    #
-    #   should_have_and_belong_to_many :posts, :cars
-    #
-    def should_have_and_belong_to_many(*associations)
-      get_options!(associations)
-      klass = model_class
-
-      associations.each do |association|
-        should &quot;should have and belong to many #{association}&quot; do
-          reflection = klass.reflect_on_association(association)
-          assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
-          assert_equal :has_and_belongs_to_many, reflection.macro
-          table = reflection.options[:join_table]
-          assert ::ActiveRecord::Base.connection.tables.include?(table), &quot;table #{table} doesn't exist&quot;
+  
+      # Ensure that the belongs_to relationship exists.
+      #
+      #   should_belong_to :parent
+      #
+      def should_belong_to(*associations)
+        get_options!(associations)
+        klass = model_class
+        associations.each do |association|
+          should &quot;belong_to #{association}&quot; do
+            reflection = klass.reflect_on_association(association)
+            assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
+            assert_equal :belongs_to, reflection.macro
+
+            unless reflection.options[:polymorphic]
+              associated_klass = (reflection.options[:class_name] || association.to_s.classify).constantize
+              fk = reflection.options[:foreign_key] || reflection.primary_key_name
+              assert klass.column_names.include?(fk.to_s), &quot;#{klass.name} does not have a #{fk} foreign key.&quot;
+            end
+          end
         end
       end
-    end
-
-    # Ensure that the belongs_to relationship exists.
-    #
-    #   should_belong_to :parent
-    #
-    def should_belong_to(*associations)
-      get_options!(associations)
-      klass = model_class
-      associations.each do |association|
-        should &quot;belong_to #{association}&quot; do
-          reflection = klass.reflect_on_association(association)
-          assert reflection, &quot;#{klass.name} does not have any relationship to #{association}&quot;
-          assert_equal :belongs_to, reflection.macro
-
-          unless reflection.options[:polymorphic]
-            associated_klass = (reflection.options[:class_name] || association.to_s.classify).constantize
-            fk = reflection.options[:foreign_key] || reflection.primary_key_name
-            assert klass.column_names.include?(fk.to_s), &quot;#{klass.name} does not have a #{fk} foreign key.&quot;
+      
+      # Ensure that the given class methods are defined on the model.
+      #
+      #   should_have_class_methods :find, :destroy
+      #
+      def should_have_class_methods(*methods)
+        get_options!(methods)
+        klass = model_class
+        methods.each do |method|
+          should &quot;respond to class method ##{method}&quot; do
+            assert_respond_to klass, method, &quot;#{klass.name} does not have class method #{method}&quot;
           end
         end
       end
-    end
-    
-    # Ensure that the given class methods are defined on the model.
-    #
-    #   should_have_class_methods :find, :destroy
-    #
-    def should_have_class_methods(*methods)
-      get_options!(methods)
-      klass = model_class
-      methods.each do |method|
-        should &quot;respond to class method ##{method}&quot; do
-          assert_respond_to klass, method, &quot;#{klass.name} does not have class method #{method}&quot;
+
+      # Ensure that the given instance methods are defined on the model.
+      #
+      #   should_have_instance_methods :email, :name, :name=
+      #
+      def should_have_instance_methods(*methods)
+        get_options!(methods)
+        klass = model_class
+        methods.each do |method|
+          should &quot;respond to instance method ##{method}&quot; do
+            assert_respond_to klass.new, method, &quot;#{klass.name} does not have instance method #{method}&quot;
+          end
         end
       end
-    end
 
-    # Ensure that the given instance methods are defined on the model.
-    #
-    #   should_have_instance_methods :email, :name, :name=
-    #
-    def should_have_instance_methods(*methods)
-      get_options!(methods)
-      klass = model_class
-      methods.each do |method|
-        should &quot;respond to instance method ##{method}&quot; do
-          assert_respond_to klass.new, method, &quot;#{klass.name} does not have instance method #{method}&quot;
+      # Ensure that the given columns are defined on the models backing SQL table.
+      #
+      #   should_have_db_columns :id, :email, :name, :created_at
+      #
+      def should_have_db_columns(*columns)
+        column_type = get_options!(columns, :type)
+        klass = model_class
+        columns.each do |name|
+          test_name = &quot;have column #{name}&quot;
+          test_name += &quot; of type #{column_type}&quot; if column_type
+          should test_name do
+            column = klass.columns.detect {|c| c.name == name.to_s }
+            assert column, &quot;#{klass.name} does not have column #{name}&quot;
+          end
         end
       end
-    end
 
-    # Ensure that the given columns are defined on the models backing SQL table.
-    #
-    #   should_have_db_columns :id, :email, :name, :created_at
-    #
-    def should_have_db_columns(*columns)
-      column_type = get_options!(columns, :type)
-      klass = model_class
-      columns.each do |name|
-        test_name = &quot;have column #{name}&quot;
-        test_name += &quot; of type #{column_type}&quot; if column_type
+      # Ensure that the given column is defined on the models backing SQL table.  The options are the same as
+      # the instance variables defined on the column definition:  :precision, :limit, :default, :null, 
+      # :primary, :type, :scale, and :sql_type.
+      #
+      #   should_have_db_column :email, :type =&gt; &quot;string&quot;, :default =&gt; nil,   :precision =&gt; nil, :limit    =&gt; 255, 
+      #                                 :null =&gt; true,     :primary =&gt; false, :scale     =&gt; nil, :sql_type =&gt; 'varchar(255)'
+      #
+      def should_have_db_column(name, opts = {})
+        klass = model_class
+        test_name = &quot;have column named :#{name}&quot;
+        test_name += &quot; with options &quot; + opts.inspect unless opts.empty?
         should test_name do
           column = klass.columns.detect {|c| c.name == name.to_s }
           assert column, &quot;#{klass.name} does not have column #{name}&quot;
+          opts.each do |k, v|
+            assert_equal column.instance_variable_get(&quot;@#{k}&quot;).to_s, v.to_s, &quot;:#{name} column on table for #{klass} does not match option :#{k}&quot;
+          end
         end
       end
-    end
-
-    # Ensure that the given column is defined on the models backing SQL table.  The options are the same as
-    # the instance variables defined on the column definition:  :precision, :limit, :default, :null, 
-    # :primary, :type, :scale, and :sql_type.
-    #
-    #   should_have_db_column :email, :type =&gt; &quot;string&quot;, :default =&gt; nil,   :precision =&gt; nil, :limit    =&gt; 255, 
-    #                                 :null =&gt; true,     :primary =&gt; false, :scale     =&gt; nil, :sql_type =&gt; 'varchar(255)'
-    #
-    def should_have_db_column(name, opts = {})
-      klass = model_class
-      test_name = &quot;have column named :#{name}&quot;
-      test_name += &quot; with options &quot; + opts.inspect unless opts.empty?
-      should test_name do
-        column = klass.columns.detect {|c| c.name == name.to_s }
-        assert column, &quot;#{klass.name} does not have column #{name}&quot;
-        opts.each do |k, v|
-          assert_equal column.instance_variable_get(&quot;@#{k}&quot;).to_s, v.to_s, &quot;:#{name} column on table for #{klass} does not match option :#{k}&quot;
-        end
-      end
-    end
 
-    # Ensures that there are DB indices on the given columns or tuples of columns.
-    # Also aliased to should_have_index for readability
-    #   
-    #   should_have_indices :email, :name, [:commentable_type, :commentable_id]
-    #   should_have_index :age
-    #
-    def should_have_indices(*columns)
-      table = model_class.name.tableize
-      indices = ::ActiveRecord::Base.connection.indexes(table).map(&amp;:columns)
-
-      columns.each do |column|
-        should &quot;have index on #{table} for #{column.inspect}&quot; do
-          columns = [column].flatten.map(&amp;:to_s)
-          assert_contains(indices, columns)
+      # Ensures that there are DB indices on the given columns or tuples of columns.
+      # Also aliased to should_have_index for readability
+      #   
+      #   should_have_indices :email, :name, [:commentable_type, :commentable_id]
+      #   should_have_index :age
+      #
+      def should_have_indices(*columns)
+        table = model_class.name.tableize
+        indices = ::ActiveRecord::Base.connection.indexes(table).map(&amp;:columns)
+
+        columns.each do |column|
+          should &quot;have index on #{table} for #{column.inspect}&quot; do
+            columns = [column].flatten.map(&amp;:to_s)
+            assert_contains(indices, columns)
+          end
         end
       end
-    end
 
-    alias_method :should_have_index, :should_have_indices
+      alias_method :should_have_index, :should_have_indices
+      
+      # Ensures that the model cannot be saved if one of the attributes listed is not accepted.
+      #
+      # Options:
+      # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
+      #   Regexp or string.  Default = &lt;tt&gt;/must be accepted/&lt;/tt&gt;
+      #
+      # Example:
+      #   should_require_acceptance_of :eula
+      #
+      def should_require_acceptance_of(*attributes)
+        message = get_options!(attributes, :message)
+        message ||= /must be accepted/
+        klass = model_class
     
-    # Ensures that the model cannot be saved if one of the attributes listed is not accepted.
-    #
-    # Options:
-    # * &lt;tt&gt;:message&lt;/tt&gt; - value the test expects to find in &lt;tt&gt;errors.on(:attribute)&lt;/tt&gt;.  
-    #   Regexp or string.  Default = &lt;tt&gt;/must be accepted/&lt;/tt&gt;
-    #
-    # Example:
-    #   should_require_acceptance_of :eula
-    #
-    def should_require_acceptance_of(*attributes)
-      message = get_options!(attributes, :message)
-      message ||= /must be accepted/
-      klass = model_class
-  
-      attributes.each do |attribute|
-        should &quot;require #{attribute} to be accepted&quot; do
-          object = klass.new
-          object.send(&quot;#{attribute}=&quot;, false)
-
-          assert !object.valid?, &quot;#{klass.name} does not require acceptance of #{attribute}.&quot;
-          assert object.errors.on(attribute), &quot;#{klass.name} does not require acceptance of #{attribute}.&quot;
-          assert_contains(object.errors.on(attribute), message)
+        attributes.each do |attribute|
+          should &quot;require #{attribute} to be accepted&quot; do
+            object = klass.new
+            object.send(&quot;#{attribute}=&quot;, false)
+
+            assert !object.valid?, &quot;#{klass.name} does not require acceptance of #{attribute}.&quot;
+            assert object.errors.on(attribute), &quot;#{klass.name} does not require acceptance of #{attribute}.&quot;
+            assert_contains(object.errors.on(attribute), message)
+          end
         end
       end
+      
+      private
+      
+      include ThoughtBot::Shoulda::Private
     end
-    
-    private
-    
-    include Shoulda::Private
   end
 end</diff>
      <filename>lib/shoulda/active_record_helpers.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,6 @@
 require 'test/unit/ui/console/testrunner'
 
-# Completely stolen from redgreen gem (thanks Pat Eyler and Chris Wanstrath).
-#
-# NOTE:  Is this now in autotest?  Can I remove this, then?
+# Completely stolen from redgreen gem
 #
 # Adds colored output to your tests.  Specify &lt;tt&gt;color: true&lt;/tt&gt; in 
 # your &lt;tt&gt;~/.shoulda.conf&lt;/tt&gt; file to enable.
@@ -11,7 +9,7 @@ require 'test/unit/ui/console/testrunner'
 # every rake task, as though there was another (empty) set of tests.  
 # A fix would be most welcome.
 #
-module Shoulda::Color 
+module ThoughtBot::Shoulda::Color 
   COLORS = { :clear =&gt; 0, :red =&gt; 31, :green =&gt; 32, :yellow =&gt; 33 } # :nodoc:
   def self.method_missing(color_name, *args)  # :nodoc:
     color(color_name) + args.first + color(:clear) 
@@ -27,7 +25,7 @@ module Test # :nodoc:
       alias :old_to_s :to_s
       def to_s
         if old_to_s =~ /\d+ tests, \d+ assertions, (\d+) failures, (\d+) errors/
-          Shoulda::Color.send($1.to_i != 0 || $2.to_i != 0 ? :red : :green, $&amp;)
+          ThoughtBot::Shoulda::Color.send($1.to_i != 0 || $2.to_i != 0 ? :red : :green, $&amp;)
         end
       end
     end
@@ -45,16 +43,16 @@ module Test # :nodoc:
     class Failure # :nodoc:
       alias :old_long_display :long_display
       def long_display
-        # old_long_display.sub('Failure', Shoulda::Color.red('Failure'))
-        Shoulda::Color.red(old_long_display)
+        # old_long_display.sub('Failure', ThoughtBot::Shoulda::Color.red('Failure'))
+        ThoughtBot::Shoulda::Color.red(old_long_display)
       end
     end
 
     class Error # :nodoc:
       alias :old_long_display :long_display
       def long_display
-        # old_long_display.sub('Error', Shoulda::Color.yellow('Error'))
-        Shoulda::Color.yellow(old_long_display)
+        # old_long_display.sub('Error', ThoughtBot::Shoulda::Color.yellow('Error'))
+        ThoughtBot::Shoulda::Color.yellow(old_long_display)
       end
     end
 
@@ -64,9 +62,9 @@ module Test # :nodoc:
           def output_single(something, level=NORMAL)
             return unless (output?(level))
             something = case something
-            when '.' then Shoulda::Color.green('.')
-            when 'F' then Shoulda::Color.red(&quot;F&quot;)
-            when 'E' then Shoulda::Color.yellow(&quot;E&quot;)
+            when '.' then ThoughtBot::Shoulda::Color.green('.')
+            when 'F' then ThoughtBot::Shoulda::Color.red(&quot;F&quot;)
+            when 'E' then ThoughtBot::Shoulda::Color.yellow(&quot;E&quot;)
             else something
             end
             @io.write(something) </diff>
      <filename>lib/shoulda/color.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,472 +1,467 @@
-module Shoulda
-  module Controller
-    def self.included(other) # :nodoc:
-      other.class_eval do
-        extend  Shoulda::Controller::ClassMethods
-        include Shoulda::Controller::InstanceMethods
-        Shoulda::Controller::ClassMethods::VALID_FORMATS.each do |format|
-          include &quot;Shoulda::Controller::#{format.to_s.upcase}&quot;.constantize
+module ThoughtBot # :nodoc:
+  module Shoulda # :nodoc:
+    module Controller
+      def self.included(other) # :nodoc:
+        other.class_eval do
+          extend  ThoughtBot::Shoulda::Controller::ClassMethods
+          include ThoughtBot::Shoulda::Controller::InstanceMethods
+          ThoughtBot::Shoulda::Controller::ClassMethods::VALID_FORMATS.each do |format|
+            include &quot;ThoughtBot::Shoulda::Controller::#{format.to_s.upcase}&quot;.constantize
+          end
         end
       end
-    end
-    
-    # = Macro test helpers for your controllers
-    #
-    # By using the macro helpers you can quickly and easily create concise and easy to read test suites.
-    # 
-    # This code segment:
-    #   context &quot;on GET to :show for first record&quot; do
-    #     setup do
-    #       get :show, :id =&gt; 1
-    #     end
-    #   
-    #     should_assign_to :user
-    #     should_respond_with :success
-    #     should_render_template :show
-    #     should_not_set_the_flash
-    #
-    #     should &quot;do something else really cool&quot; do
-    #       assert_equal 1, assigns(:user).id
-    #     end
-    #   end
-    #
-    # Would produce 5 tests for the +show+ action
-    #
-    # Furthermore, the should_be_restful helper will create an entire set of tests which will verify that your
-    # controller responds restfully to a variety of requested formats.
-    module ClassMethods
-      # Formats tested by #should_be_restful.  Defaults to [:html, :xml]
-      VALID_FORMATS = Dir.glob(File.join(File.dirname(__FILE__), 'formats', '*.rb')).map { |f| File.basename(f, '.rb') }.map(&amp;:to_sym) # :doc:
-      VALID_FORMATS.each {|f| require &quot;shoulda/controller_tests/formats/#{f}.rb&quot;}
-
-      # Actions tested by #should_be_restful
-      VALID_ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy] # :doc:
-
-      # A ResourceOptions object is passed into should_be_restful in order to configure the tests for your controller.
+      
+      # = Macro test helpers for your controllers
+      #
+      # By using the macro helpers you can quickly and easily create concise and easy to read test suites.
       # 
-      # Example:
-      #   class UsersControllerTest &lt; Test::Unit::TestCase
-      #     load_all_fixtures
-      #   
-      #     def setup
-      #       ...normal setup code...
-      #       @user = User.find(:first)
+      # This code segment:
+      #   context &quot;on GET to :show for first record&quot; do
+      #     setup do
+      #       get :show, :id =&gt; 1
       #     end
       #   
-      #     should_be_restful do |resource|
-      #       resource.identifier = :id
-      #       resource.klass      = User
-      #       resource.object     = :user
-      #       resource.parent     = []
-      #       resource.actions    = [:index, :show, :new, :edit, :update, :create, :destroy]
-      #       resource.formats    = [:html, :xml]
-      #   
-      #       resource.create.params = { :name =&gt; &quot;bob&quot;, :email =&gt; 'bob@bob.com', :age =&gt; 13}
-      #       resource.update.params = { :name =&gt; &quot;sue&quot; }
-      #   
-      #       resource.create.redirect  = &quot;user_url(@user)&quot;
-      #       resource.update.redirect  = &quot;user_url(@user)&quot;
-      #       resource.destroy.redirect = &quot;users_url&quot;
-      #   
-      #       resource.create.flash  = /created/i
-      #       resource.update.flash  = /updated/i
-      #       resource.destroy.flash = /removed/i    
+      #     should_assign_to :user
+      #     should_respond_with :success
+      #     should_render_template :show
+      #     should_not_set_the_flash
+      #
+      #     should &quot;do something else really cool&quot; do
+      #       assert_equal 1, assigns(:user).id
       #     end
       #   end
       #
-      # Whenever possible, the resource attributes will be set to sensible defaults.
+      # Would produce 5 tests for the +show+ action
       #
-      class ResourceOptions
-        # Configuration options for the create, update, destroy actions under should_be_restful
-        class ActionOptions
-          # String evaled to get the target of the redirection.
-          # All of the instance variables set by the controller will be available to the 
-          # evaled code.
-          #
-          # Example:
-          #   resource.create.redirect  = &quot;user_url(@user.company, @user)&quot;
-          #
-          # Defaults to a generated url based on the name of the controller, the action, and the resource.parents list.
-          attr_accessor :redirect
-
-          # String or Regexp describing a value expected in the flash.  Will match against any flash key.
-          #
-          # Defaults:
-          # destroy:: /removed/
-          # create::  /created/
-          # update::  /updated/
-          attr_accessor :flash
-          
-          # Hash describing the params that should be sent in with this action.
-          attr_accessor :params
-        end
-
-        # Configuration options for the denied actions under should_be_restful
-        #
+      # Furthermore, the should_be_restful helper will create an entire set of tests which will verify that your
+      # controller responds restfully to a variety of requested formats.
+      module ClassMethods
+        # Formats tested by #should_be_restful.  Defaults to [:html, :xml]
+        VALID_FORMATS = Dir.glob(File.join(File.dirname(__FILE__), 'formats', '*.rb')).map { |f| File.basename(f, '.rb') }.map(&amp;:to_sym) # :doc:
+        VALID_FORMATS.each {|f| require &quot;shoulda/controller_tests/formats/#{f}.rb&quot;}
+
+        # Actions tested by #should_be_restful
+        VALID_ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy] # :doc:
+
+        # A ResourceOptions object is passed into should_be_restful in order to configure the tests for your controller.
+        # 
         # Example:
-        #   context &quot;The public&quot; do
-        #     setup do
-        #       @request.session[:logged_in] = false
+        #   class UsersControllerTest &lt; Test::Unit::TestCase
+        #     load_all_fixtures
+        #   
+        #     def setup
+        #       ...normal setup code...
+        #       @user = User.find(:first)
         #     end
         #   
         #     should_be_restful do |resource|
-        #       resource.parent = :user
+        #       resource.identifier = :id
+        #       resource.klass      = User
+        #       resource.object     = :user
+        #       resource.parent     = []
+        #       resource.actions    = [:index, :show, :new, :edit, :update, :create, :destroy]
+        #       resource.formats    = [:html, :xml]
         #   
-        #       resource.denied.actions = [:index, :show, :edit, :new, :create, :update, :destroy]
-        #       resource.denied.flash = /get outta here/i
-        #       resource.denied.redirect = 'new_session_url'
-        #     end    
+        #       resource.create.params = { :name =&gt; &quot;bob&quot;, :email =&gt; 'bob@bob.com', :age =&gt; 13}
+        #       resource.update.params = { :name =&gt; &quot;sue&quot; }
+        #   
+        #       resource.create.redirect  = &quot;user_url(@user)&quot;
+        #       resource.update.redirect  = &quot;user_url(@user)&quot;
+        #       resource.destroy.redirect = &quot;users_url&quot;
+        #   
+        #       resource.create.flash  = /created/i
+        #       resource.update.flash  = /updated/i
+        #       resource.destroy.flash = /removed/i    
+        #     end
         #   end
         #
-        class DeniedOptions
-          # String evaled to get the target of the redirection.
-          # All of the instance variables set by the controller will be available to the 
-          # evaled code.
-          #
-          # Example:
-          #   resource.create.redirect  = &quot;user_url(@user.company, @user)&quot;
-          attr_accessor :redirect
+        # Whenever possible, the resource attributes will be set to sensible defaults.
+        #
+        class ResourceOptions
+          # Configuration options for the create, update, destroy actions under should_be_restful
+          class ActionOptions
+            # String evaled to get the target of the redirection.
+            # All of the instance variables set by the controller will be available to the 
+            # evaled code.
+            #
+            # Example:
+            #   resource.create.redirect  = &quot;user_url(@user.company, @user)&quot;
+            #
+            # Defaults to a generated url based on the name of the controller, the action, and the resource.parents list.
+            attr_accessor :redirect
+
+            # String or Regexp describing a value expected in the flash.  Will match against any flash key.
+            #
+            # Defaults:
+            # destroy:: /removed/
+            # create::  /created/
+            # update::  /updated/
+            attr_accessor :flash
+            
+            # Hash describing the params that should be sent in with this action.
+            attr_accessor :params
+          end
 
-          # String or Regexp describing a value expected in the flash.  Will match against any flash key.
+          # Configuration options for the denied actions under should_be_restful
           #
           # Example:
-          #   resource.create.flash = /created/
-          attr_accessor :flash
-
-          # Actions that should be denied (only used by resource.denied).  &lt;i&gt;Note that these actions will
-          # only be tested if they are also listed in +resource.actions+&lt;/i&gt;
-          # The special value of :all will deny all of the REST actions.
-          attr_accessor :actions
-        end
+          #   context &quot;The public&quot; do
+          #     setup do
+          #       @request.session[:logged_in] = false
+          #     end
+          #   
+          #     should_be_restful do |resource|
+          #       resource.parent = :user
+          #   
+          #       resource.denied.actions = [:index, :show, :edit, :new, :create, :update, :destroy]
+          #       resource.denied.flash = /get outta here/i
+          #       resource.denied.redirect = 'new_session_url'
+          #     end    
+          #   end
+          #
+          class DeniedOptions
+            # String evaled to get the target of the redirection.
+            # All of the instance variables set by the controller will be available to the 
+            # evaled code.
+            #
+            # Example:
+            #   resource.create.redirect  = &quot;user_url(@user.company, @user)&quot;
+            attr_accessor :redirect
+
+            # String or Regexp describing a value expected in the flash.  Will match against any flash key.
+            #
+            # Example:
+            #   resource.create.flash = /created/
+            attr_accessor :flash
+
+            # Actions that should be denied (only used by resource.denied).  &lt;i&gt;Note that these actions will
+            # only be tested if they are also listed in +resource.actions+&lt;/i&gt;
+            # The special value of :all will deny all of the REST actions.
+            attr_accessor :actions
+          end
 
-        # Name of key in params that references the primary key.  
-        # Will almost always be :id (default), unless you are using a plugin or have patched rails.
-        attr_accessor :identifier
-        
-        # Name of the ActiveRecord class this resource is responsible for.  Automatically determined from
-        # test class if not explicitly set.  UserTest =&gt; &quot;User&quot;
-        attr_accessor :klass
+          # Name of key in params that references the primary key.  
+          # Will almost always be :id (default), unless you are using a plugin or have patched rails.
+          attr_accessor :identifier
+          
+          # Name of the ActiveRecord class this resource is responsible for.  Automatically determined from
+          # test class if not explicitly set.  UserTest =&gt; &quot;User&quot;
+          attr_accessor :klass
 
-        # Name of the instantiated ActiveRecord object that should be used by some of the tests.  
-        # Defaults to the underscored name of the AR class.  CompanyManager =&gt; :company_manager
-        attr_accessor :object
+          # Name of the instantiated ActiveRecord object that should be used by some of the tests.  
+          # Defaults to the underscored name of the AR class.  CompanyManager =&gt; :company_manager
+          attr_accessor :object
 
-        # Name of the parent AR objects.  Can be set as parent= or parents=, and can take either
-        # the name of the parent resource (if there's only one), or an array of names (if there's
-        # more than one).
-        #
-        # Example:
-        #   # in the routes...
-        #   map.resources :companies do
-        #     map.resources :people do
-        #       map.resources :limbs
-        #     end
-        #   end
-        #
-        #   # in the tests...
-        #   class PeopleControllerTest &lt; Test::Unit::TestCase
-        #     should_be_restful do |resource|
-        #       resource.parent = :companies
-        #     end
-        #   end
-        #
-        #   class LimbsControllerTest &lt; Test::Unit::TestCase
-        #     should_be_restful do |resource|
-        #       resource.parents = [:companies, :people]
-        #     end
-        #   end
-        attr_accessor :parent
-        alias parents parent
-        alias parents= parent=
-        
-        # Actions that should be tested.  Must be a subset of VALID_ACTIONS (default).
-        # Tests for each actionw will only be generated if the action is listed here.
-        # The special value of :all will test all of the REST actions.
-        #
-        # Example (for a read-only controller):
-        #   resource.actions = [:show, :index]
-        attr_accessor :actions
+          # Name of the parent AR objects.  Can be set as parent= or parents=, and can take either
+          # the name of the parent resource (if there's only one), or an array of names (if there's
+          # more than one).
+          #
+          # Example:
+          #   # in the routes...
+          #   map.resources :companies do
+          #     map.resources :people do
+          #       map.resources :limbs
+          #     end
+          #   end
+          #
+          #   # in the tests...
+          #   class PeopleControllerTest &lt; Test::Unit::TestCase
+          #     should_be_restful do |resource|
+          #       resource.parent = :companies
+          #     end
+          #   end
+          #
+          #   class LimbsControllerTest &lt; Test::Unit::TestCase
+          #     should_be_restful do |resource|
+          #       resource.parents = [:companies, :people]
+          #     end
+          #   end
+          attr_accessor :parent
+          alias parents parent
+          alias parents= parent=
+          
+          # Actions that should be tested.  Must be a subset of VALID_ACTIONS (default).
+          # Tests for each actionw will only be generated if the action is listed here.
+          # The special value of :all will test all of the REST actions.
+          #
+          # Example (for a read-only controller):
+          #   resource.actions = [:show, :index]
+          attr_accessor :actions
 
-        # Formats that should be tested.  Must be a subset of VALID_FORMATS (default).
-        # Each action will be tested against the formats listed here.  The special value
-        # of :all will test all of the supported formats.
-        #
-        # Example:
-        #   resource.actions = [:html, :xml]
-        attr_accessor :formats
-        
-        # ActionOptions object specifying options for the create action.
-        attr_accessor :create
+          # Formats that should be tested.  Must be a subset of VALID_FORMATS (default).
+          # Each action will be tested against the formats listed here.  The special value
+          # of :all will test all of the supported formats.
+          #
+          # Example:
+          #   resource.actions = [:html, :xml]
+          attr_accessor :formats
+          
+          # ActionOptions object specifying options for the create action.
+          attr_accessor :create
 
-        # ActionOptions object specifying options for the update action.
-        attr_accessor :update
+          # ActionOptions object specifying options for the update action.
+          attr_accessor :update
 
-        # ActionOptions object specifying options for the desrtoy action.
-        attr_accessor :destroy
+          # ActionOptions object specifying options for the desrtoy action.
+          attr_accessor :destroy
 
-        # DeniedOptions object specifying which actions should return deny a request, and what should happen in that case.
-        attr_accessor :denied
+          # DeniedOptions object specifying which actions should return deny a request, and what should happen in that case.
+          attr_accessor :denied
 
-        def initialize # :nodoc:
-          @create  = ActionOptions.new
-          @update  = ActionOptions.new
-          @destroy = ActionOptions.new
-          @denied  = DeniedOptions.new
+          def initialize # :nodoc:
+            @create  = ActionOptions.new
+            @update  = ActionOptions.new
+            @destroy = ActionOptions.new
+            @denied  = DeniedOptions.new
 
-          @create.flash  ||= /created/i
-          @update.flash  ||= /updated/i
-          @destroy.flash ||= /removed/i
-          @denied.flash  ||= /denied/i
+            @create.flash  ||= /created/i
+            @update.flash  ||= /updated/i
+            @destroy.flash ||= /removed/i
+            @denied.flash  ||= /denied/i
 
-          @create.params  ||= {}
-          @update.params  ||= {}
+            @create.params  ||= {}
+            @update.params  ||= {}
 
-          @actions = VALID_ACTIONS
-          @formats = VALID_FORMATS
-          @denied.actions = []
-        end
+            @actions = VALID_ACTIONS
+            @formats = VALID_FORMATS
+            @denied.actions = []
+          end
 
-        def normalize!(target) # :nodoc:
-          @denied.actions  = VALID_ACTIONS if @denied.actions == :all
-          @actions         = VALID_ACTIONS if @actions        == :all
-          @formats         = VALID_FORMATS if @formats        == :all
-          
-          @denied.actions  = @denied.actions.map(&amp;:to_sym)
-          @actions         = @actions.map(&amp;:to_sym)
-          @formats         = @formats.map(&amp;:to_sym)
+          def normalize!(target) # :nodoc:
+            @denied.actions  = VALID_ACTIONS if @denied.actions == :all
+            @actions         = VALID_ACTIONS if @actions        == :all
+            @formats         = VALID_FORMATS if @formats        == :all
+            
+            @denied.actions  = @denied.actions.map(&amp;:to_sym)
+            @actions         = @actions.map(&amp;:to_sym)
+            @formats         = @formats.map(&amp;:to_sym)
+            
+            ensure_valid_members(@actions,        VALID_ACTIONS, 'actions')
+            ensure_valid_members(@denied.actions, VALID_ACTIONS, 'denied.actions')
+            ensure_valid_members(@formats,        VALID_FORMATS, 'formats')
+            
+            @identifier    ||= :id
+            @klass         ||= target.name.gsub(/ControllerTest$/, '').singularize.constantize
+            @object        ||= @klass.name.tableize.singularize
+            @parent        ||= []
+            @parent          = [@parent] unless @parent.is_a? Array
+
+            collection_helper = [@parent, @object.to_s.pluralize, 'url'].flatten.join('_')
+            collection_args   = @parent.map {|n| &quot;@#{object}.#{n}&quot;}.join(', ')
+            @destroy.redirect ||= &quot;#{collection_helper}(#{collection_args})&quot;
+
+            member_helper = [@parent, @object, 'url'].flatten.join('_')
+            member_args   = [@parent.map {|n| &quot;@#{object}.#{n}&quot;}, &quot;@#{object}&quot;].flatten.join(', ')
+            @create.redirect  ||= &quot;#{member_helper}(#{member_args})&quot;
+            @update.redirect  ||= &quot;#{member_helper}(#{member_args})&quot;
+            @denied.redirect  ||= &quot;new_session_url&quot;
+          end
           
-          ensure_valid_members(@actions,        VALID_ACTIONS, 'actions')
-          ensure_valid_members(@denied.actions, VALID_ACTIONS, 'denied.actions')
-          ensure_valid_members(@formats,        VALID_FORMATS, 'formats')
+          private
           
-          @identifier    ||= :id
-          @klass         ||= target.name.gsub(/ControllerTest$/, '').singularize.constantize
-          @object        ||= @klass.name.tableize.singularize
-          @parent        ||= []
-          @parent          = [@parent] unless @parent.is_a? Array
-
-          collection_helper = [@parent, @object.to_s.pluralize, 'url'].flatten.join('_')
-          collection_args   = @parent.map {|n| &quot;@#{object}.#{n}&quot;}.join(', ')
-          @destroy.redirect ||= &quot;#{collection_helper}(#{collection_args})&quot;
-
-          member_helper = [@parent, @object, 'url'].flatten.join('_')
-          member_args   = [@parent.map {|n| &quot;@#{object}.#{n}&quot;}, &quot;@#{object}&quot;].flatten.join(', ')
-          @create.redirect  ||= &quot;#{member_helper}(#{member_args})&quot;
-          @update.redirect  ||= &quot;#{member_helper}(#{member_args})&quot;
-          @denied.redirect  ||= &quot;new_session_url&quot;
-        end
-        
-        private
-        
-        def ensure_valid_members(ary, valid_members, name)  # :nodoc:
-          invalid = ary - valid_members
-          raise ArgumentError, &quot;Unsupported #{name}: #{invalid.inspect}&quot; unless invalid.empty?
+          def ensure_valid_members(ary, valid_members, name)  # :nodoc:
+            invalid = ary - valid_members
+            raise ArgumentError, &quot;Unsupported #{name}: #{invalid.inspect}&quot; unless invalid.empty?
+          end
         end
-      end
 
-      # :section: should_be_restful
-      # Generates a full suite of tests for a restful controller.
-      #
-      # The following definition will generate tests for the +index+, +show+, +new+, 
-      # +edit+, +create+, +update+ and +destroy+ actions, in both +html+ and +xml+ formats:
-      #
-      #   should_be_restful do |resource|
-      #     resource.parent = :user
-      #   
-      #     resource.create.params = { :title =&gt; &quot;first post&quot;, :body =&gt; 'blah blah blah'}
-      #     resource.update.params = { :title =&gt; &quot;changed&quot; }
-      #   end
-      #
-      # This generates about 40 tests, all of the format:
-      #   &quot;on GET to :show should assign @user.&quot;
-      #   &quot;on GET to :show should not set the flash.&quot;
-      #   &quot;on GET to :show should render 'show' template.&quot;
-      #   &quot;on GET to :show should respond with success.&quot;
-      #   &quot;on GET to :show as xml should assign @user.&quot;
-      #   &quot;on GET to :show as xml should have ContentType set to 'application/xml'.&quot;
-      #   &quot;on GET to :show as xml should respond with success.&quot;
-      #   &quot;on GET to :show as xml should return &lt;user/&gt; as the root element.&quot;
-      # The +resource+ parameter passed into the block is a ResourceOptions object, and 
-      # is used to configure the tests for the details of your resources.
-      #
-      def should_be_restful(&amp;blk) # :yields: resource
-        resource = ResourceOptions.new
-        blk.call(resource)
-        resource.normalize!(self)
-
-        resource.formats.each do |format|
-          resource.actions.each do |action|
-            if self.respond_to? :&quot;make_#{action}_#{format}_tests&quot;
-              self.send(:&quot;make_#{action}_#{format}_tests&quot;, resource) 
-            else
-              should &quot;test #{action} #{format}&quot; do
-                flunk &quot;Test for #{action} as #{format} not implemented&quot;
+        # :section: should_be_restful
+        # Generates a full suite of tests for a restful controller.
+        #
+        # The following definition will generate tests for the +index+, +show+, +new+, 
+        # +edit+, +create+, +update+ and +destroy+ actions, in both +html+ and +xml+ formats:
+        #
+        #   should_be_restful do |resource|
+        #     resource.parent = :user
+        #   
+        #     resource.create.params = { :title =&gt; &quot;first post&quot;, :body =&gt; 'blah blah blah'}
+        #     resource.update.params = { :title =&gt; &quot;changed&quot; }
+        #   end
+        #
+        # This generates about 40 tests, all of the format:
+        #   &quot;on GET to :show should assign @user.&quot;
+        #   &quot;on GET to :show should not set the flash.&quot;
+        #   &quot;on GET to :show should render 'show' template.&quot;
+        #   &quot;on GET to :show should respond with success.&quot;
+        #   &quot;on GET to :show as xml should assign @user.&quot;
+        #   &quot;on GET to :show as xml should have ContentType set to 'application/xml'.&quot;
+        #   &quot;on GET to :show as xml should respond with success.&quot;
+        #   &quot;on GET to :show as xml should return &lt;user/&gt; as the root element.&quot;
+        # The +resource+ parameter passed into the block is a ResourceOptions object, and 
+        # is used to configure the tests for the details of your resources.
+        #
+        def should_be_restful(&amp;blk) # :yields: resource
+          resource = ResourceOptions.new
+          blk.call(resource)
+          resource.normalize!(self)
+
+          resource.formats.each do |format|
+            resource.actions.each do |action|
+              if self.respond_to? :&quot;make_#{action}_#{format}_tests&quot;
+                self.send(:&quot;make_#{action}_#{format}_tests&quot;, resource) 
+              else
+                should &quot;test #{action} #{format}&quot; do
+                  flunk &quot;Test for #{action} as #{format} not implemented&quot;
+                end
               end
             end
           end
         end
-      end
 
-      # :section: Test macros
-      
-      # Macro that creates a test asserting that the flash contains the given value.
-      # val can be a String, a Regex, or nil (indicating that the flash should not be set)
-      #
-      # Example:
-      #
-      #   should_set_the_flash_to &quot;Thank you for placing this order.&quot;
-      #   should_set_the_flash_to /created/i
-      #   should_set_the_flash_to nil
-      def should_set_the_flash_to(val)
-        if val
-          should &quot;have #{val.inspect} in the flash&quot; do
-            assert_contains flash.values, val, &quot;, Flash: #{flash.inspect}&quot;            
-          end
-        else
-          should &quot;not set the flash&quot; do
-            assert_equal({}, flash, &quot;Flash was set to:\n#{flash.inspect}&quot;)
+        # :section: Test macros
+        
+        # Macro that creates a test asserting that the flash contains the given value.
+        # val can be a String, a Regex, or nil (indicating that the flash should not be set)
+        #
+        # Example:
+        #
+        #   should_set_the_flash_to &quot;Thank you for placing this order.&quot;
+        #   should_set_the_flash_to /created/i
+        #   should_set_the_flash_to nil
+        def should_set_the_flash_to(val)
+          if val
+            should &quot;have #{val.inspect} in the flash&quot; do
+              assert_contains flash.values, val, &quot;, Flash: #{flash.inspect}&quot;            
+            end
+          else
+            should &quot;not set the flash&quot; do
+              assert_equal({}, flash, &quot;Flash was set to:\n#{flash.inspect}&quot;)
+            end
           end
         end
-      end
-  
-      # Macro that creates a test asserting that the flash is empty.  Same as
-      # @should_set_the_flash_to nil@
-      def should_not_set_the_flash
-        should_set_the_flash_to nil
-      end
-      
-      # Macro that creates a test asserting that the controller assigned to @name
-      #
-      # Example:
-      #
-      #   should_assign_to :user
-      def should_assign_to(name)
-        should &quot;assign @#{name}&quot; do
-          assert assigns(name.to_sym), &quot;The action isn't assigning to @#{name}&quot;
+    
+        # Macro that creates a test asserting that the flash is empty.  Same as
+        # @should_set_the_flash_to nil@
+        def should_not_set_the_flash
+          should_set_the_flash_to nil
         end
-      end
-
-      # Macro that creates a test asserting that the controller did not assign to @name
-      #
-      # Example:
-      #
-      #   should_not_assign_to :user
-      def should_not_assign_to(name)
-        should &quot;not assign to @#{name}&quot; do
-          assert !assigns(name.to_sym), &quot;@#{name} was visible&quot;
+        
+        # Macro that creates a test asserting that the controller assigned to @name
+        #
+        # Example:
+        #
+        #   should_assign_to :user
+        def should_assign_to(name)
+          should &quot;assign @#{name}&quot; do
+            assert assigns(name.to_sym), &quot;The action isn't assigning to @#{name}&quot;
+          end
         end
-      end
 
-      # Macro that creates a test asserting that the controller responded with a 'response' status code.
-      # Example:
-      #
-      #   should_respond_with :success
-      def should_respond_with(response)
-        should &quot;respond with #{response}&quot; do
-          assert_response response
-        end
-      end
-  
-      # Macro that creates a test asserting that the controller rendered the given template.
-      # Example:
-      #
-      #   should_render_template :new
-      def should_render_template(template)
-        should &quot;render template #{template.inspect}&quot; do            
-          assert_template template.to_s
+        # Macro that creates a test asserting that the controller did not assign to @name
+        #
+        # Example:
+        #
+        #   should_not_assign_to :user
+        def should_not_assign_to(name)
+          should &quot;not assign to @#{name}&quot; do
+            assert !assigns(name.to_sym), &quot;@#{name} was visible&quot;
+          end
         end
-      end
 
-      # Macro that creates a test asserting that the controller returned a redirect to the given path.
-      # The given string is evaled to produce the resulting redirect path.  All of the instance variables
-      # set by the controller are available to the evaled string.
-      # Example:
-      #
-      #   should_redirect_to '&quot;/&quot;'
-      #   should_redirect_to &quot;users_url(@user)&quot;
-      def should_redirect_to(url)
-        should &quot;redirect to #{url.inspect}&quot; do
-          instantiate_variables_from_assigns do
-            assert_redirected_to eval(url, self.send(:binding), __FILE__, __LINE__)
+        # Macro that creates a test asserting that the controller responded with a 'response' status code.
+        # Example:
+        #
+        #   should_respond_with :success
+        def should_respond_with(response)
+          should &quot;respond with #{response}&quot; do
+            assert_response response
           end
         end
-      end
-      
-      # Macro that creates a test asserting that the rendered view contains a &lt;form&gt; element.
-      def should_render_a_form
-        should &quot;display a form&quot; do
-          assert_select &quot;form&quot;, true, &quot;The template doesn't contain a &lt;form&gt; element&quot;            
+    
+        # Macro that creates a test asserting that the controller rendered the given template.
+        # Example:
+        #
+        #   should_render_template :new
+        def should_render_template(template)
+          should &quot;render template #{template.inspect}&quot; do            
+            assert_template template.to_s
+          end
         end
-      end
-    end
 
-    module InstanceMethods # :nodoc:
-      
-      private # :enddoc:
-      
-      SPECIAL_INSTANCE_VARIABLES = %w{
-        _cookies
-        _flash
-        _headers
-        _params
-        _request
-        _response
-        _session
-        action_name
-        before_filter_chain_aborted
-        cookies
-        flash
-        headers
-        ignore_missing_templates
-        logger
-        params
-        request
-        request_origin
-        response
-        session
-        template
-        template_class
-        template_root
-        url
-        variables_added
-      }.map(&amp;:to_s)
-      
-      def instantiate_variables_from_assigns(*names, &amp;blk)
-        old = {}
-        names = (@response.template.assigns.keys - SPECIAL_INSTANCE_VARIABLES) if names.empty?
-        names.each do |name|
-          old[name] = instance_variable_get(&quot;@#{name}&quot;)
-          instance_variable_set(&quot;@#{name}&quot;, assigns(name.to_sym))
+        # Macro that creates a test asserting that the controller returned a redirect to the given path.
+        # The given string is evaled to produce the resulting redirect path.  All of the instance variables
+        # set by the controller are available to the evaled string.
+        # Example:
+        #
+        #   should_redirect_to '&quot;/&quot;'
+        #   should_redirect_to &quot;users_url(@user)&quot;
+        def should_redirect_to(url)
+          should &quot;redirect to #{url.inspect}&quot; do
+            instantiate_variables_from_assigns do
+              assert_redirected_to eval(url, self.send(:binding), __FILE__, __LINE__)
+            end
+          end
         end
-        blk.call
-        names.each do |name|
-          instance_variable_set(&quot;@#{name}&quot;, old[name])
+        
+        # Macro that creates a test asserting that the rendered view contains a &lt;form&gt; element.
+        def should_render_a_form
+          should &quot;display a form&quot; do
+            assert_select &quot;form&quot;, true, &quot;The template doesn't contain a &lt;form&gt; element&quot;            
+          end
         end
       end
 
-      def get_existing_record(res) # :nodoc:
-        returning(instance_variable_get(&quot;@#{res.object}&quot;)) do |record|
-          assert(record, &quot;This test requires you to set @#{res.object} in your setup block&quot;)    
+      module InstanceMethods # :nodoc:
+        
+        private # :enddoc:
+        
+        SPECIAL_INSTANCE_VARIABLES = %w{
+          _cookies
+          _flash
+          _headers
+          _params
+          _request
+          _response
+          _session
+          action_name
+          before_filter_chain_aborted
+          cookies
+          flash
+          headers
+          ignore_missing_templates
+          logger
+          params
+          request
+          request_origin
+          response
+          session
+          template
+          template_class
+          template_root
+          url
+          variables_added
+        }.map(&amp;:to_s)
+        
+        def instantiate_variables_from_assigns(*names, &amp;blk)
+          old = {}
+          names = (@response.template.assigns.keys - SPECIAL_INSTANCE_VARIABLES) if names.empty?
+          names.each do |name|
+            old[name] = instance_variable_get(&quot;@#{name}&quot;)
+            instance_variable_set(&quot;@#{name}&quot;, assigns(name.to_sym))
+          end
+          blk.call
+          names.each do |name|
+            instance_variable_set(&quot;@#{name}&quot;, old[name])
+          end
         end
-      end
 
-      def make_parent_params(resource, record = nil, parent_names = nil) # :nodoc:
-        parent_names ||= resource.parents.reverse
-        return {} if parent_names == [] # Base case
-        parent_name = parent_names.shift
-        parent = record ? record.send(parent_name) : parent_name.to_s.classify.constantize.find(:first)
+        def get_existing_record(res) # :nodoc:
+          returning(instance_variable_get(&quot;@#{res.object}&quot;)) do |record|
+            assert(record, &quot;This test requires you to set @#{res.object} in your setup block&quot;)    
+          end
+        end
 
-        { :&quot;#{parent_name}_id&quot; =&gt; parent.to_param }.merge(make_parent_params(resource, parent, parent_names))
-      end
+        def make_parent_params(resource, record = nil, parent_names = nil) # :nodoc:
+          parent_names ||= resource.parents.reverse
+          return {} if parent_names == [] # Base case
+          parent_name = parent_names.shift
+          parent = record ? record.send(parent_name) : parent_name.to_s.classify.constantize.find(:first)
 
-    end
-  end  
-end
+          { :&quot;#{parent_name}_id&quot; =&gt; parent.to_param }.merge(make_parent_params(resource, parent, parent_names))
+        end
 
-module ActionController #:nodoc: all
-  module Integration
-    class Session 
-      include Shoulda::General
-    end
+      end
+    end  
   end
 end
+</diff>
      <filename>lib/shoulda/controller_tests/controller_tests.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,194 +1,196 @@
-module Shoulda 
-  module Controller # :nodoc:
-    module HTML # :nodoc: all
-      def self.included(other)
-        other.class_eval do
-          extend Shoulda::Controller::HTML::ClassMethods
-        end
-      end
-
-      module ClassMethods 
-        def controller_name_from_class
-          self.name.gsub(/Test/, '')
+module ThoughtBot # :nodoc: 
+  module Shoulda # :nodoc: 
+    module Controller # :nodoc:
+      module HTML # :nodoc: all
+        def self.included(other)
+          other.class_eval do
+            extend ThoughtBot::Shoulda::Controller::HTML::ClassMethods
+          end
         end
+  
+        module ClassMethods 
+          def controller_name_from_class
+            self.name.gsub(/Test/, '')
+          end
 
-        def make_show_html_tests(res)
-          context &quot;on GET to #{controller_name_from_class}#show&quot; do
-            setup do
-              record = get_existing_record(res)
-              parent_params = make_parent_params(res, record)
-              get :show, parent_params.merge({ res.identifier =&gt; record.to_param })          
-            end
+          def make_show_html_tests(res)
+            context &quot;on GET to #{controller_name_from_class}#show&quot; do
+              setup do
+                record = get_existing_record(res)
+                parent_params = make_parent_params(res, record)
+                get :show, parent_params.merge({ res.identifier =&gt; record.to_param })          
+              end
 
-            if res.denied.actions.include?(:show)
-              should_not_assign_to res.object
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-            else
-              should_assign_to res.object          
-              should_respond_with :success
-              should_render_template :show
-              should_not_set_the_flash
+              if res.denied.actions.include?(:show)
+                should_not_assign_to res.object
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
+              else
+                should_assign_to res.object          
+                should_respond_with :success
+                should_render_template :show
+                should_not_set_the_flash
+              end
             end
           end
-        end
 
-        def make_edit_html_tests(res)
-          context &quot;on GET to #{controller_name_from_class}#edit&quot; do
-            setup do
-              @record = get_existing_record(res)
-              parent_params = make_parent_params(res, @record)
-              get :edit, parent_params.merge({ res.identifier =&gt; @record.to_param })          
-            end
-      
-            if res.denied.actions.include?(:edit)
-              should_not_assign_to res.object
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-            else
-              should_assign_to res.object                    
-              should_respond_with :success
-              should_render_template :edit
-              should_not_set_the_flash
-              should_render_a_form
-              should &quot;set @#{res.object} to requested instance&quot; do
-                assert_equal @record, assigns(res.object)
+          def make_edit_html_tests(res)
+            context &quot;on GET to #{controller_name_from_class}#edit&quot; do
+              setup do
+                @record = get_existing_record(res)
+                parent_params = make_parent_params(res, @record)
+                get :edit, parent_params.merge({ res.identifier =&gt; @record.to_param })          
+              end
+        
+              if res.denied.actions.include?(:edit)
+                should_not_assign_to res.object
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
+              else
+                should_assign_to res.object                    
+                should_respond_with :success
+                should_render_template :edit
+                should_not_set_the_flash
+                should_render_a_form
+                should &quot;set @#{res.object} to requested instance&quot; do
+                  assert_equal @record, assigns(res.object)
+                end
               end
             end
           end
-        end
 
-        def make_index_html_tests(res)
-          context &quot;on GET to #{controller_name_from_class}#index&quot; do
-            setup do
-              record = get_existing_record(res) rescue nil
-              parent_params = make_parent_params(res, record)
-              get(:index, parent_params)          
-            end
+          def make_index_html_tests(res)
+            context &quot;on GET to #{controller_name_from_class}#index&quot; do
+              setup do
+                record = get_existing_record(res) rescue nil
+                parent_params = make_parent_params(res, record)
+                get(:index, parent_params)          
+              end
 
-            if res.denied.actions.include?(:index)
-              should_not_assign_to res.object.to_s.pluralize
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash          
-            else
-              should_respond_with :success
-              should_assign_to res.object.to_s.pluralize
-              should_render_template :index
-              should_not_set_the_flash
+              if res.denied.actions.include?(:index)
+                should_not_assign_to res.object.to_s.pluralize
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash          
+              else
+                should_respond_with :success
+                should_assign_to res.object.to_s.pluralize
+                should_render_template :index
+                should_not_set_the_flash
+              end
             end
           end
-        end
 
-        def make_new_html_tests(res)
-          context &quot;on GET to #{controller_name_from_class}#new&quot; do
-            setup do
-              record = get_existing_record(res) rescue nil
-              parent_params = make_parent_params(res, record)
-              get(:new, parent_params)          
-            end
+          def make_new_html_tests(res)
+            context &quot;on GET to #{controller_name_from_class}#new&quot; do
+              setup do
+                record = get_existing_record(res) rescue nil
+                parent_params = make_parent_params(res, record)
+                get(:new, parent_params)          
+              end
 
-            if res.denied.actions.include?(:new)
-              should_not_assign_to res.object
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-            else
-              should_respond_with :success
-              should_assign_to res.object
-              should_not_set_the_flash
-              should_render_template :new
-              should_render_a_form
+              if res.denied.actions.include?(:new)
+                should_not_assign_to res.object
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
+              else
+                should_respond_with :success
+                should_assign_to res.object
+                should_not_set_the_flash
+                should_render_template :new
+                should_render_a_form
+              end
             end
           end
-        end
 
-        def make_destroy_html_tests(res)
-          context &quot;on DELETE to #{controller_name_from_class}#destroy&quot; do
-            setup do
-              @record = get_existing_record(res)
-              parent_params = make_parent_params(res, @record)
-              delete :destroy, parent_params.merge({ res.identifier =&gt; @record.to_param })
-            end
-      
-            if res.denied.actions.include?(:destroy)
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-        
-              should &quot;not destroy record&quot; do
-                assert_nothing_raised { assert @record.reload }
+          def make_destroy_html_tests(res)
+            context &quot;on DELETE to #{controller_name_from_class}#destroy&quot; do
+              setup do
+                @record = get_existing_record(res)
+                parent_params = make_parent_params(res, @record)
+                delete :destroy, parent_params.merge({ res.identifier =&gt; @record.to_param })
               end
-            else
-              should_set_the_flash_to res.destroy.flash
-              if res.destroy.redirect.is_a? Symbol
-                should_respond_with res.destroy.redirect
+        
+              if res.denied.actions.include?(:destroy)
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
+          
+                should &quot;not destroy record&quot; do
+                  assert_nothing_raised { assert @record.reload }
+                end
               else
-                should_redirect_to res.destroy.redirect
-              end
+                should_set_the_flash_to res.destroy.flash
+                if res.destroy.redirect.is_a? Symbol
+                  should_respond_with res.destroy.redirect
+                else
+                  should_redirect_to res.destroy.redirect
+                end
 
-              should &quot;destroy record&quot; do
-                assert_raises(::ActiveRecord::RecordNotFound, &quot;@#{res.object} was not destroyed.&quot;) do
-                  @record.reload
+                should &quot;destroy record&quot; do
+                  assert_raises(::ActiveRecord::RecordNotFound, &quot;@#{res.object} was not destroyed.&quot;) do
+                    @record.reload
+                  end
                 end
               end
             end
           end
-        end
 
-        def make_create_html_tests(res)
-          context &quot;on POST to #{controller_name_from_class}#create with #{res.create.params.inspect}&quot; do
-            setup do
-              record = get_existing_record(res) rescue nil
-              parent_params = make_parent_params(res, record)
-              @count = res.klass.count
-              post :create, parent_params.merge(res.object =&gt; res.create.params)
-            end
-      
-            if res.denied.actions.include?(:create)
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-              should_not_assign_to res.object
+          def make_create_html_tests(res)
+            context &quot;on POST to #{controller_name_from_class}#create with #{res.create.params.inspect}&quot; do
+              setup do
+                record = get_existing_record(res) rescue nil
+                parent_params = make_parent_params(res, record)
+                @count = res.klass.count
+                post :create, parent_params.merge(res.object =&gt; res.create.params)
+              end
         
-              should &quot;not create new record&quot; do
-                assert_equal @count, res.klass.count
-              end          
-            else
-              should_assign_to res.object
-              should_set_the_flash_to res.create.flash
-              if res.create.redirect.is_a? Symbol
-                should_respond_with res.create.redirect
+              if res.denied.actions.include?(:create)
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
+                should_not_assign_to res.object
+          
+                should &quot;not create new record&quot; do
+                  assert_equal @count, res.klass.count
+                end          
               else
-                should_redirect_to res.create.redirect
-              end
+                should_assign_to res.object
+                should_set_the_flash_to res.create.flash
+                if res.create.redirect.is_a? Symbol
+                  should_respond_with res.create.redirect
+                else
+                  should_redirect_to res.create.redirect
+                end
 
-              should &quot;not have errors on @#{res.object}&quot; do
-                assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;            
-              end
-            end      
+                should &quot;not have errors on @#{res.object}&quot; do
+                  assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;            
+                end
+              end      
+            end
           end
-        end
 
-        def make_update_html_tests(res)
-          context &quot;on PUT to #{controller_name_from_class}#update with #{res.create.params.inspect}&quot; do
-            setup do
-              @record = get_existing_record(res)
-              parent_params = make_parent_params(res, @record)
-              put :update, parent_params.merge(res.identifier =&gt; @record.to_param, res.object =&gt; res.update.params)
-            end
+          def make_update_html_tests(res)
+            context &quot;on PUT to #{controller_name_from_class}#update with #{res.create.params.inspect}&quot; do
+              setup do
+                @record = get_existing_record(res)
+                parent_params = make_parent_params(res, @record)
+                put :update, parent_params.merge(res.identifier =&gt; @record.to_param, res.object =&gt; res.update.params)
+              end
 
-            if res.denied.actions.include?(:update)
-              should_not_assign_to res.object
-              should_redirect_to res.denied.redirect
-              should_set_the_flash_to res.denied.flash
-            else
-              should_assign_to res.object
-              should_set_the_flash_to(res.update.flash)
-              if res.update.redirect.is_a? Symbol
-                should_respond_with res.update.redirect
+              if res.denied.actions.include?(:update)
+                should_not_assign_to res.object
+                should_redirect_to res.denied.redirect
+                should_set_the_flash_to res.denied.flash
               else
-                should_redirect_to res.update.redirect
-              end
-              
-              should &quot;not have errors on @#{res.object}&quot; do
-                assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;
+                should_assign_to res.object
+                should_set_the_flash_to(res.update.flash)
+                if res.update.redirect.is_a? Symbol
+                  should_respond_with res.update.redirect
+                else
+                  should_redirect_to res.update.redirect
+                end
+                
+                should &quot;not have errors on @#{res.object}&quot; do
+                  assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;
+                end
               end
             end
           end</diff>
      <filename>lib/shoulda/controller_tests/formats/html.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,168 +1,170 @@
-module Shoulda
-  module Controller # :nodoc:
-    module XML 
-      def self.included(other) #:nodoc:
-        other.class_eval do
-          extend Shoulda::Controller::XML::ClassMethods
-        end
-      end
-
-      module ClassMethods
-        # Macro that creates a test asserting that the controller responded with an XML content-type
-        # and that the XML contains +&lt;name/&gt;+ as the root element.
-        def should_respond_with_xml_for(name = nil)
-          should &quot;have ContentType set to 'application/xml'&quot; do
-            assert_xml_response
-          end
-          
-          if name
-            should &quot;return &lt;#{name}/&gt; as the root element&quot; do
-              body = @response.body.first(100).map {|l| &quot;  #{l}&quot;}
-              assert_select name.to_s.dasherize, 1, &quot;Body:\n#{body}...\nDoes not have &lt;#{name}/&gt; as the root element.&quot;
-            end
+module ThoughtBot # :nodoc: 
+  module Shoulda # :nodoc: 
+    module Controller # :nodoc:
+      module XML 
+        def self.included(other) #:nodoc:
+          other.class_eval do
+            extend ThoughtBot::Shoulda::Controller::XML::ClassMethods
           end
         end
-        alias should_respond_with_xml should_respond_with_xml_for
-        
-        protected
-                  
-        def make_show_xml_tests(res) # :nodoc:
-          context &quot;on GET to #{controller_name_from_class}#show as xml&quot; do
-            setup do
-              request_xml
-              record = get_existing_record(res)
-              parent_params = make_parent_params(res, record)
-              get :show, parent_params.merge({ res.identifier =&gt; record.to_param })          
+  
+        module ClassMethods
+          # Macro that creates a test asserting that the controller responded with an XML content-type
+          # and that the XML contains +&lt;name/&gt;+ as the root element.
+          def should_respond_with_xml_for(name = nil)
+            should &quot;have ContentType set to 'application/xml'&quot; do
+              assert_xml_response
+            end
+            
+            if name
+              should &quot;return &lt;#{name}/&gt; as the root element&quot; do
+                body = @response.body.first(100).map {|l| &quot;  #{l}&quot;}
+                assert_select name.to_s.dasherize, 1, &quot;Body:\n#{body}...\nDoes not have &lt;#{name}/&gt; as the root element.&quot;
+              end
             end
+          end
+          alias should_respond_with_xml should_respond_with_xml_for
+          
+          protected
+                    
+          def make_show_xml_tests(res) # :nodoc:
+            context &quot;on GET to #{controller_name_from_class}#show as xml&quot; do
+              setup do
+                request_xml
+                record = get_existing_record(res)
+                parent_params = make_parent_params(res, record)
+                get :show, parent_params.merge({ res.identifier =&gt; record.to_param })          
+              end
 
-            if res.denied.actions.include?(:show)
-              should_not_assign_to res.object
-              should_respond_with 401
-            else
-              should_assign_to res.object          
-              should_respond_with :success
-              should_respond_with_xml_for res.object
+              if res.denied.actions.include?(:show)
+                should_not_assign_to res.object
+                should_respond_with 401
+              else
+                should_assign_to res.object          
+                should_respond_with :success
+                should_respond_with_xml_for res.object
+              end
             end
           end
-        end
 
-        def make_edit_xml_tests(res) # :nodoc:
-          # XML doesn't need an :edit action
-        end
+          def make_edit_xml_tests(res) # :nodoc:
+            # XML doesn't need an :edit action
+          end
 
-        def make_new_xml_tests(res) # :nodoc:
-          # XML doesn't need a :new action
-        end
+          def make_new_xml_tests(res) # :nodoc:
+            # XML doesn't need a :new action
+          end
 
-        def make_index_xml_tests(res) # :nodoc:
-          context &quot;on GET to #{controller_name_from_class}#index as xml&quot; do
-            setup do
-              request_xml
-              parent_params = make_parent_params(res)
-              get(:index, parent_params)          
-            end
+          def make_index_xml_tests(res) # :nodoc:
+            context &quot;on GET to #{controller_name_from_class}#index as xml&quot; do
+              setup do
+                request_xml
+                parent_params = make_parent_params(res)
+                get(:index, parent_params)          
+              end
 
-            if res.denied.actions.include?(:index)
-              should_not_assign_to res.object.to_s.pluralize
-              should_respond_with 401          
-            else
-              should_respond_with :success
-              should_respond_with_xml_for res.object.to_s.pluralize
-              should_assign_to res.object.to_s.pluralize
+              if res.denied.actions.include?(:index)
+                should_not_assign_to res.object.to_s.pluralize
+                should_respond_with 401          
+              else
+                should_respond_with :success
+                should_respond_with_xml_for res.object.to_s.pluralize
+                should_assign_to res.object.to_s.pluralize
+              end
             end
           end
-        end
 
-        def make_destroy_xml_tests(res) # :nodoc:
-          context &quot;on DELETE to #{controller_name_from_class}#destroy as xml&quot; do
-            setup do
-              request_xml
-              @record = get_existing_record(res)
-              parent_params = make_parent_params(res, @record)
-              delete :destroy, parent_params.merge({ res.identifier =&gt; @record.to_param })
-            end
-      
-            if res.denied.actions.include?(:destroy)
-              should_respond_with 401
-        
-              should &quot;not destroy record&quot; do
-                assert @record.reload
+          def make_destroy_xml_tests(res) # :nodoc:
+            context &quot;on DELETE to #{controller_name_from_class}#destroy as xml&quot; do
+              setup do
+                request_xml
+                @record = get_existing_record(res)
+                parent_params = make_parent_params(res, @record)
+                delete :destroy, parent_params.merge({ res.identifier =&gt; @record.to_param })
               end
-            else
-              should &quot;destroy record&quot; do
-                assert_raises(::ActiveRecord::RecordNotFound, &quot;@#{res.object} was not destroyed.&quot;) do
-                  @record.reload
+        
+              if res.denied.actions.include?(:destroy)
+                should_respond_with 401
+          
+                should &quot;not destroy record&quot; do
+                  assert @record.reload
+                end
+              else
+                should &quot;destroy record&quot; do
+                  assert_raises(::ActiveRecord::RecordNotFound, &quot;@#{res.object} was not destroyed.&quot;) do
+                    @record.reload
+                  end
                 end
               end
             end
           end
-        end
 
-        def make_create_xml_tests(res) # :nodoc:
-          context &quot;on POST to #{controller_name_from_class}#create as xml&quot; do
-            setup do
-              request_xml
-              parent_params = make_parent_params(res)
-              @count = res.klass.count
-              post :create, parent_params.merge(res.object =&gt; res.create.params)
-            end
-      
-            if res.denied.actions.include?(:create)
-              should_respond_with 401
-              should_not_assign_to res.object
+          def make_create_xml_tests(res) # :nodoc:
+            context &quot;on POST to #{controller_name_from_class}#create as xml&quot; do
+              setup do
+                request_xml
+                parent_params = make_parent_params(res)
+                @count = res.klass.count
+                post :create, parent_params.merge(res.object =&gt; res.create.params)
+              end
         
-              should &quot;not create new record&quot; do
-                assert_equal @count, res.klass.count
-              end          
-            else
-              should_assign_to res.object
+              if res.denied.actions.include?(:create)
+                should_respond_with 401
+                should_not_assign_to res.object
+          
+                should &quot;not create new record&quot; do
+                  assert_equal @count, res.klass.count
+                end          
+              else
+                should_assign_to res.object
 
-              should &quot;not have errors on @#{res.object}&quot; do
-                assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;            
-              end
-            end      
+                should &quot;not have errors on @#{res.object}&quot; do
+                  assert_equal [], pretty_error_messages(assigns(res.object)), &quot;@#{res.object} has errors:&quot;            
+                end
+              end      
+            end
           end
-        end
 
-        def make_update_xml_tests(res) # :nodoc:
-          context &quot;on PUT to #{controller_name_from_class}#update as xml&quot; do
-            setup do
-              request_xml
-              @record = get_existing_record(res)
-              parent_params = make_parent_params(res, @record)
-              put :update, parent_params.merge(res.identifier =&gt; @record.to_param, res.object =&gt; res.update.params)
-            end
+          def make_update_xml_tests(res) # :nodoc:
+            context &quot;on PUT to #{controller_name_from_class}#update as xml&quot; do
+              setup do
+                request_xml
+                @record = get_existing_record(res)
+                parent_params = make_parent_params(res, @record)
+                put :update, parent_params.merge(res.identifier =&gt; @record.to_param, res.object =&gt; res.update.params)
+              end
 
-            if res.denied.actions.include?(:update)
-              should_not_assign_to res.object
-              should_respond_with 401
-            else
-              should_assign_to res.object
+              if res.denied.actions.include?(:update)
+                should_not_assign_to res.object
+                should_respond_with 401
+              else
+                should_assign_to res.object
 
-              should &quot;not have errors on @#{res.object}&quot; do
-                assert_equal [], assigns(res.object).errors.full_messages, &quot;@#{res.object} has errors:&quot;
+                should &quot;not have errors on @#{res.object}&quot; do
+                  assert_equal [], assigns(res.object).errors.full_messages, &quot;@#{res.object} has errors:&quot;
+                end
               end
             end
           end
         end
-      end
 
-      # Sets the next request's format to 'application/xml'
-      def request_xml
-        @request.accept = &quot;application/xml&quot;
-      end
-      
-      # Asserts that the controller's response was 'application/xml'
-      def assert_xml_response
-        content_type = (@response.headers[&quot;Content-Type&quot;] || @response.headers[&quot;type&quot;]).to_s
-        regex = %r{\bapplication/xml\b}
+        # Sets the next request's format to 'application/xml'
+        def request_xml
+          @request.accept = &quot;application/xml&quot;
+        end
+        
+        # Asserts that the controller's response was 'application/xml'
+        def assert_xml_response
+          content_type = (@response.headers[&quot;Content-Type&quot;] || @response.headers[&quot;type&quot;]).to_s
+          regex = %r{\bapplication/xml\b}
 
-        msg = &quot;Content Type '#{content_type.inspect}' doesn't match '#{regex.inspect}'\n&quot;
-        msg += &quot;Body: #{@response.body.first(100).chomp} ...&quot; 
+          msg = &quot;Content Type '#{content_type.inspect}' doesn't match '#{regex.inspect}'\n&quot;
+          msg += &quot;Body: #{@response.body.first(100).chomp} ...&quot; 
 
-        assert_match regex, content_type, msg
+          assert_match regex, content_type, msg
+        end
+        
       end
-      
     end
   end
 end</diff>
      <filename>lib/shoulda/controller_tests/formats/xml.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,116 +1,118 @@
-module Shoulda 
-  module General
-    def self.included(other) # :nodoc:
-      other.class_eval do
-        extend Shoulda::General::ClassMethods
+module ThoughtBot # :nodoc:
+  module Shoulda # :nodoc:
+    module General
+      def self.included(other) # :nodoc:
+        other.class_eval do
+          extend ThoughtBot::Shoulda::General::ClassMethods
+        end
       end
-    end
-    
-    module ClassMethods
-      # Loads all fixture files (&lt;tt&gt;test/fixtures/*.yml&lt;/tt&gt;)
-      def load_all_fixtures
-        all_fixtures = Dir.glob(File.join(Test::Unit::TestCase.fixture_path, &quot;*.yml&quot;)).collect do |f| 
-          File.basename(f, '.yml').to_sym
+      
+      module ClassMethods
+        # Loads all fixture files (&lt;tt&gt;test/fixtures/*.yml&lt;/tt&gt;)
+        def load_all_fixtures
+          all_fixtures = Dir.glob(File.join(Test::Unit::TestCase.fixture_path, &quot;*.yml&quot;)).collect do |f| 
+            File.basename(f, '.yml').to_sym
+          end
+          fixtures *all_fixtures
         end
-        fixtures *all_fixtures
       end
-    end
-    
-    # Prints a message to stdout, tagged with the name of the calling method.
-    def report!(msg = &quot;&quot;)
-      puts(&quot;#{caller.first}: #{msg}&quot;)
-    end
-
-    # Asserts that two arrays contain the same elements, the same number of times.  Essentially ==, but unordered.
-    #
-    #   assert_same_elements([:a, :b, :c], [:c, :a, :b]) =&gt; passes
-    def assert_same_elements(a1, a2, msg = nil)
-      [:select, :inject, :size].each do |m|
-        [a1, a2].each {|a| assert_respond_to(a, m, &quot;Are you sure that #{a.inspect} is an array?  It doesn't respond to #{m}.&quot;) }
+      
+      # Prints a message to stdout, tagged with the name of the calling method.
+      def report!(msg = &quot;&quot;)
+        puts(&quot;#{caller.first}: #{msg}&quot;)
       end
 
-      assert a1h = a1.inject({}) { |h,e| h[e] = a1.select { |i| i == e }.size; h }
-      assert a2h = a2.inject({}) { |h,e| h[e] = a2.select { |i| i == e }.size; h }
+      # Asserts that two arrays contain the same elements, the same number of times.  Essentially ==, but unordered.
+      #
+      #   assert_same_elements([:a, :b, :c], [:c, :a, :b]) =&gt; passes
+      def assert_same_elements(a1, a2, msg = nil)
+        [:select, :inject, :size].each do |m|
+          [a1, a2].each {|a| assert_respond_to(a, m, &quot;Are you sure that #{a.inspect} is an array?  It doesn't respond to #{m}.&quot;) }
+        end
 
-      assert_equal(a1h, a2h, msg)
-    end
+        assert a1h = a1.inject({}) { |h,e| h[e] = a1.select { |i| i == e }.size; h }
+        assert a2h = a2.inject({}) { |h,e| h[e] = a2.select { |i| i == e }.size; h }
 
-    # Asserts that the given collection contains item x.  If x is a regular expression, ensure that
-    # at least one element from the collection matches x.  +extra_msg+ is appended to the error message if the assertion fails.
-    #
-    #   assert_contains(['a', '1'], /\d/) =&gt; passes
-    #   assert_contains(['a', '1'], 'a') =&gt; passes
-    #   assert_contains(['a', '1'], /not there/) =&gt; fails
-    def assert_contains(collection, x, extra_msg = &quot;&quot;)
-      collection = [collection] unless collection.is_a?(Array)
-      msg = &quot;#{x.inspect} not found in #{collection.to_a.inspect} #{extra_msg}&quot;
-      case x
-      when Regexp: assert(collection.detect { |e| e =~ x }, msg)
-      else         assert(collection.include?(x), msg)
-      end        
-    end
+        assert_equal(a1h, a2h, msg)
+      end
 
-    # Asserts that the given collection does not contain item x.  If x is a regular expression, ensure that
-    # none of the elements from the collection match x.
-    def assert_does_not_contain(collection, x, extra_msg = &quot;&quot;)
-      collection = [collection] unless collection.is_a?(Array)
-      msg = &quot;#{x.inspect} found in #{collection.to_a.inspect} &quot; + extra_msg
-      case x
-      when Regexp: assert(!collection.detect { |e| e =~ x }, msg)
-      else         assert(!collection.include?(x), msg)
-      end        
-    end
-    
-    # Asserts that the given object can be saved
-    #
-    #  assert_save User.new(params)
-    def assert_save(obj)
-      assert obj.save, &quot;Errors: #{pretty_error_messages obj}&quot;
-      obj.reload
-    end
+      # Asserts that the given collection contains item x.  If x is a regular expression, ensure that
+      # at least one element from the collection matches x.  +extra_msg+ is appended to the error message if the assertion fails.
+      #
+      #   assert_contains(['a', '1'], /\d/) =&gt; passes
+      #   assert_contains(['a', '1'], 'a') =&gt; passes
+      #   assert_contains(['a', '1'], /not there/) =&gt; fails
+      def assert_contains(collection, x, extra_msg = &quot;&quot;)
+        collection = [collection] unless collection.is_a?(Array)
+        msg = &quot;#{x.inspect} not found in #{collection.to_a.inspect} #{extra_msg}&quot;
+        case x
+        when Regexp: assert(collection.detect { |e| e =~ x }, msg)
+        else         assert(collection.include?(x), msg)
+        end        
+      end
 
-    # Asserts that the given object is valid
-    #
-    #  assert_valid User.new(params)
-    def assert_valid(obj)
-      assert obj.valid?, &quot;Errors: #{pretty_error_messages obj}&quot;
-    end
-    
-    # Asserts that an email was delivered.  Can take a block that can further
-    # narrow down the types of emails you're expecting. 
-    #
-    #  assert_sent_email 
-    #
-    # Passes if ActionMailer::Base.deliveries has an email
-    #  
-    #  assert_sent_email do |email|
-    #    email.subject =~ /hi there/ &amp;&amp; email.to.include?('none@none.com')
-    #  end
-    #  
-    # Passes if there is an email with subject containing 'hi there' and
-    # 'none@none.com' as one of the recipients.
-    #    
-    def assert_sent_email
-      emails = ActionMailer::Base.deliveries
-      assert !emails.empty?, &quot;No emails were sent&quot;
-      if block_given?
-        matching_emails = emails.select {|email| yield email }
-        assert !matching_emails.empty?, &quot;None of the emails matched.&quot;
+      # Asserts that the given collection does not contain item x.  If x is a regular expression, ensure that
+      # none of the elements from the collection match x.
+      def assert_does_not_contain(collection, x, extra_msg = &quot;&quot;)
+        collection = [collection] unless collection.is_a?(Array)
+        msg = &quot;#{x.inspect} found in #{collection.to_a.inspect} &quot; + extra_msg
+        case x
+        when Regexp: assert(!collection.detect { |e| e =~ x }, msg)
+        else         assert(!collection.include?(x), msg)
+        end        
+      end
+      
+      # Asserts that the given object can be saved
+      #
+      #  assert_save User.new(params)
+      def assert_save(obj)
+        assert obj.save, &quot;Errors: #{pretty_error_messages obj}&quot;
+        obj.reload
       end
-    end
 
-    # Asserts that no ActionMailer mails were delivered
-    #
-    #  assert_did_not_send_email
-    def assert_did_not_send_email
-      msg = &quot;Sent #{ActionMailer::Base.deliveries.size} emails.\n&quot;
-      ActionMailer::Base.deliveries.each { |m| msg &lt;&lt; &quot;  '#{m.subject}' sent to #{m.to.to_sentence}\n&quot; }
-      assert ActionMailer::Base.deliveries.empty?, msg
-    end
+      # Asserts that the given object is valid
+      #
+      #  assert_valid User.new(params)
+      def assert_valid(obj)
+        assert obj.valid?, &quot;Errors: #{pretty_error_messages obj}&quot;
+      end
+      
+      # Asserts that an email was delivered.  Can take a block that can further
+      # narrow down the types of emails you're expecting. 
+      #
+      #  assert_sent_email 
+      #
+      # Passes if ActionMailer::Base.deliveries has an email
+      #  
+      #  assert_sent_email do |email|
+      #    email.subject =~ /hi there/ &amp;&amp; email.to.include?('none@none.com')
+      #  end
+      #  
+      # Passes if there is an email with subject containing 'hi there' and
+      # 'none@none.com' as one of the recipients.
+      #    
+      def assert_sent_email
+        emails = ActionMailer::Base.deliveries
+        assert !emails.empty?, &quot;No emails were sent&quot;
+        if block_given?
+          matching_emails = emails.select {|email| yield email }
+          assert !matching_emails.empty?, &quot;None of the emails matched.&quot;
+        end
+      end
 
-    def pretty_error_messages(obj)
-      obj.errors.map { |a, m| &quot;#{a} #{m} (#{obj.send(a).inspect})&quot; }
+      # Asserts that no ActionMailer mails were delivered
+      #
+      #  assert_did_not_send_email
+      def assert_did_not_send_email
+        msg = &quot;Sent #{ActionMailer::Base.deliveries.size} emails.\n&quot;
+        ActionMailer::Base.deliveries.each { |m| msg &lt;&lt; &quot;  '#{m.subject}' sent to #{m.to.to_sentence}\n&quot; }
+        assert ActionMailer::Base.deliveries.empty?, msg
+      end
+
+      def pretty_error_messages(obj)
+        obj.errors.map { |a, m| &quot;#{a} #{m} (#{obj.send(a).inspect})&quot; }
+      end
+      
     end
-    
   end
 end</diff>
      <filename>lib/shoulda/general.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,20 +1,22 @@
-module Shoulda
-  module Private # :nodoc:
-    # Returns the values for the entries in the args hash who's keys are listed in the wanted array.
-    # Will raise if there are keys in the args hash that aren't listed.
-    def get_options!(args, *wanted)
-      ret  = []
-      opts = (args.last.is_a?(Hash) ? args.pop : {})
-      wanted.each {|w| ret &lt;&lt; opts.delete(w)}
-      raise ArgumentError, &quot;Unsupported options given: #{opts.keys.join(', ')}&quot; unless opts.keys.empty?
-      return *ret
-    end
+module ThoughtBot # :nodoc:
+  module Shoulda # :nodoc:
+    module Private # :nodoc:
+      # Returns the values for the entries in the args hash who's keys are listed in the wanted array.
+      # Will raise if there are keys in the args hash that aren't listed.
+      def get_options!(args, *wanted)
+        ret  = []
+        opts = (args.last.is_a?(Hash) ? args.pop : {})
+        wanted.each {|w| ret &lt;&lt; opts.delete(w)}
+        raise ArgumentError, &quot;Unsupported options given: #{opts.keys.join(', ')}&quot; unless opts.keys.empty?
+        return *ret
+      end
 
-    # Returns the model class constant, as determined by the test class name.
-    #
-    #   class TestUser; model_class; end =&gt; User
-    def model_class
-      self.name.gsub(/Test$/, '').constantize
+      # Returns the model class constant, as determined by the test class name.
+      #
+      #   class TestUser; model_class; end =&gt; User
+      def model_class
+        self.name.gsub(/Test$/, '').constantize
+      end
     end
   end
 end</diff>
      <filename>lib/shoulda/private_helpers.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>lib/shoulda/context.rb</filename>
    </removed>
    <removed>
      <filename>lib/shoulda/extensions/proc.rb</filename>
    </removed>
    <removed>
      <filename>test/shoulda/context_test.rb</filename>
    </removed>
    <removed>
      <filename>test/shoulda/helpers_test.rb</filename>
    </removed>
    <removed>
      <filename>test/shoulda/private_helpers_test.rb</filename>
    </removed>
    <removed>
      <filename>test/shoulda/shoulda_test.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>2442d1f6087041c18a2124bce4ea8a19599cde0f</id>
    </parent>
  </parents>
  <author>
    <name>Tammer Saleh</name>
    <email>tsaleh@thoughtbot.com</email>
  </author>
  <url>http://github.com/rmm5t/shoulda/commit/b415bff884a3c25a058c2600f86da80d4fa28fde</url>
  <id>b415bff884a3c25a058c2600f86da80d4fa28fde</id>
  <committed-date>2008-06-23T09:36:31-07:00</committed-date>
  <authored-date>2008-06-23T09:36:31-07:00</authored-date>
  <message>Revert bunch of bad commits:

2442d1f6087041c18a2124bce4ea8a19599cde0f
35213b5a1b84c58064d8a13b50716b29a205ebb4
804f859435a3ffa3012466a8c3f745fdc8b33965
fc938bb18557c1f5a801e3e2a15c9e4e9f8f03db

Getting the following error when running tests in a real project:

  ...activesupport/lib/active_support/dependencies.rb:276:in `load_missing_constant': uninitialized constant Shoulda::ActiveRecord::Base (NameError)

Think this is because of the namespace changes, but not sure.  Will investigate later.</message>
  <tree>68163b7b5be0a08989a6894bf3db96e92710fe05</tree>
  <committer>
    <name>Tammer Saleh</name>
    <email>tsaleh@thoughtbot.com</email>
  </committer>
</commit>
