diff --git a/CHANGES.txt b/CHANGES.txt index 68a2561..0d690d7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,7 +4,9 @@ CHANGELOG 0.12.22 (unreleased) -------------------- -- Nothing changed yet. +- proper usage of config property inside objects. [Davorin Kunstelj] +- dump user defined types with handler functions (can be used to override dump + of built-in types). [Davorin Kunstelj] 0.12.21 (2014-05-27) diff --git a/src/SOAPpy/Config.py b/src/SOAPpy/Config.py index 24440a8..9f5e043 100644 --- a/src/SOAPpy/Config.py +++ b/src/SOAPpy/Config.py @@ -116,6 +116,13 @@ class SOAPConfig: # authorization error. self.authMethod = None + # The tuple of type and dump handler function pairs for + # SOAPBuilder dump dispatch. Used for handling additional types + # and overriding built-in types. Functions are expected to have + # the same parameters as SOAPBuilder dump_ methods + # (including self; possibility to call any SOAPBuilder dump method) + self.dumpmap = tuple() + # Globus Support if pyGlobus.io available try: from pyGlobus import io; @@ -144,6 +151,12 @@ class SOAPConfig: if d['SSLclient'] or d['SSLserver']: d['SSL'] = self.SSLconfig() + dumpmap = kw.pop("dumpmap", None) + if dumpmap: + if not isinstance(dumpmap, tuple): + raise TypeError("Config dumpmap parameter must be a tuple") + self.dumpmap = dumpmap + self.dumpmap + for k, v in kw.items(): if k[0] != '_': setattr(self, k, v) diff --git a/src/SOAPpy/SOAPBuilder.py b/src/SOAPpy/SOAPBuilder.py index cfbd5aa..0ce204b 100644 --- a/src/SOAPpy/SOAPBuilder.py +++ b/src/SOAPpy/SOAPBuilder.py @@ -596,6 +596,12 @@ class SOAPBuilder: else: tag = self.gentag() + # Apply additional types, override built-in types + for dtype, func in self.config.dumpmap: + if isinstance(obj, dtype): + func(self, obj, tag, typed, ns_map) + return + # watch out for order! dumpmap = ( (Exception, self.dump_exception),