Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
This commit is contained in:
parent
9eec51c04f
commit
07529354db
|
@ -68,7 +68,10 @@ Python type):
|
||||||
\lineii{arrays}{Any Python sequence type containing conformable
|
\lineii{arrays}{Any Python sequence type containing conformable
|
||||||
elements. Arrays are returned as lists}
|
elements. Arrays are returned as lists}
|
||||||
\lineii{structures}{A Python dictionary. Keys must be strings,
|
\lineii{structures}{A Python dictionary. Keys must be strings,
|
||||||
values may be any conformable type.}
|
values may be any conformable type. Objects
|
||||||
|
of user-defined classes can be passed in;
|
||||||
|
only their \var{__dict__} attribute is
|
||||||
|
transmitted.}
|
||||||
\lineii{dates}{in seconds since the epoch (pass in an instance of the
|
\lineii{dates}{in seconds since the epoch (pass in an instance of the
|
||||||
\class{DateTime} class) or a
|
\class{DateTime} class) or a
|
||||||
\class{\refmodule{datetime}.datetime},
|
\class{\refmodule{datetime}.datetime},
|
||||||
|
@ -100,6 +103,10 @@ described below.
|
||||||
compatibility. New code should use \class{ServerProxy}.
|
compatibility. New code should use \class{ServerProxy}.
|
||||||
|
|
||||||
\versionchanged[The \var{use_datetime} flag was added]{2.5}
|
\versionchanged[The \var{use_datetime} flag was added]{2.5}
|
||||||
|
|
||||||
|
\versionchanged[Instances of new-style classes can be passed in
|
||||||
|
if they have an \var{__dict__} attribute and don't have a base class
|
||||||
|
that is marshalled in a special way.}{2.6}
|
||||||
\end{classdesc}
|
\end{classdesc}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,15 @@ class XMLRPCTestCase(unittest.TestCase):
|
||||||
s = xmlrpclib.dumps((new_d,), methodresponse=True)
|
s = xmlrpclib.dumps((new_d,), methodresponse=True)
|
||||||
self.assert_(isinstance(s, str))
|
self.assert_(isinstance(s, str))
|
||||||
|
|
||||||
|
def test_newstyle_class(self):
|
||||||
|
class T(object):
|
||||||
|
pass
|
||||||
|
t = T()
|
||||||
|
t.x = 100
|
||||||
|
t.y = "Hello"
|
||||||
|
((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
|
||||||
|
self.assertEquals(t2, t.__dict__)
|
||||||
|
|
||||||
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,))
|
||||||
|
|
||||||
|
|
|
@ -630,9 +630,19 @@ class Marshaller:
|
||||||
try:
|
try:
|
||||||
f = self.dispatch[type(value)]
|
f = self.dispatch[type(value)]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise TypeError, "cannot marshal %s objects" % type(value)
|
# check if this object can be marshalled as a structure
|
||||||
else:
|
try:
|
||||||
f(self, value, write)
|
value.__dict__
|
||||||
|
except:
|
||||||
|
raise TypeError, "cannot marshal %s objects" % type(value)
|
||||||
|
# check if this class is a sub-class of a basic type,
|
||||||
|
# because we don't know how to marshal these types
|
||||||
|
# (e.g. a string sub-class)
|
||||||
|
for type_ in type(value).__mro__:
|
||||||
|
if type_ in self.dispatch.keys():
|
||||||
|
raise TypeError, "cannot marshal %s objects" % type(value)
|
||||||
|
f = self.dispatch[InstanceType]
|
||||||
|
f(self, value, write)
|
||||||
|
|
||||||
def dump_nil (self, value, write):
|
def dump_nil (self, value, write):
|
||||||
if not self.allow_none:
|
if not self.allow_none:
|
||||||
|
|
|
@ -101,6 +101,9 @@ Core and builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #1070046: Marshal new-style objects like InstanceType
|
||||||
|
in xmlrpclib.
|
||||||
|
|
||||||
- cStringIO.truncate(-1) now raises an IOError, like StringIO and
|
- cStringIO.truncate(-1) now raises an IOError, like StringIO and
|
||||||
regular files.
|
regular files.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue