From 07529354dba821ddfa8ee0a14a9302e352eb8173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Sun, 19 Nov 2006 18:51:54 +0000 Subject: Patch #1070046: Marshal new-style objects like InstanceType in xmlrpclib. --- Doc/lib/libxmlrpclib.tex | 9 ++++++++- Lib/test/test_xmlrpc.py | 9 +++++++++ Lib/xmlrpclib.py | 16 +++++++++++++--- Misc/NEWS | 3 +++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/Doc/lib/libxmlrpclib.tex b/Doc/lib/libxmlrpclib.tex index 3645b82..e3caab3 100644 --- a/Doc/lib/libxmlrpclib.tex +++ b/Doc/lib/libxmlrpclib.tex @@ -68,7 +68,10 @@ Python type): \lineii{arrays}{Any Python sequence type containing conformable elements. Arrays are returned as lists} \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 \class{DateTime} class) or a \class{\refmodule{datetime}.datetime}, @@ -100,6 +103,10 @@ described below. compatibility. New code should use \class{ServerProxy}. \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} diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py index 64d8fe8..ccc1b60 100644 --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -86,6 +86,15 @@ class XMLRPCTestCase(unittest.TestCase): s = xmlrpclib.dumps((new_d,), methodresponse=True) 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): self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) diff --git a/Lib/xmlrpclib.py b/Lib/xmlrpclib.py index 6fb6c68..3864dad 100644 --- a/Lib/xmlrpclib.py +++ b/Lib/xmlrpclib.py @@ -630,9 +630,19 @@ class Marshaller: try: f = self.dispatch[type(value)] except KeyError: - raise TypeError, "cannot marshal %s objects" % type(value) - else: - f(self, value, write) + # check if this object can be marshalled as a structure + try: + 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): if not self.allow_none: diff --git a/Misc/NEWS b/Misc/NEWS index 9b2aeba..849911b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -101,6 +101,9 @@ Core and builtins Library ------- +- Patch #1070046: Marshal new-style objects like InstanceType + in xmlrpclib. + - cStringIO.truncate(-1) now raises an IOError, like StringIO and regular files. -- cgit v0.12