resolve issue 2014

This commit is contained in:
Skip Montanaro 2008-04-18 20:35:46 +00:00
parent 08923177b4
commit b131f0468f
3 changed files with 33 additions and 11 deletions

View File

@ -55,6 +55,17 @@ class XMLRPCTestCase(unittest.TestCase):
(newdt,), m = xmlrpclib.loads(s, use_datetime=0) (newdt,), m = xmlrpclib.loads(s, use_datetime=0)
self.assertEquals(newdt, xmlrpclib.DateTime('20050210T11:41:23')) 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_cmp_datetime_DateTime(self): def test_cmp_datetime_DateTime(self):
now = datetime.datetime.now() now = datetime.datetime.now()
dt = xmlrpclib.DateTime(now.timetuple()) dt = xmlrpclib.DateTime(now.timetuple())

View File

@ -346,6 +346,20 @@ else:
# @param value The time, given as an ISO 8601 string, a time # @param value The time, given as an ISO 8601 string, a time
# tuple, or a integer time value. # 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 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: class DateTime:
"""DateTime wrapper for an ISO 8601 string or time tuple or """DateTime wrapper for an ISO 8601 string or time tuple or
localtime integer value to generate 'dateTime.iso8601' XML-RPC localtime integer value to generate 'dateTime.iso8601' XML-RPC
@ -353,16 +367,10 @@ class DateTime:
""" """
def __init__(self, value=0): def __init__(self, value=0):
if not isinstance(value, StringType): if isinstance(value, StringType):
if datetime and isinstance(value, datetime.datetime): self.value = value
self.value = value.strftime("%Y%m%dT%H:%M:%S") else:
return self.value = _strftime(value)
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
def make_comparable(self, other): def make_comparable(self, other):
if isinstance(other, DateTime): if isinstance(other, DateTime):
@ -772,7 +780,7 @@ class Marshaller:
if datetime: if datetime:
def dump_datetime(self, value, write): def dump_datetime(self, value, write):
write("<value><dateTime.iso8601>") write("<value><dateTime.iso8601>")
write(value.strftime("%Y%m%dT%H:%M:%S")) write(_strftime(value))
write("</dateTime.iso8601></value>\n") write("</dateTime.iso8601></value>\n")
dispatch[datetime.datetime] = dump_datetime dispatch[datetime.datetime] = dump_datetime

View File

@ -29,6 +29,9 @@ Extensions Modules
Library Library
------- -------
- Issue #2014: Allow XML-RPC datetime objects to have dates before
1900-01-01.
- Issue #2439: Added new function pkgutil.get_data(), which is a - Issue #2439: Added new function pkgutil.get_data(), which is a
convenience wrapper for the PEP 302 get_data() API. convenience wrapper for the PEP 302 get_data() API.