<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -6,4 +6,4 @@ README.txt
 Rakefile
 TODO
 lib/dm-more.rb
-lib/dm-more/version.rb
\ No newline at end of file
+lib/dm-more/version.rb</diff>
      <filename>Manifest.txt</filename>
    </modified>
    <modified>
      <diff>@@ -191,7 +191,7 @@ module DataMapper
         query    = nil if query == ''
 
         return Addressable::URI.new(adapter, user, password, host, port, database, query, nil)
-      end    
+      end
 
       def build_request(query)
         if query.view</diff>
      <filename>adapters/dm-couchdb-adapter/lib/couchdb_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-couchdb-adapter/lib/couchdb_adapter/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -23,4 +23,4 @@ stories/helper.rb
 stories/resources/helpers/book.rb
 stories/resources/helpers/story_helper.rb
 stories/resources/steps/read.rb
-stories/resources/steps/using_rest_adapter.rb
\ No newline at end of file
+stories/resources/steps/using_rest_adapter.rb</diff>
      <filename>adapters/dm-rest-adapter/Manifest.txt</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 == Welcome to Rails
 
-Rails is a web-application framework that includes everything needed to create 
-database-backed web applications according to the Model-View-Control pattern. 
+Rails is a web-application framework that includes everything needed to create
+database-backed web applications according to the Model-View-Control pattern.
 
 This pattern splits the view (also called the presentation) into &quot;dumb&quot; templates
 that are primarily responsible for inserting pre-built data in between HTML tags.
@@ -70,14 +70,14 @@ Options +FollowSymLinks +ExecCGI
 
 # If you don't want Rails to look in certain directories,
 # use the following rewrite rules so that Apache won't rewrite certain requests
-# 
+#
 # Example:
 #   RewriteCond %{REQUEST_URI} ^/notrails.*
 #   RewriteRule .* - [L]
 
 # Redirect all requests not available on the filesystem to Rails
 # By default the cgi dispatcher is used which is very slow
-# 
+#
 # For better performance replace the dispatcher with the fastcgi one
 #
 # Example:
@@ -98,7 +98,7 @@ RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
 
 # In case Rails experiences terminal errors
 # Instead of displaying this message you can supply a file here which will be rendered instead
-# 
+#
 # Example:
 #   ErrorDocument 500 /500.html
 
@@ -145,7 +145,7 @@ and also on programming in general.
 
 Debugger support is available through the debugger command when you start your Mongrel or
 Webrick server with --debugger. This means that you can break out of execution at any point
-in the code, investigate and change the model, AND then resume execution! 
+in the code, investigate and change the model, AND then resume execution!
 You need to install ruby-debug to run the server in debugging mode. With gems, use 'gem install ruby-debug'
 Example:
 </diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/README</filename>
    </modified>
    <modified>
      <diff>@@ -7,9 +7,9 @@ class ApplicationController &lt; ActionController::Base
   # See ActionController::RequestForgeryProtection for details
   # Uncomment the :secret if you're not using the cookie session store
   protect_from_forgery # :secret =&gt; 'fb23937b455a775732b021a8db838ba7'
-  
-  # See ActionController::Base for details 
+
+  # See ActionController::Base for details
   # Uncomment this to filter the contents of submitted sensitive data parameters
-  # from your application log (in this case, all fields with names like &quot;password&quot;). 
+  # from your application log (in this case, all fields with names like &quot;password&quot;).
   # filter_parameter_logging :password
 end</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/app/controllers/application.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 class Book &lt; ActiveRecord::Base
   validates_presence_of :title
   validates_presence_of :author
-  
+
   belongs_to :shelf
 end</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/app/models/book.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 class Shelf &lt; ActiveRecord::Base
   validates_presence_of :name
-  
+
   has_many :books
 end</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/app/models/shelf.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,13 +20,13 @@ Rails::Initializer.run do |config|
   # you must remove the Active Record framework.
   # config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
 
-  # Specify gems that this application depends on. 
+  # Specify gems that this application depends on.
   # They can then be installed with &quot;rake gems:install&quot; on new installations.
   # config.gem &quot;bj&quot;
   # config.gem &quot;hpricot&quot;, :version =&gt; '0.6', :source =&gt; &quot;http://code.whytheluckystiff.net&quot;
   # config.gem &quot;aws-s3&quot;, :lib =&gt; &quot;aws/s3&quot;
 
-  # Only load the plugins named here, in the order given. By default, all plugins 
+  # Only load the plugins named here, in the order given. By default, all plugins
   # in vendor/plugins are loaded in alphabetical order.
   # :all can be used as a placeholder for all plugins not explicitly named
   # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
@@ -45,7 +45,7 @@ Rails::Initializer.run do |config|
 
   # Your secret key for verifying cookie session data integrity.
   # If you change this key, all old sessions will become invalid!
-  # Make sure the secret is at least 30 characters and all random, 
+  # Make sure the secret is at least 30 characters and all random,
   # no regular words or you'll be exposed to dictionary attacks.
   config.action_controller.session = {
     :session_key =&gt; '_book_service_session',</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/config/environment.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,4 +14,4 @@ config.action_view.debug_rjs                         = true
 config.action_controller.perform_caching             = false
 
 # Don't care if the mailer can't send
-config.action_mailer.raise_delivery_errors = false
\ No newline at end of file
+config.action_mailer.raise_delivery_errors = false</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/config/environments/development.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 # Be sure to restart your server when you modify this file.
 
-# Add new inflection rules using the following format 
+# Add new inflection rules using the following format
 # (all these examples are active by default):
 # Inflector.inflections do |inflect|
 #   inflect.plural /^(ox)$/i, '\1en'</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/config/initializers/inflections.rb</filename>
    </modified>
    <modified>
      <diff>@@ -12,4 +12,4 @@ ActiveSupport.use_standard_json_time_format = true
 
 # Don't escape HTML entities in JSON, leave that for the #json_escape helper.
 # if you're including raw json in an HTML page.
-ActiveSupport.escape_html_entities_in_json = false
\ No newline at end of file
+ActiveSupport.escape_html_entities_in_json = false</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/config/initializers/new_rails_defaults.rb</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@ ActionController::Routing::Routes.draw do |map|
 
   # Sample resource route with sub-resources:
   #   map.resources :products, :has_many =&gt; [ :comments, :sales ], :has_one =&gt; :seller
-  
+
   # Sample resource route with more complex sub-resources
   #   map.resources :products do |products|
   #     products.resources :comments</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/config/routes.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,17 +2,17 @@ class CreateFakeBooksAndShelves &lt; ActiveRecord::Migration
   def self.up
     books = []
     books &lt;&lt; Book.new(:title =&gt; &quot;The Pragmatic Programmer&quot;, :author =&gt; &quot;Dave Thomas&quot;)
-    books &lt;&lt; Book.new(:title =&gt; &quot;Agile Web Development With Rails&quot;, :author =&gt; &quot;Dave Thomas&quot;)    
+    books &lt;&lt; Book.new(:title =&gt; &quot;Agile Web Development With Rails&quot;, :author =&gt; &quot;Dave Thomas&quot;)
     shelf = Shelf.new(:name =&gt; &quot;Ruby Geekery&quot;)
     books.each { |book| shelf.books &lt;&lt; book }
     shelf.save!
-    
+
     books.clear
     books &lt;&lt; Book.new(:title =&gt; &quot;Kama Sutra&quot;, :author =&gt; &quot;Who fucking knows&quot;)
     books &lt;&lt; Book.new(:title =&gt; &quot;Sex for Dummies&quot;, :author =&gt; &quot;Some guy&quot;)
     shelf = Shelf.new(:name =&gt; &quot;What geeks SHOULD be reading&quot;)
     books.each { |book| shelf.books &lt;&lt; book }
-    shelf.save!    
+    shelf.save!
   end
 
   def self.down</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/db/migrate/20080629143033_create_fake_books_and_shelves.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-# This file is auto-generated from the current state of the database. Instead of editing this file, 
+# This file is auto-generated from the current state of the database. Instead of editing this file,
 # please use the migrations feature of Active Record to incrementally modify your database, and
 # then regenerate this schema definition.
 #</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/db/schema.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,18 +6,18 @@
 &lt;head&gt;
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
   &lt;title&gt;The page you were looking for doesn't exist (404)&lt;/title&gt;
-	&lt;style type=&quot;text/css&quot;&gt;
-		body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
-		div.dialog {
-			width: 25em;
-			padding: 0 4em;
-			margin: 4em auto 0 auto;
-			border: 1px solid #ccc;
-			border-right-color: #999;
-			border-bottom-color: #999;
-		}
-		h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
-	&lt;/style&gt;
+ &lt;style type=&quot;text/css&quot;&gt;
+  body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+  div.dialog {
+   width: 25em;
+   padding: 0 4em;
+   margin: 4em auto 0 auto;
+   border: 1px solid #ccc;
+   border-right-color: #999;
+   border-bottom-color: #999;
+  }
+  h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+ &lt;/style&gt;
 &lt;/head&gt;
 
 &lt;body&gt;
@@ -27,4 +27,4 @@
     &lt;p&gt;You may have mistyped the address or the page may have moved.&lt;/p&gt;
   &lt;/div&gt;
 &lt;/body&gt;
-&lt;/html&gt;
\ No newline at end of file
+&lt;/html&gt;</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/404.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,18 +6,18 @@
 &lt;head&gt;
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
   &lt;title&gt;The change you wanted was rejected (422)&lt;/title&gt;
-	&lt;style type=&quot;text/css&quot;&gt;
-		body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
-		div.dialog {
-			width: 25em;
-			padding: 0 4em;
-			margin: 4em auto 0 auto;
-			border: 1px solid #ccc;
-			border-right-color: #999;
-			border-bottom-color: #999;
-		}
-		h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
-	&lt;/style&gt;
+ &lt;style type=&quot;text/css&quot;&gt;
+  body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+  div.dialog {
+   width: 25em;
+   padding: 0 4em;
+   margin: 4em auto 0 auto;
+   border: 1px solid #ccc;
+   border-right-color: #999;
+   border-bottom-color: #999;
+  }
+  h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+ &lt;/style&gt;
 &lt;/head&gt;
 
 &lt;body&gt;
@@ -27,4 +27,4 @@
     &lt;p&gt;Maybe you tried to change something you didn't have access to.&lt;/p&gt;
   &lt;/div&gt;
 &lt;/body&gt;
-&lt;/html&gt;
\ No newline at end of file
+&lt;/html&gt;</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/422.html</filename>
    </modified>
    <modified>
      <diff>@@ -6,18 +6,18 @@
 &lt;head&gt;
   &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
   &lt;title&gt;We're sorry, but something went wrong (500)&lt;/title&gt;
-	&lt;style type=&quot;text/css&quot;&gt;
-		body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
-		div.dialog {
-			width: 25em;
-			padding: 0 4em;
-			margin: 4em auto 0 auto;
-			border: 1px solid #ccc;
-			border-right-color: #999;
-			border-bottom-color: #999;
-		}
-		h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
-	&lt;/style&gt;
+ &lt;style type=&quot;text/css&quot;&gt;
+  body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+  div.dialog {
+   width: 25em;
+   padding: 0 4em;
+   margin: 4em auto 0 auto;
+   border: 1px solid #ccc;
+   border-right-color: #999;
+   border-bottom-color: #999;
+  }
+  h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+ &lt;/style&gt;
 &lt;/head&gt;
 
 &lt;body&gt;
@@ -27,4 +27,4 @@
     &lt;p&gt;We've been notified about this issue and we'll take a look at it shortly.&lt;/p&gt;
   &lt;/div&gt;
 &lt;/body&gt;
-&lt;/html&gt;
\ No newline at end of file
+&lt;/html&gt;</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/500.html</filename>
    </modified>
    <modified>
      <diff>@@ -7,4 +7,4 @@ require File.dirname(__FILE__) + &quot;/../config/environment&quot; unless defined?(RAILS_
 require &quot;dispatcher&quot;
 
 ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
-Dispatcher.dispatch
\ No newline at end of file
+Dispatcher.dispatch</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/dispatch.cgi</filename>
    </modified>
    <modified>
      <diff>@@ -7,4 +7,4 @@ require File.dirname(__FILE__) + &quot;/../config/environment&quot; unless defined?(RAILS_
 require &quot;dispatcher&quot;
 
 ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
-Dispatcher.dispatch
\ No newline at end of file
+Dispatcher.dispatch</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/dispatch.rb</filename>
    </modified>
    <modified>
      <diff>@@ -14,20 +14,20 @@
         font-size: 13px;
         color: #333;
       }
-      
+
       h1 {
         font-size: 28px;
         color: #000;
       }
-      
+
       a  {color: #03c}
       a:hover {
         background-color: #03c;
         color: white;
         text-decoration: none;
       }
-      
-      
+
+
       #page {
         background-color: #f0f0f0;
         width: 750px;
@@ -35,7 +35,7 @@
         margin-left: auto;
         margin-right: auto;
       }
-      
+
       #content {
         float: left;
         background-color: white;
@@ -44,7 +44,7 @@
         padding: 25px;
         width: 500px;
       }
-      
+
       #sidebar {
         float: right;
         width: 175px;
@@ -53,7 +53,7 @@
       #footer {
         clear: both;
       }
-      
+
 
       #header, #about, #getting-started {
         padding-left: 75px;
@@ -73,14 +73,14 @@
         font-weight: normal;
         font-size: 16px;
       }
-      
-      
+
+
       #about h3 {
         margin: 0;
         margin-bottom: 10px;
         font-size: 14px;
       }
-      
+
       #about-content {
         background-color: #ffd;
         border: 1px solid #fc0;
@@ -99,7 +99,7 @@
       }
       #about-content td.name  {color: #555}
       #about-content td.value {color: #000}
-      
+
       #about-content.failure {
         background-color: #fcc;
         border: 1px solid #f00;
@@ -108,8 +108,8 @@
         margin: 0;
         padding: 10px;
       }
-      
-      
+
+
       #getting-started {
         border-top: 1px solid #ccc;
         margin-top: 25px;
@@ -145,8 +145,8 @@
         color: #555;
         font-size: 13px;
       }
-      
-      
+
+
       #search {
         margin: 0;
         padding-top: 10px;
@@ -158,8 +158,8 @@
         margin: 2px;
       }
       #search-text {width: 170px}
-      
-      
+
+
       #sidebar ul {
         margin-left: 0;
         padding-left: 0;
@@ -176,7 +176,7 @@
       #sidebar ul.links li {
         margin-bottom: 5px;
       }
-      
+
     &lt;/style&gt;
     &lt;script type=&quot;text/javascript&quot; src=&quot;javascripts/prototype.js&quot;&gt;&lt;/script&gt;
     &lt;script type=&quot;text/javascript&quot; src=&quot;javascripts/effects.js&quot;&gt;&lt;/script&gt;
@@ -189,11 +189,11 @@
             onComplete: function() {new Effect.BlindDown('about-content', {duration: 0.25})}
           });
         } else {
-          new Effect[Element.visible('about-content') ? 
+          new Effect[Element.visible('about-content') ?
             'BlindUp' : 'BlindDown']('about-content', {duration: 0.25});
         }
       }
