[前][次][番号順一覧][スレッド一覧]

ruby-changes:19308

From: tadf <ko1@a...>
Date: Tue, 26 Apr 2011 22:37:42 +0900 (JST)
Subject: [ruby-changes:19308] Ruby:r31348 (trunk): * ext/date/lib/date/format.rb (_iso8601): allowed day only civil

tadf	2011-04-26 22:36:49 +0900 (Tue, 26 Apr 2011)

  New Revision: 31348

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=31348

  Log:
    * ext/date/lib/date/format.rb (_iso8601): allowed day only civil
      date.  disallowed separatorless day only ordinal date.

  Modified files:
    trunk/ChangeLog
    trunk/ext/date/lib/date/format.rb
    trunk/test/date/test_date_parse.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 31347)
+++ ChangeLog	(revision 31348)
@@ -1,3 +1,8 @@
+Tue Apr 26 22:34:04 2011  Tadayoshi Funaba  <tadf@d...>
+
+	* ext/date/lib/date/format.rb (_iso8601): allowed day only civil
+	  date.  disallowed separatorless day only ordinal date.
+
 Mon Apr 25 21:31:36 2011  Nobuhiro Iwamatsu  <iwamatsu@n...>
 
 	* ext/openssl/extconf.rb: Should check SSLv2_*method.
Index: ext/date/lib/date/format.rb
===================================================================
--- ext/date/lib/date/format.rb	(revision 31347)
+++ ext/date/lib/date/format.rb	(revision 31348)
@@ -145,7 +145,7 @@
   end
 
   def self._iso8601(str) # :nodoc:
-    if /\A\s*(?:([-+]?\d{2,}|-)-(\d{2})-(\d{2})|
+    if /\A\s*(?:([-+]?\d{2,}|-)-(\d{2})?-(\d{2})|
 		([-+]?\d{2,})?-(\d{3})|
 		(\d{4}|\d{2})?-w(\d{2})-(\d)|
 		-w-(\d))
@@ -154,7 +154,6 @@
 	(z|[-+]\d{2}(?::?\d{2})?)?)?\s*\z/ix =~ str
       if $3
 	e = {
-	  :mon => $2.to_i,
 	  :mday => $3.to_i
 	}
 	if $1 != '-'
@@ -164,6 +163,11 @@
 	  end
 	  e[:year] = y
 	end
