diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -47,6 +47,17 @@ class XMLRPCTestCase(unittest.TestCase): (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23')) + def test_datetime_before_1900(self): + # same as before but with an date before 1900 + dt = datetime.datetime(1, 02, 10, 11, 41, 23) + s = xmlrpclib.dumps((dt,)) + (newdt,), m = xmlrpclib.loads(s, use_datetime=1) + self.assertEquals(newdt, dt) + self.assertEquals(m, None) + + (newdt,), m = xmlrpclib.loads(s, use_datetime=0) + self.assertEquals(newdt, xmlrpclib.DateTime('00010210T11:41:23')) + def test_dump_bare_date(self): # This checks that an unwrapped datetime.date object can be handled # by the marshalling code. This can't be done via test_dump_load() @@ -60,6 +71,18 @@ class XMLRPCTestCase(unittest.TestCase): (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEquals(newdt, xmlrpclib.DateTime('20050210T00:00:00')) + + def test_date_before_1900(self): + # same as before but with an date before 1900 + d = datetime.datetime(1, 02, 10, 11, 41, 23).date() + s = xmlrpclib.dumps((d,)) + (newd,), m = xmlrpclib.loads(s, use_datetime=1) + self.assertEquals(newd.date(), d) + self.assertEquals(newd.time(), datetime.time(0, 0, 0)) + self.assertEquals(m, None) + + (newdt,), m = xmlrpclib.loads(s, use_datetime=0) + self.assertEquals(newdt, xmlrpclib.DateTime('00010210T00:00:00')) def test_dump_bare_time(self): # This checks that an unwrapped datetime.time object can be handled diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py --- a/Lib/xmlrpclib.py +++ b/Lib/xmlrpclib.py @@ -346,6 +346,26 @@ else: # @param value The time, given as an ISO 8601 string, a time # tuple, or a integer time value. +def _strftime(value): + if datetime: + if isinstance(value, datetime.datetime): + return "%04d%02d%02dT%02d:%02d:%02d" % (value.year, value.month, value.day, + value.hour, value.minute, value.second) + if isinstance(value, datetime.date): + return "%04d%02d%02dT00:00:00" % (value.year, value.month, value.day) + + if isinstance(value, datetime.time): + now = datetime.datetime.now() + return "%04d%02d%02dT%02d:%02d:%02d" % (now.year, now.month, now.day, + value.hour, value.minute, value.second) + + if not isinstance(value, (TupleType, time.struct_time)): + if value == 0: + value = time.time() + value = time.localtime(value) + + return "%04d%02d%02dT%02d:%02d:%02d" % value[:6] + class DateTime: """DateTime wrapper for an ISO 8601 string or time tuple or localtime integer value to generate 'dateTime.iso8601' XML-RPC @@ -353,23 +373,10 @@ class DateTime: """ def __init__(self, value=0): - if not isinstance(value, StringType): - if datetime and isinstance(value, datetime.datetime): - self.value = value.strftime("%Y%m%dT%H:%M:%S") - return - if datetime and isinstance(value, datetime.date): - self.value = value.strftime("%Y%m%dT%H:%M:%S") - return - if datetime and isinstance(value, datetime.time): - today = datetime.datetime.now().strftime("%Y%m%d") - self.value = value.strftime(today+"T%H:%M:%S") - return - if not isinstance(value, (TupleType, time.struct_time)): - if value == 0: - value = time.time() - value = time.localtime(value) - value = time.strftime("%Y%m%dT%H:%M:%S", value) - self.value = value + if isinstance(value, StringType): + self.value = value + else: + self.value = _strftime(value) def __cmp__(self, other): if isinstance(other, DateTime): @@ -722,22 +729,11 @@ class Marshaller: if datetime: def dump_datetime(self, value, write): write("") - write(value.strftime("%Y%m%dT%H:%M:%S")) + write(_strftime(value)) write("\n") dispatch[datetime.datetime] = dump_datetime - - def dump_date(self, value, write): - write("") - write(value.strftime("%Y%m%dT00:00:00")) - write("\n") - dispatch[datetime.date] = dump_date - - def dump_time(self, value, write): - write("") - write(datetime.datetime.now().date().strftime("%Y%m%dT")) - write(value.strftime("%H:%M:%S")) - write("\n") - dispatch[datetime.time] = dump_time + dispatch[datetime.date] = dump_datetime + dispatch[datetime.time] = dump_datetime def dump_instance(self, value, write): # check for special wrappers