-      
+
       window.onload = function() {
         $('search-text').value = '';
         $('search').onsubmit = function() {
@@ -213,7 +213,7 @@
               &lt;input type=&quot;submit&quot; value=&quot;Search&quot; /&gt; the Rails site
             &lt;/form&gt;
           &lt;/li&gt;
-        
+
           &lt;li&gt;
             &lt;h3&gt;Join the community&lt;/h3&gt;
             &lt;ul class=&quot;links&quot;&gt;
@@ -222,7 +222,7 @@
               &lt;li&gt;&lt;a href=&quot;http://wiki.rubyonrails.org/&quot;&gt;Wiki&lt;/a&gt;&lt;/li&gt;
             &lt;/ul&gt;
           &lt;/li&gt;
-          
+
           &lt;li&gt;
             &lt;h3&gt;Browse the documentation&lt;/h3&gt;
             &lt;ul class=&quot;links&quot;&gt;
@@ -244,17 +244,17 @@
           &lt;h3&gt;&lt;a href=&quot;rails/info/properties&quot; onclick=&quot;about(); return false&quot;&gt;About your application&amp;rsquo;s environment&lt;/a&gt;&lt;/h3&gt;
           &lt;div id=&quot;about-content&quot; style=&quot;display: none&quot;&gt;&lt;/div&gt;
         &lt;/div&gt;
-        
+
         &lt;div id=&quot;getting-started&quot;&gt;
           &lt;h1&gt;Getting started&lt;/h1&gt;
           &lt;h2&gt;Here&amp;rsquo;s how to get rolling:&lt;/h2&gt;
-          
-          &lt;ol&gt;          
+
+          &lt;ol&gt;
             &lt;li&gt;
               &lt;h2&gt;Use &lt;tt&gt;script/generate&lt;/tt&gt; to create your models and controllers&lt;/h2&gt;
               &lt;p&gt;To see all available options, run it without parameters.&lt;/p&gt;
             &lt;/li&gt;
-            
+
             &lt;li&gt;
               &lt;h2&gt;Set up a default route and remove or rename this file&lt;/h2&gt;
               &lt;p&gt;Routes are set up in config/routes.rb.&lt;/p&gt;
@@ -267,8 +267,8 @@
           &lt;/ol&gt;
         &lt;/div&gt;
       &lt;/div&gt;
-      
+
       &lt;div id=&quot;footer&quot;&gt;&amp;nbsp;&lt;/div&gt;
     &lt;/div&gt;
   &lt;/body&gt;
-&lt;/html&gt;
\ No newline at end of file
+&lt;/html&gt;</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/index.html</filename>
    </modified>
    <modified>
      <diff>@@ -5,18 +5,18 @@
 //  Richard Livsey
 //  Rahul Bhargava
 //  Rob Wills
-// 
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
-// Autocompleter.Base handles all the autocompletion functionality 
+// Autocompleter.Base handles all the autocompletion functionality
 // that's independent of the data source for autocompletion. This
 // includes drawing the autocompletion menu, observing keyboard
 // and mouse events, and similar.
 //
-// Specific autocompleters need to provide, at the very least, 
+// Specific autocompleters need to provide, at the very least,
 // a getUpdatedChoices function that will be invoked every time
-// the text inside the monitored textbox changes. This method 
+// the text inside the monitored textbox changes. This method
 // should get the text for which to provide autocompletion by
 // invoking this.getToken(), NOT by directly accessing
 // this.element.value. This is to allow incremental tokenized
@@ -30,8 +30,8 @@
 // will incrementally autocomplete with a comma as the token.
 // Additionally, ',' in the above example can be replaced with
 // a token array, e.g. { tokens: [',', '\n'] } which
-// enables autocompletion on multiple tokens. This is most 
-// useful when one of the tokens is \n (a newline), as it 
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
 // allows smart autocompletion after linebreaks.
 
 if(typeof Effect == 'undefined')
@@ -41,12 +41,12 @@ var Autocompleter = { }
 Autocompleter.Base = Class.create({
   baseInitialize: function(element, update, options) {
     element          = $(element)
-    this.element     = element; 
-    this.update      = $(update);  
-    this.hasFocus    = false; 
-    this.changed     = false; 
-    this.active      = false; 
-    this.index       = 0;     
+    this.element     = element;
+    this.update      = $(update);
+    this.hasFocus    = false;
+    this.changed     = false;
+    this.active      = false;
+    this.index       = 0;
     this.entryCount  = 0;
     this.oldElementValue = this.element.value;
 
@@ -59,28 +59,28 @@ Autocompleter.Base = Class.create({
     this.options.tokens       = this.options.tokens || [];
     this.options.frequency    = this.options.frequency || 0.4;
     this.options.minChars     = this.options.minChars || 1;
-    this.options.onShow       = this.options.onShow || 
-      function(element, update){ 
+    this.options.onShow       = this.options.onShow ||
+      function(element, update){
         if(!update.style.position || update.style.position=='absolute') {
           update.style.position = 'absolute';
           Position.clone(element, update, {
-            setHeight: false, 
+            setHeight: false,
             offsetTop: element.offsetHeight
           });
         }
         Effect.Appear(update,{duration:0.15});
       };
-    this.options.onHide = this.options.onHide || 
+    this.options.onHide = this.options.onHide ||
       function(element, update){ new Effect.Fade(update,{duration:0.15}) };
 
-    if(typeof(this.options.tokens) == 'string') 
+    if(typeof(this.options.tokens) == 'string')
       this.options.tokens = new Array(this.options.tokens);
     // Force carriage returns as token delimiters anyway
     if (!this.options.tokens.include('\n'))
       this.options.tokens.push('\n');
 
     this.observer = null;
-    
+
     this.element.setAttribute('autocomplete','off');
 
     Element.hide(this.update);
@@ -91,10 +91,10 @@ Autocompleter.Base = Class.create({
 
   show: function() {
     if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
-    if(!this.iefix &amp;&amp; 
+    if(!this.iefix &amp;&amp;
       (Prototype.Browser.IE) &amp;&amp;
       (Element.getStyle(this.update, 'position')=='absolute')) {
-      new Insertion.After(this.update, 
+      new Insertion.After(this.update,
        '&lt;iframe id=&quot;' + this.update.id + '_iefix&quot; '+
        'style=&quot;display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);&quot; ' +
        'src=&quot;javascript:false;&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;');
@@ -102,7 +102,7 @@ Autocompleter.Base = Class.create({
     }
     if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
   },
-  
+
   fixIEOverlapping: function() {
     Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
     this.iefix.style.zIndex = 1;
@@ -150,15 +150,15 @@ Autocompleter.Base = Class.create({
          Event.stop(event);
          return;
       }
-     else 
-       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
+     else
+       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
          (Prototype.Browser.WebKit &gt; 0 &amp;&amp; event.keyCode == 0)) return;
 
     this.changed = true;
     this.hasFocus = true;
 
     if(this.observer) clearTimeout(this.observer);
-      this.observer = 
+      this.observer =
         setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
   },
 
@@ -170,35 +170,35 @@ Autocompleter.Base = Class.create({
 
   onHover: function(event) {
     var element = Event.findElement(event, 'LI');
-    if(this.index != element.autocompleteIndex) 
+    if(this.index != element.autocompleteIndex)
     {
         this.index = element.autocompleteIndex;
         this.render();
     }
     Event.stop(event);
   },
-  
+
   onClick: function(event) {
     var element = Event.findElement(event, 'LI');
     this.index = element.autocompleteIndex;
     this.selectEntry();
     this.hide();
   },
-  
+
   onBlur: function(event) {
     // needed to make click events working
     setTimeout(this.hide.bind(this), 250);
     this.hasFocus = false;
-    this.active = false;     
-  }, 
-  
+    this.active = false;
+  },
+
   render: function() {
     if(this.entryCount &gt; 0) {
       for (var i = 0; i &lt; this.entryCount; i++)
-        this.index==i ? 
-          Element.addClassName(this.getEntry(i),&quot;selected&quot;) : 
+        this.index==i ?
+          Element.addClassName(this.getEntry(i),&quot;selected&quot;) :
           Element.removeClassName(this.getEntry(i),&quot;selected&quot;);
-      if(this.hasFocus) { 
+      if(this.hasFocus) {
         this.show();
         this.active = true;
       }
@@ -207,27 +207,27 @@ Autocompleter.Base = Class.create({
       this.hide();
     }
   },
-  
+
   markPrevious: function() {
     if(this.index &gt; 0) this.index--
       else this.index = this.entryCount-1;
     this.getEntry(this.index).scrollIntoView(true);
   },
-  
+
   markNext: function() {
     if(this.index &lt; this.entryCount-1) this.index++
       else this.index = 0;
     this.getEntry(this.index).scrollIntoView(false);
   },
-  
+
   getEntry: function(index) {
     return this.update.firstChild.childNodes[index];
   },
-  
+
   getCurrentEntry: function() {
     return this.getEntry(this.index);
   },
-  
+
   selectEntry: function() {
     this.active = false;
     this.updateElement(this.getCurrentEntry());
@@ -244,7 +244,7 @@ Autocompleter.Base = Class.create({
       if(nodes.length&gt;0) value = Element.collectTextNodes(nodes[0], this.options.select);
     } else
       value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
-    
+
     var bounds = this.getTokenBounds();
     if (bounds[0] != -1) {
       var newValue = this.element.value.substr(0, bounds[0]);
@@ -257,7 +257,7 @@ Autocompleter.Base = Class.create({
     }
     this.oldElementValue = this.element.value;
     this.element.focus();
-    
+
     if (this.options.afterUpdateElement)
       this.options.afterUpdateElement(this.element, selectedElement);
   },
@@ -269,20 +269,20 @@ Autocompleter.Base = Class.create({
       Element.cleanWhitespace(this.update.down());
 
       if(this.update.firstChild &amp;&amp; this.update.down().childNodes) {
-        this.entryCount = 
+        this.entryCount =
           this.update.down().childNodes.length;
         for (var i = 0; i &lt; this.entryCount; i++) {
           var entry = this.getEntry(i);
           entry.autocompleteIndex = i;
           this.addObservers(entry);
         }
-      } else { 
+      } else {
         this.entryCount = 0;
       }
 
       this.stopIndicator();
       this.index = 0;
-      
+
       if(this.entryCount==1 &amp;&amp; this.options.autoSelect) {
         this.selectEntry();
         this.hide();
@@ -298,7 +298,7 @@ Autocompleter.Base = Class.create({
   },
 
   onObserverEvent: function() {
-    this.changed = false;   
+    this.changed = false;
     this.tokenBounds = null;
     if(this.getToken().length&gt;=this.options.minChars) {
       this.getUpdatedChoices();
@@ -351,16 +351,16 @@ Ajax.Autocompleter = Class.create(Autocompleter.Base, {
 
   getUpdatedChoices: function() {
     this.startIndicator();
-    
-    var entry = encodeURIComponent(this.options.paramName) + '=' + 
+
+    var entry = encodeURIComponent(this.options.paramName) + '=' +
       encodeURIComponent(this.getToken());
 
     this.options.parameters = this.options.callback ?
       this.options.callback(this.element, entry) : entry;
 
-    if(this.options.defaultParams) 
+    if(this.options.defaultParams)
       this.options.parameters += '&amp;' + this.options.defaultParams;
-    
+
     new Ajax.Request(this.url, this.options);
   },
 
@@ -382,7 +382,7 @@ Ajax.Autocompleter = Class.create(Autocompleter.Base, {
 // - choices - How many autocompletion choices to offer
 //
 // - partialSearch - If false, the autocompleter will match entered
-//                    text only at the beginning of strings in the 
+//                    text only at the beginning of strings in the
 //                    autocomplete array. Defaults to true, which will
 //                    match text at the beginning of any *word* in the
 //                    strings in the autocomplete array. If you want to
@@ -399,7 +399,7 @@ Ajax.Autocompleter = Class.create(Autocompleter.Base, {
 // - ignoreCase - Whether to ignore case when autocompleting.
 //                 Defaults to true.
 //
-// It's possible to pass in a custom function as the 'selector' 
+// It's possible to pass in a custom function as the 'selector'
 // option, if you prefer to write your own autocompletion logic.
 // In that case, the other options above will not apply unless
 // you support them.
@@ -427,20 +427,20 @@ Autocompleter.Local = Class.create(Autocompleter.Base, {
         var entry     = instance.getToken();
         var count     = 0;
 
-        for (var i = 0; i &lt; instance.options.array.length &amp;&amp;  
-          ret.length &lt; instance.options.choices ; i++) { 
+        for (var i = 0; i &lt; instance.options.array.length &amp;&amp;
+          ret.length &lt; instance.options.choices ; i++) {
 
           var elem = instance.options.array[i];
-          var foundPos = instance.options.ignoreCase ? 
-            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
+          var foundPos = instance.options.ignoreCase ?
+            elem.toLowerCase().indexOf(entry.toLowerCase()) :
             elem.indexOf(entry);
 
           while (foundPos != -1) {
-            if (foundPos == 0 &amp;&amp; elem.length != entry.length) { 
-              ret.push(&quot;&lt;li&gt;&lt;strong&gt;&quot; + elem.substr(0, entry.length) + &quot;&lt;/strong&gt;&quot; + 
+            if (foundPos == 0 &amp;&amp; elem.length != entry.length) {
+              ret.push(&quot;&lt;li&gt;&lt;strong&gt;&quot; + elem.substr(0, entry.length) + &quot;&lt;/strong&gt;&quot; +
                 elem.substr(entry.length) + &quot;&lt;/li&gt;&quot;);
               break;
-            } else if (entry.length &gt;= instance.options.partialChars &amp;&amp; 
+            } else if (entry.length &gt;= instance.options.partialChars &amp;&amp;
               instance.options.partialSearch &amp;&amp; foundPos != -1) {
               if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                 partial.push(&quot;&lt;li&gt;&quot; + elem.substr(0, foundPos) + &quot;&lt;strong&gt;&quot; +
@@ -450,8 +450,8 @@ Autocompleter.Local = Class.create(Autocompleter.Base, {
               }
             }
 
-            foundPos = instance.options.ignoreCase ? 
-              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
+            foundPos = instance.options.ignoreCase ?
+              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
               elem.indexOf(entry, foundPos + 1);
 
           }
@@ -937,7 +937,7 @@ Ajax.InPlaceCollectionEditor.DefaultOptions = {
   loadingCollectionText: 'Loading options...'
 };
 
-// Delayed observer, like Form.Element.Observer, 
+// Delayed observer, like Form.Element.Observer,
 // but waits for delay after last key input
 // Ideal for live-search fields
 
@@ -947,7 +947,7 @@ Form.Element.DelayedObserver = Class.create({
     this.element   = $(element);
     this.callback  = callback;
     this.timer     = null;
-    this.lastValue = $F(this.element); 
+    this.lastValue = $F(this.element);
     Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
   },
   delayedListener: function(event) {</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/javascripts/controls.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 // Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
 //           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-// 
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
 // For details, see the script.aculo.us web site: http://script.aculo.us/
 
@@ -32,7 +32,7 @@ var Droppables = {
         options._containers.push($(containment));
       }
     }
-    
+
     if(options.accept) options.accept = [options.accept].flatten();
 
     Element.makePositioned(element); // fix IE
@@ -40,34 +40,34 @@ var Droppables = {
 
     this.drops.push(options);
   },
-  
+
   findDeepestChild: function(drops) {
     deepest = drops[0];
-      
+
     for (i = 1; i &lt; drops.length; ++i)
       if (Element.isParent(drops[i].element, deepest.element))
         deepest = drops[i];
-    
+
     return deepest;
   },
 
   isContained: function(element, drop) {
     var containmentNode;
     if(drop.tree) {
-      containmentNode = element.treeNode; 
+      containmentNode = element.treeNode;
     } else {
       containmentNode = element.parentNode;
     }
     return drop._containers.detect(function(c) { return containmentNode == c });
   },
-  
+
   isAffected: function(point, element, drop) {
     return (
       (drop.element!=element) &amp;&amp;
       ((!drop._containers) ||
         this.isContained(element, drop)) &amp;&amp;
       ((!drop.accept) ||
-        (Element.classNames(element).detect( 
+        (Element.classNames(element).detect(
           function(v) { return drop.accept.include(v) } ) )) &amp;&amp;
       Position.within(drop.element, point[0], point[1]) );
   },
@@ -87,12 +87,12 @@ var Droppables = {
   show: function(point, element) {
     if(!this.drops.length) return;
     var drop, affected = [];
-    
+
     this.drops.each( function(drop) {
       if(Droppables.isAffected(point, element, drop))
         affected.push(drop);
     });
-        
+
     if(affected.length&gt;0)
       drop = Droppables.findDeepestChild(affected);
 
@@ -101,7 +101,7 @@ var Droppables = {
       Position.within(drop.element, point[0], point[1]);
       if(drop.onHover)
         drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-      
+
       if (drop != this.last_active) Droppables.activate(drop);
     }
   },
@@ -112,8 +112,8 @@ var Droppables = {
 
     if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
       if (this.last_active.onDrop) {
-        this.last_active.onDrop(element, this.last_active.element, event); 
-        return true; 
+        this.last_active.onDrop(element, this.last_active.element, event);
+        return true;
       }
   },
 
@@ -126,20 +126,20 @@ var Droppables = {
 var Draggables = {
   drags: [],
   observers: [],
-  
+
   register: function(draggable) {
     if(this.drags.length == 0) {
       this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
       this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
       this.eventKeypress  = this.keyPress.bindAsEventListener(this);
-      
+
       Event.observe(document, &quot;mouseup&quot;, this.eventMouseUp);
       Event.observe(document, &quot;mousemove&quot;, this.eventMouseMove);
       Event.observe(document, &quot;keypress&quot;, this.eventKeypress);
     }
     this.drags.push(draggable);
   },
-  
+
   unregister: function(draggable) {
     this.drags = this.drags.reject(function(d) { return d==draggable });
     if(this.drags.length == 0) {
@@ -148,24 +148,24 @@ var Draggables = {
       Event.stopObserving(document, &quot;keypress&quot;, this.eventKeypress);
     }
   },
-  
+
   activate: function(draggable) {
-    if(draggable.options.delay) { 
-      this._timeout = setTimeout(function() { 
-        Draggables._timeout = null; 
-        window.focus(); 
-        Draggables.activeDraggable = draggable; 
-      }.bind(this), draggable.options.delay); 
+    if(draggable.options.delay) {
+      this._timeout = setTimeout(function() {
+        Draggables._timeout = null;
+        window.focus();
+        Draggables.activeDraggable = draggable;
+      }.bind(this), draggable.options.delay);
     } else {
       window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
       this.activeDraggable = draggable;
     }
   },
-  
+
   deactivate: function() {
     this.activeDraggable = null;
   },
-  
+
   updateDrag: function(event) {
     if(!this.activeDraggable) return;
     var pointer = [Event.pointerX(event), Event.pointerY(event)];
@@ -173,36 +173,36 @@ var Draggables = {
     // the same coordinates, prevent needless redrawing (moz bug?)
     if(this._lastPointer &amp;&amp; (this._lastPointer.inspect() == pointer.inspect())) return;
     this._lastPointer = pointer;
-    
+
     this.activeDraggable.updateDrag(event, pointer);
   },
-  
+
   endDrag: function(event) {
-    if(this._timeout) { 
-      clearTimeout(this._timeout); 
-      this._timeout = null; 
+    if(this._timeout) {
+      clearTimeout(this._timeout);
+      this._timeout = null;
     }
     if(!this.activeDraggable) return;
     this._lastPointer = null;
     this.activeDraggable.endDrag(event);
     this.activeDraggable = null;
   },
-  
+
   keyPress: function(event) {
     if(this.activeDraggable)
       this.activeDraggable.keyPress(event);
   },
-  
+
   addObserver: function(observer) {
     this.observers.push(observer);
     this._cacheObserverCallbacks();
   },
-  
+
   removeObserver: function(element) {  // element instead of observer fixes mem leaks
     this.observers = this.observers.reject( function(o) { return o.element==element });
     this._cacheObserverCallbacks();
   },
-  
+
   notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
     if(this[eventName+'Count'] &gt; 0)
       this.observers.each( function(o) {
@@ -210,7 +210,7 @@ var Draggables = {
       });
     if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
   },
-  
+
   _cacheObserverCallbacks: function() {
     ['onStart','onEnd','onDrag'].each( function(eventName) {
       Draggables[eventName+'Count'] = Draggables.observers.select(
@@ -234,12 +234,12 @@ var Draggable = Class.create({
       },
       endeffect: function(element) {
         var toOpacity = Object.isNumber(element._opacity) ? element._opacity : 1.0;
-        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
+        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
           queue: {scope:'_draggable', position:'end'},
-          afterFinish: function(){ 
-            Draggable._dragging[element] = false 
+          afterFinish: function(){
+            Draggable._dragging[element] = false
           }
-        }); 
+        });
       },
       zindex: 1000,
       revert: false,
@@ -250,57 +250,57 @@ var Draggable = Class.create({
       snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
       delay: 0
     };
-    
+
     if(!arguments[1] || Object.isUndefined(arguments[1].endeffect))
       Object.extend(defaults, {
         starteffect: function(element) {
           element._opacity = Element.getOpacity(element);
           Draggable._dragging[element] = true;
-          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
+          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
         }
       });
-    
+
     var options = Object.extend(defaults, arguments[1] || { });
 
     this.element = $(element);
-    
+
     if(options.handle &amp;&amp; Object.isString(options.handle))
       this.handle = this.element.down('.'+options.handle, 0);
-    
+
     if(!this.handle) this.handle = $(options.handle);
     if(!this.handle) this.handle = this.element;
-    
+
     if(options.scroll &amp;&amp; !options.scroll.scrollTo &amp;&amp; !options.scroll.outerHTML) {
       options.scroll = $(options.scroll);
       this._isScrollChild = Element.childOf(this.element, options.scroll);
     }
 
-    Element.makePositioned(this.element); // fix IE    
+    Element.makePositioned(this.element); // fix IE
 
     this.options  = options;
-    this.dragging = false;   
+    this.dragging = false;
 
     this.eventMouseDown = this.initDrag.bindAsEventListener(this);
     Event.observe(this.handle, &quot;mousedown&quot;, this.eventMouseDown);
-    
+
     Draggables.register(this);
   },
-  
+
   destroy: function() {
     Event.stopObserving(this.handle, &quot;mousedown&quot;, this.eventMouseDown);
     Draggables.unregister(this);
   },
-  
+
   currentDelta: function() {
     return([
       parseInt(Element.getStyle(this.element,'left') || '0'),
       parseInt(Element.getStyle(this.element,'top') || '0')]);
   },
-  
+
   initDrag: function(event) {
     if(!Object.isUndefined(Draggable._dragging[this.element]) &amp;&amp;
       Draggable._dragging[this.element]) return;
-    if(Event.isLeftClick(event)) {    
+    if(Event.isLeftClick(event)) {
       // abort on form elements, fixes a Firefox issue
       var src = Event.element(event);
       if((tag_name = src.tagName.toUpperCase()) &amp;&amp; (
@@ -309,26 +309,26 @@ var Draggable = Class.create({
         tag_name=='OPTION' ||
         tag_name=='BUTTON' ||
         tag_name=='TEXTAREA')) return;
-        
+
       var pointer = [Event.pointerX(event), Event.pointerY(event)];
       var pos     = Position.cumulativeOffset(this.element);
       this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
-      
+
       Draggables.activate(this);
       Event.stop(event);
     }
   },
-  
+
   startDrag: function(event) {
     this.dragging = true;
     if(!this.delta)
       this.delta = this.currentDelta();
-    
+
     if(this.options.zindex) {
       this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
       this.element.style.zIndex = this.options.zindex;
     }
-    
+
     if(this.options.ghosting) {
       this._clone = this.element.cloneNode(true);
       this.element._originallyAbsolute = (this.element.getStyle('position') == 'absolute');
@@ -336,7 +336,7 @@ var Draggable = Class.create({
         Position.absolutize(this.element);
       this.element.parentNode.insertBefore(this._clone, this.element);
     }
-    
+
     if(this.options.scroll) {
       if (this.options.scroll == window) {
         var where = this._getWindowScroll(this.options.scroll);
@@ -347,28 +347,28 @@ var Draggable = Class.create({
         this.originalScrollTop = this.options.scroll.scrollTop;
       }
     }
-    
+
     Draggables.notify('onStart', this, event);
-        
+
     if(this.options.starteffect) this.options.starteffect(this.element);
   },
-  
+
   updateDrag: function(event, pointer) {
     if(!this.dragging) this.startDrag(event);
-    
+
     if(!this.options.quiet){
       Position.prepare();
       Droppables.show(pointer, this.element);
     }
-    
+
     Draggables.notify('onDrag', this, event);
-    
+
     this.draw(pointer);
     if(this.options.change) this.options.change(this);
-    
+
     if(this.options.scroll) {
       this.stopScrolling();
-      
+
       var p;
       if (this.options.scroll == window) {
         with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
@@ -386,16 +386,16 @@ var Draggable = Class.create({
       if(pointer[1] &gt; (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
       this.startScrolling(speed);
     }
-    
+
     // fix AppleWebKit rendering
     if(Prototype.Browser.WebKit) window.scrollBy(0,0);
-    
+
     Event.stop(event);
   },
-  
+
   finishDrag: function(event, success) {
     this.dragging = false;
-    
+
     if(this.options.quiet){
       Position.prepare();
       var pointer = [Event.pointerX(event), Event.pointerY(event)];
@@ -410,17 +410,17 @@ var Draggable = Class.create({
       this._clone = null;
     }
 
-    var dropped = false; 
-    if(success) { 
-      dropped = Droppables.fire(event, this.element); 
-      if (!dropped) dropped = false; 
+    var dropped = false;
+    if(success) {
+      dropped = Droppables.fire(event, this.element);
+      if (!dropped) dropped = false;
     }
     if(dropped &amp;&amp; this.options.onDropped) this.options.onDropped(this.element);
     Draggables.notify('onEnd', this, event);
 
     var revert = this.options.revert;
     if(revert &amp;&amp; Object.isFunction(revert)) revert = revert(this.element);
-    
+
     var d = this.currentDelta();
     if(revert &amp;&amp; this.options.reverteffect) {
       if (dropped == 0 || revert != 'failure')
@@ -433,45 +433,45 @@ var Draggable = Class.create({
     if(this.options.zindex)
       this.element.style.zIndex = this.originalZ;
 
-    if(this.options.endeffect) 
+    if(this.options.endeffect)
       this.options.endeffect(this.element);
-      
+
     Draggables.deactivate(this);
     Droppables.reset();
   },
-  
+
   keyPress: function(event) {
     if(event.keyCode!=Event.KEY_ESC) return;
     this.finishDrag(event, false);
     Event.stop(event);
   },
-  
+
   endDrag: function(event) {
     if(!this.dragging) return;
     this.stopScrolling();
     this.finishDrag(event, true);
     Event.stop(event);
   },
-  
+
   draw: function(point) {
     var pos = Position.cumulativeOffset(this.element);
     if(this.options.ghosting) {
       var r   = Position.realOffset(this.element);
       pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
     }
-    
+
     var d = this.currentDelta();
     pos[0] -= d[0]; pos[1] -= d[1];
-    
+
     if(this.options.scroll &amp;&amp; (this.options.scroll != window &amp;&amp; this._isScrollChild)) {
       pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
       pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
     }
-    
-    var p = [0,1].map(function(i){ 
-      return (point[i]-pos[i]-this.offset[i]) 
+
+    var p = [0,1].map(function(i){
+      return (point[i]-pos[i]-this.offset[i])
     }.bind(this));
-    
+
     if(this.options.snap) {
       if(Object.isFunction(this.options.snap)) {
         p = this.options.snap(p[0],p[1],this);
@@ -484,16 +484,16 @@ var Draggable = Class.create({
           return (v/this.options.snap).round()*this.options.snap }.bind(this))
       }
     }}
-    
+
     var style = this.element.style;
     if((!this.options.constraint) || (this.options.constraint=='horizontal'))
       style.left = p[0] + &quot;px&quot;;
     if((!this.options.constraint) || (this.options.constraint=='vertical'))
       style.top  = p[1] + &quot;px&quot;;
-    
+
     if(style.visibility==&quot;hidden&quot;) style.visibility = &quot;&quot;; // fix gecko rendering
   },
-  
+
   stopScrolling: function() {
     if(this.scrollInterval) {
       clearInterval(this.scrollInterval);
@@ -501,14 +501,14 @@ var Draggable = Class.create({
       Draggables._lastScrollPointer = null;
     }
   },
-  
+
   startScrolling: function(speed) {
     if(!(speed[0] || speed[1])) return;
     this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
     this.lastScrolled = new Date();
     this.scrollInterval = setInterval(this.scroll.bind(this), 10);
   },
-  
+
   scroll: function() {
     var current = new Date();
     var delta = current - this.lastScrolled;
@@ -524,7 +524,7 @@ var Draggable = Class.create({
       this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
       this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
     }
-    
+
     Position.prepare();
     Droppables.show(Draggables._lastPointer, this.element);
     Draggables.notify('onDrag', this);
@@ -538,10 +538,10 @@ var Draggable = Class.create({
         Draggables._lastScrollPointer[1] = 0;
       this.draw(Draggables._lastScrollPointer);
     }
-    
+
     if(this.options.change) this.options.change(this);
   },
-  
+
   _getWindowScroll: function(w) {
     var T, L, W, H;
     with (w.document) {
@@ -577,11 +577,11 @@ var SortableObserver = Class.create({
     this.observer  = observer;
     this.lastValue = Sortable.serialize(this.element);
   },
-  
+
   onStart: function() {
     this.lastValue = Sortable.serialize(this.element);
   },
-  
+
   onEnd: function() {
     Sortable.unmark();
     if(this.lastValue != Sortable.serialize(this.element))
@@ -591,11 +591,11 @@ var SortableObserver = Class.create({
 
 var Sortable = {
   SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
-  
+
   sortables: { },
-  
+
   _findRootElement: function(element) {
-    while (element.tagName.toUpperCase() != &quot;BODY&quot;) {  
+    while (element.tagName.toUpperCase() != &quot;BODY&quot;) {
       if(element.id &amp;&amp; Sortable.sortables[element.id]) return element;
       element = element.parentNode;
     }
@@ -606,22 +606,22 @@ var Sortable = {
     if(!element) return;
     return Sortable.sortables[element.id];
   },
-  
+
   destroy: function(element){
     var s = Sortable.options(element);
-    
+
     if(s) {
       Draggables.removeObserver(s.element);
       s.droppables.each(function(d){ Droppables.remove(d) });
       s.draggables.invoke('destroy');
-      
+
       delete Sortable.sortables[s.element.id];
     }
   },
 
   create: function(element) {
     element = $(element);
-    var options = Object.extend({ 
+    var options = Object.extend({
       element:     element,
       tag:         'li',       // assumes li children, override with tag: 'tagname'
       dropOnEmpty: false,
@@ -635,17 +635,17 @@ var Sortable = {
       delay:       0,
       hoverclass:  null,
       ghosting:    false,
-      quiet:       false, 
+      quiet:       false,
       scroll:      false,
       scrollSensitivity: 20,
       scrollSpeed: 15,
       format:      this.SERIALIZE_RULE,
-      
-      // these take arrays of elements or ids and can be 
+
+      // these take arrays of elements or ids and can be
       // used for better initialization performance
       elements:    false,
       handles:     false,
-      
+
       onChange:    Prototype.emptyFunction,
       onUpdate:    Prototype.emptyFunction
     }, arguments[1] || { });
@@ -682,7 +682,7 @@ var Sortable = {
     if(options.zindex)
       options_for_draggable.zindex = options.zindex;
 
-    // build options for the droppables  
+    // build options for the droppables
     var options_for_droppable = {
       overlap:     options.overlap,
       containment: options.containment,
@@ -690,7 +690,7 @@ var Sortable = {
       hoverclass:  options.hoverclass,
       onHover:     Sortable.onHover
     }
-    
+
     var options_for_tree = {
       onHover:      Sortable.onEmptyHover,
       overlap:      options.overlap,
@@ -699,7 +699,7 @@ var Sortable = {
     }
 
     // fix for gecko engine
-    Element.cleanWhitespace(element); 
+    Element.cleanWhitespace(element);
 
     options.draggables = [];
     options.droppables = [];
@@ -712,14 +712,14 @@ var Sortable = {
 
     (options.elements || this.findElements(element, options) || []).each( function(e,i) {
       var handle = options.handles ? $(options.handles[i]) :
-        (options.handle ? $(e).select('.' + options.handle)[0] : e); 
+        (options.handle ? $(e).select('.' + options.handle)[0] : e);
       options.draggables.push(
         new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
       Droppables.add(e, options_for_droppable);
       if(options.tree) e.treeNode = element;
-      options.droppables.push(e);      
+      options.droppables.push(e);
     });
-    
+
     if(options.tree) {
       (Sortable.findTreeElements(element, options) || []).each( function(e) {
         Droppables.add(e, options_for_tree);
@@ -741,7 +741,7 @@ var Sortable = {
     return Element.findChildren(
       element, options.only, options.tree ? true : false, options.tag);
   },
-  
+
   findTreeElements: function(element, options) {
     return Element.findChildren(
       element, options.only, options.tree ? true : false, options.treeTag);
@@ -758,7 +758,7 @@ var Sortable = {
         var oldParentNode = element.parentNode;
         element.style.visibility = &quot;hidden&quot;; // fix gecko rendering
         dropon.parentNode.insertBefore(element, dropon);
-        if(dropon.parentNode!=oldParentNode) 
+        if(dropon.parentNode!=oldParentNode)
           Sortable.options(oldParentNode).onChange(element);
         Sortable.options(dropon.parentNode).onChange(element);
       }
@@ -769,26 +769,26 @@ var Sortable = {
         var oldParentNode = element.parentNode;
         element.style.visibility = &quot;hidden&quot;; // fix gecko rendering
         dropon.parentNode.insertBefore(element, nextElement);
-        if(dropon.parentNode!=oldParentNode) 
+        if(dropon.parentNode!=oldParentNode)
           Sortable.options(oldParentNode).onChange(element);
         Sortable.options(dropon.parentNode).onChange(element);
       }
     }
   },
-  
+
   onEmptyHover: function(element, dropon, overlap) {
     var oldParentNode = element.parentNode;
     var droponOptions = Sortable.options(dropon);
-        
+
     if(!Element.isParent(dropon, element)) {
       var index;
-      
+
       var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
       var child = null;
-            
+
       if(children) {
         var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
-        
+
         for (index = 0; index &lt; children.length; index += 1) {
           if (offset - Element.offsetSize (children[index], droponOptions.overlap) &gt;= 0) {
             offset -= Element.offsetSize (children[index], droponOptions.overlap);
@@ -801,9 +801,9 @@ var Sortable = {
           }
         }
       }
-      
+
       dropon.insertBefore(element, child);
-      
+
       Sortable.options(oldParentNode).onChange(element);
       droponOptions.onChange(element);
     }
@@ -816,34 +816,34 @@ var Sortable = {
   mark: function(dropon, position) {
     // mark on ghosting only
     var sortable = Sortable.options(dropon.parentNode);
-    if(sortable &amp;&amp; !sortable.ghosting) return; 
+    if(sortable &amp;&amp; !sortable.ghosting) return;
 
     if(!Sortable._marker) {
-      Sortable._marker = 
+      Sortable._marker =
         ($('dropmarker') || Element.extend(document.createElement('DIV'))).
           hide().addClassName('dropmarker').setStyle({position:'absolute'});
       document.getElementsByTagName(&quot;body&quot;).item(0).appendChild(Sortable._marker);
-    }    
+    }
     var offsets = Position.cumulativeOffset(dropon);
     Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
-    
+
     if(position=='after')
-      if(sortable.overlap == 'horizontal') 
+      if(sortable.overlap == 'horizontal')
         Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
       else
         Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
-    
+
     Sortable._marker.show();
   },
-  
+
   _tree: function(element, options, parent) {
     var children = Sortable.findElements(element, options) || [];
-  
+
     for (var i = 0; i &lt; children.length; ++i) {
       var match = children[i].id.match(options.format);
 
       if (!match) continue;
-      
+
       var child = {
         id: encodeURIComponent(match ? match[1] : null),
         element: element,
@@ -852,15 +852,15 @@ var Sortable = {
         position: parent.children.length,
         container: $(children[i]).down(options.treeTag)
       }
-      
+
       /* Get the element containing the children and recurse over it */
       if (child.container)
         this._tree(child.container, options, child)
-      
+
       parent.children.push (child);
     }
 
-    return parent; 
+    return parent;
   },
 
   tree: function(element) {
@@ -873,7 +873,7 @@ var Sortable = {
       name: element.id,
       format: sortableOptions.format
     }, arguments[1] || { });
-    
+
     var root = {
       id: null,
       parent: null,
@@ -881,7 +881,7 @@ var Sortable = {
       container: element,
       position: 0
     }
-    
+
     return Sortable._tree(element, options, root);
   },
 
@@ -897,7 +897,7 @@ var Sortable = {
   sequence: function(element) {
     element = $(element);
     var options = Object.extend(this.options(element), arguments[1] || { });
-    
+
     return $(this.findElements(element, options) || []).map( function(item) {
       return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
     });
@@ -906,14 +906,14 @@ var Sortable = {
   setSequence: function(element, new_sequence) {
     element = $(element);
     var options = Object.extend(this.options(element), arguments[2] || { });
-    
+
     var nodeMap = { };
     this.findElements(element, options).each( function(n) {
         if (n.id.match(options.format))
             nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
         n.parentNode.removeChild(n);
     });
-   
+
     new_sequence.each(function(ident) {
       var n = nodeMap[ident];
       if (n) {
@@ -922,16 +922,16 @@ var Sortable = {
       }
     });
   },
-  
+
   serialize: function(element) {
     element = $(element);
     var options = Object.extend(Sortable.options(element), arguments[1] || { });
     var name = encodeURIComponent(
       (arguments[1] &amp;&amp; arguments[1].name) ? arguments[1].name : element.id);
-    
+
     if (options.tree) {
       return Sortable.tree(element, arguments[1]).children.map( function (item) {
-        return [name + Sortable._constructIndex(item) + &quot;[id]=&quot; + 
+        return [name + Sortable._constructIndex(item) + &quot;[id]=&quot; +
                 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
       }).flatten().join('&amp;');
     } else {
@@ -949,7 +949,7 @@ Element.isParent = function(child, element) {
   return Element.isParent(child.parentNode, element);
 }
 
-Element.findChildren = function(element, only, recursive, tagName) {   
+Element.findChildren = function(element, only, recursive, tagName) {
   if(!element.hasChildNodes()) return null;
   tagName = tagName.toUpperCase();
   if(only) only = [only].flatten();</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/javascripts/dragdrop.js</filename>
    </modified>
    <modified>
      <diff>@@ -3,46 +3,46 @@
 //  Justin Palmer (http://encytemedia.com/)
 //  Mark Pilgrim (http://diveintomark.org/)
 //  Martin Bialasinki
-// 
+//
 // script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+// For details, see the script.aculo.us web site: http://script.aculo.us/
 
-// converts rgb() and #xxx to #xxxxxx format,  
-// returns self (or first argument) if not convertable  
-String.prototype.parseColor = function() {  
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
   var color = '#';
-  if (this.slice(0,4) == 'rgb(') {  
-    var cols = this.slice(4,this.length-1).split(',');  
-    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);  
-  } else {  
-    if (this.slice(0,1) == '#') {  
-      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
-      if (this.length==7) color = this.toLowerCase();  
-    }  
-  }  
-  return (color.length==7 ? color : (arguments[0] || this));  
+  if (this.slice(0,4) == 'rgb(') {
+    var cols = this.slice(4,this.length-1).split(',');
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);
+  } else {
+    if (this.slice(0,1) == '#') {
+      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+      if (this.length==7) color = this.toLowerCase();
+    }
+  }
+  return (color.length==7 ? color : (arguments[0] || this));
 };
 
 /*--------------------------------------------------------------------------*/
 
-Element.collectTextNodes = function(element) {  
+Element.collectTextNodes = function(element) {
   return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
+    return (node.nodeType==3 ? node.nodeValue :
       (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
   }).flatten().join('');
 };
 
-Element.collectTextNodesIgnoreClass = function(element, className) {  
+Element.collectTextNodesIgnoreClass = function(element, className) {
   return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ? 
+    return (node.nodeType==3 ? node.nodeValue :
+      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ?
         Element.collectTextNodesIgnoreClass(node, className) : ''));
   }).flatten().join('');
 };
 
 Element.setContentZoom = function(element, percent) {
-  element = $(element);  
-  element.setStyle({fontSize: (percent/100) + 'em'});   
+  element = $(element);
+  element.setStyle({fontSize: (percent/100) + 'em'});
   if (Prototype.Browser.WebKit) window.scrollBy(0,0);
   return element;
 };
@@ -82,16 +82,16 @@ var Effect = {
     wobble: function(pos) {
       return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
     },
-    pulse: function(pos, pulses) { 
-      pulses = pulses || 5; 
+    pulse: function(pos, pulses) {
+      pulses = pulses || 5;
       return (
-        ((pos % (1/pulses)) * pulses).round() == 0 ? 
-              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
+        ((pos % (1/pulses)) * pulses).round() == 0 ?
+              ((pos * pulses * 2) - (pos * pulses * 2).floor()) :
           1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
         );
     },
-    spring: function(pos) { 
-      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
+    spring: function(pos) {
+      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
     },
     none: function(pos) {
       return 0;
@@ -112,14 +112,14 @@ var Effect = {
   tagifyText: function(element) {
     var tagifyStyle = 'position:relative';
     if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
-    
+
     element = $(element);
     $A(element.childNodes).each( function(child) {
       if (child.nodeType==3) {
         child.nodeValue.toArray().each( function(character) {
           element.insertBefore(
             new Element('span', {style: tagifyStyle}).update(
-              character == ' ' ? String.fromCharCode(160) : character), 
+              character == ' ' ? String.fromCharCode(160) : character),
               child);
         });
         Element.remove(child);
@@ -128,13 +128,13 @@ var Effect = {
   },
   multiple: function(element, effect) {
     var elements;
-    if (((typeof element == 'object') || 
-        Object.isFunction(element)) &amp;&amp; 
+    if (((typeof element == 'object') ||
+        Object.isFunction(element)) &amp;&amp;
        (element.length))
       elements = element;
     else
       elements = $(element).childNodes;
-      
+
     var options = Object.extend({
       speed: 0.1,
       delay: 0.0
@@ -156,7 +156,7 @@ var Effect = {
     var options = Object.extend({
       queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
     }, arguments[2] || { });
-    Effect[element.visible() ? 
+    Effect[element.visible() ?
       Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
   }
 };
@@ -168,20 +168,20 @@ Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
 Effect.ScopedQueue = Class.create(Enumerable, {
   initialize: function() {
     this.effects  = [];
-    this.interval = null;    
+    this.interval = null;
   },
   _each: function(iterator) {
     this.effects._each(iterator);
   },
   add: function(effect) {
     var timestamp = new Date().getTime();
-    
-    var position = Object.isString(effect.options.queue) ? 
+
+    var position = Object.isString(effect.options.queue) ?
       effect.options.queue : effect.options.queue.position;
-    
+
     switch(position) {
       case 'front':
-        // move unstarted effects after this effect  
+        // move unstarted effects after this effect
         this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
             e.startOn  += effect.finishOn;
             e.finishOn += effect.finishOn;
@@ -195,13 +195,13 @@ Effect.ScopedQueue = Class.create(Enumerable, {
         timestamp = this.effects.pluck('finishOn').max() || timestamp;
         break;
     }
-    
+
     effect.startOn  += timestamp;
     effect.finishOn += timestamp;
 
     if (!effect.options.queue.limit || (this.effects.length &lt; effect.options.queue.limit))
       this.effects.push(effect);
-    
+
     if (!this.interval)
       this.interval = setInterval(this.loop.bind(this), 15);
   },
@@ -214,7 +214,7 @@ Effect.ScopedQueue = Class.create(Enumerable, {
   },
   loop: function() {
     var timePos = new Date().getTime();
-    for(var i=0, len=this.effects.length;i&lt;len;i++) 
+    for(var i=0, len=this.effects.length;i&lt;len;i++)
       this.effects[i] &amp;&amp; this.effects[i].loop(timePos);
   }
 });
@@ -223,7 +223,7 @@ Effect.Queues = {
   instances: $H(),
   get: function(queueName) {
     if (!Object.isString(queueName)) return queueName;
-    
+
     return this.instances.get(queueName) ||
       this.instances.set(queueName, new Effect.ScopedQueue());
   }
@@ -248,11 +248,11 @@ Effect.Base = Class.create({
     this.fromToDelta  = this.options.to-this.options.from;
     this.totalTime    = this.finishOn-this.startOn;
     this.totalFrames  = this.options.fps*this.options.duration;
-    
+
     eval('this.render = function(pos){ '+
       'if (this.state==&quot;idle&quot;){this.state=&quot;running&quot;;'+
       codeForEvent(this.options,'beforeSetup')+
-      (this.setup ? 'this.setup();':'')+ 
+      (this.setup ? 'this.setup();':'')+
       codeForEvent(this.options,'afterSetup')+
       '};if (this.state==&quot;running&quot;){'+
       'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
@@ -261,10 +261,10 @@ Effect.Base = Class.create({
       (this.update ? 'this.update(pos);':'')+
       codeForEvent(this.options,'afterUpdate')+
       '}}');
-    
+
     this.event('beforeStart');
     if (!this.options.sync)
-      Effect.Queues.get(Object.isString(this.options.queue) ? 
+      Effect.Queues.get(Object.isString(this.options.queue) ?
         'global' : this.options.queue.scope).add(this);
   },
   loop: function(timePos) {
@@ -273,9 +273,9 @@ Effect.Base = Class.create({
         this.render(1.0);
         this.cancel();
         this.event('beforeFinish');
-        if (this.finish) this.finish(); 
+        if (this.finish) this.finish();
         this.event('afterFinish');
-        return;  
+        return;
       }
       var pos   = (timePos - this.startOn) / this.totalTime,
           frame = (pos * this.totalFrames).round();
@@ -287,7 +287,7 @@ Effect.Base = Class.create({
   },
   cancel: function() {
     if (!this.options.sync)
-      Effect.Queues.get(Object.isString(this.options.queue) ? 
+      Effect.Queues.get(Object.isString(this.options.queue) ?
         'global' : this.options.queue.scope).remove(this);
     this.state = 'finished';
   },
@@ -325,10 +325,10 @@ Effect.Parallel = Class.create(Effect.Base, {
 Effect.Tween = Class.create(Effect.Base, {
   initialize: function(object, from, to) {
     object = Object.isString(object) ? $(object) : object;
-    var args = $A(arguments), method = args.last(), 
+    var args = $A(arguments), method = args.last(),
       options = args.length == 5 ? args[3] : null;
     this.method = Object.isFunction(method) ? method.bind(object) :
-      Object.isFunction(object[method]) ? object[method].bind(object) : 
+      Object.isFunction(object[method]) ? object[method].bind(object) :
       function(value) { object[method] = value };
     this.start(Object.extend({ from: from, to: to }, options || { }));
   },
@@ -392,7 +392,7 @@ Effect.Move = Class.create(Effect.Base, {
 
 // for backwards compatibility
 Effect.MoveBy = function(element, toTop, toLeft) {
-  return new Effect.Move(element, 
+  return new Effect.Move(element,
     Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
 };
 
@@ -414,15 +414,15 @@ Effect.Scale = Class.create(Effect.Base, {
   setup: function() {
     this.restoreAfterFinish = this.options.restoreAfterFinish || false;
     this.elementPositioning = this.element.getStyle('position');
-    
+
     this.originalStyle = { };
     ['top','left','width','height','fontSize'].each( function(k) {
       this.originalStyle[k] = this.element.style[k];
     }.bind(this));
-      
+
     this.originalTop  = this.element.offsetTop;
     this.originalLeft = this.element.offsetLeft;
-    
+
     var fontSize = this.element.getStyle('font-size') || '100%';
     ['em','px','%','pt'].each( function(fontSizeType) {
       if (fontSize.indexOf(fontSizeType)&gt;0) {
@@ -430,9 +430,9 @@ Effect.Scale = Class.create(Effect.Base, {
         this.fontSizeType = fontSizeType;
       }
     }.bind(this));
-    
+
     this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
-    
+
     this.dims = null;
     if (this.options.scaleMode=='box')
       this.dims = [this.element.offsetHeight, this.element.offsetWidth];
@@ -509,7 +509,7 @@ Effect.ScrollTo = function(element) {
   var options = arguments[1] || { },
     scrollOffsets = document.viewport.getScrollOffsets(),
     elementOffsets = $(element).cumulativeOffset(),
-    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();  
+    max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();
 
   if (options.offset) elementOffsets[1] += options.offset;
 
@@ -529,9 +529,9 @@ Effect.Fade = function(element) {
   var options = Object.extend({
     from: element.getOpacity() || 1.0,
     to:   0.0,
-    afterFinishInternal: function(effect) { 
+    afterFinishInternal: function(effect) {
       if (effect.options.to!=0) return;
-      effect.element.hide().setStyle({opacity: oldOpacity}); 
+      effect.element.hide().setStyle({opacity: oldOpacity});
     }
   }, arguments[1] || { });
   return new Effect.Opacity(element,options);
@@ -547,15 +547,15 @@ Effect.Appear = function(element) {
     effect.element.forceRerendering();
   },
   beforeSetup: function(effect) {
-    effect.element.setOpacity(effect.options.from).show(); 
+    effect.element.setOpacity(effect.options.from).show();
   }}, arguments[1] || { });
   return new Effect.Opacity(element,options);
 };
 
 Effect.Puff = function(element) {
   element = $(element);
-  var oldStyle = { 
-    opacity: element.getInlineOpacity(), 
+  var oldStyle = {
+    opacity: element.getInlineOpacity(),
     position: element.getStyle('position'),
     top:  element.style.top,
     left: element.style.left,
@@ -563,10 +563,10 @@ Effect.Puff = function(element) {
     height: element.style.height
   };
   return new Effect.Parallel(
-   [ new Effect.Scale(element, 200, 
-      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
-     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
-     Object.extend({ duration: 1.0, 
+   [ new Effect.Scale(element, 200,
+      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+     Object.extend({ duration: 1.0,
       beforeSetupInternal: function(effect) {
         Position.absolutize(effect.effects[0].element)
       },
@@ -580,12 +580,12 @@ Effect.BlindUp = function(element) {
   element = $(element);
   element.makeClipping();
   return new Effect.Scale(element, 0,
-    Object.extend({ scaleContent: false, 
-      scaleX: false, 
+    Object.extend({ scaleContent: false,
+      scaleX: false,
       restoreAfterFinish: true,
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping();
-      } 
+      }
     }, arguments[1] || { })
   );
 };
@@ -593,15 +593,15 @@ Effect.BlindUp = function(element) {
 Effect.BlindDown = function(element) {
   element = $(element);
   var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
     scaleX: false,
     scaleFrom: 0,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
     restoreAfterFinish: true,
     afterSetup: function(effect) {
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
-    },  
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
+    },
     afterFinishInternal: function(effect) {
       effect.element.undoClipping();
     }
@@ -616,10 +616,10 @@ Effect.SwitchOff = function(element) {
     from: 0,
     transition: Effect.Transitions.flicker,
     afterFinishInternal: function(effect) {
-      new Effect.Scale(effect.element, 1, { 
+      new Effect.Scale(effect.element, 1, {
         duration: 0.3, scaleFromCenter: true,
         scaleX: false, scaleContent: false, restoreAfterFinish: true,
-        beforeSetup: function(effect) { 
+        beforeSetup: function(effect) {
           effect.element.makePositioned().makeClipping();
         },
         afterFinishInternal: function(effect) {
@@ -637,16 +637,16 @@ Effect.DropOut = function(element) {
     left: element.getStyle('left'),
     opacity: element.getInlineOpacity() };
   return new Effect.Parallel(
-    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
+    [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
       new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
     Object.extend(
       { duration: 0.5,
         beforeSetup: function(effect) {
-          effect.effects[0].element.makePositioned(); 
+          effect.effects[0].element.makePositioned();
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
-        } 
+        }
       }, arguments[1] || { }));
 };
 
@@ -682,9 +682,9 @@ Effect.SlideDown = function(element) {
   // SlideDown need to have the content of the element wrapped in a container element with fixed height!
   var oldInnerBottom = element.down().getStyle('bottom');
   var elementDimensions = element.getDimensions();
-  return new Effect.Scale(element, 100, Object.extend({ 
-    scaleContent: false, 
-    scaleX: false, 
+  return new Effect.Scale(element, 100, Object.extend({
+    scaleContent: false,
+    scaleX: false,
     scaleFrom: window.opera ? 0 : 1,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
     restoreAfterFinish: true,
@@ -692,11 +692,11 @@ Effect.SlideDown = function(element) {
       effect.element.makePositioned();
       effect.element.down().makePositioned();
       if (window.opera) effect.element.setStyle({top: ''});
-      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
+      effect.element.makeClipping().setStyle({height: '0px'}).show();
     },
     afterUpdateInternal: function(effect) {
       effect.element.down().setStyle({bottom:
-        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
+        (effect.dims[0] - effect.element.clientHeight) + 'px' });
     },
     afterFinishInternal: function(effect) {
       effect.element.undoClipping().undoPositioned();
@@ -710,8 +710,8 @@ Effect.SlideUp = function(element) {
   var oldInnerBottom = element.down().getStyle('bottom');
   var elementDimensions = element.getDimensions();
   return new Effect.Scale(element, window.opera ? 0 : 1,
-   Object.extend({ scaleContent: false, 
-    scaleX: false, 
+   Object.extend({ scaleContent: false,
+    scaleX: false,
     scaleMode: 'box',
     scaleFrom: 100,
     scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
@@ -721,7 +721,7 @@ Effect.SlideUp = function(element) {
       effect.element.down().makePositioned();
       if (window.opera) effect.element.setStyle({top: ''});
       effect.element.makeClipping().show();
-    },  
+    },
     afterUpdateInternal: function(effect) {
       effect.element.down().setStyle({bottom:
         (effect.dims[0] - effect.element.clientHeight) + 'px' });
@@ -734,15 +734,15 @@ Effect.SlideUp = function(element) {
   );
 };
 
-// Bug in opera makes the TD containing this element expand for a instance after finish 
+// Bug in opera makes the TD containing this element expand for a instance after finish
 Effect.Squish = function(element) {
-  return new Effect.Scale(element, window.opera ? 1 : 0, { 
+  return new Effect.Scale(element, window.opera ? 1 : 0, {
     restoreAfterFinish: true,
     beforeSetup: function(effect) {
-      effect.element.makeClipping(); 
-    },  
+      effect.element.makeClipping();
+    },
     afterFinishInternal: function(effect) {
-      effect.element.hide().undoClipping(); 
+      effect.element.hide().undoClipping();
     }
   });
 };
@@ -762,13 +762,13 @@ Effect.Grow = function(element) {
     width: element.style.width,
     opacity: element.getInlineOpacity() };
 
-  var dims = element.getDimensions();    
+  var dims = element.getDimensions();
   var initialMoveX, initialMoveY;
   var moveX, moveY;
-  
+
   switch (options.direction) {
     case 'top-left':
-      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      initialMoveX = initialMoveY = moveX = moveY = 0;
       break;
     case 'top-right':
       initialMoveX = dims.width;
@@ -793,11 +793,11 @@ Effect.Grow = function(element) {
       moveY = -dims.height / 2;
       break;
   }
-  
+
   return new Effect.Move(element, {
     x: initialMoveX,
     y: initialMoveY,
-    duration: 0.01, 
+    duration: 0.01,
     beforeSetup: function(effect) {
       effect.element.hide().makeClipping().makePositioned();
     },
@@ -806,14 +806,14 @@ Effect.Grow = function(element) {
         [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
           new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
           new Effect.Scale(effect.element, 100, {
-            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
+            scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
             sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
         ], Object.extend({
              beforeSetup: function(effect) {
-               effect.effects[0].element.setStyle({height: '0px'}).show(); 
+               effect.effects[0].element.setStyle({height: '0px'}).show();
              },
              afterFinishInternal: function(effect) {
-               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
+               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
              }
            }, options)
       )
@@ -838,7 +838,7 @@ Effect.Shrink = function(element) {
 
   var dims = element.getDimensions();
   var moveX, moveY;
-  
+
   switch (options.direction) {
     case 'top-left':
       moveX = moveY = 0;
@@ -855,19 +855,19 @@ Effect.Shrink = function(element) {
       moveX = dims.width;
       moveY = dims.height;
       break;
-    case 'center':  
+    case 'center':
       moveX = dims.width / 2;
       moveY = dims.height / 2;
       break;
   }
-  
+
   return new Effect.Parallel(
     [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
       new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
       new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
-    ], Object.extend({            
+    ], Object.extend({
          beforeStartInternal: function(effect) {
-           effect.effects[0].element.makePositioned().makeClipping(); 
+           effect.effects[0].element.makePositioned().makeClipping();
          },
          afterFinishInternal: function(effect) {
            effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
@@ -882,7 +882,7 @@ Effect.Pulsate = function(element) {
   var transition = options.transition || Effect.Transitions.sinoidal;
   var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
   reverser.bind(transition);
-  return new Effect.Opacity(element, 
+  return new Effect.Opacity(element,
     Object.extend(Object.extend({  duration: 2.0, from: 0,
       afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
     }, options), {transition: reverser}));
@@ -896,12 +896,12 @@ Effect.Fold = function(element) {
     width: element.style.width,
     height: element.style.height };
   element.makeClipping();
-  return new Effect.Scale(element, 5, Object.extend({   
+  return new Effect.Scale(element, 5, Object.extend({
     scaleContent: false,
     scaleX: false,
     afterFinishInternal: function(effect) {
-    new Effect.Scale(element, 1, { 
-      scaleContent: false, 
+    new Effect.Scale(element, 1, {
+      scaleContent: false,
       scaleY: false,
       afterFinishInternal: function(effect) {
         effect.element.hide().undoClipping().setStyle(oldStyle);
@@ -916,7 +916,7 @@ Effect.Morph = Class.create(Effect.Base, {
     var options = Object.extend({
       style: { }
     }, arguments[1] || { });
-    
+
     if (!Object.isString(options.style)) this.style = $H(options.style);
     else {
       if (options.style.include(':'))
@@ -939,13 +939,13 @@ Effect.Morph = Class.create(Effect.Base, {
     }
     this.start(options);
   },
-  
+
   setup: function(){
     function parseColor(color){
       if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
       color = color.parseColor();
       return $R(0,2).map(function(i){
-        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
+        return parseInt( color.slice(i*2+1,i*2+3), 16 )
       });
     }
     this.transforms = this.style.map(function(pair){
@@ -965,9 +965,9 @@ Effect.Morph = Class.create(Effect.Base, {
       }
 
       var originalValue = this.element.getStyle(property);
-      return { 
-        style: property.camelize(), 
-        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
+      return {
+        style: property.camelize(),
+        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
         targetValue: unit=='color' ? parseColor(value) : value,
         unit: unit
       };
@@ -984,7 +984,7 @@ Effect.Morph = Class.create(Effect.Base, {
   update: function(position) {
     var style = { }, transform, i = this.transforms.length;
     while(i--)
-      style[(transform = this.transforms[i]).style] = 
+      style[(transform = this.transforms[i]).style] =
         transform.unit=='color' ? '#'+
           (Math.round(transform.originalValue[0]+
             (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
@@ -993,7 +993,7 @@ Effect.Morph = Class.create(Effect.Base, {
           (Math.round(transform.originalValue[2]+
             (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
         (transform.originalValue +
-          (transform.targetValue - transform.originalValue) * position).toFixed(3) + 
+          (transform.targetValue - transform.originalValue) * position).toFixed(3) +
             (transform.unit === null ? '' : transform.unit);
     this.element.setStyle(style, true);
   }
@@ -1030,7 +1030,7 @@ Effect.Transform = Class.create({
 });
 
 Element.CSS_PROPERTIES = $w(
-  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
+  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
   'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
   'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
   'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
@@ -1039,7 +1039,7 @@ Element.CSS_PROPERTIES = $w(
   'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
   'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
   'right textIndent top width wordSpacing zIndex');
-  
+
 Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
 
 String.__parseStyleElement = document.createElement('div');
@@ -1051,11 +1051,11 @@ String.prototype.parseStyle = function(){
     String.__parseStyleElement.innerHTML = '&lt;div style=&quot;' + this + '&quot;&gt;&lt;/div&gt;';
     style = String.__parseStyleElement.childNodes[0].style;
   }
-  
+
   Element.CSS_PROPERTIES.each(function(property){
-    if (style[property]) styleRules.set(property, style[property]); 
+    if (style[property]) styleRules.set(property, style[property]);
   });
-  
+
   if (Prototype.Browser.IE &amp;&amp; this.include('opacity'))
     styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
 
@@ -1104,7 +1104,7 @@ Effect.Methods = {
 
 $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
   'pulsate shake puff squish switchOff dropOut').each(
-  function(effect) { 
+  function(effect) {
     Effect.Methods[effect] = function(element, options){
       element = $(element);
       Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
@@ -1113,7 +1113,7 @@ $w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
   }
 );
 
-$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each( 
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
   function(f) { Effect.Methods[f] = Element[f]; }
 );
 </diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/javascripts/effects.js</filename>
    </modified>
    <modified>
      <diff>@@ -2765,7 +2765,7 @@ var Selector = Class.create({
         p = ps[i];
         if (m = e.match(p)) {
           this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
-    	      new Template(c[i]).evaluate(m));
+           new Template(c[i]).evaluate(m));
           e = e.replace(m[0], '');
           break;
         }
@@ -3102,7 +3102,7 @@ Object.extend(Selector, {
 
     nextElementSibling: function(node) {
       while (node = node.nextSibling)
-	      if (node.nodeType == 1) return node;
+       if (node.nodeType == 1) return node;
       return null;
     },
 
@@ -4222,4 +4222,4 @@ Object.extend(Element.ClassNames.prototype, Enumerable);
 
 /*--------------------------------------------------------------------------*/
 
-Element.addMethods();
\ No newline at end of file
+Element.addMethods();</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/javascripts/prototype.js</filename>
    </modified>
    <modified>
      <diff>@@ -51,4 +51,3 @@ a:hover { color: #fff; background-color:#000; }
   font-size: 12px;
   list-style: square;
 }
-</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/public/stylesheets/scaffold.css</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,7 @@ class Test::Unit::TestCase
   # don't care one way or the other, switching from MyISAM to InnoDB tables
   # is recommended.
   #
-  # The only drawback to using transactional fixtures is when you actually 
+  # The only drawback to using transactional fixtures is when you actually
   # need to test transactions.  Since your test is bracketed by a transaction,
   # any transactions started in your code will be automatically rolled back.
   self.use_transactional_fixtures = true</diff>
      <filename>adapters/dm-rest-adapter/fixtures/book_service/test/test_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -17,7 +17,7 @@ module DataMapper
   module Adapters
     class RestAdapter &lt; AbstractAdapter
       include Extlib
-      
+
       # Creates a new resource in the specified repository.
       def create(resources)
         count = 0
@@ -25,7 +25,7 @@ module DataMapper
           resource_name = Inflection.underscore(resource.class.name)
           result = http_post(&quot;/#{resource_name.pluralize}.xml&quot;, resource.to_xml)
           # TODO: Raise error if cannot reach server
-          success = result.instance_of?(Net::HTTPCreated) 
+          success = result.instance_of?(Net::HTTPCreated)
           if success
             count += 1
             # TODO: Fix commented out code below to work through the identity_map of the repository
@@ -36,7 +36,7 @@ module DataMapper
         end
         count
       end
-      
+
       # read_set
       #
       # Examples of query string:
@@ -65,7 +65,7 @@ module DataMapper
           end
         end
       end
-      
+
       def read_one(query)
         resource = nil
         resource_name = resource_name_from_query(query)
@@ -76,16 +76,16 @@ module DataMapper
         else
           id = query.conditions.first[2]
           # KLUGE: Again, we're assuming below that we're dealing with a pluralized resource mapping
-          
+
           response = http_get(&quot;/#{resource_name.pluralize}/#{id}.xml&quot;)
-        
+
           # KLUGE: Rails returns HTML if it can't find a resource.  A properly RESTful app would return a 404, right?
           return nil if response.is_a? Net::HTTPNotFound || response.content_type == &quot;text/html&quot;
-        
+
           data = response.body
           resource_meta = parse_resource(data, query.model, query)
         end
-        if resource_meta 
+        if resource_meta
           if resource_meta.has_key?(:associations)
             load_nested_resources_from resource_meta[:associations], query
           end
@@ -93,13 +93,13 @@ module DataMapper
         end
         resource
       end
-      
+
       def update(attributes, query)
         # TODO What if we have a compound key?
         raise NotImplementedError.new unless is_single_resource_query? query
         id = query.conditions.first[2]
         resource = nil
-        query.repository.scope do 
+        query.repository.scope do
           resource = query.model.get(id)
         end
         attributes.each do |attr, val|
@@ -110,15 +110,15 @@ module DataMapper
         # TODO: Raise error if cannot reach server
         res.kind_of?(Net::HTTPSuccess) ? 1 : 0
       end
-      
+
       def delete(query)
         raise NotImplementedError.new unless is_single_resource_query? query
         id = query.conditions.first[2]
         res = http_delete(&quot;/#{resource_name_from_query(query).pluralize}/#{id}.xml&quot;)
         res.kind_of?(Net::HTTPSuccess) ? 1 : 0
       end
-      
-    protected    
+
+    protected
       def load_nested_resources_from(nested_resources, query)
         nested_resources.each do |resource_meta|
           # TODO: Houston, we have a problem.  Model#load expects a Query.  When we're nested, we don't have a query yet...
@@ -128,7 +128,7 @@ module DataMapper
           #end
         end
       end
-    
+
       def read_set_all(repository, query, resource_name)
         # TODO: how do we know whether the resource we're talking to is singular or plural?
         res = http_get(&quot;/#{resource_name.pluralize}.xml&quot;)
@@ -136,18 +136,18 @@ module DataMapper
         parse_resources(data, query.model, query)
         # TODO: Raise error if cannot reach server
       end
-      
+
       #    GET /books/4200
       def read_set_for_condition(repository, query, resource_name)
         # More complex conditions
         raise NotImplementedError.new
-      end    
-          
+      end
+
       # query.conditions like [[:eql, #&lt;Property:Book:id&gt;, 4200]]
       def is_single_resource_query?(query)
         query.conditions.length == 1 &amp;&amp; query.conditions.first.first == :eql &amp;&amp; query.conditions.first[1].name == :id
       end
-      
+
       def http_put(uri, data = nil)
         request { |http| http.put(uri, data, {&quot;Content-Type&quot;, &quot;application/xml&quot;}) }
       end
@@ -170,13 +170,13 @@ module DataMapper
           res = yield(http)
         end
         res
-      end  
+      end
 
       def values_from_rexml(entity_element, dm_model_class)
         resource = {}
         resource[:values] = []
         entity_element.elements.each do |field_element|
-          attribute = dm_model_class.properties(repository.name).find do |property| 
+          attribute = dm_model_class.properties(repository.name).find do |property|
             # *MUST* use Inflection.underscore on the XML as Rails converts '_' to '-' in the XML
             property.name.to_s == Inflection.underscore(field_element.name.to_s)
           end
@@ -191,7 +191,7 @@ module DataMapper
             field_element.each_element do |associated_element|
               model = association[1].child_model
               (resource[:associations] ||= []) &lt;&lt; {
-                :model =&gt; model, 
+                :model =&gt; model,
                 :value =&gt; values_from_rexml(associated_element, association[1].child_model)
               }
             end
@@ -207,7 +207,7 @@ module DataMapper
         return nil unless entity_element
         values_from_rexml(entity_element, dm_model_class)
       end
-      
+
       def parse_resources(xml, dm_model_class, query = nil)
         doc = REXML::Document::new(xml)
         # # TODO: handle singular resource case as well....
@@ -219,12 +219,12 @@ module DataMapper
         doc.elements.collect(&quot;#{resource_name.pluralize}/#{resource_name}&quot;) do |entity_element|
           values_from_rexml(entity_element, dm_model_class)
         end
-      end  
-      
+      end
+
       def resource_name_from_model(model)
         Inflection.underscore(model.name)
       end
-      
+
       def resource_name_from_query(query)
         resource_name_from_model(query.model)
       end</diff>
      <filename>adapters/dm-rest-adapter/lib/rest_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/lib/rest_adapter/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,20 +2,20 @@ $LOAD_PATH &lt;&lt; File.dirname(__FILE__)
 require 'spec_helper'
 
 describe 'A REST adapter' do
-  
+
   before do
     @adapter = DataMapper::Repository.adapters[:default]
   end
-  
+
   describe 'when saving a resource' do
-  
+
     before do
       @book = Book.new(:title =&gt; 'Hello, World!', :author =&gt; 'Anonymous')
     end
-  
+
     it 'should make an HTTP Post' do
       @adapter.should_receive(:http_post).with('/books.xml', @book.to_xml)
       @book.save
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/spec/create_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,21 +2,21 @@ $LOAD_PATH &lt;&lt; File.dirname(__FILE__)
 require 'spec_helper'
 
 describe 'A REST adapter' do
-  
+
   before do
     @adapter = DataMapper::Repository.adapters[:default]
   end
-  
+
   describe 'when deleting an existing resource' do
     before do
       @book = Book.new(:title =&gt; 'Hello, World!', :author =&gt; 'Anonymous')
       @book.stub!(:new_record?).and_return(false)
     end
-    
+
     it 'should do an HTTP DELETE' do
       @adapter.should_receive(:http_delete)
       @book.destroy
     end
-    
+
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/spec/delete_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,15 @@ $LOAD_PATH &lt;&lt; File.dirname(__FILE__)
 require 'spec_helper'
 
 describe 'A REST adapter' do
-  
+
   before do
     @adapter = DataMapper::Repository.adapters[:default]
   end
-  
+
   describe 'when getting one resource' do
 
     describe 'if the resource exists' do
-    
+
       before do
         book_xml = &lt;&lt;-BOOK
         &lt;?xml version='1.0' encoding='UTF-8'?&gt;
@@ -27,25 +27,25 @@ describe 'A REST adapter' do
         @response.stub!(:body).and_return(book_xml)
         @adapter.stub!(:http_get).and_return(@response)
       end
-        
+
       it 'should return the resource' do
         book = Book.get(@id)
         book.should_not be_nil
         book.id.should be_an_instance_of(Fixnum)
         book.id.should == 1
       end
-        
+
       it 'should do an HTTP GET' do
         @adapter.should_receive(:http_get).with('/books/1.xml').and_return(@response)
         Book.get(@id)
       end
-      
+
       it &quot;it be equal to itself&quot; do
         Book.get(@id).should == Book.get(@id)
-      end      
+      end
     end
-      
-    
+
+
     describe 'if the resource does not exist' do
       it 'should return nil' do
         @id = 1
@@ -58,9 +58,9 @@ describe 'A REST adapter' do
       end
     end
   end
-  
+
   describe 'when getting all resource of a particular type' do
-    before do      
+    before do
       books_xml = &lt;&lt;-BOOK
       &lt;?xml version='1.0' encoding='UTF-8'?&gt;
       &lt;books type='array'&gt;
@@ -70,7 +70,7 @@ describe 'A REST adapter' do
           &lt;id type='integer'&gt;1&lt;/id&gt;
           &lt;title&gt;The Dispossed&lt;/title&gt;
           &lt;updated-at type='datetime'&gt;2008-06-08T17:02:28Z&lt;/updated-at&gt;
-        &lt;/book&gt;      
+        &lt;/book&gt;
         &lt;book&gt;
           &lt;author&gt;Stephen King&lt;/author&gt;
           &lt;created-at type='datetime'&gt;2008-06-08T17:03:07Z&lt;/created-at&gt;
@@ -84,18 +84,18 @@ describe 'A REST adapter' do
       @response.stub!(:body).and_return(books_xml)
       @adapter.stub!(:http_get).and_return(@response)
     end
-    
+
     it 'should get a non-empty list' do
       Book.all.should_not be_empty
     end
-    
+
     it 'should receive one Resource for each entity in the XML' do
       Book.all.size.should == 2
     end
-    
+
     it 'should do an HTTP GET' do
       @adapter.should_receive(:http_get).and_return(@response)
       Book.first
-    end    
+    end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/spec/read_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,4 +10,4 @@ module RubyForker
     cmd &lt;&lt; &quot; 2&gt; #{stderr}&quot; unless stderr.nil?
     `#{cmd}`
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/spec/ruby_forker.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@ $LOAD_PATH &lt;&lt; File.dirname(__FILE__)
 require 'spec_helper'
 
 describe 'A REST adapter' do
-  
+
   describe 'when updating an existing resource' do
     before do
       @books_xml = &lt;&lt;-XML
@@ -16,11 +16,11 @@ describe 'A REST adapter' do
       repository do |repo|
         @repository = repo
         @book = Book.new(:id =&gt; 42,
-                         :title =&gt; 'Starship Troopers', 
-                         :author =&gt; 'Robert Heinlein', 
+                         :title =&gt; 'Starship Troopers',
+                         :author =&gt; 'Robert Heinlein',
                          :created_at =&gt; DateTime.parse('2008-06-08T17:02:28Z'))
         @book.instance_eval { @new_record = false }
-        @repository.identity_map(Book).set(@book.key, @book)      
+        @repository.identity_map(Book).set(@book.key, @book)
         @book.title = &quot;Mary Had a Little Lamb&quot;
       end
     end
@@ -28,9 +28,9 @@ describe 'A REST adapter' do
     it 'should do an HTTP PUT' do
       adapter = @repository.adapter #DataMapper::Repository.adapters[:default]
       adapter.should_receive(:http_put).with('/books/42.xml', @book.to_xml)
-      @repository.scope do 
+      @repository.scope do
         @book.save
       end
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/spec/update_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,4 +15,4 @@ Dir[&quot;#{File.dirname(__FILE__)}/*&quot;].each do |file|
       run file if File.file?(file)
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/stories/crud/stories.rb</filename>
    </modified>
    <modified>
      <diff>@@ -6,4 +6,4 @@ require 'dm-core'
 #require 'pathname'
 #require Pathname(__FILE__).dirname.parent.expand_path + '../../lib/rest_adapter'
 require File.join(File.dirname(__FILE__), *%w[resources helpers story_helper])
-require File.join(File.dirname(__FILE__), *%w[resources steps using_rest_adapter])
\ No newline at end of file
+require File.join(File.dirname(__FILE__), *%w[resources steps using_rest_adapter])</diff>
      <filename>adapters/dm-rest-adapter/stories/helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,2 +1,2 @@
 require 'spec/story'
-require File.dirname(__FILE__) + '/../../../spec/ruby_forker'
\ No newline at end of file
+require File.dirname(__FILE__) + '/../../../spec/ruby_forker'</diff>
      <filename>adapters/dm-rest-adapter/stories/resources/helpers/story_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,9 +7,9 @@ steps_for :read do
       has n, :books
     end
   end
-  
+
   Given &quot;the ID of an existing Resource that has associated Resources&quot; do
-    # Assuming that resource 1 is there.  
+    # Assuming that resource 1 is there.
     # @type.first would do a GET; that's what we're testing
     @resource_id = 1
   end
@@ -21,15 +21,15 @@ steps_for :read do
   When &quot;I GET &lt;nested resource&gt;/&lt;id&gt;&quot; do
     @resource = Shelf.get(@resource_id)
   end
-  
+
   Then &quot;I should get the Resource&quot; do
     @resource.should_not be_nil
     @resource.should be_an_instance_of(Shelf)
     @resource.id.should == 1
   end
-  
+
   Then &quot;the Resource will have associated Resources&quot; do
     @resource.books.should_not be_empty
     @resource.books.first.should be_an_instance_of(Book)
   end
-end
\ No newline at end of file
+end</diff>
      <filename>adapters/dm-rest-adapter/stories/resources/steps/read.rb</filename>
    </modified>
    <modified>
      <diff>@@ -39,18 +39,18 @@ steps_for :using_rest_adapter do
     @resource = Book.first
     @resource_id = @resource.id
   end
-  
+
   When(&quot;I try to save the Resource&quot;) do
     @result = @resource.save
   end
-  
+
   When(&quot;I request all of the Resources of that type&quot;) do
     require File.join(File.dirname(__FILE__), '..', 'helpers', 'book')
     @resources = Book.all
   end
-  
+
   When(&quot;I request the Resource&quot;) do
-    require File.join(File.dirname(__FILE__), '..', 'helpers', 'book')    
+    require File.join(File.dirname(__FILE__), '..', 'helpers', 'book')
     @resource = Book.get(@resource_id)
   end
 
@@ -61,19 +61,19 @@ steps_for :using_rest_adapter do
   When(&quot;I make invalid changes to that Resource&quot;) do
     @resource.title = nil
   end
-  
+
   When(&quot;I destroy the Resource&quot;) do
     @resource.destroy
   end
-  
+
   Then(&quot;the Resource should save&quot;) do
     @result.should be_true
   end
-  
+
   Then(&quot;the Resource should not save&quot;) do
     @result.should be_false
   end
-  
+
   Then(&quot;I should not receive an empty list&quot;) do
     @resources.should_not be_empty
   end
@@ -86,7 +86,7 @@ steps_for :using_rest_adapter do
   Then(&quot;I should get nothing in return&quot;) do
     @resource.should be_nil
   end
-  
+
   Then(&quot;the Resource will no longer be available&quot;) do
     # TODO refactor
     require File.join(File.dirname(__FILE__), '..', 'helpers', 'book')</diff>
      <filename>adapters/dm-rest-adapter/stories/resources/steps/using_rest_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -54,8 +54,8 @@ module DataMapper
               aggregate_field_statement(repository, property.operator, property.target, qualify)
             when Property
               original_property_to_column_name(repository, property, qualify)
-						when Query::Path
-							 original_property_to_column_name(repository, property, qualify)
+      when Query::Path
+        original_property_to_column_name(repository, property, qualify)
             else
               raise ArgumentError, &quot;+property+ must be a DataMapper::Query::Operator or a DataMapper::Property, but was a #{property.class} (#{property.inspect})&quot;
           end</diff>
      <filename>dm-aggregates/lib/dm-aggregates/adapters/data_objects_adapter.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,12 +5,12 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
   describe 'DataMapper::Resource' do
     before :all do
       # A simplistic example, using with an Integer property
-			class Knight
-				include DataMapper::Resource
+   class Knight
+    include DataMapper::Resource
 
-				property :id,								Serial
-				property :name,							String
-			end
+    property :id,								Serial
+    property :name,							String
+   end
 
       class Dragon
         include DataMapper::Resource
@@ -23,7 +23,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         property :birth_on,          Date
         property :birth_time,        Time
 
-				belongs_to :knight
+    belongs_to :knight
       end
 
 
@@ -47,8 +47,8 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
       @birth_on   = Date.parse(@birth_at.to_s)
       @birth_time = Time.parse(@birth_at.to_s)
 
-			@chuck = Knight.create( :name =&gt; 'Chuck' )
-			@larry = Knight.create( :name =&gt; 'Larry')
+   @chuck = Knight.create( :name =&gt; 'Chuck' )
+   @larry = Knight.create( :name =&gt; 'Larry')
 
       Dragon.create(:name =&gt; 'George', :is_fire_breathing =&gt; false, :toes_on_claw =&gt; 3, :birth_at =&gt; @birth_at, :birth_on =&gt; @birth_on, :birth_time =&gt; @birth_time, :knight =&gt; @chuck )
       Dragon.create(:name =&gt; 'Puff',   :is_fire_breathing =&gt; true,  :toes_on_claw =&gt; 4, :birth_at =&gt; @birth_at, :birth_on =&gt; @birth_on, :birth_time =&gt; @birth_time, :knight =&gt; @larry )
@@ -319,13 +319,13 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
           end
         end
       end
-    
-			describe &quot;query path issue&quot; do
-			  it &quot;should not break when a query path is specified&quot; do
-			    dragon = Dragon.first(Dragon.knight.name =&gt; 'Chuck')
-					dragon.name.should == 'George'
-			  end
-			end
-		end
+
+   describe &quot;query path issue&quot; do
+     it &quot;should not break when a query path is specified&quot; do
+       dragon = Dragon.first(Dragon.knight.name =&gt; 'Chuck')
+     dragon.name.should == 'George'
+     end
+   end
+  end
   end
 end</diff>
      <filename>dm-aggregates/spec/integration/aggregates_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-require File.join(File.dirname(__FILE__), &quot;dm-cli&quot;, &quot;cli&quot;)
\ No newline at end of file
+require File.join(File.dirname(__FILE__), &quot;dm-cli&quot;, &quot;cli&quot;)</diff>
      <filename>dm-cli/lib/dm-cli.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   class CLI
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-cli/lib/dm-cli/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,4 +3,3 @@ module DataMapper
     VERSION = &quot;0.9.4&quot;
   end
 end
-</diff>
      <filename>dm-constraints/lib/dm-constraints/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-example/lib/dm-is-example/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-list/lib/dm-is-list/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -358,7 +358,7 @@ module DataMapper
         def right_sibling
           self_and_siblings.find{|v| v.lft == rgt+1}
         end
-        
+
        private
         def detach
           offset = self.lft - self.rgt - 1</diff>
      <filename>dm-is-nested_set/lib/dm-is-nested_set/is/nested_set.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-nested_set/lib/dm-is-nested_set/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -25,9 +25,9 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
 
     def pos; [lft,rgt] end # convenience method only for speccing.
   end
-  
+
   class CustomCategory &lt; Category
-    
+
   end
 
   def setup
@@ -92,13 +92,13 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         end
       end
     end
-    
+
     describe 'Class#root and #root' do
       it 'should return the toplevel node' do
         Category.root.name.should == &quot;Electronics&quot;
       end
     end
-    
+
     describe 'Class#leaves and #leaves' do
       it 'should return all nodes without descendants' do
         repository(:default) do
@@ -110,7 +110,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         end
       end
     end
-    
+
     describe '#ancestor, #ancestors and #self_and_ancestors' do
       it 'should return ancestors in an array' do
         repository(:default) do |repos|
@@ -123,7 +123,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         end
       end
     end
-    
+
     describe '#children' do
       it 'should return children of node' do
         repository(:default) do |repos|
@@ -138,7 +138,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
       end
     end
 
-    Category.get(1).children 
+    Category.get(1).children
 
     describe '#descendants and #self_and_descendants' do
       it 'should return all subnodes of node' do
@@ -170,7 +170,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
     end
 
     describe '#move' do
-    
+
       # Outset:
       # id | lft| rgt| title
       #========================================
@@ -184,118 +184,118 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
       # 8  | 12 | 13 |       - Flash
       # 9  | 15 | 16 |     - CD Players
       # 10 | 17 | 18 |     - 2 Way Radios
-    
+
       it 'should move items correctly with :higher / :highest / :lower / :lowest' do
         repository(:default) do |repos|
-    
+
           Category.get(4).pos.should == [5,6]
-    
+
           Category.get(4).move(:above =&gt; Category.get(3))
           Category.get(4).pos.should == [3,4]
-    
+
           Category.get(4).move(:higher).should == false
           Category.get(4).pos.should == [3,4]
           Category.get(3).pos.should == [5,6]
           Category.get(4).right_sibling.should == Category.get(3)
-    
+
           Category.get(4).move(:lower)
           Category.get(4).pos.should == [5,6]
           Category.get(4).left_sibling.should == Category.get(3)
           Category.get(4).right_sibling.should == Category.get(5)
-    
+
           Category.get(4).move(:highest)
           Category.get(4).pos.should == [3,4]
           Category.get(4).move(:higher).should == false
-    
+
           Category.get(4).move(:lowest)
           Category.get(4).pos.should == [7,8]
           Category.get(4).left_sibling.should == Category.get(5)
-    
+
           Category.get(4).move(:higher) # should reset the tree to how it was
-    
+
         end
       end
-    
+
       it 'should move items correctly with :indent / :outdent' do
         repository(:default) do |repos|
-    
+
           mp3_players = Category.get(7)
-    
+
           portable_electronics = Category.get(6)
           televisions = Category.get(2)
-    
+
           mp3_players.pos.should == [11,14]
           #mp3_players.descendants.length.should == 1
-    
+
           # The category is at the top of its parent, should not be able to indent.
           mp3_players.move(:indent).should == false
-    
+
           mp3_players.move(:outdent)
-    
+
           mp3_players.pos.should == [16,19]
           mp3_players.left_sibling.should == portable_electronics
-    
+
           mp3_players.move(:higher) # Move up above Portable Electronics
-    
+
           mp3_players.pos.should == [10,13]
           mp3_players.left_sibling.should == televisions
         end
       end
     end
-    
+
     describe 'moving objects with #move_* #and place_node_at' do
       it 'should set left/right when choosing a parent' do
         repository(:default) do |repos|
           Category.auto_migrate!
-    
+
           c1 = Category.create!(:name =&gt; &quot;New Electronics&quot;)
-    
+
           c2 = Category.create!(:name =&gt; &quot;OLED TVs&quot;)
-    
+
           c1.pos.should == [1,4]
           c1.root.should == c1
           c2.pos.should == [2,3]
-    
+
           c3 = Category.create(:name =&gt; &quot;Portable Electronics&quot;)
           c3.parent=c1
           c3.save
-    
+
           c1.pos.should == [1,6]
           c2.pos.should == [2,3]
           c3.pos.should == [4,5]
-    
+
           c3.parent=c2
           c3.save
-    
+
           c1.pos.should == [1,6]
           c2.pos.should == [2,5]
           c3.pos.should == [3,4]
-    
+
           c3.parent=c1
           c3.move(:into =&gt; c2)
-    
+
           c1.pos.should == [1,6]
           c2.pos.should == [2,5]
           c3.pos.should == [3,4]
-    
+
           c4 = Category.create(:name =&gt; &quot;Tube&quot;, :parent =&gt; c2)
           c5 = Category.create(:name =&gt; &quot;Flatpanel&quot;, :parent =&gt; c2)
-    
+
           c1.pos.should == [1,10]
           c2.pos.should == [2,9]
           c3.pos.should == [3,4]
           c4.pos.should == [5,6]
           c5.pos.should == [7,8]
-    
+
           c5.move(:above =&gt; c3)
           c3.pos.should == [5,6]
           c4.pos.should == [7,8]
           c5.pos.should == [3,4]
-    
+
         end
       end
     end
-    
+
     describe 'scoping' do
       it 'should detach from list when changing scope' do
         repository(:default) do |repos|
@@ -308,7 +308,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         end
       end
     end
-    
+
     describe 'integrity' do
       it 'should detach object from list when deleted' do
         repository(:default) do |repos|</diff>
      <filename>dm-is-nested_set/spec/integration/nested_set_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,4 +3,3 @@
 * 1 major enhancement
 
   * Pre-Release, super beta.
-</diff>
      <filename>dm-is-remixable/History.txt</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@ For example:
 module Comment
   include DataMapper::Resource
   is :remixable
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
   property :body,       String
   property :created_at, DateTime
@@ -18,17 +18,17 @@ end
 #Lots of things can be addressable; people, buildings
 module Addressable
   include DataMapper::Resource
-  
+
   is :remixable,
     :suffix =&gt; &quot;address&quot; #Default suffix is module name pluralized
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
-  
+
   property :label,      String #home, work, etc...
-  
+
   property :address1,   String, :length =&gt; 255
   property :address2,   String, :length =&gt; 255
-  
+
   property :city,       String, :length =&gt; 128
   property :state,      String, :length =&gt; 2
   property :zip,        String, :length =&gt; 5..10
@@ -36,70 +36,70 @@ end
 
 module Vote
   include DataMapper::Resource
-  
+
   is :remixable
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
   property :opinion,    Enum.new(&quot;good&quot;,&quot;bad&quot;)
-  
+
 end
 
 class Location
   include DataMapper::Resource
-  
+
   #Location can have 1 address
   remix 1, :addressables
-  
+
   # This does the following:
-  # - creates a class called LocationAddress 
+  # - creates a class called LocationAddress
       (default name would be LocationAddressable, but Addressable#suffix was specified)
   # - duplicates the properties of Addressable within LocationAddress
   # - a table called location_addresses
   # - creates Location#location_addresses accessor
-  
+
   #... methods, properties, etc ...#
 end
 
 
 class User
   include DataMapper::Resource
-  
+
   #User can have many addresses
   remix n, :addressables, :as =&gt; &quot;addresses&quot;
-  # - creates a class called UserAddress 
+  # - creates a class called UserAddress
       (default name would be UserAddressable, but Addressable#suffix was specified)
   # - duplicates the properties of Addressable within UserAddress
   # - a table called user_addresses
   # - creates User#user_addresses accessor
   # - creates an accessor alias User#addresses
-  
+
   enhance :addressables do
     storage_names[:default] = &quot;a_different_table_name&quot;
     property :label, Enum.new(&quot;work&quot;,&quot;home&quot;)
-    
+
     #This adds a column to user_addresses to store an address label
   end
-  
+
   #... methods, properties, etc ...#
 end
 
 class Article
   include DataMapper::Resource
-  
+
   remix n, :comments, :for =&gt; &quot;User&quot;
   # - creates a class called ArticleComment
   # - duplicates the properties of Comment within ArticleComment
   # - a table called article_comments
   # - creates Article#article_comments
   # - creates User#article_comments
-  
+
   #... methods, properties, etc ...#
 
 end
 
 class Video
   include DataMapper::Resource
-  
+
   remix n, :comments, :for =&gt; &quot;User&quot;, :as =&gt; &quot;comments&quot;
   # - creates a class called VideoComment
   # - duplicates the properties of Comment within VideoComment
@@ -107,21 +107,21 @@ class Video
   # - creates Video#video_comments
   # - creates User#video_comments
   # - create Video#comments
-  
+
   enhance :comments do
     # VideoComment now has the method #reverse
     def reverse
       return self.body.reverse
     end
-    
+
     #I like YouTubes ability for users to vote comments up and down
     remix 1, :votes, :for =&gt; &quot;User&quot;
     # - creates a class called VideoCommentVote
     # - duplicates the properties of Vote within VideoCommentVote
     # - a table called video_comment_votes
     # - creates Video#video_comments#votes
-    
+
   end
-  
+
   #... methods, properties, etc ...#
 end</diff>
      <filename>dm-is-remixable/README.txt</filename>
    </modified>
    <modified>
      <diff>@@ -4,12 +4,12 @@ Add ability to have a unique relationship when joining through remixable
   This is stubbed at remixable.rb @~ line 223; waiting on stategic eager loading
   M:M Video.remix n, :commentables, :as =&gt; &quot;comments&quot;, :for =&gt; &quot;User&quot;, :unique =&gt; false
   M:M Article.remix n, :views, :for =&gt; &quot;User&quot;, :unique =&gt; true
-    in the generated table article_views article_id and user_id would be a unique key, 
+    in the generated table article_views article_id and user_id would be a unique key,
       only counting a users viewing of an article once
 
 
 TODO
-====  
+====
 - Test nested remix with M:M through Remixable, :for =&gt; &quot;Class&quot;
 - Test with Namespaced Models
 
@@ -19,9 +19,9 @@ TODO
 - Harvest Class methods (including it into Remixed Model gets the instance methods, but not class methods...)
 
 - Squash protection;
-  IF    ClassA =&gt; remix ModuleB, :table_name =&gt; &quot;squashme&quot; 
+  IF    ClassA =&gt; remix ModuleB, :table_name =&gt; &quot;squashme&quot;
   AND   ClassC =&gt; remix ModuleB, :table_name =&gt; &quot;squashme&quot; #SQUASHED THAT TABLE
-  
+
 - Remixable.related(*remixed_models)
   Taggable.related(Article, JobPostings)
 
@@ -32,7 +32,7 @@ CONSIDERATIONS
 - Adding Conditions to Associations (http://datamapper.org/docs/associations.html)
 
 - Defining class name specifically during remix (rather than implied from :table_name)
-  remix, :class_name =&gt; &quot;MyClassName&quot; 
+  remix, :class_name =&gt; &quot;MyClassName&quot;
       #instead of using table_name? Too Many Options or having Remixable default class name...
 
   EXAMPLE:
@@ -40,19 +40,18 @@ CONSIDERATIONS
     :table_name =&gt; &quot;user_addresses&quot;
     :as =&gt; &quot;addresses&quot;
     :class_name =&gt; &quot;address&quot;
-    
+
 - Remixable Module defines class name
 
   EXAMPLE:
   module :addressables
-    is :remixable, 
+    is :remixable,
       :suffix =&gt; &quot;address&quot;,
       :class_name =&gt; &quot;address&quot;
-  
+
   a = Address.new  #Instead of a = UserAddress.new
   User.user_addresses &lt;&lt; a
   User.addresses &lt;&lt; a
-  
+
   Benefit: On remixing you dont end up with crazy amounts of classes/names UserAddress, AccountAddress, etc
   Problem: How does enhancing work (since all Address's will use same class)
-   
\ No newline at end of file</diff>
      <filename>dm-is-remixable/TODO</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,15 @@
 module DataMapper
   module Is
     module Remixable
-      
+
       #==============================INCLUSION METHODS==============================#
-      
+
       # Adds remixer methods to DataMapper::Resource
       def self.included(base)
         base.send(:include,RemixerClassMethods)
         base.send(:include,RemixerInstanceMethods)
       end
-      
+
       # - is_remixable
       # ==== Description
       #   Adds RemixeeClassMethods and RemixeeInstanceMethods to any model that is: remixable
@@ -30,32 +30,32 @@ module DataMapper
       #   include DataMapper::Resource
       #
       #   is :remixable
-      # 
+      #
       # ==== Notes
       #   These options are just available for whatever reason your Remixable Module name
       #   might not be what you'd like to see the table name and property accessor named.
       #   These are just configurable defaults, upon remixing the class_name and accessor there
-      #   take precedence over the defaults set here 
+      #   take precedence over the defaults set here
       # ==== Options
-      #   :suffix   &lt;String&gt; 
+      #   :suffix   &lt;String&gt;
       #             Table suffix, defaults to YourModule.name.downcase.singular
       #             Yields table name of remixer_suffix; ie user_comments, user_votes
       def is_remixable(options={})
-        extend  DataMapper::Is::Remixable::RemixeeClassMethods        
+        extend  DataMapper::Is::Remixable::RemixeeClassMethods
         include DataMapper::Is::Remixable::RemixeeInstanceMethods
-               
+
         suffix(options.delete(:suffix) || self.name.downcase.singular)
       end
-      
-      
+
+
       #==============================CLASS METHODS==============================#
-      
+
       # - RemixerClassMethods
       # ==== Description
       #   Methods available to all DataMapper::Resources
       module RemixerClassMethods
         def self.included(base);end;
-        
+
         # - remixables
         # ==== Description
         #   Returns a hash of the remixables used by this class
@@ -64,8 +64,8 @@ module DataMapper
         def remixables
           @remixables
         end
-        
-        # - remix 
+
+        # - remix
         # ==== Description
         #   Remixes a Remixable Module
         # ==== Parameters
@@ -88,24 +88,24 @@ module DataMapper
         #                                   over the two table id's
         # ==== Examples
         # Given: User (Class), Addressable (Module)
-        #   
+        #
         #   One-To-Many; Class-To-Remixable
         #
         #   remix n, :addressables,
-        #     :class_name =&gt; &quot;UserAddress&quot;, 
-        #     :as         =&gt; &quot;addresses&quot;       
-        #   
+        #     :class_name =&gt; &quot;UserAddress&quot;,
+        #     :as         =&gt; &quot;addresses&quot;
+        #
         #   Tables: users, user_addresses
         #   Classes: User, UserAddress
         #     User.user_addresses &lt;&lt; UserAddress.new
         #     User.addresses &lt;&lt; UserAddress.new
         #   --------------------------------------------
         #   --------------------------------------------
-        # 
+        #
         # Given: User (Class), Video (Class), Commentable (Module)
         #
         #   Many-To-Many; Class-To-Class through RemixableIntermediate (Video allows Commentable for User)
-        # 
+        #
         #   Video.remix n, :commentables
         #     :for        =&gt; 'User'    #:for &amp; :on have same effect, just a choice of wording...
         #   --------------------------------------------
@@ -115,14 +115,14 @@ module DataMapper
         #
         #   Many-To-Many Unary relationship between User &amp; User through comments
         #   User.remix n, :commentables, :as =&gt; &quot;comments&quot;, :for =&gt; 'User', :via =&gt; &quot;commentor&quot;
-        #   =&gt; This would create user_id and commentor_id as the 
+        #   =&gt; This would create user_id and commentor_id as the
         #
         def remix(cardinality, remixable, options={})
           #A map for remixable names to Remixed Models
           @remixables = {} if @remixables.nil?
-          
+
           remixable_module = Object.const_get(Extlib::Inflection.classify(remixable))
-          
+
           #Merge defaults/options
           options = {
             :as         =&gt; nil,
@@ -132,28 +132,28 @@ module DataMapper
             :unique     =&gt; false,
             :via        =&gt; nil
           }.merge(options)
-             
+
           #Make sure the class hasn't been remixed already
           unless Object.const_defined? options[:class_name]
-            
+
             #Storage name of our remixed model
             options[:table_name] = Extlib::Inflection.tableize(options[:class_name])
-            
+
             #Other model to mix with in case of M:M through Remixable
             options[:other_model] = options[:for] || options[:on]
-            
+
             puts &quot; ~ Generating Remixed Model: #{options[:class_name]}&quot;
             model = generate_remixed_model(remixable_module, options)
 
             #map the remixable to the remixed model
             @remixables[remixable] = model
-            
-            #Create relationships between Remixer and remixed class          
-            if options[:other_model] 
+
+            #Create relationships between Remixer and remixed class
+            if options[:other_model]
               # M:M Class-To-Class w/ Remixable Module as intermediate table
               # has n and belongs_to (or One-To-Many)
               remix_many_to_many cardinality, model, options
-            else 
+            else
               # 1:M Class-To-Remixable
               # has n and belongs_to (or One-To-Many)
               remix_one_to_many cardinality, model, options
@@ -161,11 +161,11 @@ module DataMapper
 
             #Add accessor alias
             attach_accessor(options) unless options[:as].nil?
-          else  
+          else
             puts &quot;#{__FILE__}:#{__LINE__} warning: already remixed constant #{options[:class_name]}&quot;
           end
         end
-        
+
         # - enhance
         # ==== Description
         #   Enhance a remix; allows nesting remixables, adding columns &amp; functions to a remixed resource
@@ -179,23 +179,23 @@ module DataMapper
         #
         #     enhance :comments do
         #       remix n, :votes        #This would result in something like YouTubes Voting comments up/down
-        #       
+        #
         #       property :updated_at, DateTime
         #
         #       def backwards; self.test.reverse; end;
         #     end
         def enhance(remixable,&amp;block)
           model = @remixables[remixable]
-          
+
           unless model.nil?
             model.class_eval &amp;block
           else
             raise Exception, &quot;#{remixable} must be remixed before it can be enhanced&quot;
           end
         end
-        
+
         private
-        
+
         # - attach_accessor
         # ==== Description
         #   Creates additional alias for r/w accessor
@@ -207,7 +207,7 @@ module DataMapper
             alias #{options[:as].intern}= #{options[:table_name].intern}=
           EOS
         end
-        
+
         # - remix_one_to_many
         # ==== Description
         #   creates a one to many relationship Class has many of remixed model
@@ -219,7 +219,7 @@ module DataMapper
           self.has cardinality, options[:table_name].intern
           model.belongs_to Extlib::Inflection.tableize(self.name).intern
         end
-        
+
         # - remix_many_to_many
         # ==== Description
         #   creates a many to many relationship between two DataMapper models THROUGH a Remixable module
@@ -229,27 +229,27 @@ module DataMapper
         #   options     &lt;Hash&gt; options hash
         def remix_many_to_many(cardinality, model, options)
           options[:other_model] = Object.const_get options[:other_model]
-                
+
           #TODO if options[:unique] the two *_id's need to be a unique composite key, maybe even
           # attach a validates_is_unique if the validator is included.
           puts &quot; ~ options[:unique] is not yet supported&quot; if options[:unique]
-          
+
           # Is M:M between two different classes or the same class
-          unless self.name == options[:other_model].name          
+          unless self.name == options[:other_model].name
             self.has cardinality, options[:table_name].intern
             options[:other_model].has cardinality, options[:table_name].intern
-        
+
             model.belongs_to  Extlib::Inflection.tableize(self.name).intern
             model.belongs_to  Extlib::Inflection.tableize(options[:other_model].name).intern
           else
             raise Exception, &quot;options[:via] must be specified when Remixing a module between two of the same class&quot; unless options[:via]
-            
+
             self.has cardinality, options[:table_name].intern
             model.belongs_to Extlib::Inflection.tableize(self.name).intern
             model.belongs_to options[:via].intern, :class_name =&gt; options[:other_model].name, :child_key =&gt; [&quot;#{options[:via]}_id&quot;.intern]
           end
         end
-        
+
         # - generate_remixed_model
         # ==== Description
         #   Generates a Remixed Model Class from a Remixable Module and options
@@ -259,11 +259,11 @@ module DataMapper
         # ==== Returns
         #   &lt;Class&gt; remixed model
         def generate_remixed_model(remixable,options)
-          #Create Remixed Model          
+          #Create Remixed Model
           klass = Class.new Object do
             include DataMapper::Resource
           end
-        
+
           #Give remixed model a name and create its constant
           model = Object.const_set options[:class_name], klass
 
@@ -274,12 +274,12 @@ module DataMapper
           remixable.properties.each do |prop|
             model.property(prop.name, prop.type, prop.options)
           end
-          
+
           model
         end
-                 
+
       end # RemixerClassMethods
-      
+
       # - RemixeeClassMethods
       # ==== Description
       #   Methods available to any model that is :remixable
@@ -293,29 +293,29 @@ module DataMapper
           @suffix = sfx unless sfx.nil?
           @suffix
         end
-        
+
         #Squash auto_migrate!
         def auto_migrate!(args=nil)
           DataMapper.logger.warn(&quot;Remixable modules (#{self.name}) cannot be auto migrated&quot;)
         end
-        
+
         #Squash auto_upgrade!
         def auto_upgrade!(args=nil)
-          DataMapper.logger.warn(&quot;Remixable modules (#{self.name}) cannot be auto updated&quot;)          
+          DataMapper.logger.warn(&quot;Remixable modules (#{self.name}) cannot be auto updated&quot;)
         end
       end # RemixeeClassMethods
-      
-      
+
+
       #==============================INSTANCE METHODS==============================#
-            
+
       module RemixeeInstanceMethods
         def self.included(base);end;
       end # RemixeeInstanceMethods
-      
+
       module RemixerInstanceMethods
         def self.included(base);end;
       end # RemixerInstanceMethods
-      
+
     end # Example
   end # Is
 end # DataMapper</diff>
      <filename>dm-is-remixable/lib/dm-is-remixable/is/remixable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/lib/dm-is-remixable/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,15 +1,15 @@
 module Addressable
   include DataMapper::Resource
-  
+
   is :remixable,
     :suffix =&gt; &quot;address&quot;
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
-    
+
   property :address1,   String, :length =&gt; 255
   property :address2,   String, :length =&gt; 255
-  
+
   property :city,       String, :length =&gt; 128
   property :state,      String, :length =&gt; 2
   property :zip,        String, :length =&gt; 5..10
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/spec/data/addressable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,28 +5,28 @@ require Pathname(__FILE__).dirname / &quot;user&quot;
 
 class Article
   include DataMapper::Resource
-  
+
   property :id, Integer, :key =&gt; true, :serial =&gt; true
   property :title, String
   property :url, String
-  
-  
+
+
   remix 1, :images, :as =&gt; &quot;pics&quot;
-    
+
   remix n, :viewables, :as =&gt; &quot;views&quot;
 
   remix n, :commentables, :as =&gt; &quot;comments&quot;, :for =&gt; &quot;User&quot;
-  
+
   enhance :viewables do
     belongs_to :user
   end
-  
+
   def viewed_by(usr)
     art_view = ArticleView.new
     art_view.ip = &quot;127.0.0.1&quot;
     art_view.user_id = usr.id
-    
+
     self.views &lt;&lt; art_view
   end
-  
-end
\ No newline at end of file
+
+end</diff>
      <filename>dm-is-remixable/spec/data/article.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,12 @@
 module Billable
   include DataMapper::Resource
-  
+
   is :remixable,
     :suffix =&gt; &quot;billing_account&quot;
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
-  
+
   property :cc_type,    Enum.new(&quot;mastercard&quot;,&quot;amex&quot;,&quot;visa&quot;)
   property :cc_num,     String, :length =&gt; 12..20
-  property :expiration, Date  
+  property :expiration, Date
 end</diff>
      <filename>dm-is-remixable/spec/data/billable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,10 @@
 module Commentable
   include DataMapper::Resource
-  
+
   is :remixable,
     :suffix =&gt; &quot;comment&quot;
-  
+
   property :id,         Integer, :key =&gt; true, :serial =&gt; true
   property :comment,    String
   property :created_at, DateTime
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/spec/data/commentable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,9 @@
 module Image
   include DataMapper::Resource
-  
+
   is :remixable
 
-  property :id,           Integer, :key =&gt; true, :serial =&gt; true 
+  property :id,           Integer, :key =&gt; true, :serial =&gt; true
   property :description,  String
   property :path,         String
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/spec/data/image.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,28 +4,28 @@ require Pathname(__FILE__).dirname / &quot;addressable&quot;
 
 class User
   include DataMapper::Resource
-    
-  property :id,             Integer,  
-    :key          =&gt; true,       
+
+  property :id,             Integer,
+    :key          =&gt; true,
     :serial       =&gt; true
-  
-  property :first_name,     String,   
-    :nullable     =&gt; false, 
+
+  property :first_name,     String,
+    :nullable     =&gt; false,
     :length       =&gt; 2..50
-    
-  property :last_name,      String,   
-    :nullable     =&gt; false, 
+
+  property :last_name,      String,
+    :nullable     =&gt; false,
     :length       =&gt; 2..50
-      
+
   remix n, :viewables
-  
+
   remix n, :billables, :class_name =&gt; &quot;Account&quot;
-  
+
   remix n, :addressables
-  
+
   remix n, :commentables, :as =&gt; &quot;comments&quot;, :for =&gt; &quot;User&quot;, :via =&gt; &quot;commentor&quot;
 
   enhance :addressables do
     property :label, Enum.new('home','work')
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/spec/data/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,11 @@
 module Viewable
   include DataMapper::Resource
-  
+
   is :remixable,
     :suffix =&gt; &quot;view&quot;
 
-  property :id, Integer, :key =&gt; true, :serial =&gt; true 
-  
+  property :id, Integer, :key =&gt; true, :serial =&gt; true
+
   property :created_at, DateTime
   property :ip, String
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-remixable/spec/data/viewable.rb</filename>
    </modified>
    <modified>
      <diff>@@ -24,51 +24,51 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
         true
       end
     end
-        
+
     it &quot;should provide a default suffix values for models that do 'is :remixable'&quot; do
       Image.suffix.should == &quot;image&quot;
     end
-        
+
     it &quot;should allow enhancing a model that is remixed&quot; do
       Article.enhance :images do
         def self.test_enhance
           puts &quot;Testing&quot;
         end
       end
-      
+
       ArticleImage.should respond_to(&quot;test_enhance&quot;)
     end
-    
+
     it &quot;should provided a map of Remixable Modules to Remixed Models names&quot; do
       User.remixables.should_not be(nil)
     end
-        
+
     it &quot;should allow specifying an alternate class name&quot; do
       User.remixables[:billables].name.should_not == &quot;UserBillable&quot;
       User.remixables[:billables].name.should == &quot;Account&quot;
     end
-    
+
     it &quot;should create a storage name based on the class name&quot; do
 
       Article.remixables[:images].storage_names[:default].should == &quot;article_images&quot;
       User.remixables[:billables].storage_names[:default].should == &quot;accounts&quot;
     end
-        
+
     it &quot;should allow creating an accessor alias&quot; do
       article = Article.new
       article.should respond_to(&quot;pics&quot;)
       article.should respond_to(&quot;article_images&quot;)
     end
-    
+
     it &quot;should copy properties from the Remixable Module to the Remixed Model&quot; do
       #Billabe =&gt; Account
       account = Account.new
 
       account.should respond_to(&quot;cc_num&quot;)
       account.should respond_to(&quot;cc_type&quot;)
-      account.should respond_to(&quot;expiration&quot;)      
+      account.should respond_to(&quot;expiration&quot;)
     end
-    
+
     it &quot;should allow 1:M relationships with the Remixable Module&quot; do
       user = User.new
       addy = UserAddress.new
@@ -76,86 +76,86 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
 
       user.first_name = &quot;Jack&quot;
       user.last_name = &quot;Tester&quot;
-      
+
       addy.address1 = &quot;888 West Whatnot Ave.&quot;
       addy.city = &quot;Los Angeles&quot;
       addy.state = &quot;CA&quot;
       addy.zip = &quot;90230&quot;
-      
+
       addy2.address1 = &quot;325 East NoWhere Lane&quot;
       addy2.city = &quot;Fort Myers&quot;
       addy2.state = &quot;FL&quot;
       addy2.zip = &quot;33971&quot;
-      
+
       user.user_addresses &lt;&lt; addy
       user.user_addresses &lt;&lt; addy2
-      
+
       user.user_addresses.length.should be(2)
     end
-    
+
     it &quot;should allow 1:1 relationships with the Remixable Module&quot; do
       article = Article.new
       image1  = ArticleImage.new
       image2  = ArticleImage.new
-      
+
       article.title = &quot;Really important news!&quot;
       article.url = &quot;http://example.com/index.html&quot;
-      
+
       image1.description = &quot;Shocking and horrific photo!&quot;
       image1.path = &quot;~/pictures/shocking.jpg&quot;
-      
+
       image2.description = &quot;Other photo&quot;
       image2.path = &quot;~/pictures/mom_naked.yipes&quot;
-      
+
       begin
         article.pics &lt;&lt; image1
         false
       rescue Exception =&gt; e
         e.class.should be(NoMethodError)
       end
-      
+
       article.pics = image2
       article.pics.path.should == image2.path
     end
-    
+
     it &quot;should allow M:M unary relationships through the Remixable Module&quot; do
       #User =&gt; Commentable =&gt; User
       user = User.new
       user.first_name = &quot;Tester&quot;
       user2 = User.new
       user2.first_name = &quot;Testy&quot;
-      
+
       comment = UserComment.new
       comment.comment = &quot;YOU SUCK!&quot;
       comment.commentor = user2
       user.user_comments &lt;&lt; comment
-      
+
       user2.user_comments.length.should be(0)
-      
+
       comment.commentor.first_name.should == &quot;Testy&quot;
       user.user_comments.length.should be(1)
     end
-    
+
     it &quot;should allow M:M relationships through the Remixable Module&quot; do
       #Article =&gt; Commentable =&gt; User
       user = User.new
       article = Article.new
-      
+
       ac = ArticleComment.new
-      
+
       user.first_name = &quot;Talker&quot;
       user.last_name = &quot;OnTheInternetz&quot;
-      
+
       article.url = &quot;Http://example.com/&quot;
       article.title = &quot;Important internet thingz, lol&quot;
-      
+
       ac.comment = &quot;This article sux!&quot;
-      
+
       article.comments &lt;&lt; ac
       user.article_comments &lt;&lt; ac
-      
+
       article.comments.first.should be(ac)
       user.article_comments.first.should be(ac)
-    end    
+    end
   end
 end</diff>
      <filename>dm-is-remixable/spec/integration/remixable_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-tree/lib/dm-is-tree/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,4 +4,4 @@ module DataMapper
       VERSION = &quot;0.9.4&quot;
     end
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-is-versioned/lib/dm-is-versioned/is/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,46 +3,46 @@ module DataMapper
     ##
     # = Is Versioned
     # The Versioned module will configure a model to be versioned.
-    # 
+    #
     # The is-versioned plugin functions differently from other versioning
     # solutions (such as acts_as_versioned), but can be configured to
     # function like it if you so desire.
-    # 
+    #
     # The biggest difference is that there is not an incrementing 'version'
     # field, but rather, any field of your choosing which will be unique
     # on update.
-    # 
+    #
     # == Setup
     # For simplicity, I will assume that you have loaded dm-timestamps to
     # automatically update your :updated_at field. See versioned_spec for
     # and example of updating the versioned field yourself.
-    # 
+    #
     #   class Story
     #     include DataMapper::Resource
     #     property :id, Serial
     #     property :title, String
     #     property :updated_at, DateTime
-    # 
+    #
     #     is_versioned :on =&gt; [:updated_at]
     #   end
-    # 
+    #
     # == Auto Upgrading and Auto Migrating
-    # 
+    #
     #   Story.auto_migrate! # =&gt; will run auto_migrate! on Story::Version, too
     #   Story.auto_upgrade! # =&gt; will run auto_upgrade! on Story::Version, too
-    # 
+    #
     # == Usage
-    # 
+    #
     #   story = Story.get(1)
     #   story.title = &quot;New Title&quot;
     #   story.save # =&gt; Saves this story and creates a new version with the
     #              #    original values.
     #   story.versions.size # =&gt; 1
-    # 
+    #
     #   story.title = &quot;A Different New Title&quot;
     #   story.save
     #   story.versions.size # =&gt; 2
-    # 
+    #
     # TODO: enable replacing a current version with an old version.
     module Versioned
       def self.included(base)
@@ -95,7 +95,7 @@ module DataMapper
         # Returns a hash of original values to be stored in the
         # versions table when a new version is created. It is
         # cleared after a version model is created.
-        # 
+        #
         # --
         # @return &lt;Hash&gt;
         def pending_version_attributes
@@ -106,7 +106,7 @@ module DataMapper
         # Returns a collection of other versions of this resource.
         # The versions are related on the models keys, and ordered
         # by the version field.
-        # 
+        #
         # --
         # @return &lt;Collection&gt;
         def versions</diff>
      <filename>dm-is-versioned/lib/dm-is-versioned/is/versioned.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   class Migration
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-migrations/lib/dm-migrations/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -54,4 +54,3 @@ module SQL
   end
 
 end
-</diff>
      <filename>dm-migrations/lib/sql/table_creator.rb</filename>
    </modified>
    <modified>
      <diff>@@ -40,11 +40,11 @@ require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
       it &quot;should quote the table name for the adapter&quot; do
         @creator.quoted_table_name.should == (adapter == :mysql ? '`people`' : '&quot;people&quot;')
       end
-      
+
       it &quot;should allow for custom options&quot; do
         columns = @creator.instance_eval(&quot;@columns&quot;)
         col = columns.detect{|c| c.name == &quot;long_string&quot;}
-        col.instance_eval(&quot;@type&quot;).should include(&quot;200&quot;) 
+        col.instance_eval(&quot;@type&quot;).should include(&quot;200&quot;)
       end
 
     end</diff>
      <filename>dm-migrations/spec/integration/sql_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,2 @@
 --colour
 --format progress
-</diff>
      <filename>dm-migrations/spec/spec.opts</filename>
    </modified>
    <modified>
      <diff>@@ -46,7 +46,7 @@ describe 'Migration' do
       @adapter.should_receive(:class).and_return(DataMapper::Adapters::Sqlite3Adapter)
       DataMapper::Migration.new(1, :do_nothing, {}) {}
     end
-    
+
     it 'should extend the adapter with the right module' do
       @adapter.should_receive(:extend).with(SQL::Sqlite3)
       DataMapper::Migration.new(1, :do_nothing, {}) {}
@@ -64,10 +64,10 @@ describe 'Migration' do
       m.instance_variable_get(:@verbose).should be_false
     end
 
-    it 'should set @verbose to true by default' do 
+    it 'should set @verbose to true by default' do
       @m.instance_variable_get(:@verbose).should be_true
     end
-  
+
     it 'should set the @up_action to an empty block' do
       @m.instance_variable_get(:@up_action).should be_kind_of(Proc)
     end
@@ -77,7 +77,7 @@ describe 'Migration' do
     end
 
     it 'should evaluate the given block'
-      
+
   end
 
   it 'should set the @up_action when #up is called with a block' do
@@ -166,7 +166,7 @@ describe 'Migration' do
 
   end
 
-  describe 'methods used in the action blocks' do 
+  describe 'methods used in the action blocks' do
 
     describe '#execute' do
       before do
@@ -199,7 +199,7 @@ describe 'Migration' do
           SQL::TableCreator.should_receive(:new).with(@adapter, :users, {}).and_return(@tc)
           @m.create_table(:users) { }
         end
-        
+
         it 'should convert the TableCreator object to an sql statement' do
           @tc.should_receive(:to_sql).and_return('CREATE TABLE')
           @m.create_table(:users) { }
@@ -444,4 +444,3 @@ describe 'Migration' do
 
   end
 end
-</diff>
      <filename>dm-migrations/spec/unit/migration_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ require Pathname(__FILE__).dirname + '../../spec_helper'
 require Pathname(__FILE__).dirname + '../../../lib/sql/column'
 
 describe SQL::Column do
-  before do 
+  before do
     @column = SQL::Column.new
   end
 
@@ -15,4 +15,3 @@ describe SQL::Column do
   end
 
 end
-</diff>
      <filename>dm-migrations/spec/unit/sql/column_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -95,5 +95,3 @@ describe &quot;SQLite3 Extensions&quot; do
 
 
 end
- 
-</diff>
      <filename>dm-migrations/spec/unit/sql/postgresql_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -106,4 +106,3 @@ describe &quot;SQLite3 Extensions&quot; do
 
 
 end
- </diff>
      <filename>dm-migrations/spec/unit/sql/sqlite3_extensions_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -46,7 +46,7 @@ describe 'SQL module' do
       @adapter.should_receive(:quote_table_name).with('users').and_return(%{'users'})
       @tc.quoted_table_name.should == %{'users'}
     end
-    
+
     it 'should initialze a new column and add it to the list of columns' do
       col = mock('column')
       SQL::TableCreator::Column.should_receive(:new).with(@adapter, :foo, :bar, {}).and_return(col)
@@ -55,7 +55,7 @@ describe 'SQL module' do
     end
 
     it 'should output an SQL CREATE statement to build itself' do
-      @tc.to_sql.should == 
+      @tc.to_sql.should ==
         %{CREATE TABLE 'users' ()}
     end
 </diff>
      <filename>dm-migrations/spec/unit/sql/table_creator_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@ describe 'SQL module' do
       it 'should set @opts to the options hash' do
         @tc.instance_variable_get(&quot;@opts&quot;).should == {}
       end
-       
+
       it 'should set @statements to an empty array' do
         @tc.instance_variable_get(&quot;@statements&quot;).should == []
       end</diff>
      <filename>dm-migrations/spec/unit/sql/table_modifier_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ require Pathname(__FILE__).dirname + '../../spec_helper'
 require Pathname(__FILE__).dirname + '../../../lib/sql/table'
 
 describe SQL::Table do
-  before do 
+  before do
     @table = SQL::Table.new
   end
 
@@ -23,7 +23,7 @@ describe SQL::Table do
     column_a = mock('column', :name =&gt; 'id')
     column_b = mock('column', :name =&gt; 'login')
     @table.columns = [column_a, column_b]
-    
+
     @table.column('id').should == column_a
   end
 </diff>
      <filename>dm-migrations/spec/unit/sql/table_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ require Pathname(__FILE__).dirname + '../spec_helper'
 require Pathname(__FILE__).dirname + '../../lib/sql'
 
 describe 'SQL module' do
-  
+
   it 'doesnt really do anything'
 
 end</diff>
      <filename>dm-migrations/spec/unit/sql_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Observer
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-observer/lib/dm-observer/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Querizer
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-querizer/lib/dm-querizer/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -35,7 +35,7 @@ module DataMapper
       fields += propset.map do |property|
         &quot;#{property.name.to_json}: #{send(property.getter).to_json}&quot;
       end
-      
+
       if self.respond_to?(:serialize_properties)
         self.serialize_properties.each do |k,v|
           fields &lt;&lt; &quot;#{k.to_json}: #{v.to_json}&quot;
@@ -77,7 +77,7 @@ module DataMapper
     #
     # @return &lt;REXML::Document&gt; an XML representation of this Resource
     def to_xml(opts = {})
-      
+
       to_xml_document(opts).to_s
     end
 
@@ -154,12 +154,12 @@ module DataMapper
       end
       result
     end
-    
+
     protected
     def xml_element_name
       Extlib::Inflection.tableize(self.model.to_s)
     end
-    
+
     def to_xml_document(opts={})
       doc = REXML::Document.new
       root = doc.add_element(xml_element_name)</diff>
      <filename>dm-serializer/lib/dm-serializer.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Serializer
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-serializer/lib/dm-serializer/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ class Cow
   property :composite, Integer, :key =&gt; true
   property :name,      String
   property :breed,     String
-  
+
   def serialize_properties
     {:extra =&gt; &quot;Extra&quot;, :another =&gt; 42}
   end</diff>
      <filename>dm-serializer/spec/fixtures/cow.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,11 @@
-class QuantumCat 
+class QuantumCat
   include DataMapper::Resource
-  
+
   property :id, Serial
   property :name, String
   property :location, String
-  
+
   repository(:alternate) do
     property :is_dead, Boolean
-  end 
-end
\ No newline at end of file
+  end
+end</diff>
      <filename>dm-serializer/spec/fixtures/quatum_cat.rb</filename>
    </modified>
    <modified>
      <diff>@@ -31,13 +31,13 @@ describe DataMapper::Serialize, '#to_csv' do
       &quot;1,2,Betsy,Jersey\n&quot; +
       &quot;10,20,Berta,Guernsey\n&quot;
   end
-  
+
   describe &quot;multiple repositories&quot; do
     before(:all) do
       QuantumCat.auto_migrate!
       repository(:alternate){QuantumCat.auto_migrate!}
     end
-    
+
     it &quot;should use the repsoitory for the model&quot; do
       gerry = QuantumCat.create(:name =&gt; &quot;gerry&quot;)
       george = repository(:alternate){QuantumCat.create(:name =&gt; &quot;george&quot;, :is_dead =&gt; false)}</diff>
      <filename>dm-serializer/spec/unit/to_csv_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -106,13 +106,13 @@ describe DataMapper::Serialize, '#to_json' do
     deserialized_hash[&quot;name&quot;].should be(nil)
     deserialized_hash[&quot;aphelion&quot;].should == 249_209_300.4
   end
-  
+
   describe &quot;multiple repositories&quot; do
     before(:all) do
       QuantumCat.auto_migrate!
       repository(:alternate){QuantumCat.auto_migrate!}
     end
-    
+
     it &quot;should use the repsoitory for the model&quot; do
       gerry = QuantumCat.create(:name =&gt; &quot;gerry&quot;)
       george = repository(:alternate){QuantumCat.create(:name =&gt; &quot;george&quot;, :is_dead =&gt; false)}
@@ -120,7 +120,7 @@ describe DataMapper::Serialize, '#to_json' do
       george.to_json.should match(/is_dead/)
     end
   end
-  
+
   it &quot;supports :include option for one level depth&quot;
 
   it &quot;supports :include option for more than one level depth&quot;</diff>
      <filename>dm-serializer/spec/unit/to_json_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,9 +8,9 @@ describe DataMapper::Serialize, '#to_xml' do
 
   before(:all) do
     query = DataMapper::Query.new(DataMapper::repository(:default), Cow)
-    
+
     @time = DateTime.now
-    
+
 
     @collection = DataMapper::Collection.new(query) do |c|
       c.load([1, 2, 'Betsy', 'Jersey'])
@@ -55,13 +55,13 @@ describe DataMapper::Serialize, '#to_xml' do
       &lt;/cows&gt;
   EOS
   end
-  
+
   describe &quot;multiple repositories&quot; do
     before(:all) do
       QuantumCat.auto_migrate!
       repository(:alternate){QuantumCat.auto_migrate!}
     end
-    
+
     it &quot;should use the repsoitory for the model&quot; do
       gerry = QuantumCat.create(:name =&gt; &quot;gerry&quot;)
       george = repository(:alternate){QuantumCat.create(:name =&gt; &quot;george&quot;, :is_dead =&gt; false)}</diff>
      <filename>dm-serializer/spec/unit/to_xml_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -58,13 +58,13 @@ describe DataMapper::Serialize, '#to_yaml' do
   it &quot;handles empty collections just fine&quot; do
     YAML.load(@empty_collection.to_yaml).should be_empty
   end
-  
+
   describe &quot;multiple repositories&quot; do
     before(:all) do
       QuantumCat.auto_migrate!
       repository(:alternate){QuantumCat.auto_migrate!}
     end
-    
+
     it &quot;should use the repsoitory for the model&quot; do
       gerry = QuantumCat.create(:name =&gt; &quot;gerry&quot;)
       george = repository(:alternate){QuantumCat.create(:name =&gt; &quot;george&quot;, :is_dead =&gt; false)}</diff>
      <filename>dm-serializer/spec/unit/to_yaml_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Shorthand
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-shorthand/lib/dm-shorthand/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Timestamps
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-timestamps/lib/dm-timestamps/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -21,7 +21,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
     after do
      repository(:default).adapter.execute('DELETE from green_smoothies');
     end
-    
+
     it &quot;should not set the created_at/on fields if they're already set&quot; do
       repository(:default) do
         green_smoothie = GreenSmoothie.new(:name =&gt; 'Banana')</diff>
      <filename>dm-timestamps/spec/integration/timestamps_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module Types
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>dm-types/lib/dm-types/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,7 @@ describe DataMapper::Types::FilePath do
     repository(:default) do
       FilePathTest.create!(:path =&gt; '/usr')
     end
-    
+
     FilePathTest.first.path.should == Pathname.new('/usr')
   end
 </diff>
      <filename>dm-types/spec/integration/file_path_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,15 +8,15 @@ describe DataMapper::Types::Csv, &quot;.load&quot; do
     FasterCSV.should_receive(:parse).with('csv_string').once
     DataMapper::Types::Csv.load('csv_string', :property)
   end
-  
+
   it 'should do nothing if the value is a string' do
     FasterCSV.should_not_receive(:parse)
     DataMapper::Types::Csv.load([], :property).should == []
   end
-  
+
   it 'should return nil otherwise' do
     DataMapper::Types::Csv.load({},  :property).should == nil
-    DataMapper::Types::Csv.load(nil, :property).should == nil    
+    DataMapper::Types::Csv.load(nil, :property).should == nil
   end
 end
 
@@ -24,14 +24,14 @@ describe DataMapper::Types::Csv, &quot;.dump&quot; do
   it 'should dump to CSV' do
     DataMapper::Types::Csv.dump([[1, 2, 3]], :property).should == &quot;1,2,3\n&quot;
   end
-  
+
   it 'should do nothing if the value is a string' do
     FasterCSV.should_not_receive(:generate)
     DataMapper::Types::Csv.dump('string', :property).should == 'string'
   end
-  
+
   it 'should return nil otherwise' do
     DataMapper::Types::Csv.dump({},  :property).should == nil
-    DataMapper::Types::Csv.dump(nil, :property).should == nil    
+    DataMapper::Types::Csv.dump(nil, :property).should == nil
   end
 end</diff>
      <filename>dm-types/spec/unit/csv_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,12 +5,12 @@ describe DataMapper::Types::Json, &quot;.load&quot; do
   it 'should return nil if nil is provided' do
     DataMapper::Types::Json.load(nil, :property).should be_nil
   end
-  
+
   it 'should parse the value if a string is provided' do
     JSON.should_receive(:load).with('json_string').once
     DataMapper::Types::Json.load('json_string', :property)
   end
-  
+
   it 'should raise an ArgumentError if something else is given' do
     lambda {
       DataMapper::Types::Json.load(:sym, :property)
@@ -22,12 +22,12 @@ describe DataMapper::Types::Json, &quot;.dump&quot; do
   it 'should return nil if the value is nil' do
     DataMapper::Types::Json.dump(nil, :property).should be_nil
   end
-  
+
   it 'should do nothing if the value is a string' do
     JSON.should_not_receive(:dump)
     DataMapper::Types::Json.dump('', :property).should be_kind_of(String)
   end
-  
+
   it 'should dump to a JSON string otherwise' do
     JSON.should_receive(:dump).with([]).once
     DataMapper::Types::Json.dump([], :property)</diff>
      <filename>dm-types/spec/unit/json_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,12 +5,12 @@ describe DataMapper::Types::Yaml, &quot;.load&quot; do
   it 'should return nil if nil is provided' do
     DataMapper::Types::Yaml.load(nil, :property).should be_nil
   end
-  
+
   it 'should parse the value if a string is provided' do
     YAML.should_receive(:load).with('yaml_string').once
     DataMapper::Types::Yaml.load('yaml_string', :property)
   end
-  
+
   it 'should raise an ArgumentError if something else is given' do
     lambda {
       DataMapper::Types::Yaml.load(:sym, :property)
@@ -22,17 +22,17 @@ describe DataMapper::Types::Yaml, &quot;.dump&quot; do
   it 'should return nil if the value is nil' do
     DataMapper::Types::Yaml.dump(nil, :property).should be_nil
   end
-  
+
   it 'should do nothing if the value is a string which begins with ---' do
     YAML.should_not_receive(:dump)
     DataMapper::Types::Yaml.dump('--- str', :property).should be_kind_of(String)
   end
-  
+
   it 'should dump to a YAML string if the value is a normal string' do
     YAML.should_receive(:dump).with('string').once
     DataMapper::Types::Yaml.dump('string', :property)
   end
-  
+
   it 'should dump to a YAML string otherwise' do
     YAML.should_receive(:dump).with([]).once
     DataMapper::Types::Yaml.dump([], :property)</diff>
      <filename>dm-types/spec/unit/yaml_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module More
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>lib/dm-more/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -15,7 +15,7 @@ Merb::Generators::ResourceControllerGenerator.template :controller_datamapper, :
   source(File.dirname(__FILE__), &quot;templates/resource_controller.rb&quot;)
   destination(&quot;app/controllers&quot;, base_path, &quot;#{file_name}.rb&quot;)
 end
- 
+
 [:index, :show, :edit, :new].each do |view|
   Merb::Generators::ResourceControllerGenerator.template &quot;view_#{view}_datamapper&quot;.to_sym,
       :orm =&gt; :datamapper, :template_engine =&gt; :erb do</diff>
      <filename>merb_datamapper/lib/generators/data_mapper_resource_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,4 +2,4 @@ module DataMapper
   module MerbDataMapper
     VERSION = &quot;0.9.4&quot;
   end
-end
\ No newline at end of file
+end</diff>
      <filename>merb_datamapper/lib/merb_datamapper/version.rb</filename>
    </modified>
    <modified>
      <diff>@@ -33,7 +33,7 @@ shared_examples_for &quot;named generator&quot; do
     end
 
   end
-  
+
   describe '#base_name' do
 
     it &quot;should convert the name to snake case&quot; do
@@ -54,7 +54,7 @@ shared_examples_for &quot;named generator&quot; do
       @generator.name = &quot;ProjectPictures&quot;
       @generator.symbol_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should replace dashes with underscores&quot; do
       @generator.name = &quot;project-pictures&quot;
       @generator.symbol_name.should == &quot;project_pictures&quot;
@@ -63,40 +63,40 @@ shared_examples_for &quot;named generator&quot; do
   end
 
   describe '#class_name' do
-  
+
     it &quot;should convert the name to camel case&quot; do
       @generator.name = 'some_more_stuff'
       @generator.class_name.should == 'SomeMoreStuff'
     end
-    
+
     it &quot;should convert a name with dashes to camel case&quot; do
       @generator.name = 'some-more-stuff'
       @generator.class_name.should == 'SomeMoreStuff'
     end
-  
+
   end
-  
+
   describe '#module_name' do
-  
+
     it &quot;should convert the name to camel case&quot; do
       @generator.name = 'some_more_stuff'
       @generator.module_name.should == 'SomeMoreStuff'
     end
-    
+
     it &quot;should convert a name with dashes to camel case&quot; do
       @generator.name = 'some-more-stuff'
       @generator.module_name.should == 'SomeMoreStuff'
     end
-  
+
   end
-  
+
   describe '#test_class_name' do
-    
+
     it &quot;should convert the name to camel case and append 'test'&quot; do
       @generator.name = 'some_more_stuff'
       @generator.test_class_name.should == 'SomeMoreStuffTest'
     end
-    
+
   end
 
 end
@@ -108,168 +108,168 @@ shared_examples_for &quot;namespaced generator&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.class_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should split off the last double colon separated chunk&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.class_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.class_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should convert a name with dashes to camel case&quot; do
       @generator.name = 'some-more-stuff'
       @generator.class_name.should == 'SomeMoreStuff'
     end
   end
-  
+
   describe &quot;#module_name&quot; do
     it &quot;should camelize the name&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.module_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should split off the last double colon separated chunk&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.module_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.module_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should convert a name with dashes to camel case&quot; do
       @generator.name = 'some-more-stuff'
       @generator.module_name.should == 'SomeMoreStuff'
     end
   end
-  
+
   describe &quot;#modules&quot; do
     it &quot;should be empty if no modules are passed to the name&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.modules.should == []
     end
-    
+
     it &quot;should split off all but the last double colon separated chunks&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.modules.should == [&quot;Test&quot;, &quot;Monkey&quot;]
     end
-    
+
     it &quot;should split off all but the last slash separated chunk&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.modules.should == [&quot;Test&quot;, &quot;Monkey&quot;]
     end
   end
-  
+
   describe &quot;#file_name&quot; do
     it &quot;should snakify the name&quot; do
       @generator.name = &quot;ProjectPictures&quot;
       @generator.file_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should preserve dashes&quot; do
       @generator.name = &quot;project-pictures&quot;
       @generator.file_name.should == &quot;project-pictures&quot;
     end
-    
+
     it &quot;should split off the last double colon separated chunk and snakify it&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.file_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk and snakify it&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.file_name.should == &quot;project_pictures&quot;
     end
   end
-  
+
   describe &quot;#base_name&quot; do
     it &quot;should snakify the name&quot; do
       @generator.name = &quot;ProjectPictures&quot;
       @generator.base_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should preserve dashes&quot; do
       @generator.name = &quot;project-pictures&quot;
       @generator.base_name.should == &quot;project-pictures&quot;
     end
-    
+
     it &quot;should split off the last double colon separated chunk and snakify it&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.base_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk and snakify it&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.base_name.should == &quot;project_pictures&quot;
     end
   end
-  
+
   describe &quot;#symbol_name&quot; do
     it &quot;should snakify the name and replace dashes with underscores&quot; do
       @generator.name = &quot;project-pictures&quot;
       @generator.symbol_name.should == &quot;project_pictures&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk, snakify it and replace dashes with underscores&quot; do
       @generator.name = &quot;test/monkey/project-pictures&quot;
       @generator.symbol_name.should == &quot;project_pictures&quot;
     end
   end
-  
+
   describe &quot;#test_class_name&quot; do
     it &quot;should camelize the name and append 'Test'&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.test_class_name.should == &quot;ProjectPicturesTest&quot;
     end
-    
+
     it &quot;should split off the last double colon separated chunk&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.test_class_name.should == &quot;ProjectPicturesTest&quot;
     end
-    
+
     it &quot;should split off the last slash separated chunk&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.test_class_name.should == &quot;ProjectPicturesTest&quot;
     end
   end
-  
+
   describe &quot;#full_class_name&quot; do
     it &quot;should camelize the name&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.full_class_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should camelize a name with dashes&quot; do
       @generator.name = &quot;project-pictures&quot;
       @generator.full_class_name.should == &quot;ProjectPictures&quot;
     end
-    
+
     it &quot;should leave double colon separated chunks&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.full_class_name.should == &quot;Test::Monkey::ProjectPictures&quot;
     end
-    
+
     it &quot;should convert slashes to double colons and camel case&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.full_class_name.should == &quot;Test::Monkey::ProjectPictures&quot;
     end
   end
-  
+
   describe &quot;#base_path&quot; do
     it &quot;should be blank for no namespaces&quot; do
       @generator.name = &quot;project_pictures&quot;
       @generator.base_path.should == &quot;&quot;
     end
-    
+
     it &quot;should snakify and join namespace for double colon separated chunk&quot; do
       @generator.name = &quot;Test::Monkey::ProjectPictures&quot;
       @generator.base_path.should == &quot;test/monkey&quot;
     end
-    
+
     it &quot;should leave slashes but only use the namespace part&quot; do
       @generator.name = &quot;test/monkey/project_pictures&quot;
       @generator.base_path.should == &quot;test/monkey&quot;</diff>
      <filename>merb_datamapper/spec/generators/spec_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -36,4 +36,4 @@ hoe = Hoe.new(GEM_NAME, GEM_VERSION) do |p|
     p.extra_deps &lt;&lt; dep
   end
 
-end
\ No newline at end of file
+end</diff>
      <filename>tasks/hoe.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0956c30b069e06704034eefad715d8a99fcb22dc</id>
    </parent>
  </parents>
  <author>
    <name>Dan Kubb</name>
    <email>dan.kubb@autopilotmarketing.com</email>
  </author>
  <url>http://github.com/digitalhobbit/dm-more/commit/b56684c15714340b530a3c3576f6395a59d456b1</url>
  <id>b56684c15714340b530a3c3576f6395a59d456b1</id>
  <committed-date>2008-08-12T13:54:30-07:00</committed-date>
  <authored-date>2008-08-12T13:54:30-07:00</authored-date>
  <message>Stripped whitespace with &quot;sake strip&quot;</message>
  <tree>3263d9bf8c0b1135dca5951551e5e633ad5162d9</tree>
  <committer>
    <name>Dan Kubb</name>
    <email>dan.kubb@autopilotmarketing.com</email>
  </committer>
</commit>
