diff options
-rw-r--r-- | lib/xmlrpc/datetime.rb | 4 | ||||
-rw-r--r-- | lib/xmlrpc/parser.rb | 32 | ||||
-rw-r--r-- | test/xmlrpc/data/datetime_iso8601.xml | 8 | ||||
-rw-r--r-- | test/xmlrpc/test_parser.rb | 30 |
4 files changed, 54 insertions, 20 deletions
diff --git a/lib/xmlrpc/datetime.rb b/lib/xmlrpc/datetime.rb index e3bc6943f0..8ae6c7a56e 100644 --- a/lib/xmlrpc/datetime.rb +++ b/lib/xmlrpc/datetime.rb @@ -126,6 +126,10 @@ class DateTime [@year, @month, @day, @hour, @min, @sec] end + def ==(o) + self.to_a == o.to_a + end + end diff --git a/lib/xmlrpc/parser.rb b/lib/xmlrpc/parser.rb index ed0e9a66f3..db99bafafc 100644 --- a/lib/xmlrpc/parser.rb +++ b/lib/xmlrpc/parser.rb @@ -84,18 +84,32 @@ module XMLRPC end def self.dateTime(str) - if str =~ /^(-?\d\d\d\d)(\d\d)(\d\d)T(\d\d):(\d\d):(\d\d)$/ then - # TODO: Time.gm ??? .local ??? + case str + when /^(-?\d\d\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(?:Z|([+-])(\d\d):?(\d\d))?$/ + a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i} + if $7 + ofs = $8.to_i*3600 + $9.to_i*60 + ofs = -ofs if $7=='+' + utc = Time.utc(a.reverse) + ofs + a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ] + end + XMLRPC::DateTime.new(*a) + when /^(-?\d\d)-?(\d\d)-?(\d\d)T(\d\d):(\d\d):(\d\d)(Z|([+-]\d\d):(\d\d))?$/ a = [$1, $2, $3, $4, $5, $6].collect{|i| i.to_i} - + if a[0] < 70 + a[0] += 2000 + else + a[0] += 1900 + end + if $7 + ofs = $8.to_i*3600 + $9.to_i*60 + ofs = -ofs if $7=='+' + utc = Time.utc(a.reverse) + ofs + a = [ utc.year, utc.month, utc.day, utc.hour, utc.min, utc.sec ] + end XMLRPC::DateTime.new(*a) - #if a[0] >= 1970 then - # Time.gm(*a) - #else - # Date.new(*a[0,3]) - #end else - raise "wrong dateTime.iso8601 format" + raise "wrong dateTime.iso8601 format " + str end end diff --git a/test/xmlrpc/data/datetime_iso8601.xml b/test/xmlrpc/data/datetime_iso8601.xml new file mode 100644 index 0000000000..43d8da6c13 --- /dev/null +++ b/test/xmlrpc/data/datetime_iso8601.xml @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<methodResponse> + <params> + <param> + <value><dateTime.iso8601>20041105T01:15:23Z</dateTime.iso8601></value> + </param> + </params> +</methodResponse> diff --git a/test/xmlrpc/test_parser.rb b/test/xmlrpc/test_parser.rb index 3e55cdb35a..3665b6e1af 100644 --- a/test/xmlrpc/test_parser.rb +++ b/test/xmlrpc/test_parser.rb @@ -1,25 +1,29 @@ $LOAD_PATH.unshift '../../lib' require 'test/unit' +require 'xmlrpc/datetime' require "xmlrpc/parser" module GenericParserTest def setup - @xml1 = File.readlines("data/xml1.xml").to_s - @expected1 = File.readlines("data/xml1.expected").to_s.chomp + @xml1 = File.read("data/xml1.xml") + @expected1 = File.read("data/xml1.expected").chomp - @xml2 = File.readlines("data/bug_covert.xml").to_s - @expected2 = File.readlines("data/bug_covert.expected").to_s.chomp + @xml2 = File.read("data/bug_covert.xml") + @expected2 = File.read("data/bug_covert.expected").chomp - @xml3 = File.readlines("data/bug_bool.xml").to_s - @expected3 = File.readlines("data/bug_bool.expected").to_s.chomp + @xml3 = File.read("data/bug_bool.xml") + @expected3 = File.read("data/bug_bool.expected").chomp - @xml4 = File.readlines("data/value.xml").to_s - @expected4 = File.readlines("data/value.expected").to_s.chomp + @xml4 = File.read("data/value.xml") + @expected4 = File.read("data/value.expected").chomp - @cdata_xml = File.readlines("data/bug_cdata.xml").to_s.chomp - @cdata_expected = File.readlines("data/bug_cdata.expected").to_s.chomp + @cdata_xml = File.read("data/bug_cdata.xml").chomp + @cdata_expected = File.read("data/bug_cdata.expected").chomp - @fault_doc = File.readlines("data/fault.xml").to_s + @datetime_xml = File.read("data/datetime_iso8601.xml") + @datetime_expected = XMLRPC::DateTime.new(2004, 11, 5, 1, 15, 23) + + @fault_doc = File.read("data/fault.xml").to_s end # test parseMethodResponse -------------------------------------------------- @@ -40,6 +44,10 @@ module GenericParserTest assert_equal(@cdata_expected, @p.parseMethodResponse(@cdata_xml).inspect) end + def test_dateTime + assert_equal(@datetime_expected, @p.parseMethodResponse(@datetime_xml)[1]) + end + # test parseMethodCall ------------------------------------------------------ def test_parseMethodCall |