mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
accept datetime.datetime instances when marshalling;
dateTime.iso8601 elements still unmarshal into xmlrpclib.DateTime objects
This commit is contained in:
parent
bfd7d6a0ea
commit
ba613c3410
2 changed files with 33 additions and 1 deletions
|
@ -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,))
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue