From 602ffe2a63a455bf4a8177552226db955b59e493 Mon Sep 17 00:00:00 2001
From: Fumiaki MATSUSHIMA <mtsmfm@gmail.com>
Date: Wed, 17 Jun 2015 20:01:18 +0900
Subject: TimeWithZone#xmlschema should be able to display more than 6 digits

---
 activesupport/lib/active_support/time_with_zone.rb | 9 ++++-----
 activesupport/test/core_ext/time_with_zone_test.rb | 4 ++--
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb
index a82a7dfea0..3592dcba39 100644
--- a/activesupport/lib/active_support/time_with_zone.rb
+++ b/activesupport/lib/active_support/time_with_zone.rb
@@ -41,6 +41,9 @@ module ActiveSupport
       'Time'
     end
 
+    PRECISIONS = Hash.new { |h, n| h[n] = "%FT%T.%#{n}N".freeze }
+    PRECISIONS[0] = '%FT%T'.freeze
+
     include Comparable
     attr_reader :time_zone
 
@@ -142,11 +145,7 @@ module ActiveSupport
     #
     #   Time.zone.now.xmlschema  # => "2014-12-04T11:02:37-05:00"
     def xmlschema(fraction_digits = 0)
-      fraction = if fraction_digits.to_i > 0
-        (".%06i" % time.usec)[0, fraction_digits.to_i + 1]
-      end
-
-      "#{time.strftime("%Y-%m-%dT%H:%M:%S")}#{fraction}#{formatted_offset(true, 'Z')}"
+      "#{time.strftime(PRECISIONS[fraction_digits.to_i])}#{formatted_offset(true, 'Z'.freeze)}"
     end
     alias_method :iso8601, :xmlschema
 
diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb
index ccb7f02331..c40f0bacbf 100644
--- a/activesupport/test/core_ext/time_with_zone_test.rb
+++ b/activesupport/test/core_ext/time_with_zone_test.rb
@@ -110,14 +110,14 @@ class TimeWithZoneTest < ActiveSupport::TestCase
     @twz += 0.1234560001 # advance the time by a fraction of a second
     assert_equal "1999-12-31T19:00:00.123-05:00", @twz.xmlschema(3)
     assert_equal "1999-12-31T19:00:00.123456-05:00", @twz.xmlschema(6)
-    assert_equal "1999-12-31T19:00:00.123456-05:00", @twz.xmlschema(12)
+    assert_equal "1999-12-31T19:00:00.123456000100-05:00", @twz.xmlschema(12)
   end
 
   def test_xmlschema_with_fractional_seconds_lower_than_hundred_thousand
     @twz += 0.001234 # advance the time by a fraction
     assert_equal "1999-12-31T19:00:00.001-05:00", @twz.xmlschema(3)
     assert_equal "1999-12-31T19:00:00.001234-05:00", @twz.xmlschema(6)
-    assert_equal "1999-12-31T19:00:00.001234-05:00", @twz.xmlschema(12)
+    assert_equal "1999-12-31T19:00:00.001234000000-05:00", @twz.xmlschema(12)
   end
 
   def test_xmlschema_with_nil_fractional_seconds
-- 
cgit v1.2.3