accept datetime.datetime instances when marshalling;

dateTime.iso8601 elements still unmarshal into xmlrpclib.DateTime objects
This commit is contained in:
Fred Drake 2005-02-10 18:33:30 +00:00
parent bfd7d6a0ea
commit ba613c3410
2 changed files with 33 additions and 1 deletions

View file

@ -1,3 +1,4 @@
import datetime
import sys import sys
import unittest import unittest
import xmlrpclib import xmlrpclib
@ -12,6 +13,11 @@ alist = [{'astring': 'foo@bar.baz.spam',
'boolean': xmlrpclib.False, 'boolean': xmlrpclib.False,
'unicode': u'\u4000\u6000\u8000', 'unicode': u'\u4000\u6000\u8000',
u'ukey\u4000': 'regular value', u'ukey\u4000': 'regular value',
'datetime1': xmlrpclib.DateTime('20050210T11:41:23'),
'datetime2': xmlrpclib.DateTime(
(2005, 02, 10, 11, 41, 23, 0, 1, -1)),
'datetime3': xmlrpclib.DateTime(
datetime.datetime(2005, 02, 10, 11, 41, 23)),
}] }]
class XMLRPCTestCase(unittest.TestCase): class XMLRPCTestCase(unittest.TestCase):
@ -20,6 +26,17 @@ class XMLRPCTestCase(unittest.TestCase):
self.assertEquals(alist, self.assertEquals(alist,
xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0]) xmlrpclib.loads(xmlrpclib.dumps((alist,)))[0][0])
def test_dump_bare_datetime(self):
# This checks that an unwrapped datetime object can be handled
# by the marshalling code. This can't be done via
# test_dump_load() since the unmarshaller doesn't produce base
# datetime instances.
dt = datetime.datetime(2005, 02, 10, 11, 41, 23)
s = xmlrpclib.dumps((dt,))
r, m = xmlrpclib.loads(s)
self.assertEquals(r, (xmlrpclib.DateTime('20050210T11:41:23'),))
self.assertEquals(m, None)
def test_dump_big_long(self): def test_dump_big_long(self):
self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,))

View file

@ -148,6 +148,11 @@ try:
except NameError: except NameError:
unicode = None # unicode support not available unicode = None # unicode support not available
try:
import datetime
except ImportError:
datetime = None
try: try:
_bool_is_builtin = False.__class__.__name__ == "bool" _bool_is_builtin = False.__class__.__name__ == "bool"
except NameError: except NameError:
@ -349,7 +354,10 @@ class DateTime:
def __init__(self, value=0): def __init__(self, value=0):
if not isinstance(value, StringType): if not isinstance(value, StringType):
if not isinstance(value, (TupleType, time.struct_time)): if datetime and isinstance(value, datetime.datetime):
self.value = value.strftime("%Y%m%dT%H:%M:%S")
return
elif not isinstance(value, (TupleType, time.struct_time)):
if value == 0: if value == 0:
value = time.time() value = time.time()
value = time.localtime(value) value = time.localtime(value)
@ -699,6 +707,13 @@ class Marshaller:
del self.memo[i] del self.memo[i]
dispatch[DictType] = dump_struct dispatch[DictType] = dump_struct
if datetime:
def dump_datetime(self, value, write):
write("<value><dateTime.iso8601>")
write(value.strftime("%Y%m%dT%H:%M:%S"))
write("</dateTime.iso8601></value>\n")
dispatch[datetime.datetime] = dump_datetime
def dump_instance(self, value, write): def dump_instance(self, value, write):
# check for special wrappers # check for special wrappers
if value.__class__ in WRAPPERS: if value.__class__ in WRAPPERS: