aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorTomK32 <tomk32@tomk32.de>2008-06-11 19:22:51 +0200
committerTomK32 <tomk32@tomk32.de>2008-06-11 19:22:51 +0200
commit6a5ac86207765e2c041378b35c05812f9bfe68b9 (patch)
tree4b341329991f2bd08c01d2f139c4c3721a8fbe25 /activesupport
parentfa0cca368f74119b561595cc6ca7454f7debdf6b (diff)
parentd4b7cd99e8e7051c9d3ed6722f9627d5d4dea4e9 (diff)
downloadrails-6a5ac86207765e2c041378b35c05812f9bfe68b9.tar.gz
rails-6a5ac86207765e2c041378b35c05812f9bfe68b9.tar.bz2
rails-6a5ac86207765e2c041378b35c05812f9bfe68b9.zip
Merge branch 'master' of git@github.com:lifo/docrails
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG10
-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/bigdecimal/conversions.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/hash/conversions.rb4
-rw-r--r--activesupport/lib/active_support/core_ext/hash/except.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/integer/even_odd.rb12
-rw-r--r--activesupport/lib/active_support/core_ext/object/misc.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/string/inflections.rb4
-rw-r--r--activesupport/lib/active_support/core_ext/string/unicode.rb10
-rw-r--r--activesupport/lib/active_support/core_ext/time/calculations.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/time/conversions.rb2
-rw-r--r--activesupport/lib/active_support/core_ext/time/zones.rb37
-rw-r--r--activesupport/lib/active_support/dependencies.rb23
-rw-r--r--activesupport/lib/active_support/deprecation.rb4
-rw-r--r--activesupport/lib/active_support/inflector.rb118
-rw-r--r--activesupport/lib/active_support/json.rb2
-rw-r--r--activesupport/lib/active_support/json/decoding.rb2
-rw-r--r--activesupport/lib/active_support/json/encoders/date.rb11
-rw-r--r--activesupport/lib/active_support/json/encoders/date_time.rb11
-rw-r--r--activesupport/lib/active_support/json/encoders/time.rb15
-rw-r--r--activesupport/lib/active_support/multibyte/chars.rb14
-rw-r--r--activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb18
-rw-r--r--activesupport/lib/active_support/testing/setup_and_teardown.rb12
-rw-r--r--activesupport/lib/active_support/time_with_zone.rb83
-rw-r--r--activesupport/lib/active_support/values/time_zone.rb27
-rw-r--r--activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb2
-rw-r--r--activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb4
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb2
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb2
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb2
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/offset_rationals.rb114
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb2
-rw-r--r--activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb2
-rw-r--r--activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb6
-rw-r--r--activesupport/lib/active_support/version.rb4
-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/dependencies_test.rb26
-rw-r--r--activesupport/test/json/encoding_test.rb16
-rw-r--r--activesupport/test/time_zone_test.rb2
43 files changed, 447 insertions, 239 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index e8821060f9..690bb987dc 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,4 +1,12 @@
-*2.1.0 RC1 (May 11th, 2008)*
+*2.1.0 (May 31st, 2008)*
+
+* TimeZone#to_s shows offset as GMT instead of UTC, because GMT will be more familiar to end users (see time zone selects used by Windows OS, google.com and yahoo.com.) Reverts [8370] [Geoff Buesing]
+
+* 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]
* 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/bigdecimal/conversions.rb b/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb
index d2b01b1b8d..94c7c779f7 100644
--- a/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/bigdecimal/conversions.rb
@@ -21,7 +21,7 @@ module ActiveSupport #:nodoc:
# This emits the number without any scientific notation.
# I prefer it to using self.to_f.to_s, which would lose precision.
#
- # Note that YAML allows that when reconsituting floats
+ # Note that YAML allows that when reconstituting floats
# to native types, some precision may get lost.
# There is no full precision real YAML tag that I am aware of.
str = self.to_s
diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb
index 3d6a8d8588..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) },
@@ -212,7 +212,7 @@ module ActiveSupport #:nodoc:
nil
# If the type is the only element which makes it then
# this still makes the value nil, except if type is
- # a xml node(where type['value'] is a Hash)
+ # a XML node(where type['value'] is a Hash)
elsif value['type'] && value.size == 1 && !value['type'].is_a?(::Hash)
nil
else
diff --git a/activesupport/lib/active_support/core_ext/hash/except.rb b/activesupport/lib/active_support/core_ext/hash/except.rb
index 8362cd880e..64d690965a 100644
--- a/activesupport/lib/active_support/core_ext/hash/except.rb
+++ b/activesupport/lib/active_support/core_ext/hash/except.rb
@@ -14,7 +14,7 @@ module ActiveSupport #:nodoc:
reject { |key,| rejected.include?(key) }
end
- # Replaces the hash without only the given keys.
+ # Replaces the hash without the given keys.
def except!(*keys)
replace(except(*keys))
end
diff --git a/activesupport/lib/active_support/core_ext/integer/even_odd.rb b/activesupport/lib/active_support/core_ext/integer/even_odd.rb
index cfc6b4c6d6..b1d1e28062 100644
--- a/activesupport/lib/active_support/core_ext/integer/even_odd.rb
+++ b/activesupport/lib/active_support/core_ext/integer/even_odd.rb
@@ -3,10 +3,14 @@ module ActiveSupport #:nodoc:
module Integer #:nodoc:
# For checking if a fixnum is even or odd.
#
- # 1.even? # => false
- # 1.odd? # => true
- # 2.even? # => true
- # 2.odd? # => false
+ # 2.even? # => true
+ # 2.odd? # => false
+ # 1.even? # => false
+ # 1.odd? # => true
+ # 0.even? # => true
+ # 0.odd? # => false
+ # -1.even? # => false
+ # -1.odd? # => true
module EvenOdd
def multiple_of?(number)
self % number == 0
diff --git a/activesupport/lib/active_support/core_ext/object/misc.rb b/activesupport/lib/active_support/core_ext/object/misc.rb
index a3637d7a8a..8384a12327 100644
--- a/activesupport/lib/active_support/core_ext/object/misc.rb
+++ b/activesupport/lib/active_support/core_ext/object/misc.rb
@@ -48,7 +48,7 @@ class Object
yield ActiveSupport::OptionMerger.new(self, options)
end
- # A duck-type assistant method. For example, ActiveSupport extends Date
+ # A duck-type assistant method. For example, Active Support extends Date
# to define an acts_like_date? method, and extends Time to define
# acts_like_time?. As a result, we can do "x.acts_like?(:time)" and
# "x.acts_like?(:date)" to do duck-type-safe comparisons, since classes that
diff --git a/activesupport/lib/active_support/core_ext/string/inflections.rb b/activesupport/lib/active_support/core_ext/string/inflections.rb
index a009d7c085..3bbad7dad8 100644
--- a/activesupport/lib/active_support/core_ext/string/inflections.rb
+++ b/activesupport/lib/active_support/core_ext/string/inflections.rb
@@ -24,8 +24,8 @@ module ActiveSupport #:nodoc:
#
# "posts".singularize # => "post"
# "octopi".singularize # => "octopus"
- # "sheep".singluarize # => "sheep"
- # "word".singluarize # => "word"
+ # "sheep".singularize # => "sheep"
+ # "word".singularize # => "word"
# "the blue mailmen".singularize # => "the blue mailman"
# "CamelOctopi".singularize # => "CamelOctopus"
def singularize
diff --git a/activesupport/lib/active_support/core_ext/string/unicode.rb b/activesupport/lib/active_support/core_ext/string/unicode.rb
index ba16d4d866..5e20534d1d 100644
--- a/activesupport/lib/active_support/core_ext/string/unicode.rb
+++ b/activesupport/lib/active_support/core_ext/string/unicode.rb
@@ -17,17 +17,17 @@ module ActiveSupport #:nodoc:
# string overrides can also be called through the +chars+ proxy.
#
# name = 'Claus Müller'
- # name.reverse #=> "rell??M sualC"
- # name.length #=> 13
+ # name.reverse # => "rell??M sualC"
+ # name.length # => 13
#
- # name.chars.reverse.to_s #=> "rellüM sualC"
- # name.chars.length #=> 12
+ # name.chars.reverse.to_s # => "rellüM sualC"
+ # name.chars.length # => 12
#
#
# All the methods on the chars proxy which normally return a string will return a Chars object. This allows
# method chaining on the result of any of these methods.
#
- # name.chars.reverse.length #=> 12
+ # name.chars.reverse.length # => 12
#
# The Char object tries to be as interchangeable with String objects as possible: sorting and comparing between
# String and Char work like expected. The bang! methods change the internal string representation in the Chars
diff --git a/activesupport/lib/active_support/core_ext/time/calculations.rb b/activesupport/lib/active_support/core_ext/time/calculations.rb
index 2cce782676..cd234c9b89 100644
--- a/activesupport/lib/active_support/core_ext/time/calculations.rb
+++ b/activesupport/lib/active_support/core_ext/time/calculations.rb
@@ -261,7 +261,7 @@ module ActiveSupport #:nodoc:
# Layers additional behavior on Time#<=> so that DateTime and ActiveSupport::TimeWithZone instances
# can be chronologically compared with a Time
def compare_with_coercion(other)
- # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do <=> comparision
+ # if other is an ActiveSupport::TimeWithZone, coerce a Time instance from it so we can do <=> comparison
other = other.comparable_time if other.respond_to?(:comparable_time)
if other.acts_like?(:date)
# other is a Date/DateTime, so coerce self #to_datetime and hand off to DateTime#<=>
diff --git a/activesupport/lib/active_support/core_ext/time/conversions.rb b/activesupport/lib/active_support/core_ext/time/conversions.rb
index edca5b8a98..9054008309 100644
--- a/activesupport/lib/active_support/core_ext/time/conversions.rb
+++ b/activesupport/lib/active_support/core_ext/time/conversions.rb
@@ -59,7 +59,7 @@ module ActiveSupport #:nodoc:
# Converts a Time object to a Date, dropping hour, minute, and second precision.
#
# my_time = Time.now # => Mon Nov 12 22:59:51 -0500 2007
- # my_time.to_date #=> Mon, 12 Nov 2007
+ # my_time.to_date # => Mon, 12 Nov 2007
#
# your_time = Time.parse("1/13/2009 1:13:03 P.M.") # => Tue Jan 13 13:13:03 -0500 2009
# your_time.to_date # => Tue, 13 Jan 2009
diff --git a/activesupport/lib/active_support/core_ext/time/zones.rb b/activesupport/lib/active_support/core_ext/time/zones.rb
index 3ffc71407c..079ecdd48e 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,23 +9,36 @@ 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 <tt>Time.zone</tt> has not been set for the current request, returns the TimeZone specified in <tt>config.time_zone</tt>.
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 <tt>Time.zone</tt> 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)", <tt>-5.hours</tt>).
+ # * 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 <tt>Time.zone</tt> on a per request basis -- <tt>current_user.time_zone</tt>
+ # 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
- # Allows override of Time.zone locally inside supplied block; resets Time.zone to existing value when done
+ # Allows override of <tt>Time.zone</tt> locally inside supplied block; resets <tt>Time.zone</tt> to existing value when done.
def use_zone(time_zone)
old_zone, ::Time.zone = ::Time.zone, get_zone(time_zone)
yield
@@ -35,7 +46,7 @@ module ActiveSupport #:nodoc:
::Time.zone = old_zone
end
- # Returns Time.zone.now when config.time_zone is set, otherwise just returns Time.now.
+ # Returns <tt>Time.zone.now</tt> when <tt>config.time_zone</tt> is set, otherwise just returns <tt>Time.now</tt>.
def current
::Time.zone_default ? ::Time.zone.now : ::Time.now
end
@@ -54,16 +65,16 @@ module ActiveSupport #:nodoc:
end
end
- # Returns the simultaneous time in Time.zone.
+ # Returns the simultaneous time in <tt>Time.zone</tt>.
#
# Time.zone = 'Hawaii' # => 'Hawaii'
# Time.utc(2000).in_time_zone # => Fri, 31 Dec 1999 14:00:00 HST -10:00
#
- # This method is similar to Time#localtime, except that it uses Time.zone as the local zone
+ # This method is similar to Time#localtime, except that it uses <tt>Time.zone</tt> as the local zone
# instead of the operating system's time zone.
#
# You can also pass in a TimeZone instance or string that identifies a TimeZone as an argument,
- # and the conversion will be based on that zone instead of Time.zone.
+ # and the conversion will be based on that zone instead of <tt>Time.zone</tt>.
#
# Time.utc(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00
def in_time_zone(zone = ::Time.zone)
diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb
index eaba46dd9c..8f3aa4f848 100644
--- a/activesupport/lib/active_support/dependencies.rb
+++ b/activesupport/lib/active_support/dependencies.rb
@@ -82,9 +82,10 @@ module Dependencies #:nodoc:
# infinite loop with mutual dependencies.
loaded << expanded
- if load?
- log "loading #{file_name}"
- begin
+ begin
+ if load?
+ log "loading #{file_name}"
+
# Enable warnings iff this file has not been loaded before and
# warnings_on_first_load is set.
load_args = ["#{file_name}.rb"]
@@ -95,13 +96,13 @@ module Dependencies #:nodoc:
else
enable_warnings { result = load_file(*load_args) }
end
- rescue Exception
- loaded.delete expanded
- raise
+ else
+ log "requiring #{file_name}"
+ result = require file_name
end
- else
- log "requiring #{file_name}"
- result = require file_name
+ rescue Exception
+ loaded.delete expanded
+ raise
end
# Record history *after* loading so first load gets warnings.
@@ -128,7 +129,7 @@ module Dependencies #:nodoc:
if Module.method(:const_defined?).arity == 1
# Does this module define this constant?
- # Wrapper to accomodate changing Module#const_defined? in Ruby 1.9
+ # Wrapper to accommodate changing Module#const_defined? in Ruby 1.9
def uninherited_const_defined?(mod, const)
mod.const_defined?(const)
end
@@ -384,7 +385,7 @@ module Dependencies #:nodoc:
return new_constants
ensure
# Remove the stack frames that we added.
- if defined?(watch_frames) && ! watch_frames.empty?
+ if defined?(watch_frames) && ! watch_frames.blank?
frame_ids = watch_frames.collect(&:object_id)
constant_watch_stack.delete_if do |watch_frame|
frame_ids.include? watch_frame.object_id
diff --git a/activesupport/lib/active_support/deprecation.rb b/activesupport/lib/active_support/deprecation.rb
index 6aa379b550..758aef5445 100644
--- a/activesupport/lib/active_support/deprecation.rb
+++ b/activesupport/lib/active_support/deprecation.rb
@@ -144,8 +144,8 @@ module ActiveSupport
end
end
- # Stand-in for @request, @attributes, @params, etc which emits deprecation
- # warnings on any method call (except #inspect).
+ # Stand-in for <tt>@request</tt>, <tt>@attributes</tt>, <tt>@params</tt>, etc.
+ # which emits deprecation warnings on any method call (except +inspect+).
class DeprecatedInstanceVariableProxy #:nodoc:
silence_warnings do
instance_methods.each { |m| undef_method m unless m =~ /^__/ }
diff --git a/activesupport/lib/active_support/inflector.rb b/activesupport/lib/active_support/inflector.rb
index 0fd44324bb..d7f44cb2b9 100644
--- a/activesupport/lib/active_support/inflector.rb
+++ b/activesupport/lib/active_support/inflector.rb
@@ -109,13 +109,13 @@ module Inflector
# Returns the plural form of the word in the string.
#
- # Examples
- # "post".pluralize #=> "posts"
- # "octopus".pluralize #=> "octopi"
- # "sheep".pluralize #=> "sheep"
- # "words".pluralize #=> "words"
- # "the blue mailman".pluralize #=> "the blue mailmen"
- # "CamelOctopus".pluralize #=> "CamelOctopi"
+ # Examples:
+ # "post".pluralize # => "posts"
+ # "octopus".pluralize # => "octopi"
+ # "sheep".pluralize # => "sheep"
+ # "words".pluralize # => "words"
+ # "the blue mailman".pluralize # => "the blue mailmen"
+ # "CamelOctopus".pluralize # => "CamelOctopi"
def pluralize(word)
result = word.to_s.dup
@@ -127,15 +127,15 @@ module Inflector
end
end
- # The reverse of pluralize, returns the singular form of a word in a string.
+ # The reverse of +pluralize+, returns the singular form of a word in a string.
#
- # Examples
- # "posts".singularize #=> "post"
- # "octopi".singularize #=> "octopus"
- # "sheep".singluarize #=> "sheep"
- # "word".singluarize #=> "word"
- # "the blue mailmen".singularize #=> "the blue mailman"
- # "CamelOctopi".singularize #=> "CamelOctopus"
+ # Examples:
+ # "posts".singularize # => "post"
+ # "octopi".singularize # => "octopus"
+ # "sheep".singularize # => "sheep"
+ # "word".singularize # => "word"
+ # "the blue mailmen".singularize # => "the blue mailman"
+ # "CamelOctopi".singularize # => "CamelOctopus"
def singularize(word)
result = word.to_s.dup
@@ -147,16 +147,16 @@ module Inflector
end
end
- # By default, camelize converts strings to UpperCamelCase. If the argument to camelize
- # is set to ":lower" then camelize produces lowerCamelCase.
+ # By default, +camelize+ converts strings to UpperCamelCase. If the argument to +camelize+
+ # is set to <tt>:lower</tt> then +camelize+ produces lowerCamelCase.
#
- # camelize will also convert '/' to '::' which is useful for converting paths to namespaces
+ # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
#
- # Examples
- # "active_record".camelize #=> "ActiveRecord"
- # "active_record".camelize(:lower) #=> "activeRecord"
- # "active_record/errors".camelize #=> "ActiveRecord::Errors"
- # "active_record/errors".camelize(:lower) #=> "activeRecord::Errors"
+ # Examples:
+ # "active_record".camelize # => "ActiveRecord"
+ # "active_record".camelize(:lower) # => "activeRecord"
+ # "active_record/errors".camelize # => "ActiveRecord::Errors"
+ # "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
def camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
if first_letter_in_uppercase
lower_case_and_underscored_word.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
@@ -166,14 +166,14 @@ module Inflector
end
# Capitalizes all the words and replaces some characters in the string to create
- # a nicer looking title. Titleize is meant for creating pretty output. It is not
+ # a nicer looking title. +titleize+ is meant for creating pretty output. It is not
# used in the Rails internals.
#
- # titleize is also aliased as as titlecase
+ # +titleize+ is also aliased as as +titlecase+.
#
- # Examples
- # "man from the boondocks".titleize #=> "Man From The Boondocks"
- # "x-men: the last stand".titleize #=> "X Men: The Last Stand"
+ # Examples:
+ # "man from the boondocks".titleize # => "Man From The Boondocks"
+ # "x-men: the last stand".titleize # => "X Men: The Last Stand"
def titleize(word)
humanize(underscore(word)).gsub(/\b('?[a-z])/) { $1.capitalize }
end
@@ -182,9 +182,9 @@ module Inflector
#
# Changes '::' to '/' to convert namespaces to paths.
#
- # Examples
- # "ActiveRecord".underscore #=> "active_record"
- # "ActiveRecord::Errors".underscore #=> active_record/errors
+ # Examples:
+ # "ActiveRecord".underscore # => "active_record"
+ # "ActiveRecord::Errors".underscore # => active_record/errors
def underscore(camel_cased_word)
camel_cased_word.to_s.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
@@ -195,52 +195,52 @@ module Inflector
# Replaces underscores with dashes in the string.
#
- # Example
- # "puni_puni" #=> "puni-puni"
+ # Example:
+ # "puni_puni" # => "puni-puni"
def dasherize(underscored_word)
underscored_word.gsub(/_/, '-')
end
- # Capitalizes the first word and turns underscores into spaces and strips _id.
- # Like titleize, this is meant for creating pretty output.
+ # Capitalizes the first word and turns underscores into spaces and strips a
+ # trailing "_id", if any. Like +titleize+, this is meant for creating pretty output.
#
- # Examples
- # "employee_salary" #=> "Employee salary"
- # "author_id" #=> "Author"
+ # Examples:
+ # "employee_salary" # => "Employee salary"
+ # "author_id" # => "Author"
def humanize(lower_case_and_underscored_word)
lower_case_and_underscored_word.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
end
- # Removes the module part from the expression in the string
+ # Removes the module part from the expression in the string.
#
- # Examples
- # "ActiveRecord::CoreExtensions::String::Inflections".demodulize #=> "Inflections"
- # "Inflections".demodulize #=> "Inflections"
+ # Examples:
+ # "ActiveRecord::CoreExtensions::String::Inflections".demodulize # => "Inflections"
+ # "Inflections".demodulize # => "Inflections"
def demodulize(class_name_in_module)
class_name_in_module.to_s.gsub(/^.*::/, '')
end
# Create the name of a table like Rails does for models to table names. This method
- # uses the pluralize method on the last word in the string.
+ # uses the +pluralize+ method on the last word in the string.
#
# Examples
- # "RawScaledScorer".tableize #=> "raw_scaled_scorers"
- # "egg_and_ham".tableize #=> "egg_and_hams"
- # "fancyCategory".tableize #=> "fancy_categories"
+ # "RawScaledScorer".tableize # => "raw_scaled_scorers"
+ # "egg_and_ham".tableize # => "egg_and_hams"
+ # "fancyCategory".tableize # => "fancy_categories"
def tableize(class_name)
pluralize(underscore(class_name))
end
# Create a class name from a plural table name like Rails does for table names to models.
# Note that this returns a string and not a Class. (To convert to an actual class
- # follow classify with constantize.)
+ # follow +classify+ with +constantize+.)
#
- # Examples
- # "egg_and_hams".classify #=> "EggAndHam"
- # "posts".classify #=> "Post"
+ # Examples:
+ # "egg_and_hams".classify # => "EggAndHam"
+ # "posts".classify # => "Post"
#
- # Singular names are not handled correctly
- # "business".classify #=> "Busines"
+ # Singular names are not handled correctly:
+ # "business".classify # => "Busines"
def classify(table_name)
# strip out any leading schema name
camelize(singularize(table_name.to_s.sub(/.*\./, '')))
@@ -250,10 +250,10 @@ module Inflector
# +separate_class_name_and_id_with_underscore+ sets whether
# the method should put '_' between the name and 'id'.
#
- # Examples
- # "Message".foreign_key #=> "message_id"
- # "Message".foreign_key(false) #=> "messageid"
- # "Admin::Post".foreign_key #=> "post_id"
+ # Examples:
+ # "Message".foreign_key # => "message_id"
+ # "Message".foreign_key(false) # => "messageid"
+ # "Admin::Post".foreign_key # => "post_id"
def foreign_key(class_name, separate_class_name_and_id_with_underscore = true)
underscore(demodulize(class_name)) + (separate_class_name_and_id_with_underscore ? "_id" : "id")
end
@@ -283,10 +283,10 @@ module Inflector
Object.module_eval("::#{$1}", __FILE__, __LINE__)
end
- # Ordinalize turns a number into an ordinal string used to denote the
- # position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
+ # Turns a number into an ordinal string used to denote the position in an
+ # ordered sequence such as 1st, 2nd, 3rd, 4th.
#
- # Examples
+ # Examples:
# ordinalize(1) # => "1st"
# ordinalize(2) # => "2nd"
# ordinalize(1002) # => "1002nd"
diff --git a/activesupport/lib/active_support/json.rb b/activesupport/lib/active_support/json.rb
index bbda2c9fa3..2bdb4a7b11 100644
--- a/activesupport/lib/active_support/json.rb
+++ b/activesupport/lib/active_support/json.rb
@@ -1,5 +1,5 @@
module ActiveSupport
- # If true, use ISO 8601 format for dates and times. Otherwise, fall back to the ActiveSupport legacy format.
+ # If true, use ISO 8601 format for dates and times. Otherwise, fall back to the Active Support legacy format.
mattr_accessor :use_standard_json_time_format
class << self
diff --git a/activesupport/lib/active_support/json/decoding.rb b/activesupport/lib/active_support/json/decoding.rb
index c58001f49f..fdb219dbf7 100644
--- a/activesupport/lib/active_support/json/decoding.rb
+++ b/activesupport/lib/active_support/json/decoding.rb
@@ -31,7 +31,7 @@ module ActiveSupport
if json[pos..scanner.pos-2] =~ DATE_REGEX
# found a date, track the exact positions of the quotes so we can remove them later.
# oh, and increment them for each current mark, each one is an extra padded space that bumps
- # the position in the final yaml output
+ # the position in the final YAML output
total_marks = marks.size
times << pos+total_marks << scanner.pos+total_marks
end
diff --git a/activesupport/lib/active_support/json/encoders/date.rb b/activesupport/lib/active_support/json/encoders/date.rb
index cb9419d29d..1fc99c466f 100644
--- a/activesupport/lib/active_support/json/encoders/date.rb
+++ b/activesupport/lib/active_support/json/encoders/date.rb
@@ -1,7 +1,14 @@
class Date
- # Returns a JSON string representing the date.
+ # Returns a JSON string representing the date. If ActiveSupport.use_standard_json_time_format is set to true, the
+ # ISO 8601 format is used.
#
- # ==== Example:
+ # ==== Examples:
+ #
+ # # With ActiveSupport.use_standard_json_time_format = true
+ # Date.new(2005,2,1).to_json
+ # # => "2005-02-01"
+ #
+ # # With ActiveSupport.use_standard_json_time_format = false
# Date.new(2005,2,1).to_json
# # => "2005/02/01"
def to_json(options = nil)
diff --git a/activesupport/lib/active_support/json/encoders/date_time.rb b/activesupport/lib/active_support/json/encoders/date_time.rb
index d41c3e9786..cd96cda1f7 100644
--- a/activesupport/lib/active_support/json/encoders/date_time.rb
+++ b/activesupport/lib/active_support/json/encoders/date_time.rb
@@ -1,7 +1,14 @@
class DateTime
- # Returns a JSON string representing the datetime.
+ # Returns a JSON string representing the datetime. If ActiveSupport.use_standard_json_time_format is set to true, the
+ # ISO 8601 format is used.
#
- # ==== Example:
+ # ==== Examples:
+ #
+ # # With ActiveSupport.use_standard_json_time_format = true
+ # DateTime.civil(2005,2,1,15,15,10).to_json
+ # # => "2005-02-01T15:15:10+00:00"
+ #
+ # # With ActiveSupport.use_standard_json_time_format = false
# DateTime.civil(2005,2,1,15,15,10).to_json
# # => "2005/02/01 15:15:10 +0000"
def to_json(options = nil)
diff --git a/activesupport/lib/active_support/json/encoders/time.rb b/activesupport/lib/active_support/json/encoders/time.rb
index 3660d87c82..09fc614889 100644
--- a/activesupport/lib/active_support/json/encoders/time.rb
+++ b/activesupport/lib/active_support/json/encoders/time.rb
@@ -1,12 +1,19 @@
class Time
- # Returns a JSON string representing the time.
+ # Returns a JSON string representing the time. If ActiveSupport.use_standard_json_time_format is set to true, the
+ # ISO 8601 format is used.
#
- # ==== Example:
+ # ==== Examples:
+ #
+ # # With ActiveSupport.use_standard_json_time_format = true
+ # Time.utc(2005,2,1,15,15,10).to_json
+ # # => "2005-02-01T15:15:10Z"
+ #
+ # # With ActiveSupport.use_standard_json_time_format = false
# Time.utc(2005,2,1,15,15,10).to_json
- # # => 2005/02/01 15:15:10 +0000"
+ # # => "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/multibyte/chars.rb b/activesupport/lib/active_support/multibyte/chars.rb
index 65114415eb..185d03020c 100644
--- a/activesupport/lib/active_support/multibyte/chars.rb
+++ b/activesupport/lib/active_support/multibyte/chars.rb
@@ -10,7 +10,7 @@ module ActiveSupport::Multibyte #:nodoc:
# String methods are proxied through the Chars object, and can be accessed through the +chars+ method. Methods
# which would normally return a String object now return a Chars object so methods can be chained.
#
- # "The Perfect String ".chars.downcase.strip.normalize #=> "the perfect string"
+ # "The Perfect String ".chars.downcase.strip.normalize # => "the perfect string"
#
# Chars objects are perfectly interchangeable with String objects as long as no explicit class checks are made.
# If certain methods do explicitly check the class, call +to_s+ before you pass chars objects to them.
@@ -40,13 +40,15 @@ module ActiveSupport::Multibyte #:nodoc:
# core dumps. Don't go there.
@string
end
-
+
# Make duck-typing with String possible
- def respond_to?(method)
- super || @string.respond_to?(method) || handler.respond_to?(method) ||
- (method.to_s =~ /(.*)!/ && handler.respond_to?($1)) || false
+ def respond_to?(method, include_priv = false)
+ super || @string.respond_to?(method, include_priv) ||
+ handler.respond_to?(method, include_priv) ||
+ (method.to_s =~ /(.*)!/ && handler.respond_to?($1, include_priv)) ||
+ false
end
-
+
# Create a new Chars instance.
def initialize(str)
@string = str.respond_to?(:string) ? str.string : str
diff --git a/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb b/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
index 0166b69ac3..aa9c16f575 100644
--- a/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
+++ b/activesupport/lib/active_support/multibyte/handlers/utf8_handler.rb
@@ -147,13 +147,11 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
#
# s = "Müller"
# s.chars[2] = "e" # Replace character with offset 2
- # s
- # #=> "Müeler"
+ # s # => "Müeler"
#
# s = "Müller"
# s.chars[1, 2] = "ö" # Replace 2 characters at character offset 1
- # s
- # #=> "Möler"
+ # s # => "Möler"
def []=(str, *args)
replace_by = args.pop
# Indexed replace with regular expressions already works
@@ -183,10 +181,10 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
# Example:
#
# "¾ cup".chars.rjust(8).to_s
- # #=> " ¾ cup"
+ # # => " ¾ cup"
#
# "¾ cup".chars.rjust(8, " ").to_s # Use non-breaking whitespace
- # #=> "   ¾ cup"
+ # # => "   ¾ cup"
def rjust(str, integer, padstr=' ')
justify(str, integer, :right, padstr)
end
@@ -196,10 +194,10 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
# Example:
#
# "¾ cup".chars.rjust(8).to_s
- # #=> "¾ cup "
+ # # => "¾ cup "
#
# "¾ cup".chars.rjust(8, " ").to_s # Use non-breaking whitespace
- # #=> "¾ cup   "
+ # # => "¾ cup   "
def ljust(str, integer, padstr=' ')
justify(str, integer, :left, padstr)
end
@@ -209,10 +207,10 @@ module ActiveSupport::Multibyte::Handlers #:nodoc:
# Example:
#
# "¾ cup".chars.center(8).to_s
- # #=> " ¾ cup "
+ # # => " ¾ cup "
#
# "¾ cup".chars.center(8, " ").to_s # Use non-breaking whitespace
- # #=> " ¾ cup  "
+ # # => " ¾ cup  "
def center(str, integer, padstr=' ')
justify(str, integer, :center, padstr)
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 48606dbcff..4218ed5928 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 <tt>ENV['TZ']</tt> zone.
+ #
+ # You shouldn't ever need to create a TimeWithZone instance directly via <tt>new</tt> -- 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
@@ -11,12 +38,12 @@ module ActiveSupport
@period = @utc ? period : get_period_and_ensure_valid_local_time
end
- # Returns a Time or DateTime instance that represents the time in time_zone
+ # Returns a Time or DateTime instance that represents the time in +time_zone+.
def time
@time ||= period.to_local(@utc)
end
- # Returns a Time or DateTime instance that represents the time in UTC
+ # Returns a Time or DateTime instance that represents the time in UTC.
def utc
@utc ||= period.to_utc(@time)
end
@@ -25,18 +52,18 @@ module ActiveSupport
alias_method :getutc, :utc
alias_method :gmtime, :utc
- # Returns the underlying TZInfo::TimezonePeriod
+ # Returns the underlying TZInfo::TimezonePeriod.
def period
@period ||= time_zone.period_for_utc(@utc)
end
- # Returns the simultaneous time in Time.zone, or the specified zone
+ # Returns the simultaneous time in <tt>Time.zone</tt>, or the specified zone.
def in_time_zone(new_zone = ::Time.zone)
return self if time_zone == new_zone
utc.in_time_zone(new_zone)
end
- # Returns a Time.local() instance of the simultaneous time in your system's ENV['TZ'] zone
+ # Returns a <tt>Time.local()</tt> instance of the simultaneous time in your system's <tt>ENV['TZ']</tt> zone
def localtime
utc.getlocal
end
@@ -62,7 +89,7 @@ module ActiveSupport
utc? && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
end
- # Time uses #zone to display the time zone abbreviation, so we're duck-typing it
+ # Time uses +zone+ to display the time zone abbreviation, so we're duck-typing it.
def zone
period.zone_identifier.to_s
end
@@ -75,7 +102,19 @@ module ActiveSupport
"#{time.strftime("%Y-%m-%dT%H:%M:%S")}#{formatted_offset(true, 'Z')}"
end
alias_method :iso8601, :xmlschema
-
+
+ # Returns a JSON string representing the TimeWithZone. If ActiveSupport.use_standard_json_time_format is set to
+ # true, the ISO 8601 format is used.
+ #
+ # ==== Examples:
+ #
+ # # With ActiveSupport.use_standard_json_time_format = true
+ # Time.utc(2005,2,1,15,15,10).in_time_zone.to_json
+ # # => "2005-02-01T15:15:10Z"
+ #
+ # # With ActiveSupport.use_standard_json_time_format = false
+ # Time.utc(2005,2,1,15,15,10).in_time_zone.to_json
+ # # => "2005/02/01 15:15:10 +0000"
def to_json(options = nil)
if ActiveSupport.use_standard_json_time_format
xmlschema.inspect
@@ -119,7 +158,7 @@ module ActiveSupport
time.strftime(format)
end
- # Use the time in UTC for comparisons
+ # Use the time in UTC for comparisons.
def <=>(other)
utc <=> other
end
@@ -132,10 +171,10 @@ module ActiveSupport
utc == other
end
- # If wrapped #time is a DateTime, use DateTime#since instead of #+
- # Otherwise, just pass on to #method_missing
+ # 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 +185,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
@@ -198,18 +237,18 @@ module ActiveSupport
utc.to_datetime.new_offset(Rational(utc_offset, 86_400))
end
- # so that self acts_like?(:time)
+ # So that +self+ <tt>acts_like?(:time)</tt>.
def acts_like_time?
true
end
- # Say we're a Time to thwart type checking
+ # Say we're a Time to thwart type checking.
def is_a?(klass)
klass == ::Time || super
end
alias_method :kind_of?, :is_a?
- # Neuter freeze because freezing can cause problems with lazy loading of attributes
+ # Neuter freeze because freezing can cause problems with lazy loading of attributes.
def freeze
self
end
@@ -221,15 +260,15 @@ module ActiveSupport
def marshal_load(variables)
initialize(variables[0], ::Time.send!(:get_zone, variables[1]), variables[2])
end
-
- # Ensure proxy class responds to all methods that underlying time instance responds to
- def respond_to?(sym)
+
+ # Ensure proxy class responds to all methods that underlying time instance responds to.
+ def respond_to?(sym, include_priv = false)
# consistently respond false to acts_like?(:date), regardless of whether #time is a Time or DateTime
return false if sym.to_s == 'acts_like_date?'
- super || time.respond_to?(sym)
+ super || time.respond_to?(sym, include_priv)
end
-
- # Send the missing method to time instance, and wrap result in a new TimeWithZone with the existing time_zone
+
+ # Send the missing method to +time+ instance, and wrap result in a new TimeWithZone with the existing +time_zone+.
def method_missing(sym, *args, &block)
result = time.__send__(sym, *args, &block)
result.acts_like?(:time) ? self.class.new(nil, time_zone, result) : result
diff --git a/activesupport/lib/active_support/values/time_zone.rb b/activesupport/lib/active_support/values/time_zone.rb
index f522b64108..64d734f039 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's +local+, +parse+, +at+ and +now+ methods.
+#
+# If you set <tt>config.time_zone</tt> in the Rails Initializer, you can access this TimeZone object via <tt>Time.zone</tt>:
+#
+# # 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 Active Support 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
@@ -171,7 +192,7 @@ class TimeZone
utc_offset == 0 && alternate_utc_string || utc_offset.to_utc_offset_s(colon)
end
- # Compare this time zone to the parameter. The two are comapred first on
+ # Compare this time zone to the parameter. The two are compared first on
# their offsets, and then by name.
def <=>(zone)
result = (utc_offset <=> zone.utc_offset)
@@ -181,7 +202,7 @@ class TimeZone
# Returns a textual representation of this time zone.
def to_s
- "(UTC#{formatted_offset}) #{name}"
+ "(GMT#{formatted_offset}) #{name}"
end
# Method for creating new ActiveSupport::TimeWithZone instance in time zone of +self+ from given values. Example:
@@ -335,7 +356,7 @@ class TimeZone
# Return a TimeZone instance with the given name, or +nil+ if no
# such TimeZone instance exists. (This exists to support the use of
- # this class with the #composed_of macro.)
+ # this class with the +composed_of+ macro.)
def new(name)
self[name]
end
diff --git a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb b/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb
index 91fcd21e13..b373e4da3c 100644
--- a/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb
+++ b/activesupport/lib/active_support/vendor/builder-2.1.2/builder/xmlevents.rb
@@ -20,7 +20,7 @@ module Builder
# markup.
#
# Usage:
- # xe = Builder::XmlEvents.new(hander)
+ # xe = Builder::XmlEvents.new(handler)
# xe.title("HI") # Sends start_tag/end_tag/text messages to the handler.
#
# Indentation may also be selected by providing value for the
diff --git a/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb b/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb
index dda7f2c30e..30113201a6 100644
--- a/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb
+++ b/activesupport/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb
@@ -119,7 +119,7 @@ class MemCache
# Valid options for +opts+ are:
#
# [:namespace] Prepends this value to all keys added or retrieved.
- # [:readonly] Raises an exeception on cache writes when true.
+ # [:readonly] Raises an exception on cache writes when true.
# [:multithread] Wraps cache access in a Mutex for thread safety.
#
# Other options are ignored.
@@ -207,7 +207,7 @@ class MemCache
end
##
- # Deceremets the value for +key+ by +amount+ and returns the new value.
+ # Decrements the value for +key+ by +amount+ and returns the new value.
# +key+ must already exist. If +key+ is not an integer, it is assumed to be
# 0. +key+ can not be decremented below 0.
diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb
index 5eccbdf0db..2510e90b5b 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone.rb
@@ -38,7 +38,7 @@ module TZInfo
# Returns the set of TimezonePeriod instances that are valid for the given
# local time as an array. If you just want a single period, use
- # period_for_local instead and specify how abiguities should be resolved.
+ # period_for_local instead and specify how ambiguities should be resolved.
# Raises PeriodNotFound if no periods are found for the given time.
def periods_for_local(local)
info.periods_for_local(local)
diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb
index f34fabc36a..d2a6620dd2 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/data_timezone_info.rb
@@ -64,7 +64,7 @@ module TZInfo
# ArgumentError will be raised if a transition is added out of order.
# offset_id refers to an id defined with offset. ArgumentError will be
# raised if the offset_id cannot be found. numerator_or_time and
- # denomiator specify the time the transition occurs as. See
+ # denominator specify the time the transition occurs as. See
# TimezoneTransitionInfo for more detail about specifying times.
def transition(year, month, offset_id, numerator_or_time, denominator = nil)
offset = @offsets[offset_id]
diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb
index f8ec4fca87..c757485b84 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/linked_timezone.rb
@@ -36,7 +36,7 @@ module TZInfo
# Returns the set of TimezonePeriod instances that are valid for the given
# local time as an array. If you just want a single period, use
- # period_for_local instead and specify how abiguities should be resolved.
+ # period_for_local instead and specify how ambiguities should be resolved.
# Raises PeriodNotFound if no periods are found for the given time.
def periods_for_local(local)
@linked_timezone.periods_for_local(local)
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/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb
index 04f2f2f0a5..910eefca02 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone.rb
@@ -121,7 +121,7 @@ module TZInfo
TimezoneProxy.new(identifier)
end
- # If identifier is nil calls super(), otherwise calls get. An identfier
+ # If identifier is nil calls super(), otherwise calls get. An identifier
# should always be passed in when called externally.
def self.new(identifier = nil)
if identifier
diff --git a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb
index 6ae1b7df97..146c131708 100644
--- a/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb
+++ b/activesupport/lib/active_support/vendor/tzinfo-0.3.8/tzinfo/timezone_transition_info.rb
@@ -37,7 +37,7 @@ module TZInfo
attr_reader :numerator_or_time
protected :numerator_or_time
- # Either the denominotor of the DateTime if the transition time is defined
+ # Either the denominator of the DateTime if the transition time is defined
# as a DateTime, otherwise nil.
attr_reader :denominator
protected :denominator
diff --git a/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb b/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb
index 0de24c0eff..ec6dab513f 100644
--- a/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb
+++ b/activesupport/lib/active_support/vendor/xml-simple-1.0.11/xmlsimple.rb
@@ -121,7 +121,7 @@ class XmlSimple
# Create a "global" cache.
@@cache = Cache.new
- # Creates and intializes a new XmlSimple object.
+ # Creates and initializes a new XmlSimple object.
#
# defaults::
# Default values for options.
@@ -497,7 +497,7 @@ class XmlSimple
}
end
- # Fold Hases containing a single anonymous Array up into just the Array.
+ # Fold Hashes containing a single anonymous Array up into just the Array.
if count == 1
anonymoustag = @options['anonymoustag']
if result.has_key?(anonymoustag) && result[anonymoustag].instance_of?(Array)
@@ -907,7 +907,7 @@ class XmlSimple
# Thanks to Norbert Gawor for a bugfix.
#
# value::
- # Value to be checked for emptyness.
+ # Value to be checked for emptiness.
def empty(value)
case value
when Hash
diff --git a/activesupport/lib/active_support/version.rb b/activesupport/lib/active_support/version.rb
index f3d141cf72..b346459a9b 100644
--- a/activesupport/lib/active_support/version.rb
+++ b/activesupport/lib/active_support/version.rb
@@ -1,8 +1,8 @@
module ActiveSupport
module VERSION #:nodoc:
MAJOR = 2
- MINOR = 0
- TINY = 991
+ MINOR = 1
+ TINY = 0
STRING = [MAJOR, MINOR, TINY].join('.')
end
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/dependencies_test.rb b/activesupport/test/dependencies_test.rb
index 9e98e764fd..0309ab6858 100644
--- a/activesupport/test/dependencies_test.rb
+++ b/activesupport/test/dependencies_test.rb
@@ -584,6 +584,12 @@ class DependenciesTest < Test::Unit::TestCase
assert_equal [], m
end
+ def test_new_constants_in_with_illegal_module_name_raises_correct_error
+ assert_raises(NameError) do
+ Dependencies.new_constants_in("Illegal-Name") {}
+ end
+ end
+
def test_file_with_multiple_constants_and_require_dependency
with_loading 'autoloading_fixtures' do
assert ! defined?(MultipleConstantFile)
@@ -667,7 +673,7 @@ class DependenciesTest < Test::Unit::TestCase
assert !defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
end
end
-
+
ensure
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
end
@@ -680,11 +686,20 @@ class DependenciesTest < Test::Unit::TestCase
assert !defined?(::RaisesNoMethodError), "::RaisesNoMethodError is defined but it should have failed!"
end
end
-
+
ensure
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
end
+ def test_autoload_doesnt_shadow_error_when_mechanism_not_set_to_load
+ with_loading 'autoloading_fixtures' do
+ Dependencies.mechanism = :require
+ 2.times do
+ assert_raise(NameError) {"RaisesNameError".constantize}
+ end
+ end
+ end
+
def test_autoload_doesnt_shadow_name_error
with_loading 'autoloading_fixtures' do
assert !defined?(::RaisesNameError), "::RaisesNameError is defined but it hasn't been referenced yet!"
@@ -708,7 +723,7 @@ class DependenciesTest < Test::Unit::TestCase
ensure
Object.class_eval { remove_const :RaisesNoMethodError if const_defined?(:RaisesNoMethodError) }
end
-
+
def test_remove_constant_handles_double_colon_at_start
Object.const_set 'DeleteMe', Module.new
DeleteMe.const_set 'OrMe', Module.new
@@ -718,7 +733,7 @@ class DependenciesTest < Test::Unit::TestCase
Dependencies.remove_constant "::DeleteMe"
assert ! defined?(DeleteMe)
end
-
+
def test_load_once_constants_should_not_be_unloaded
with_loading 'autoloading_fixtures' do
Dependencies.load_once_paths = Dependencies.load_paths
@@ -731,7 +746,7 @@ class DependenciesTest < Test::Unit::TestCase
Dependencies.load_once_paths = []
Object.class_eval { remove_const :A if const_defined?(:A) }
end
-
+
def test_load_once_paths_should_behave_when_recursively_loading
with_loading 'dependencies', 'autoloading_fixtures' do
Dependencies.load_once_paths = [Dependencies.load_paths.last]
@@ -747,5 +762,4 @@ class DependenciesTest < Test::Unit::TestCase
ensure
Dependencies.load_once_paths = []
end
-
end
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
diff --git a/activesupport/test/time_zone_test.rb b/activesupport/test/time_zone_test.rb
index 3757ddcedb..f3069b589b 100644
--- a/activesupport/test/time_zone_test.rb
+++ b/activesupport/test/time_zone_test.rb
@@ -252,7 +252,7 @@ class TimeZoneTest < Test::Unit::TestCase
end
def test_to_s
- assert_equal "(UTC+03:00) Moscow", TimeZone['Moscow'].to_s
+ assert_equal "(GMT+03:00) Moscow", TimeZone['Moscow'].to_s
end
def test_all_sorted