aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2008-05-09 10:51:57 +0100
committerPratik Naik <pratiknaik@gmail.com>2008-05-09 10:51:57 +0100
commitc99e54f4ec67cefe11787aa9ab9d8bd006e6ca71 (patch)
treec7548000db7be1adb3b12ec5e6d3877d9262f979 /activesupport
parente6afd8b2736364322b673bbdcca3e9b38b6d3da0 (diff)
parentdc4eec1129520ce9863c9373d7cb79d8636ab7ca (diff)
downloadrails-c99e54f4ec67cefe11787aa9ab9d8bd006e6ca71.tar.gz
rails-c99e54f4ec67cefe11787aa9ab9d8bd006e6ca71.tar.bz2
rails-c99e54f4ec67cefe11787aa9ab9d8bd006e6ca71.zip
Merge commit 'mainstream/master'
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG8
-rw-r--r--activesupport/lib/active_support/core_ext/date/calculations.rb5
-rw-r--r--activesupport/lib/active_support/time_with_zone.rb8
-rw-r--r--activesupport/lib/active_support/values/time_zone.rb8
-rw-r--r--activesupport/test/core_ext/date_ext_test.rb23
-rw-r--r--activesupport/test/core_ext/time_with_zone_test.rb10
-rw-r--r--activesupport/test/time_zone_test.rb25
7 files changed, 85 insertions, 2 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 3ee9ed925c..f72825731e 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,13 @@
*SVN*
+* Adding Date.current, which returns Time.zone.today if config.time_zone is set; otherwise returns Date.today [Geoff Buesing]
+
+* TimeWithZone: date part getter methods (#year #mon #day etc) are defined on class; no longer relying on method_missing [Geoff Buesing]
+
+* Time.zone.parse return nil for strings with no date information [Geoff Buesing]
+
+* Time.zone.parse respects offset information in string. Resolves #105. [Scott Fleckenstein, Geoff Buesing]
+
* Added Ruby 1.8 implementation of Process.daemon
* Duration #since and #ago with no argument (e.g., 5.days.ago) return TimeWithZone when config.time_zone is set. Introducing Time.current, which returns Time.zone.now if config.time_zone is set, otherwise just returns Time.now [Geoff Buesing]
diff --git a/activesupport/lib/active_support/core_ext/date/calculations.rb b/activesupport/lib/active_support/core_ext/date/calculations.rb
index 183471706b..1e2dbf118e 100644
--- a/activesupport/lib/active_support/core_ext/date/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/date/calculations.rb
@@ -25,6 +25,11 @@ module ActiveSupport #:nodoc:
def tomorrow
::Date.today.tomorrow
end
+
+ # Returns Time.zone.today when config.time_zone is set, otherwise just returns Date.today.
+ def current
+ ::Time.zone_default ? ::Time.zone.today : ::Date.today
+ end
end
# Converts Date to a Time (or DateTime if necessary) with the time portion set to the beginning of the day (0:00)
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb
index 461d52e40e..21ddcaad48 100644
--- a/activesupport/lib/active_support/time_with_zone.rb
+++ b/activesupport/lib/active_support/time_with_zone.rb
@@ -163,6 +163,14 @@ module ActiveSupport
utc.advance(options).in_time_zone(time_zone)
end
+ %w(year mon month day mday hour min sec).each do |method_name|
+ class_eval <<-EOV
+ def #{method_name}
+ time.#{method_name}
+ end
+ EOV
+ end
+
def usec
time.respond_to?(:usec) ? time.usec : 0
end
diff --git a/activesupport/lib/active_support/values/time_zone.rb b/activesupport/lib/active_support/values/time_zone.rb
index 9cdc2a74ed..0fa99135e2 100644
--- a/activesupport/lib/active_support/values/time_zone.rb
+++ b/activesupport/lib/active_support/values/time_zone.rb
@@ -213,8 +213,14 @@ class TimeZone
# Time.zone.now # => Fri, 31 Dec 1999 14:00:00 HST -10:00
# Time.zone.parse('22:30:00') # => Fri, 31 Dec 1999 22:30:00 HST -10:00
def parse(str, now=now)
+ date_parts = Date._parse(str)
+ return if date_parts.blank?
time = Time.parse(str, now) rescue DateTime.parse(str)
- ActiveSupport::TimeWithZone.new(nil, self, time)
+ if date_parts[:offset].nil?
+ ActiveSupport::TimeWithZone.new(nil, self, time)
+ else
+ time.in_time_zone(self)
+ end
end
# Returns an ActiveSupport::TimeWithZone instance representing the current time
diff --git a/activesupport/test/core_ext/date_ext_test.rb b/activesupport/test/core_ext/date_ext_test.rb
index 2e363c439a..5925ae3a61 100644
--- a/activesupport/test/core_ext/date_ext_test.rb
+++ b/activesupport/test/core_ext/date_ext_test.rb
@@ -208,6 +208,29 @@ class DateExtCalculationsTest < Test::Unit::TestCase
end
end
end
+
+ uses_mocha 'TestDateCurrent' do
+ def test_current_returns_date_today_when_zone_default_not_set
+ with_env_tz 'US/Central' do
+ Time.stubs(:now).returns Time.local(1999, 12, 31, 23)
+ assert_equal Date.new(1999, 12, 31), Date.today
+ assert_equal Date.new(1999, 12, 31), Date.current
+ end
+ end
+
+ def test_current_returns_time_zone_today_when_zone_default_set
+ silence_warnings do # silence warnings raised by tzinfo gem
+ Time.zone_default = TimeZone['Eastern Time (US & Canada)']
+ with_env_tz 'US/Central' do
+ Time.stubs(:now).returns Time.local(1999, 12, 31, 23)
+ assert_equal Date.new(1999, 12, 31), Date.today
+ assert_equal Date.new(2000, 1, 1), Date.current
+ end
+ end
+ ensure
+ Time.zone_default = nil
+ end
+ end
protected
def with_env_tz(new_tz = 'US/Eastern')
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb
index df70e82c1d..64fcb4af09 100644
--- a/activesupport/test/core_ext/time_with_zone_test.rb
+++ b/activesupport/test/core_ext/time_with_zone_test.rb
@@ -328,10 +328,18 @@ class TimeWithZoneTest < Test::Unit::TestCase
assert_equal Time.utc(1999, 12, 31, 19), mtime.time
end
end
-
+
def test_method_missing_with_non_time_return_value
silence_warnings do # silence warnings raised by tzinfo gem
+ @twz.time.expects(:foo).returns('bar')
+ assert_equal 'bar', @twz.foo
+ end
+ end
+
+ def test_date_part_value_methods
+ silence_warnings do # silence warnings raised by tzinfo gem
twz = ActiveSupport::TimeWithZone.new(Time.utc(1999,12,31,19,18,17,500), @time_zone)
+ twz.stubs(:method_missing).returns(nil) #ensure these methods are defined directly on class
assert_equal 1999, twz.year
assert_equal 12, twz.month
assert_equal 31, twz.day
diff --git a/activesupport/test/time_zone_test.rb b/activesupport/test/time_zone_test.rb
index 2f06c347a1..3757ddcedb 100644
--- a/activesupport/test/time_zone_test.rb
+++ b/activesupport/test/time_zone_test.rb
@@ -173,6 +173,14 @@ class TimeZoneTest < Test::Unit::TestCase
assert_equal zone, twz.time_zone
end
+ def test_parse_string_with_timezone
+ (-11..13).each do |timezone_offset|
+ zone = TimeZone[timezone_offset]
+ twz = zone.parse('1999-12-31 19:00:00')
+ assert_equal twz, zone.parse(twz.to_s)
+ end
+ end
+
def test_parse_with_old_date
silence_warnings do # silence warnings raised by tzinfo gem
zone = TimeZone['Eastern Time (US & Canada)']
@@ -181,6 +189,23 @@ class TimeZoneTest < Test::Unit::TestCase
assert_equal zone, twz.time_zone
end
end
+
+ def test_parse_far_future_date_with_time_zone_offset_in_string
+ silence_warnings do # silence warnings raised by tzinfo gem
+ zone = TimeZone['Eastern Time (US & Canada)']
+ twz = zone.parse('2050-12-31 19:00:00 -10:00') # i.e., 2050-01-01 05:00:00 UTC
+ assert_equal [0,0,0,1,1,2051], twz.to_a[0,6]
+ assert_equal zone, twz.time_zone
+ end
+ end
+
+ def test_parse_returns_nil_when_string_without_date_information_is_passed_in
+ silence_warnings do # silence warnings raised by tzinfo gem
+ zone = TimeZone['Eastern Time (US & Canada)']
+ assert_nil zone.parse('foobar')
+ assert_nil zone.parse(' ')
+ end
+ end
uses_mocha 'TestParseWithIncompleteDate' do
def test_parse_with_incomplete_date