aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2008-05-20 10:37:30 +0100
committerPratik Naik <pratiknaik@gmail.com>2008-05-20 10:37:30 +0100
commit1148af4b3f8507c851be2f0bee103642937e8c29 (patch)
tree460879f6076f271e7dbc0b313245be6bf1ba640e /activesupport
parentecba27c9701698a70eb7a7af1a995bb1d089949c (diff)
parent1b0128c5413ace12dee45e9db328cff866a5bb06 (diff)
downloadrails-1148af4b3f8507c851be2f0bee103642937e8c29.tar.gz
rails-1148af4b3f8507c851be2f0bee103642937e8c29.tar.bz2
rails-1148af4b3f8507c851be2f0bee103642937e8c29.zip
Merge commit 'mainstream/master'
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG6
-rw-r--r--activesupport/lib/active_support/cache.rb8
-rw-r--r--activesupport/lib/active_support/cache/file_store.rb7
-rw-r--r--activesupport/lib/active_support/cache/mem_cache_store.rb8
-rw-r--r--activesupport/lib/active_support/cache/memory_store.rb7
-rw-r--r--activesupport/lib/active_support/core_ext/hash/conversions.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/time/zones.rb27
-rw-r--r--activesupport/lib/active_support/json/encoders/time.rb2
-rw-r--r--activesupport/lib/active_support/testing/setup_and_teardown.rb12
-rw-r--r--activesupport/lib/active_support/time_with_zone.rb33
-rw-r--r--activesupport/lib/active_support/values/time_zone.rb21
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb114
-rw-r--r--activesupport/test/core_ext/hash_ext_test.rb38
-rw-r--r--activesupport/test/core_ext/time_with_zone_test.rb7
-rw-r--r--activesupport/test/json/encoding_test.rb16
15 files changed, 231 insertions, 77 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index e8821060f9..6250f33998 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,3 +1,9 @@
+* Hash.from_xml: datetime xml types overflow to Ruby DateTime class when out of range of Time. Adding tests for utc offsets [Geoff Buesing]
+
+* TimeWithZone #+ and #- : ensure overflow to DateTime with Numeric arg [Geoff Buesing]
+
+* Time#to_json: don't convert to utc before encoding. References #175 [Geoff Buesing]
+
*2.1.0 RC1 (May 11th, 2008)*
* Remove unused JSON::RESERVED_WORDS, JSON.valid_identifier? and JSON.reserved_word? methods. Resolves #164. [Cheah Chu Yeow]
diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb
index b3c9c23d9f..2f1143e610 100644
--- a/activesupport/lib/active_support/cache.rb
+++ b/activesupport/lib/active_support/cache.rb
@@ -87,8 +87,12 @@ module ActiveSupport
def delete_matched(matcher, options = nil)
log("delete matched", matcher.inspect, options)
- end
-
+ end
+
+ def exist?(key, options = nil)
+ log("exist?", key, options)
+ end
+
def increment(key, amount = 1)
log("incrementing", key, amount)
if num = read(key)
diff --git a/activesupport/lib/active_support/cache/file_store.rb b/activesupport/lib/active_support/cache/file_store.rb
index 16a2509ce2..5b771b1da0 100644
--- a/activesupport/lib/active_support/cache/file_store.rb
+++ b/activesupport/lib/active_support/cache/file_store.rb
@@ -40,13 +40,18 @@ module ActiveSupport
end
end
+ def exist?(name, options = nil)
+ super
+ File.exist?(real_file_path(name))
+ end
+
private
def real_file_path(name)
'%s/%s.cache' % [@cache_path, name.gsub('?', '.').gsub(':', '.')]
end
def ensure_cache_path(path)
- FileUtils.makedirs(path) unless File.exists?(path)
+ FileUtils.makedirs(path) unless File.exist?(path)
end
def search_dir(dir, &callback)
diff --git a/activesupport/lib/active_support/cache/mem_cache_store.rb b/activesupport/lib/active_support/cache/mem_cache_store.rb
index bfe7e2ccf3..b3769b812f 100644
--- a/activesupport/lib/active_support/cache/mem_cache_store.rb
+++ b/activesupport/lib/active_support/cache/mem_cache_store.rb
@@ -48,7 +48,13 @@ module ActiveSupport
rescue MemCache::MemCacheError => e
logger.error("MemCacheError (#{e}): #{e.message}")
false
- end
+ end
+
+ def exist?(key, options = nil)
+ # Doesn't call super, cause exist? in memcache is in fact a read
+ # But who cares? Reading is very fast anyway
+ !read(key, options).nil?
+ end
def increment(key, amount = 1)
log("incrementing", key, amount)
diff --git a/activesupport/lib/active_support/cache/memory_store.rb b/activesupport/lib/active_support/cache/memory_store.rb
index 4872e025cd..6f114273e4 100644
--- a/activesupport/lib/active_support/cache/memory_store.rb
+++ b/activesupport/lib/active_support/cache/memory_store.rb
@@ -24,7 +24,12 @@ module ActiveSupport
super
@data.delete_if { |k,v| k =~ matcher }
end
-
+
+ def exist?(name,options = nil)
+ super
+ @data.has_key?(name)
+ end
+
def clear
@data.clear
end
diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb
index f0f54a92fe..2c606b401b 100644
--- a/activesupport/lib/active_support/core_ext/hash/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/hash/conversions.rb
@@ -70,7 +70,7 @@ module ActiveSupport #:nodoc:
XML_PARSING = {
"symbol" => Proc.new { |symbol| symbol.to_sym },
"date" => Proc.new { |date| ::Date.parse(date) },
- "datetime" => Proc.new { |time| ::Time.parse(time).utc },
+ "datetime" => Proc.new { |time| ::Time.parse(time).utc rescue ::DateTime.parse(time).utc },
"integer" => Proc.new { |integer| integer.to_i },
"float" => Proc.new { |float| float.to_f },
"decimal" => Proc.new { |number| BigDecimal(number) },
diff --git a/activesupport/lib/active_support/core_ext/time/zones.rb b/activesupport/lib/active_support/core_ext/time/zones.rb
index 3ffc71407c..cf28d0fa95 100644
--- a/activesupport/lib/active_support/core_ext/time/zones.rb
+++ b/activesupport/lib/active_support/core_ext/time/zones.rb
@@ -1,9 +1,7 @@
module ActiveSupport #:nodoc:
module CoreExtensions #:nodoc:
module Time #:nodoc:
- # Methods for creating TimeWithZone objects from Time instances
module Zones
-
def self.included(base) #:nodoc:
base.extend(ClassMethods) if base == ::Time # i.e., don't include class methods in DateTime
end
@@ -11,18 +9,31 @@ module ActiveSupport #:nodoc:
module ClassMethods
attr_accessor :zone_default
+ # Returns the TimeZone for the current request, if this has been set (via Time.zone=).
+ # If Time.zone has not been set for the current request, returns the TimeZone specified in config.time_zone
def zone
Thread.current[:time_zone] || zone_default
end
- # Sets a global default time zone, separate from the system time zone in ENV['TZ'].
- # Accepts either a Rails TimeZone object, a string that identifies a
- # Rails TimeZone object (e.g., "Central Time (US & Canada)"), or a TZInfo::Timezone object.
+ # Sets Time.zone to a TimeZone object for the current request/thread.
+ #
+ # This method accepts any of the following:
+ #
+ # * a Rails TimeZone object
+ # * an identifier for a Rails TimeZone object (e.g., "Eastern Time (US & Canada)", -5.hours)
+ # * a TZInfo::Timezone object
+ # * an identifier for a TZInfo::Timezone object (e.g., "America/New_York")
+ #
+ # Here's an example of how you might set Time.zone on a per request basis -- current_user.time_zone
+ # just needs to return a string identifying the user's preferred TimeZone:
#
- # Any Time or DateTime object can use this default time zone, via <tt>in_time_zone</tt>.
+ # class ApplicationController < ActionController::Base
+ # before_filter :set_time_zone
#
- # Time.zone = 'Hawaii' # => 'Hawaii'
- # Time.utc(2000).in_time_zone # => Fri, 31 Dec 1999 14:00:00 HST -10:00
+ # def set_time_zone
+ # Time.zone = current_user.time_zone
+ # end
+ # end
def zone=(time_zone)
Thread.current[:time_zone] = get_zone(time_zone)
end
diff --git a/activesupport/lib/active_support/json/encoders/time.rb b/activesupport/lib/active_support/json/encoders/time.rb
index 3660d87c82..57ed3c9e31 100644
--- a/activesupport/lib/active_support/json/encoders/time.rb
+++ b/activesupport/lib/active_support/json/encoders/time.rb
@@ -6,7 +6,7 @@ class Time
# # => 2005/02/01 15:15:10 +0000"
def to_json(options = nil)
if ActiveSupport.use_standard_json_time_format
- utc.xmlschema.inspect
+ xmlschema.inspect
else
%("#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}")
end
diff --git a/activesupport/lib/active_support/testing/setup_and_teardown.rb b/activesupport/lib/active_support/testing/setup_and_teardown.rb
index b2a937edd0..ed8e34510a 100644
--- a/activesupport/lib/active_support/testing/setup_and_teardown.rb
+++ b/activesupport/lib/active_support/testing/setup_and_teardown.rb
@@ -1,6 +1,14 @@
module ActiveSupport
module Testing
module SetupAndTeardown
+ # For compatibility with Ruby < 1.8.6
+ PASSTHROUGH_EXCEPTIONS =
+ if defined?(Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS)
+ Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
+ else
+ [NoMemoryError, SignalException, Interrupt, SystemExit]
+ end
+
def self.included(base)
base.send :include, ActiveSupport::Callbacks
base.define_callbacks :setup, :teardown
@@ -25,7 +33,7 @@ module ActiveSupport
__send__(@method_name)
rescue Test::Unit::AssertionFailedError => e
add_failure(e.message, e.backtrace)
- rescue *Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
+ rescue *PASSTHROUGH_EXCEPTIONS
raise
rescue Exception
add_error($!)
@@ -35,7 +43,7 @@ module ActiveSupport
run_callbacks :teardown, :enumerator => :reverse_each
rescue Test::Unit::AssertionFailedError => e
add_failure(e.message, e.backtrace)
- rescue *Test::Unit::TestCase::PASSTHROUGH_EXCEPTIONS
+ rescue *PASSTHROUGH_EXCEPTIONS
raise
rescue Exception
add_error($!)
diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb
index fbdc680235..c9fb615fa5 100644
--- a/activesupport/lib/active_support/time_with_zone.rb
+++ b/activesupport/lib/active_support/time_with_zone.rb
@@ -1,7 +1,34 @@
require 'tzinfo'
module ActiveSupport
# A Time-like class that can represent a time in any time zone. Necessary because standard Ruby Time instances are
- # limited to UTC and the system's ENV['TZ'] zone
+ # limited to UTC and the system's ENV['TZ'] zone.
+ #
+ # You shouldn't ever need to create a TimeWithZone instance directly via .new -- instead, Rails provides the methods
+ # #local, #parse, #at and #now on TimeZone instances, and #in_time_zone on Time and DateTime instances, for a more
+ # user-friendly syntax. Examples:
+ #
+ # Time.zone = 'Eastern Time (US & Canada)' # => 'Eastern Time (US & Canada)'
+ # Time.zone.local(2007, 2, 10, 15, 30, 45) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
+ # Time.zone.parse('2007-02-01 15:30:45') # => Sat, 10 Feb 2007 15:30:45 EST -05:00
+ # Time.zone.at(1170361845) # => Sat, 10 Feb 2007 15:30:45 EST -05:00
+ # Time.zone.now # => Sun, 18 May 2008 13:07:55 EDT -04:00
+ # Time.utc(2007, 2, 10, 20, 30, 45).in_time_zone # => Sat, 10 Feb 2007 15:30:45 EST -05:00
+ #
+ # See TimeZone and ActiveSupport::CoreExtensions::Time::Zones for further documentation for these methods.
+ #
+ # TimeWithZone instances implement the same API as Ruby Time instances, so that Time and TimeWithZone instances are interchangable. Examples:
+ #
+ # t = Time.zone.now # => Sun, 18 May 2008 13:27:25 EDT -04:00
+ # t.hour # => 13
+ # t.dst? # => true
+ # t.utc_offset # => -14400
+ # t.zone # => "EDT"
+ # t.to_s(:rfc822) # => "Sun, 18 May 2008 13:27:25 -0400"
+ # t + 1.day # => Mon, 19 May 2008 13:27:25 EDT -04:00
+ # t.beginning_of_year # => Tue, 01 Jan 2008 00:00:00 EST -05:00
+ # t > Time.utc(1999) # => true
+ # t.is_a?(Time) # => true
+ # t.is_a?(ActiveSupport::TimeWithZone) # => true
class TimeWithZone
include Comparable
attr_reader :time_zone
@@ -135,7 +162,7 @@ module ActiveSupport
# If wrapped #time is a DateTime, use DateTime#since instead of <tt>+</tt>.
# Otherwise, just pass on to +method_missing+.
def +(other)
- result = utc.acts_like?(:date) ? utc.since(other) : utc + other
+ result = utc.acts_like?(:date) ? utc.since(other) : utc + other rescue utc.since(other)
result.in_time_zone(time_zone)
end
@@ -146,7 +173,7 @@ module ActiveSupport
if other.acts_like?(:time)
utc - other
else
- result = utc.acts_like?(:date) ? utc.ago(other) : utc - other
+ result = utc.acts_like?(:date) ? utc.ago(other) : utc - other rescue utc.ago(other)
result.in_time_zone(time_zone)
end
end
diff --git a/activesupport/lib/active_support/values/time_zone.rb b/activesupport/lib/active_support/values/time_zone.rb
index 323429d126..886c3e952d 100644
--- a/activesupport/lib/active_support/values/time_zone.rb
+++ b/activesupport/lib/active_support/values/time_zone.rb
@@ -1,3 +1,24 @@
+# The TimeZone class serves as a wrapper around TZInfo::Timezone instances. It allows us to do the following:
+#
+# * limit the set of zones provided by TZInfo to a meaningful subset of 142 zones
+# * retrieve and display zones with a friendlier name (e.g., "Eastern Time (US & Canada)" instead of "America/New_York")
+# * lazily load TZInfo::Timezone instances only when they're needed
+# * create ActiveSupport::TimeWithZone instances via TimeZone #local, #parse, #at and #now methods
+#
+# If you set config.time_zone in the Rails Initializer, you can access this TimeZone object via Time.zone:
+#
+# # environment.rb:
+# Rails::Initializer.run do |config|
+# config.time_zone = "Eastern Time (US & Canada)"
+# end
+#
+# Time.zone # => #<TimeZone:0x514834...>
+# Time.zone.name # => "Eastern Time (US & Canada)"
+# Time.zone.now # => Sun, 18 May 2008 14:30:44 EDT -04:00
+#
+# The version of TZInfo bundled with ActiveSupport only includes the definitions necessary to support the zones
+# defined by the TimeZone class. If you need to use zones that aren't defined by TimeZone, you'll need to install the TZInfo gem
+# (if a recent version of the gem is installed locally, this will be used instead of the bundled version.)
class TimeZone
unless const_defined?(:MAPPING)
# Keys are Rails TimeZone names, values are TZInfo identifiers
diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb
index 5857de623d..32fa4123f1 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb
@@ -27,63 +27,63 @@ module TZInfo
# -14 and +14 hours to avoid having to call gcd at runtime.
module OffsetRationals #:nodoc:
@@rational_cache = {
- -50400 => Rational.new!(-7,12),
- -48600 => Rational.new!(-9,16),
- -46800 => Rational.new!(-13,24),
- -45000 => Rational.new!(-25,48),
- -43200 => Rational.new!(-1,2),
- -41400 => Rational.new!(-23,48),
- -39600 => Rational.new!(-11,24),
- -37800 => Rational.new!(-7,16),
- -36000 => Rational.new!(-5,12),
- -34200 => Rational.new!(-19,48),
- -32400 => Rational.new!(-3,8),
- -30600 => Rational.new!(-17,48),
- -28800 => Rational.new!(-1,3),
- -27000 => Rational.new!(-5,16),
- -25200 => Rational.new!(-7,24),
- -23400 => Rational.new!(-13,48),
- -21600 => Rational.new!(-1,4),
- -19800 => Rational.new!(-11,48),
- -18000 => Rational.new!(-5,24),
- -16200 => Rational.new!(-3,16),
- -14400 => Rational.new!(-1,6),
- -12600 => Rational.new!(-7,48),
- -10800 => Rational.new!(-1,8),
- -9000 => Rational.new!(-5,48),
- -7200 => Rational.new!(-1,12),
- -5400 => Rational.new!(-1,16),
- -3600 => Rational.new!(-1,24),
- -1800 => Rational.new!(-1,48),
- 0 => Rational.new!(0,1),
- 1800 => Rational.new!(1,48),
- 3600 => Rational.new!(1,24),
- 5400 => Rational.new!(1,16),
- 7200 => Rational.new!(1,12),
- 9000 => Rational.new!(5,48),
- 10800 => Rational.new!(1,8),
- 12600 => Rational.new!(7,48),
- 14400 => Rational.new!(1,6),
- 16200 => Rational.new!(3,16),
- 18000 => Rational.new!(5,24),
- 19800 => Rational.new!(11,48),
- 21600 => Rational.new!(1,4),
- 23400 => Rational.new!(13,48),
- 25200 => Rational.new!(7,24),
- 27000 => Rational.new!(5,16),
- 28800 => Rational.new!(1,3),
- 30600 => Rational.new!(17,48),
- 32400 => Rational.new!(3,8),
- 34200 => Rational.new!(19,48),
- 36000 => Rational.new!(5,12),
- 37800 => Rational.new!(7,16),
- 39600 => Rational.new!(11,24),
- 41400 => Rational.new!(23,48),
- 43200 => Rational.new!(1,2),
- 45000 => Rational.new!(25,48),
- 46800 => Rational.new!(13,24),
- 48600 => Rational.new!(9,16),
- 50400 => Rational.new!(7,12)}
+ -50400 => Rational(-7,12),
+ -48600 => Rational(-9,16),
+ -46800 => Rational(-13,24),
+ -45000 => Rational(-25,48),
+ -43200 => Rational(-1,2),
+ -41400 => Rational(-23,48),
+ -39600 => Rational(-11,24),
+ -37800 => Rational(-7,16),
+ -36000 => Rational(-5,12),
+ -34200 => Rational(-19,48),
+ -32400 => Rational(-3,8),
+ -30600 => Rational(-17,48),
+ -28800 => Rational(-1,3),
+ -27000 => Rational(-5,16),
+ -25200 => Rational(-7,24),
+ -23400 => Rational(-13,48),
+ -21600 => Rational(-1,4),
+ -19800 => Rational(-11,48),
+ -18000 => Rational(-5,24),
+ -16200 => Rational(-3,16),
+ -14400 => Rational(-1,6),
+ -12600 => Rational(-7,48),
+ -10800 => Rational(-1,8),
+ -9000 => Rational(-5,48),
+ -7200 => Rational(-1,12),
+ -5400 => Rational(-1,16),
+ -3600 => Rational(-1,24),
+ -1800 => Rational(-1,48),
+ 0 => Rational(0,1),
+ 1800 => Rational(1,48),
+ 3600 => Rational(1,24),
+ 5400 => Rational(1,16),
+ 7200 => Rational(1,12),
+ 9000 => Rational(5,48),
+ 10800 => Rational(1,8),
+ 12600 => Rational(7,48),
+ 14400 => Rational(1,6),
+ 16200 => Rational(3,16),
+ 18000 => Rational(5,24),
+ 19800 => Rational(11,48),
+ 21600 => Rational(1,4),
+ 23400 => Rational(13,48),
+ 25200 => Rational(7,24),
+ 27000 => Rational(5,16),
+ 28800 => Rational(1,3),
+ 30600 => Rational(17,48),
+ 32400 => Rational(3,8),
+ 34200 => Rational(19,48),
+ 36000 => Rational(5,12),
+ 37800 => Rational(7,16),
+ 39600 => Rational(11,24),
+ 41400 => Rational(23,48),
+ 43200 => Rational(1,2),
+ 45000 => Rational(25,48),
+ 46800 => Rational(13,24),
+ 48600 => Rational(9,16),
+ 50400 => Rational(7,12)}
# Returns a Rational expressing the fraction of a day that offset in
# seconds represents (i.e. equivalent to Rational(offset, 86400)).
diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb
index 706e218abc..69028a123f 100644
--- a/activesupport/test/core_ext/hash_ext_test.rb
+++ b/activesupport/test/core_ext/hash_ext_test.rb
@@ -733,6 +733,44 @@ class HashToXmlTest < Test::Unit::TestCase
assert_equal hash, Hash.from_xml(hash.to_xml(@xml_options))['person']
end
+
+ def test_datetime_xml_type_with_utc_time
+ alert_xml = <<-XML
+ <alert>
+ <alert_at type="datetime">2008-02-10T15:30:45Z</alert_at>
+ </alert>
+ XML
+ alert_at = Hash.from_xml(alert_xml)['alert']['alert_at']
+ assert alert_at.utc?
+ assert_equal Time.utc(2008, 2, 10, 15, 30, 45), alert_at
+ end
+
+ def test_datetime_xml_type_with_non_utc_time
+ alert_xml = <<-XML
+ <alert>
+ <alert_at type="datetime">2008-02-10T10:30:45-05:00</alert_at>
+ </alert>
+ XML
+ alert_at = Hash.from_xml(alert_xml)['alert']['alert_at']
+ assert alert_at.utc?
+ assert_equal Time.utc(2008, 2, 10, 15, 30, 45), alert_at
+ end
+
+ def test_datetime_xml_type_with_far_future_date
+ alert_xml = <<-XML
+ <alert>
+ <alert_at type="datetime">2050-02-10T15:30:45Z</alert_at>
+ </alert>
+ XML
+ alert_at = Hash.from_xml(alert_xml)['alert']['alert_at']
+ assert alert_at.utc?
+ assert_equal 2050, alert_at.year
+ assert_equal 2, alert_at.month
+ assert_equal 10, alert_at.day
+ assert_equal 15, alert_at.hour
+ assert_equal 30, alert_at.min
+ assert_equal 45, alert_at.sec
+ end
end
class QueryTest < Test::Unit::TestCase
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb
index 70c393dd46..c373bca88d 100644
--- a/activesupport/test/core_ext/time_with_zone_test.rb
+++ b/activesupport/test/core_ext/time_with_zone_test.rb
@@ -170,6 +170,13 @@ class TimeWithZoneTest < Test::Unit::TestCase
assert_equal DateTime.civil(1999, 12, 31, 19, 0 ,5), (twz + 5).time
end
end
+
+ def test_plus_when_crossing_time_class_limit
+ silence_warnings do # silence warnings raised by tzinfo gem
+ twz = ActiveSupport::TimeWithZone.new(Time.utc(2038, 1, 19), @time_zone)
+ assert_equal [0, 0, 19, 19, 1, 2038], (twz + 86_400).to_a[0,6]
+ end
+ end
def test_plus_with_duration
silence_warnings do # silence warnings raised by tzinfo gem
diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb
index 7bc8eaf06c..38bb8f3e79 100644
--- a/activesupport/test/json/encoding_test.rb
+++ b/activesupport/test/json/encoding_test.rb
@@ -90,6 +90,15 @@ class TestJSONEncoding < Test::Unit::TestCase
def test_hash_should_allow_key_filtering_with_except
assert_equal %({"b": 2}), { 'foo' => 'bar', :b => 2, :c => 3 }.to_json(:except => ['foo', :c])
end
+
+ def test_time_to_json_includes_local_offset
+ ActiveSupport.use_standard_json_time_format = true
+ with_env_tz 'US/Eastern' do
+ assert_equal %("2005-02-01T15:15:10-05:00"), Time.local(2005,2,1,15,15,10).to_json
+ end
+ ensure
+ ActiveSupport.use_standard_json_time_format = false
+ end
protected
def with_kcode(code)
@@ -108,6 +117,13 @@ class TestJSONEncoding < Test::Unit::TestCase
def object_keys(json_object)
json_object[1..-2].scan(/([^{}:,\s]+):/).flatten.sort
end
+
+ def with_env_tz(new_tz = 'US/Eastern')
+ old_tz, ENV['TZ'] = ENV['TZ'], new_tz
+ yield
+ ensure
+ old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
+ end
end
uses_mocha 'JsonOptionsTests' do