+	if $2.nil?
+	  return if $1 != '-'
+	else
+	  e[:mon] = $2.to_i
+	end
       elsif $5
 	e = {
 	  :yday => $5.to_i
@@ -205,17 +209,17 @@
 	e[:offset] = zone_to_diff($14)
       end
       e
-    elsif /\A\s*(?:([-+]?(?:\d{4}|\d{2})|--)(\d{2})(\d{2})|
-		   ([-+]?(?:\d{4}|\d{2}))?(\d{3})|
+    elsif /\A\s*(?:([-+]?(?:\d{4}|\d{2})|--)(\d{2}|-)(\d{2})|
+		   ([-+]?(?:\d{4}|\d{2}))(\d{3})|
 		   -(\d{3})|
-		   (\d{4}|\d{2})?w(\d{2})(\d)|
-		-w-(\d))
+		   (\d{4}|\d{2})w(\d{2})(\d)|
+		   -w(\d{2})(\d)|
+		   -w-(\d))
 	(?:t?
 	(\d{2})(\d{2})(?:(\d{2})(?:[,.](\d+))?)?
 	(z|[-+]\d{2}(?:\d{2})?)?)?\s*\z/ix =~ str
       if $3
 	e = {
-	  :mon => $2.to_i,
 	  :mday => $3.to_i
 	}
 	if $1 != '--'
@@ -225,17 +229,20 @@
 	  end
 	  e[:year] = y
 	end
+	if $2 == '-'
+	  return if $1 != '--'
+	else
+	  e[:mon] = $2.to_i
+	end
       elsif $5
 	e = {
 	  :yday => $5.to_i
 	}
-	if $4
-	  y = $4.to_i
-	  if $4.size < 4
-	    y += if y >= 69 then 1900 else 2000 end
-	  end
-	  e[:year] = y
+	y = $4.to_i
+	if $4.size < 4
+	  y += if y >= 69 then 1900 else 2000 end
 	end
+	e[:year] = y
       elsif $6
 	e = {
 	  :yday => $6.to_i
@@ -245,29 +252,32 @@
 	  :cweek => $8.to_i,
 	  :cwday => $9.to_i
 	}
-	if $7
-	  y = $7.to_i
-	  if $7.size < 4
-	    y += if y >= 69 then 1900 else 2000 end
-	  end
-	  e[:cwyear] = y
+	y = $7.to_i
+	if $7.size < 4
+	  y += if y >= 69 then 1900 else 2000 end
 	end
-      elsif $10
+	e[:cwyear] = y
+      elsif $11
 	e = {
-	  :cwday => $10.to_i
+	  :cweek => $10.to_i,
+	  :cwday => $11.to_i
 	}
+      elsif $12
+	e = {
+	  :cwday => $12.to_i
+	}
       end
-      if $11
-	e[:hour] = $11.to_i
-	e[:min] = $12.to_i
-	e[:sec] = $13.to_i if $13
+      if $13
+	e[:hour] = $13.to_i
+	e[:min] = $14.to_i
+	e[:sec] = $15.to_i if $15
       end
-      if $14
-	e[:sec_fraction] = Rational($14.to_i, 10**$14.size)
+      if $16
+	e[:sec_fraction] = Rational($16.to_i, 10**$16.size)
       end
-      if $15
-	e[:zone] = $15
-	e[:offset] = zone_to_diff($15)
+      if $17
+	e[:zone] = $17
+	e[:offset] = zone_to_diff($17)
       end
       e
     elsif /\A\s*(?:(\d{2}):(\d{2})(?::(\d{2})(?:[,.](\d+))?)?
Index: test/date/test_date_parse.rb
===================================================================
--- test/date/test_date_parse.rb	(revision 31347)
+++ test/date/test_date_parse.rb	(revision 31348)
@@ -667,15 +667,18 @@
   end
 
   def test__iso8601
-    h = Date._iso8601('01-02-03')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('01-02-03T04:05:06Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('2001-02-03')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('2001-02-03T04:05:06Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('--02-03')
-    assert_equal([nil, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('--02-03T04:05:06Z')
+    assert_equal([nil, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('---03T04:05:06Z')
+    assert_equal([nil, nil, 3, 4, 5, 6, 0],
+		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
 
     h = Date._iso8601('2001-02-03T04:05')
     assert_equal([2001, 2, 3, 4, 5, nil, nil],
@@ -693,15 +696,18 @@
     assert_equal([2001, 2, 3, 4, 5, 6, 3600],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
 
-    h = Date._iso8601('010203')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('010203T040506Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('20010203')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('20010203T040506Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('--0203')
-    assert_equal([nil, 2, 3, nil, nil, nil, nil],
+    h = Date._iso8601('--0203T040506Z')
+    assert_equal([nil, 2, 3, 4, 5, 6, 0],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('---03T040506Z')
+    assert_equal([nil, nil, 3, 4, 5, 6, 0],
+		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
 
     h = Date._iso8601('010203T0405')
     assert_equal([2001, 2, 3, 4, 5, nil, nil],
@@ -738,16 +744,52 @@
     assert_equal([2001, 2, 3, 4, 5, 6, 3600],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
 
-    h = Date._iso8601('01-023')
-    assert_equal([2001, 23, nil, nil, nil, nil],
+    h = Date._iso8601('01-023T04:05:06Z')
+    assert_equal([2001, 23, 4, 5, 6, 0],
 		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('2001-023')
-    assert_equal([2001, 23, nil, nil, nil, nil],
+    h = Date._iso8601('2001-023T04:05:06Z')
+    assert_equal([2001, 23, 4, 5, 6, 0],
 		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('-023')
-    assert_equal([nil, 23, nil, nil, nil, nil],
+    h = Date._iso8601('-023T04:05:06Z')
+    assert_equal([nil, 23, 4, 5, 6, 0],
 		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
 
+    h = Date._iso8601('01023T040506Z')
+    assert_equal([2001, 23, 4, 5, 6, 0],
+		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('2001023T040506Z')
+    assert_equal([2001, 23, 4, 5, 6, 0],
+		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('-023T040506Z')
+    assert_equal([nil, 23, 4, 5, 6, 0],
+		 h.values_at(:year, :yday, :hour, :min, :sec, :offset))
+
+    h = Date._iso8601('01-w02-3T04:05:06Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('2001-w02-3T04:05:06Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('-w02-3T04:05:06Z')
+    assert_equal([nil, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('-w-3T04:05:06Z')
+    assert_equal([nil, nil, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+
+    h = Date._iso8601('01w023T040506Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('2001w023T040506Z')
+    assert_equal([2001, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('-w023T040506Z')
+    assert_equal([nil, 2, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+    h = Date._iso8601('-w-3T040506Z')
+    assert_equal([nil, nil, 3, 4, 5, 6, 0],
+		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
+
     h = Date._iso8601('04:05')
     assert_equal([nil, nil, nil, 4, 5, nil, nil],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
@@ -771,21 +813,6 @@
     assert_equal([nil, nil, nil, 4, 5, 6, 3600],
 		 h.values_at(:year, :mon, :mday, :hour, :min, :sec, :offset))
 
-    h = Date._iso8601('01-w02-3')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
-		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('2001-w02-3')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
-		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('2001w023')
-    assert_equal([2001, 2, 3, nil, nil, nil, nil],
-		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('-w02-3')
-    assert_equal([nil, 2, 3, nil, nil, nil, nil],
-		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
-    h = Date._iso8601('-w-3')
-    assert_equal([nil, nil, 3, nil, nil, nil, nil],
-		 h.values_at(:cwyear, :cweek, :cwday, :hour, :min, :sec, :offset))
   end
 
   def test__rfc3339

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]