From: <poo...@us...> - 2010-03-08 06:07:05
|
Revision: 1497 http://pywebsvcs.svn.sourceforge.net/pywebsvcs/?rev=1497&view=rev Author: pooryorick Date: 2010-03-08 06:06:52 +0000 (Mon, 08 Mar 2010) Log Message: ----------- overhaul dump operations (dump_instance was never called under newer Python) Modified Paths: -------------- trunk/SOAPpy/SOAPpy/Parser.py trunk/SOAPpy/SOAPpy/SOAPBuilder.py Modified: trunk/SOAPpy/SOAPpy/Parser.py =================================================================== --- trunk/SOAPpy/SOAPpy/Parser.py 2010-03-04 23:46:17 UTC (rev 1496) +++ trunk/SOAPpy/SOAPpy/Parser.py 2010-03-08 06:06:52 UTC (rev 1497) @@ -820,9 +820,6 @@ zerofloatre = '[1-9]' - - - def convertType(self, d, t, attrs, config=Config): if t[0] is None and t[1] is not None: type = t[1].strip() Modified: trunk/SOAPpy/SOAPpy/SOAPBuilder.py =================================================================== --- trunk/SOAPpy/SOAPpy/SOAPBuilder.py 2010-03-04 23:46:17 UTC (rev 1496) +++ trunk/SOAPpy/SOAPpy/SOAPBuilder.py 2010-03-08 06:06:52 UTC (rev 1497) @@ -284,22 +284,7 @@ if type(tag) not in (NoneType, StringType, UnicodeType): raise KeyError, "tag must be a string or None" - try: - meth = getattr(self, "dump_" + type(obj).__name__) - except AttributeError: - if type(obj) == LongType: - obj_type = "integer" - elif pythonHasBooleanType and type(obj) == BooleanType: - obj_type = "boolean" - else: - obj_type = type(obj).__name__ - - self.out.append(self.dumper(None, obj_type, obj, tag, typed, - ns_map, self.genroot(ns_map))) - else: - meth(obj, tag, typed, ns_map) - - + self.dump_dispatch(obj, tag, typed, ns_map) self.depth -= 1 # generic dumper @@ -332,6 +317,7 @@ data = obj + return xml % {"tag": tag, "type": t, "data": data, "root": rootattr, "id": id, "attrs": a} @@ -353,10 +339,20 @@ else: obj = repr(obj) - # Note: python 'float' is actually a SOAP 'double'. - self.out.append(self.dumper(None, "double", obj, tag, typed, ns_map, - self.genroot(ns_map))) + # Note: python 'float' is actually a SOAP 'double'. + self.out.append(self.dumper( + None, "double", obj, tag, typed, ns_map, self.genroot(ns_map))) + def dump_int(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_int." + self.out.append(self.dumper(None, 'integer', obj, tag, typed, + ns_map, self.genroot(ns_map))) + + def dump_bool(self, obj, tag, typed = 1, ns_map = {}): + if Config.debug: print "In dump_bool." + self.out.append(self.dumper(None, 'boolean', obj, tag, typed, + ns_map, self.genroot(ns_map))) + def dump_string(self, obj, tag, typed = 0, ns_map = {}): if Config.debug: print "In dump_string." tag = tag or self.gentag() @@ -407,12 +403,12 @@ except: # preserve type if present if getattr(obj,"_typed",None) and getattr(obj,"_type",None): - if getattr(obj, "_complexType", None): + if getattr(obj, "_complexType", None): sample = typedArrayType(typed=obj._type, complexType = obj._complexType) sample._typename = obj._type if not getattr(obj,"_ns",None): obj._ns = NS.URN - else: + else: sample = typedArrayType(typed=obj._type) else: sample = structType() @@ -459,7 +455,7 @@ else: t = 'ur-type' else: - typename = type(sample).__name__ + typename = type(sample).__name__ # For Python 2.2+ if type(sample) == StringType: typename = 'string' @@ -467,10 +463,10 @@ # HACK: unicode is a SOAP string if type(sample) == UnicodeType: typename = 'string' - # HACK: python 'float' is actually a SOAP 'double'. - if typename=="float": typename="double" - t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ - typename + # HACK: python 'float' is actually a SOAP 'double'. + if typename=="float": typename="double" + t = self.genns( + ns_map, self.config.typesNamespaceURI)[0] + typename else: t = self.genns(ns_map, self.config.typesNamespaceURI)[0] + \ @@ -524,21 +520,43 @@ dump_dict = dump_dictionary # For Python 2.2+ - def dump_instance(self, obj, tag, typed = 1, ns_map = {}): - if Config.debug: print "In dump_instance.", "obj=", obj, "tag=", tag + def dump_dispatch(self, obj, tag, typed = 1, ns_map = {}): + # watch out for order! + dumpmap = ( + (basestring, self.dump_string), + (NoneType, self.dump_None), + (bool, self.dump_bool), + (int, self.dump_int), + (long, self.dump_int), + (list, self.dump_list), + (dict, self.dump_dictionary), + (float, self.dump_float), + ) + for dtype, func in dumpmap: + if isinstance(obj, dtype): + func(obj, tag, typed, ns_map) + return + + try: + iter(obj) + except TypeError: + pass + else: + self.dump_list(obj, tag, typed, ns_map) + return + + if not tag: # If it has a name use it. if isinstance(obj, anyType) and obj._name: tag = obj._name else: tag = self.gentag() - tag = toXMLname(tag) # convert from SOAP 1.2 XML name encoding if isinstance(obj, arrayType): # Array self.dump_list(obj, tag, typed, ns_map) return - - if isinstance(obj, faultType): # Fault + elif isinstance(obj, faultType): # Fault cns, cdecl = self.genns(ns_map, NS.ENC) vns, vdecl = self.genns(ns_map, NS.ENV) self.out.append('<%sFault %sroot="1"%s%s>' % (vns, cns, vdecl, cdecl)) @@ -556,12 +574,11 @@ if isinstance(obj, voidType): # void self.out.append("<%s%s%s></%s>\n" % (tag, a, r, tag)) - return + else: + id = self.checkref(obj, tag, ns_map) + if id == None: + return - id = self.checkref(obj, tag, ns_map) - if id == None: - return - if isinstance(obj, structType): # Check for namespace ndecl = '' @@ -612,13 +629,16 @@ else: # Some Class self.out.append('<%s%s%s>\n' % (tag, id, r)) - for (k, v) in obj.__dict__.items(): - if k[0] != "_": - self.dump(v, k, 1, ns_map) + d1 = getattr(obj, '__dict__', None) + if d1 is not None: + for (k, v) in d1: + if k[0] != "_": + self.dump(v, k, 1, ns_map) self.out.append('</%s>\n' % tag) + ################################################################################ # SOAPBuilder's more public interface ################################################################################ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |