From 9c4a4822296e43b3722f203418a005b7651a1e94 Mon Sep 17 00:00:00 2001 From: akr Date: Sat, 24 Aug 2002 05:18:08 +0000 Subject: [PATCH] * lib/time.rb (Time.rfc2822, Time#rfc2822): preserve localtimeness. * lib/pp.rb: pretty_print_cycled is renamed to pretty_print_cycle. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2742 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/pp.rb | 18 +++++++++--------- lib/time.rb | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index cbd89e6d6f..203d126631 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sat Aug 24 13:57:28 2002 Tanaka Akira + + * lib/time.rb (Time.rfc2822, Time#rfc2822): preserve localtimeness. + + * lib/pp.rb: pretty_print_cycled is renamed to pretty_print_cycle. + Fri Aug 23 23:59:57 2002 Nobuyoshi Nakada * eval.c (method_call): check receiver is defined. diff --git a/lib/pp.rb b/lib/pp.rb index 46e066a078..81b06df003 100644 --- a/lib/pp.rb +++ b/lib/pp.rb @@ -83,9 +83,9 @@ PP#pp to print the object. == methods --- pp(obj) adds ((|obj|)) to the pretty printing buffer - using Object#pretty_print or Object#pretty_print_cycled. + using Object#pretty_print or Object#pretty_print_cycle. - Object#pretty_print_cycled is used when ((|obj|)) is already + Object#pretty_print_cycle is used when ((|obj|)) is already printed, a.k.a the object reference chain has a cycle. --- object_group(obj) { ... } @@ -111,7 +111,7 @@ PP#pp to print the object. This module provides predefined pretty_print() methods for some of the most commonly used built-in classes for convenience. ---- pretty_print_cycled(pp) +--- pretty_print_cycle(pp) is a default pretty printing method for general objects that are detected as part of a cycle. @@ -179,7 +179,7 @@ class PP < PrettyPrint id = obj.__id__ if Thread.current[InspectKey].include? id - group {obj.pretty_print_cycled self} + group {obj.pretty_print_cycle self} return end @@ -273,7 +273,7 @@ class PP < PrettyPrint end end - def pretty_print_cycled(pp) + def pretty_print_cycle(pp) pp.object_address_group(self) { pp.breakable pp.text '...' @@ -304,7 +304,7 @@ class Array } end - def pretty_print_cycled(pp) + def pretty_print_cycle(pp) pp.text(empty? ? '[]' : '[...]') end end @@ -314,7 +314,7 @@ class Hash pp.pp_hash self end - def pretty_print_cycled(pp) + def pretty_print_cycle(pp) pp.text(empty? ? '{}' : '{...}') end end @@ -341,7 +341,7 @@ class Struct } end - def pretty_print_cycled(pp) + def pretty_print_cycle(pp) pp.text sprintf("#<%s:...>", self.class.name) end end @@ -440,7 +440,7 @@ end [Numeric, Symbol, FalseClass, TrueClass, NilClass, Module].each {|c| c.class_eval { - alias :pretty_print_cycled :pretty_print + alias :pretty_print_cycle :pretty_print } } diff --git a/lib/time.rb b/lib/time.rb index 093d8f4a8b..bc1147104b 100644 --- a/lib/time.rb +++ b/lib/time.rb @@ -212,7 +212,10 @@ class Time year end - Time.utc(year, mon, day, hour, min, sec) - zone_offset(zone) + t = Time.utc(year, mon, day, hour, min, sec) + offset = zone_offset(zone) + t = (t - offset).localtime if offset != 0 || zone == '+0000' + t else raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}") end @@ -303,7 +306,7 @@ class Time where zone is [+-]hhmm. - If self is a UTC time, +0000 is used as zone. + If self is a UTC time, -0000 is used as zone. =end RFC2822_DAY_NAME = [ @@ -319,7 +322,7 @@ class Time day, RFC2822_MONTH_NAME[mon-1], year, hour, min, sec) + if utc? - '+0000' + '-0000' else off = utc_offset sign = off < 0 ? '-' : '+' @@ -447,6 +450,32 @@ if __FILE__ == $0 Time.httpdate("Fri, 31 Dec 1999 23:59:59 GMT")) end + def test_rfc3339 + t = Time.utc(1985, 4, 12, 23, 20, 50, 520000) + s = "1985-04-12T23:20:50.52Z" + assert_equal(t, Time.iso8601(s)) + assert_equal(s, t.iso8601(2)) + + t = Time.utc(1996, 12, 20, 0, 39, 57) + s = "1996-12-19T16:39:57-08:00" + assert_equal(t, Time.iso8601(s)) + # There is no way to generate time string with arbitrary timezone. + s = "1996-12-20T00:39:57Z" + assert_equal(t, Time.iso8601(s)) + assert_equal(s, t.iso8601) + + t = Time.utc(1990, 12, 31, 23, 59, 60) + s = "1990-12-31T23:59:60Z" + assert_equal(t, Time.iso8601(s)) + # leap second is representable only if timezone file has it. + s = "1990-12-31T15:59:60-08:00" + assert_equal(t, Time.iso8601(s)) + + t = Time.utc(1937, 1, 1, 11, 40, 27, 870000) + s = "1937-01-01T12:00:27.87+00:20" + assert_equal(t, Time.iso8601(s)) + end + # http://www.w3.org/TR/xmlschema-2/ def test_xmlschema assert_equal(Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600,