Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 9208

Show
Ignore:
Timestamp:
04/02/08 06:56:44 (1 month ago)
Author:
gbuesing
Message:

TimeWithZone#method_missing: send to utc to advance with dst correctness, otherwise send to time. Adding tests for time calculations methods

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activesupport/CHANGELOG

    r9203 r9208  
    11*SVN* 
     2 
     3* TimeWithZone#method_missing: send to utc to advance with dst correctness, otherwise send to time. Adding tests for time calculations methods [Geoff Buesing] 
    24 
    35* Add config.active_support.use_standard_json_time_format setting so that Times and Dates export to ISO 8601 dates.  [rick] 
  • trunk/activesupport/lib/active_support/time_with_zone.rb

    r9149 r9208  
    145145    end 
    146146     
    147     %w(asctime day hour min mon sec wday yday year to_date).each do |name| 
    148       define_method(name) do 
    149         time.__send__(name) 
    150       end 
    151     end 
    152     alias_method :ctime, :asctime 
    153     alias_method :mday, :day 
    154     alias_method :month, :mon 
    155      
    156147    def usec 
    157148      time.respond_to?(:usec) ? time.usec : 0 
    158149    end 
    159      
    160     %w(sunday? monday? tuesday? wednesday? thursday? friday? saturday?).each do |name| 
    161       define_method(name) do 
    162         time.__send__(name) 
    163       end 
    164     end unless RUBY_VERSION < '1.9' 
    165150     
    166151    def to_a 
     
    220205    # Send the missing method to time instance, and wrap result in a new TimeWithZone with the existing time_zone 
    221206    def method_missing(sym, *args, &block) 
    222       result = utc.__send__(sym, *args, &block) 
    223       result = result.in_time_zone(time_zone) if result.acts_like?(:time) 
    224       result 
     207      if %w(+ - since ago advance).include?(sym.to_s) 
     208        result = utc.__send__(sym, *args, &block) 
     209        result.acts_like?(:time) ? result.in_time_zone(time_zone) : result 
     210      else 
     211        result = time.__send__(sym, *args, &block) 
     212        result.acts_like?(:time) ? self.class.new(nil, time_zone, result) : result 
     213      end 
    225214    end 
    226215     
  • trunk/activesupport/test/core_ext/time_with_zone_test.rb

    r9150 r9208  
    394394    end 
    395395  end 
     396   
     397  def test_change 
     398    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     399    assert_equal "Mon, 31 Dec 2001 19:00:00 EST -05:00", @twz.change(:year => 2001).inspect 
     400    assert_equal "Wed, 31 Mar 1999 19:00:00 EST -05:00", @twz.change(:month => 3).inspect 
     401    assert_equal "Wed, 03 Mar 1999 19:00:00 EST -05:00", @twz.change(:month => 2).inspect 
     402    assert_equal "Wed, 15 Dec 1999 19:00:00 EST -05:00", @twz.change(:day => 15).inspect 
     403    assert_equal "Fri, 31 Dec 1999 06:00:00 EST -05:00", @twz.change(:hour => 6).inspect 
     404    assert_equal "Fri, 31 Dec 1999 19:15:00 EST -05:00", @twz.change(:min => 15).inspect 
     405    assert_equal "Fri, 31 Dec 1999 19:00:30 EST -05:00", @twz.change(:sec => 30).inspect 
     406  end 
     407   
     408  def test_advance 
     409    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     410    assert_equal "Mon, 31 Dec 2001 19:00:00 EST -05:00", @twz.advance(:years => 2).inspect 
     411    assert_equal "Fri, 31 Mar 2000 19:00:00 EST -05:00", @twz.advance(:months => 3).inspect 
     412    assert_equal "Tue, 04 Jan 2000 19:00:00 EST -05:00", @twz.advance(:days => 4).inspect 
     413    assert_equal "Sat, 01 Jan 2000 01:00:00 EST -05:00", @twz.advance(:hours => 6).inspect 
     414    assert_equal "Fri, 31 Dec 1999 19:15:00 EST -05:00", @twz.advance(:minutes => 15).inspect 
     415    assert_equal "Fri, 31 Dec 1999 19:00:30 EST -05:00", @twz.advance(:seconds => 30).inspect 
     416  end 
     417   
     418  def beginning_of_year 
     419    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     420    assert_equal "Fri, 01 Jan 1999 00:00:00 EST -05:00", @twz.beginning_of_year.inspect 
     421  end 
     422   
     423  def end_of_year 
     424    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     425    assert_equal "Fri, 31 Dec 1999 23:59:59 EST -05:00", @twz.end_of_year.inspect 
     426  end 
     427   
     428  def beginning_of_month 
     429    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     430    assert_equal "Fri, 01 Dec 1999 00:00:00 EST -05:00", @twz.beginning_of_month.inspect 
     431  end 
     432   
     433  def end_of_month 
     434    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     435    assert_equal "Fri, 31 Dec 1999 23:59:59 EST -05:00", @twz.end_of_month.inspect 
     436  end 
     437   
     438  def beginning_of_day 
     439    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     440    assert_equal "Fri, 31 Dec 1999 00:00:00 EST -05:00", @twz.beginning_of_day.inspect 
     441  end 
     442   
     443  def end_of_day 
     444    assert_equal "Fri, 31 Dec 1999 19:00:00 EST -05:00", @twz.inspect 
     445    assert_equal "Fri, 31 Dec 1999 23:59:59 EST -05:00", @twz.end_of_day.inspect 
     446  end 
     447   
     448  def test_since 
     449    assert_equal "Fri, 31 Dec 1999 19:00:01 EST -05:00", @twz.since(1).inspect 
     450  end 
     451   
     452  def test_ago 
     453    assert_equal "Fri, 31 Dec 1999 18:59:59 EST -05:00", @twz.ago(1).inspect 
     454  end 
     455   
     456  def test_seconds_since_midnight 
     457    assert_equal 19 * 60 * 60, @twz.seconds_since_midnight 
     458  end 
    396459end 
    397460