<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/models/response_code.rb</filename>
    </added>
    <added>
      <filename>config/initializers/time_formats.rb</filename>
    </added>
    <added>
      <filename>db/migrate/20091104233239_create_response_codes.rb</filename>
    </added>
    <added>
      <filename>test/fixtures/response_codes.yml</filename>
    </added>
    <added>
      <filename>test/unit/response_code_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -14,8 +14,8 @@ class WatchesController &lt; ApplicationController
     respond_to do |format|
       format.html # index.html.erb
       format.xml  { render :xml =&gt; @watches }
-      format.json { render :json =&gt; @watches.to_json( :methods =&gt; :from_average,
-                                                      :except =&gt; [:created_at, :updated_at, :status_id, :content_match, :active], 
+      format.json { render :json =&gt; @watches.to_json( :methods =&gt; [:from_average, :since],
+                                                      :except =&gt; [:created_at, :updated_at, :last_status_change_at, :status_id, :content_match, :active], 
                                                       :include =&gt; { :status =&gt; { :except =&gt; [:id] } } ) }
     end
   end
@@ -80,7 +80,7 @@ class WatchesController &lt; ApplicationController
     respond_to do |format|
       if @watch.update_attributes(params[:watch])
         flash[:notice] = 'Watch was successfully updated.'
-        format.html { redirect_to root_path }
+        format.html { redirect_to :controller =&gt; 'dashboard', :action =&gt; 'compact' }
         format.xml  { head :ok }
       else
         format.html { render :action =&gt; &quot;edit&quot; }</diff>
      <filename>app/controllers/watches_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,15 +11,22 @@ class Watch &lt; ActiveRecord::Base
   DEFAULT_INTERVAL = 1.hour
   DEFAULT_COUNT = 10
   
+  
   # Computes the standard deviation for the last response time of this watch compared to a certain number of checks in the past.
   # By default we look at the average of the last 10 ten minute spans
   def from_average(interval=DEFAULT_INTERVAL)
-    # puts interval
     average = Response.average(:time, :conditions =&gt; ['watch_id = ? and time != 0 and created_at &lt; ? and created_at &gt; ?', self.id, Time.zone.now.to_s(:db), (Time.zone.now-interval).to_s(:db)]).to_i
     logger.debug(&quot;  *** average: #{average}, last_response_time: #{self.last_response_time}&quot;)
     return (average == 0 || last_response_time == 0) ? nil : (average.to_f / self.last_response_time.to_f * 100.0).to_i
   end
   
+  
+  # Says how long we've been in the current state (either last_status_update_at or created_at)
+  def since
+    return self.last_status_change_at.nil? ? self.created_at.to_s(:javascript) : self.last_status_change_at.to_s(:javascript)
+  end
+  
+  
   private
     
     def set_status</diff>
      <filename>app/models/watch.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,7 @@
     = yield :head  # if you want to add any other code to the head, add it via `content_for :head do` in any view and it'll end up here
       
   %body
-    %h1= link_to '&lt;span&gt;Owl&lt;/span&gt;', root_path
+    %h1= link_to '&lt;span&gt;Owl&lt;/span&gt;', :controller =&gt; 'dashboard', :action =&gt; 'compact'
     
     = yield
     = yield :body</diff>
      <filename>app/views/layouts/application.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,8 @@
 %div[site]
   %h2= link_to(site.name, site_path(site))
   - site.watches.each do |watch| 
-    %div[watch]{:class =&gt; watch.status.css}
-      = render :partial =&gt; 'watches/watch', :locals =&gt; { :watch =&gt; watch, :mode =&gt; mode }
+    -# to change the size of a watch, make sure the container fills the empty space then set .watch to position:absolute
+    .container
+      %div[watch]{:class =&gt; watch.status.css}
+        = render :partial =&gt; 'watches/watch', :locals =&gt; { :watch =&gt; watch, :mode =&gt; mode }
   %h3.new_watch= link_to '+ Add URL', new_watch_path(:site_id =&gt; site.id)</diff>
      <filename>app/views/sites/_site.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,7 @@
-- if params[:action] == 'slides'
-  = stylesheet_link_tag 'slides'
+= render 'dashboard/display', :locals =&gt; { :sites =&gt; @sites, :mode =&gt; :extended }
 
-#sites
-  = render :partial =&gt; 'sites/site', :collection =&gt; @sites
-  
-  #add_site
-    %h2= link_to '+ Add Group', new_site_path
+#add_site
+  %h2= link_to '+ Add Group', new_site_path
 
 :javascript
   Event.observe(window,'dom:loaded',function() { watchBlock.setGraphsFromCookie() });
-  
\ No newline at end of file</diff>
      <filename>app/views/sites/index.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,8 @@
 #sites
-  = render :partial =&gt; 'sites/site', :locals =&gt; { :site =&gt; @site }
+  = render :partial =&gt; 'sites/site', :locals =&gt; { :site =&gt; @site, :mode =&gt; :extended }
 
 = link_to 'Delete This Group', @site, :confirm =&gt; 'Are you sure?', :method =&gt; :delete, :class =&gt; 'delete'
 
 :javascript
-  Event.observe(window,'dom:loaded',function() { watchBlock.setGraphsFromCookie() });
\ No newline at end of file
+  Event.observe(window,'dom:loaded',function() { watchBlock.setGraphsFromCookie() });
+  
\ No newline at end of file</diff>
      <filename>app/views/sites/show.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,3 @@
-- if (watch.warning_time &amp;&amp; watch.last_response_time &gt; watch.warning_time)
-  - warning = true
-- else
-  - warning = false
-  
 .name{:onclick =&gt; &quot;location.href = '#{edit_watch_path(watch)}'&quot;}
   %span.site_name= watch.site.name
   %span.full_name= watch.name
@@ -20,16 +15,6 @@
 .status
   %span.response_title Last:
   %span.response= watch.last_response_time.to_s + &quot; ms&quot;
-  %span.since_title For:
+  %span.since_title= watch.status.name + &quot; for &quot;
   %span.since_text= time_ago_in_words(watch.last_status_change_at || watch.created_at)
   %span.since_date= watch.last_status_change_at || watch.created_at
-
-
--#
-  .status
-    %span.status
-      = warning ? 'Warning' : watch.status.name
-    - unless watch.status.id == Status::DISABLED
-      %span.response= watch.last_response_time.to_s + &quot; ms&quot;
-    - else
-      %span.enable= link_to_remote 'Enable?', :url =&gt; { :controller =&gt; 'watches', :action =&gt; 'update', :id =&gt; watch.id }, :success =&gt; &quot;$('watch_#{watch.id}').down('span.status').update('Enabled'); $('watch_#{watch.id}').down('span.enable').update('').addClassName('response').removeClassName('enable');&quot;, :method =&gt; :put, :with =&gt; &quot;'watch[active]=1'&quot;</diff>
      <filename>app/views/watches/_watch.html.haml</filename>
    </modified>
    <modified>
      <diff>@@ -7,9 +7,11 @@ class CreateWatches &lt; ActiveRecord::Migration
       t.integer :warning_time
       t.boolean :active, :default =&gt; true
       t.string :content_match
+      t.integer :expected_response, :default =&gt; 200
       t.integer :status_id, :default =&gt; Status::UP
       t.integer :site_id
       t.datetime :last_status_change_at
+      t.string :status_reason
       
       t.timestamps
     end</diff>
      <filename>db/migrate/20091027230701_create_watches.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version =&gt; 20091028171657) do
+ActiveRecord::Schema.define(:version =&gt; 20091104233239) do
 
   create_table &quot;headers&quot;, :force =&gt; true do |t|
     t.string   &quot;key&quot;
@@ -19,6 +19,13 @@ ActiveRecord::Schema.define(:version =&gt; 20091028171657) do
     t.datetime &quot;updated_at&quot;
   end
 
+  create_table &quot;response_codes&quot;, :force =&gt; true do |t|
+    t.integer  &quot;code&quot;
+    t.string   &quot;name&quot;
+    t.datetime &quot;created_at&quot;
+    t.datetime &quot;updated_at&quot;
+  end
+
   create_table &quot;responses&quot;, :force =&gt; true do |t|
     t.integer  &quot;time&quot;
     t.integer  &quot;status&quot;
@@ -46,9 +53,11 @@ ActiveRecord::Schema.define(:version =&gt; 20091028171657) do
     t.integer  &quot;warning_time&quot;
     t.boolean  &quot;active&quot;,                :default =&gt; true
     t.string   &quot;content_match&quot;
+    t.integer  &quot;expected_response&quot;,     :default =&gt; 200
     t.integer  &quot;status_id&quot;,             :default =&gt; 1
     t.integer  &quot;site_id&quot;
     t.datetime &quot;last_status_change_at&quot;
+    t.string   &quot;status_reason&quot;
     t.datetime &quot;created_at&quot;
     t.datetime &quot;updated_at&quot;
   end</diff>
      <filename>db/schema.rb</filename>
    </modified>
    <modified>
      <diff>@@ -10,4 +10,16 @@ Status.create([ { :id =&gt; 1, :name =&gt; 'Up', :css =&gt; 'up' },
                 { :id =&gt; 3, :name =&gt; 'Disabled', :css =&gt; 'disabled' }, 
                 { :id =&gt; 4, :name =&gt; 'Unknown', :css =&gt; 'unknown' },
                 { :id =&gt; 5, :name =&gt; 'Warning', :css =&gt; 'warning'} ])
-                
\ No newline at end of file
+                
+ResponseCode.create([ { :id =&gt; 1, :code =&gt; 200, :name =&gt; 'OK' },
+                      { :id =&gt; 2, :code =&gt; 301, :name =&gt; 'Moved Permanently' },
+                      { :id =&gt; 3, :code =&gt; 302, :name =&gt; 'Found (Moved Temporarily)' },
+                      { :id =&gt; 4, :code =&gt; 307, :name =&gt; 'Moved Temporarily' },
+                      { :id =&gt; 5, :code =&gt; 400, :name =&gt; 'Bad Request' },
+                      { :id =&gt; 6, :code =&gt; 401, :name =&gt; 'Unauthorized' },
+                      { :id =&gt; 7, :code =&gt; 403, :name =&gt; 'Forbidden' },
+                      { :id =&gt; 8, :code =&gt; 404, :name =&gt; 'Not Found' },
+                      { :id =&gt; 9, :code =&gt; 500, :name =&gt; 'Internal Server Error' },
+                      { :id =&gt; 10, :code =&gt; 502, :name =&gt; 'Bad Gateway' },
+                      { :id =&gt; 11, :code =&gt; 503, :name =&gt; 'Service Unavailable' }])
+</diff>
      <filename>db/seeds.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,27 +16,27 @@ module Mouse
       
       watches = Watch.active
       watches.each do |watch|
-        #threads &lt;&lt; Thread.new do
-          Mouse.logger.debug(&quot;  - Checking watch #{watch.id}: #{watch.url}...&quot;)
-          begin
-            time = Time.now
-            http = HTTPClient.get(watch.url)
-            time = ((Time.now - time) * 1000).to_i
-            up(watch, http, time)
-          rescue SocketError =&gt; e
-            # URL is invalid
-            down(watch, 'URL is invalid')
-          rescue HTTPClient::ReceiveTimeoutError =&gt; e
-            # Apparently the uncatchable error
-            down(watch, 'ReceiveTimeoutError')
-          rescue HTTPClient::ConnectTimeoutError =&gt; e
-            # Site isn't responding
-            down(watch, 'Site not responding (timeout)')
+        Mouse.logger.debug(&quot;  - Checking watch #{watch.id}: #{watch.url}...&quot;)
+        begin
+          time = Time.now
+          http = HTTPClient.get(watch.url)
+          time = ((Time.now - time) * 1000).to_i
+          if http.status != watch.expected_response       # status code wasn't what was expected
+            down(watch, :time =&gt; time, :status_reason =&gt; &quot;Response code #{http.status} did not match expected (#{watch.expected_response})&quot;, :message =&gt; 'Response codes do not match expected')
+          elsif watch.content_match &amp;&amp; !http.body.content.match(watch.content_match)  # content on the page wasn't found
+            down(watch, :time =&gt; time, :status_reason =&gt; &quot;Required content ('#{watch.content_match}') was not found on the page&quot;, :message =&gt; 'Required content not found on page')
+          else                                            # everything looks good, mark as up
+            up(watch, :http =&gt; http, :time =&gt; time)
           end
-        #end
+        rescue SocketError =&gt; e                           # URL is invalid
+          down(watch, :status_reason =&gt; 'URL invalid', :message =&gt; 'URL is invalid')
+        rescue HTTPClient::ReceiveTimeoutError =&gt; e       # Apparently the uncatchable error
+          down(watch, :message =&gt; 'ReceiveTimeoutError')
+        rescue HTTPClient::ConnectTimeoutError =&gt; e       # Site isn't responding
+          down(watch, :status_reason =&gt; 'Timed out waiting for response', :message =&gt; 'Site not responding (timeout)')
+        end
       end
       
-      #threads.each { |t| t.join }
       cleanup   # removes responses older than a day
     end
     
@@ -44,30 +44,27 @@ module Mouse
     private
     
       # called when a site is considered up
-      def up(watch, http, time)
-        update_watch(watch, time, Status::UP)
-        #watch.update_attributes(:last_response_time =&gt; time, :status_id =&gt; Status::UP)
-        response = add_response(watch, time, http.status, http.reason)
-        #response = watch.responses.create(:time =&gt; time, :status =&gt; http.status, :reason =&gt; http.reason)
+      def up(watch, options={})
+        defaults = { :time =&gt; 0, :http =&gt; nil, :status_reason =&gt; 'Site responding normally' }
+        options = defaults.merge!(options)
+        update_watch(watch, options[:time], Status::UP, options[:status_reason])
+        response = add_response(watch, options[:time], options[:http].status, options[:http].reason)
         if Mouse.options.write_headers
           Mouse.logger.debug(&quot;    Saving headers...&quot;)
-          http.header.get.each do |header|
+          options[:http].header.get.each do |header|
             response.headers.create(:key =&gt; header.first, :value =&gt; header.last)
           end
         end
-        # set this to a warning if the response time was greater than the warning time
-        #if watch.warning_time &amp;&amp; time &gt; watch.warning_time
-        #  warning(watch)
-        #end
       end
       
     
       # called when a site is considered down
-      def down(watch, message='')
-        update_watch(watch, 0, Status::DOWN)
-        response = add_response(watch, 0, 0, 'error')
-        #watch.responses.create(:time =&gt; 0, :status =&gt; 0, :reason =&gt; 'error')
-        Mouse.logger.error(&quot;  ** #{message}&quot;)
+      def down(watch, options={})
+        defaults = { :time =&gt; 0, :http =&gt; nil, :status_reason =&gt; 'Site is down', :message =&gt; 'Error with response' }
+        options = defaults.merge!(options)
+        update_watch(watch, options[:time], Status::DOWN, options[:status_reason])
+        response = add_response(watch, options[:time], options[:http] ? options[:http].status : 0, options[:http] ? options[:http].reason : 'error')
+        Mouse.logger.error(&quot;  ** #{options[:message]}&quot;)
       end
       
       
@@ -78,10 +75,11 @@ module Mouse
       
       
       # updates the watch record
-      def update_watch(watch, time, status)
+      def update_watch(watch, time, status, status_reason)
         watch.status_id = status
         watch.last_status_change_at = Time.zone.now.to_s(:db) if watch.changed?  # only updates the last status change
         watch.last_response_time = time
+        watch.status_reason = status_reason
         return watch.save
       end
       </diff>
      <filename>lib/mouse/lib/engine.rb</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ function resizePanels() {
   var watches = $$('.watch');
   var container_margin = $('sites').getStyle('marginLeft').match(/\d+/);  // how much space we need to reserve for the margins of the page
   var browser_width = parseInt(document.viewport.getWidth());             // browser width
-  var watch_margin = parseInt(watches.first().getStyle('marginRight').match(/\d+/));  // how much margin for each watch
+  var watch_margin = parseInt(watches.first().up().getStyle('marginRight').match(/\d+/));  // how much margin for each watch
   var watch_min_width = parseInt(watches.first().getStyle('minWidth').match(/\d+/));  // the minimum width a watch is allowed to be
   var i = watches.length;
   
@@ -15,7 +15,8 @@ function resizePanels() {
 
   // resize each slide
   watches.each(function(element) {
-    element.setStyle({'width':watch_width+'px'});
+    //element.setStyle({'width':watch_width+'px'});
+    element.up().setStyle({'width':watch_width+'px'});
     resizeLink(element, watch_width);
     resizeName(element, watch_width);
   });
@@ -129,6 +130,15 @@ watchBlock = {
   updateWatch:function(obj,data) {
 
     // update text labels and times
+    obj.down('span.full_name').update(data.name);
+    obj.down('span.full_url').update(data.url);
+    
+    obj.down('span.since_date').update(data.since);
+    obj.down('span.since_title').update(data.status.name+' for ');
+    obj.down('span.since_text').update(DateHelper.time_ago_in_words_with_parsing(data.since));
+    
+    obj.title = data.status_reason
+    
     if (obj.down('span.enable')) {
       obj.down('span.enable').removeClassName('enable').addClassName('response');
     }
@@ -139,7 +149,10 @@ watchBlock = {
       obj.down('img.graph').src = '/watches/response_graph/'+data.id+'?'+Date.now();
     }
 
-
+    // call resize panels so if the name or URL is too long, it'll get resized right now
+    resizeLink(obj,obj.getWidth());
+    resizeName(obj,obj.getWidth());
+    
     // change color based on watch.from_average value. from_average represents a percentage of the average response
     // time for the last hour. So if from_average is 75, that means that ping was 75% of the speed of the average, so
     // it was _slower_ than the average by 25%. 110 would be 10% faster than the average
@@ -165,10 +178,13 @@ watchBlock = {
       var new_color = new Color('666666');
       break;
     }
-    
-    console.info('watch_id:',data.id,' css:',data.status.css,' color:',new_color.hex_color);
-    
+
     obj.morph('background-color: #'+new_color.hex_color);
+    
+    // pulsate the watch if its response time is greater than the preset limit
+    if (data.warning_time &amp;&amp; data.last_response_time &gt; data.warning_time) {
+      new Effect.Pulsate(obj,{'delay':1});
+    }
   }, 
   
   // converts from the server's range to a 0 - 100 scale
@@ -202,3 +218,38 @@ function Color(hex_color) {
   this.b = parseInt(hex_color.slice(4,6),16);
   this.hex_color = this.r.toString(16) + this.g.toString(16) + this.b.toString(16);
 }
+
+// DateHelper from http://gist.github.com/58761 with a couple mods to display number of seconds
+// gets us nicely formatted time spans (ie: 3 minutes ago)
+
+var DateHelper = {
+  // Takes the format of &quot;Thu Jul 23 17:44:00 PDT 2009&quot; and converts it to a relative time
+  // Ruby strftime: %a %b %d %H:%M:%S %Z %Y
+  time_ago_in_words_with_parsing: function(from) {
+    var date = new Date;
+    date.setTime(Date.parse(from)); 
+    return this.time_ago_in_words(date);
+  },
+  
+  time_ago_in_words: function(from) {
+    return this.distance_of_time_in_words(new Date, from);
+  },
+
+  distance_of_time_in_words: function(to, from) {
+    var distance_in_seconds = ((to - from) / 1000).floor();
+    var distance_in_minutes = (distance_in_seconds / 60).floor();
+
+    if (distance_in_minutes == 0) { return distance_in_seconds + ' seconds'; }
+    if (distance_in_minutes == 1) { return 'a minute'; }
+    if (distance_in_minutes &lt; 45) { return distance_in_minutes + ' minutes'; }
+    if (distance_in_minutes &lt; 90) { return 'about 1 hour'; }
+    if (distance_in_minutes &lt; 1440) { return 'about ' + (distance_in_minutes / 60).floor() + ' hours'; }
+    if (distance_in_minutes &lt; 2880) { return '1 day'; }
+    if (distance_in_minutes &lt; 43200) { return (distance_in_minutes / 1440).floor() + ' days'; }
+    if (distance_in_minutes &lt; 86400) { return 'about 1 month'; }
+    if (distance_in_minutes &lt; 525960) { return (distance_in_minutes / 43200).floor() + ' months'; }
+    if (distance_in_minutes &lt; 1051199) { return 'about 1 year'; }
+
+    return 'over ' + (distance_in_minutes / 525960).floor() + ' years';
+  }
+};
\ No newline at end of file</diff>
      <filename>public/javascripts/application.js</filename>
    </modified>
    <modified>
      <diff>@@ -70,6 +70,8 @@ h1
             text-shadow: 1px 1px 2px rgba(0,0,0,.6)
           span.response
             font-size: 85%
+          span.since_date
+            display: none
           a
             color: #ffffff
         &amp;.graph</diff>
      <filename>public/stylesheets/sass/shared.sass</filename>
    </modified>
    <modified>
      <diff>@@ -10,11 +10,14 @@ h1
     padding: 0
     h2
       display: none
-    .watch
+    .container
+      overflow: hidden
       float: left
-      width: 300px
-      height: 112px
+      min-height: 1px
       margin: 0 10px 10px 0
+    .watch
+      width: auto
+      height: 112px
       display: block
       min-width: 200px
       -moz-box-shadow: 2px 2px 2px rgba(0,0,0,.2)
@@ -28,6 +31,7 @@ h1
           span.name
             font-size: 131%
           span.url
+            white-space: nowrap
             a
               font-size: 85%
         &amp;.status
@@ -44,8 +48,6 @@ h1
             font-size: 85%
             &amp;.response
               margin: 0 1.3em 0 0
-            &amp;.since_date
-              display: none
         &amp;.graph
           display: none
     .new_watch</diff>
      <filename>public/stylesheets/sass/slides.sass</filename>
    </modified>
    <modified>
      <diff>@@ -88,6 +88,9 @@ h1 a span {
 #sites .site .watch div.status span.response {
   font-size: 85%;
 }
+#sites .site .watch div.status span.since_date {
+  display: none;
+}
 #sites .site .watch div.status a {
   color: #ffffff;
 }</diff>
      <filename>public/stylesheets/shared.css</filename>
    </modified>
    <modified>
      <diff>@@ -14,11 +14,15 @@ h1 {
 #sites .site h2 {
   display: none;
 }
-#sites .site .watch {
+#sites .site .container {
+  overflow: hidden;
   float: left;
-  width: 300px;
-  height: 112px;
+  min-height: 1px;
   margin: 0 10px 10px 0;
+}
+#sites .site .watch {
+  width: auto;
+  height: 112px;
   display: block;
   min-width: 200px;
   -moz-box-shadow: 2px 2px 2px rgba(0,0,0,.2);
@@ -35,6 +39,9 @@ h1 {
 #sites .site .watch div.name span.name {
   font-size: 131%;
 }
+#sites .site .watch div.name span.url {
+  white-space: nowrap;
+}
 #sites .site .watch div.name span.url a {
   font-size: 85%;
 }
@@ -55,9 +62,6 @@ h1 {
 #sites .site .watch div.status span.response {
   margin: 0 1.3em 0 0;
 }
-#sites .site .watch div.status span.since_date {
-  display: none;
-}
 #sites .site .watch div.graph {
   display: none;
 }</diff>
      <filename>public/stylesheets/slides.css</filename>
    </modified>
    <modified>
      <diff>@@ -4,10 +4,10 @@ ihoops:
   id: 1
   name: Homepage
   url: http://www.ihoops.com/
-  last_response_time: 124
+  last_response_time: 500
   active: true
-  content_match: 'Welcome to iHoops.com'
-  warning_time: 600
+  content_match: Welcome to iHoops.com
+  warning_time: 2000
   status_id: 1
   site_id: 1
 
@@ -15,7 +15,8 @@ sportsstudiocasting1:
   id: 2
   name: Homepage
   url: http://sportsstudiocasting.com
-  last_response_time: 243
+  last_response_time: 500
+  warning_time: 2000
   active: true
   status_id: 1
   site_id: 2
@@ -24,9 +25,9 @@ sportsstudiocasting2:
   id: 3
   name: Login
   url: http://sportsstudiocasting.com/login
-  last_response_time: 3413
+  last_response_time: 500
   active: true
-  warning_time: 1000
+  warning_time: 2000
   status_id: 1
   site_id: 2
   
\ No newline at end of file</diff>
      <filename>test/fixtures/watches.yml</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>35edecc668f4d857631c7d5c4c981b3fe853fa68</id>
    </parent>
  </parents>
  <author>
    <name>Cannikin</name>
    <email>cannikinn@gmail.com</email>
  </author>
  <url>http://github.com/cannikin/owl/commit/649b223b95ee34161bd831e2b00e10c792643ef1</url>
  <id>649b223b95ee34161bd831e2b00e10c792643ef1</id>
  <committed-date>2009-11-04T16:15:28-08:00</committed-date>
  <authored-date>2009-11-04T16:15:28-08:00</authored-date>
  <message>Added response code and content tracking</message>
  <tree>5fac9ccf7a2af5155dc61abfe6c02bf9896a280b</tree>
  <committer>
    <name>Cannikin</name>
    <email>cannikinn@gmail.com</email>
  </committer>
</commit>
