From: <bov...@us...> - 2006-06-28 22:14:12
|
Revision: 1241 Author: boverhof Date: 2006-06-28 15:14:03 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pywebsvcs/?rev=1241&view=rev Log Message: ----------- M test/wsdl2py/config.txt M test/wsdl2py/ServiceTest.py M test/wsdl2py/test_OpcDaGateway.py M ZSI/generate/pyclass.py M ZSI/generate/commands.py M ZSI/generate/containers.py M ZSI/TC.py M ZSI/TCcompound.py M ZSI/address.py M CHANGES Added an option "--lazy" to wsdl2py tooling, using this option causes typecodes (complexTypes) to be evaluated during serialization/parsing, thus can be used when importing generated code takes too much time or when max recursion errors occur because types contain references to themselves. Modified Paths: -------------- trunk/zsi/CHANGES trunk/zsi/ZSI/TC.py trunk/zsi/ZSI/TCcompound.py trunk/zsi/ZSI/address.py trunk/zsi/ZSI/generate/commands.py trunk/zsi/ZSI/generate/containers.py trunk/zsi/ZSI/generate/pyclass.py trunk/zsi/test/wsdl2py/ServiceTest.py trunk/zsi/test/wsdl2py/config.txt trunk/zsi/test/wsdl2py/test_OpcDaGateway.py Modified: trunk/zsi/CHANGES =================================================================== --- trunk/zsi/CHANGES 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/CHANGES 2006-06-28 22:14:03 UTC (rev 1241) @@ -1,15 +1,18 @@ Change for xxx released xxx: - - Added ZSI.twisted package w/client and server, requires Python 2.4 - - If Python >= 2.4, build/install ZSI.twisted package - Make XMLSchema.py work in cases where threading isn't built in - Add client-side Cookie Support (Jorgen Frojk Kjaersgaard) - - Add Typecode.typed to control xsi:type data system-wide - For cookies, getheaders() is Python 2.3; use getallmatchingheaders - In SoapWriter, put nsdecls on body, not envelope - Record facets (restrictions) in XMLSchema.py <vc...@da...> - Remove Send()'s kwargs out of _args list <ef...@bo...> - Replace many/most id() with _get_idstr() to hide negative numbers +Change for 2.0.0 released xxx: + - Added ZSI.twisted package w/client and server, requires Python 2.4 + - If Python >= 2.4, build/install ZSI.twisted package + - Add Typecode.typed to control xsi:type data system-wide + - Replace many/most id() with _get_idstr() to hide negative numbers + Changes for 1.7 released 16-Feb-2005: - Add support for jonpy (http://jonpy.sourceforge.net) FastCGI courtesy of Guan Yang Modified: trunk/zsi/ZSI/TC.py =================================================================== --- trunk/zsi/ZSI/TC.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/TC.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -36,8 +36,8 @@ return (None,None) -def _get_type_definition(namespaceURI, name): - return SchemaInstanceType.getTypeDefinition(namespaceURI, name) +def _get_type_definition(namespaceURI, name, **kw): + return SchemaInstanceType.getTypeDefinition(namespaceURI, name, **kw) def _get_global_element_declaration(namespaceURI, name, **kw): return SchemaInstanceType.getElementDeclaration(namespaceURI, name, **kw) @@ -49,6 +49,7 @@ return SchemaInstanceType.getTypeDefinition(namespaceURI, name) is not None + class SchemaInstanceType(type): '''Register all types/elements, when hit already defined class dont create a new one just give back reference. Thus @@ -94,7 +95,7 @@ raise TypeError, 'SchemaInstanceType must be an ElementDeclaration or TypeDefinition ' - def getTypeDefinition(cls, namespaceURI, name): + def getTypeDefinition(cls, namespaceURI, name, lazy=False): '''Grab a type definition, returns a typecode class definition because the facets (name, minOccurs, maxOccurs) must be provided. @@ -102,10 +103,13 @@ namespaceURI -- name -- ''' - return cls.types.get((namespaceURI, name), None) + klass = cls.types.get((namespaceURI, name), None) + if lazy and klass is not None: + return _Mirage(klass) + return klass getTypeDefinition = classmethod(getTypeDefinition) - def getElementDeclaration(cls, namespaceURI, name, isref=False): + def getElementDeclaration(cls, namespaceURI, name, isref=False, lazy=False): '''Grab an element declaration, returns a typecode instance representation or a typecode class definition. An element reference has its own facets, and is local so it will not be @@ -118,7 +122,10 @@ ''' key = (namespaceURI, name) if isref: - return cls.elements.get(key,None) + klass = cls.elements.get(key,None) + if klass is not None and lazy is True: + return _Mirage(klass) + return klass typecode = cls.element_typecode_cache.get(key, None) if typecode is None: @@ -139,8 +146,8 @@ literal = NCName ''' __metaclass__ = SchemaInstanceType + - class TypeDefinition: '''Typecodes subclass to represent a Global Type Definition by setting class variable type. @@ -148,7 +155,7 @@ type = (namespaceURI, NCName) ''' __metaclass__ = SchemaInstanceType - + def getSubstituteType(self, elt, ps): '''if xsi:type does not match the instance type attr, check to see if it is a derived type substitution. @@ -205,7 +212,8 @@ ''' tag = None type = (None,None) - typechecks = True + #typechecks = True + typechecks = False attribute_typecode_dict = None logger = _GetLogger('ZSI.TC.TypeCode') @@ -1988,6 +1996,55 @@ el.createAppendTextNode(textNode) +class _Mirage: + '''Used with SchemaInstanceType for lazy evaluation, eval during serialize or + parse as needed. Mirage is callable, TypeCodes are not. When called it returns the + typecode. + ''' + def __init__(self, klass): + self.pyclass = True + self.klass = klass + if issubclass(klass, ElementDeclaration): + self.__call__ = self._hide_element + + def _hide_type(self, pname, aname, minOccurs=0, maxOccurs=1, nillable=False, **kw): + self.__call__ = self._reveal_type + + # store all attributes, make some visable for pyclass_type + self.__kw = kw + self.minOccurs,self.maxOccurs,self.nillable = minOccurs,maxOccurs,nillable + self.nspname,self.pname,self.aname = None,pname,aname + if type(self.pname) in (tuple,list): + self.nspname,self.pname = pname + + return self + + def _hide_element(self, minOccurs=0, maxOccurs=1, nillable=False, **kw): + self.__call__ = self._reveal_element + + # store all attributes, make some visable for pyclass_type + self.__kw = kw + self.nspname = self.klass.schema + self.pname = self.klass.literal + #TODO: Fix hack + self.aname = '_%s' %self.pname + self.minOccurs,self.maxOccurs,self.nillable = minOccurs,maxOccurs,nillable + + return self + + def _reveal_type(self, *args, **kw): + return self.klass(pname=self.pname, + aname=self.aname, minOccurs=self.minOccurs, + maxOccurs=self.maxOccurs, nillable=self.nillable, + **self.__kw) + + def _reveal_element(self, *args, **kw): + return self.klass(minOccurs=self.minOccurs, + maxOccurs=self.maxOccurs, nillable=self.nillable, + **self.__kw) + __call__ = _hide_type + + class _GetPyobjWrapper: '''Get a python object that wraps data and typecode. Used by <any> parse routine, so that typecode information discovered @@ -2036,6 +2093,7 @@ from TCtimes import * from TCcompound import * from TCapache import * + f = lambda x: type(x) == types.ClassType and issubclass(x, TypeCode) and getattr(x, 'type', None) is not None TYPES = filter(f, map(lambda y:eval(y),dir())) Modified: trunk/zsi/ZSI/TCcompound.py =================================================================== --- trunk/zsi/ZSI/TCcompound.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/TCcompound.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -77,8 +77,10 @@ continue any_keys.append(aname) return any_keys + + class ComplexType(TypeCode): '''Represents an element of complexType, potentially containing other elements. @@ -181,6 +183,10 @@ any = None for i,what in [ (i, self.ofwhat[i]) for i in range(len(self.ofwhat)) ]: + + # retrieve typecode if it is hidden + if callable(what): what = what() + # Loop over all available kids if debug: self.logger.debug("what: (%s,%s)", what.nspname, what.pname) @@ -360,6 +366,10 @@ while indx < lenofwhat: occurs = 0 what = self.ofwhat[indx] + + # retrieve typecode if hidden + if callable(what): what = what() + if debug: self.logger.debug('serialize what -- %s', what.__class__.__name__) Modified: trunk/zsi/ZSI/address.py =================================================================== --- trunk/zsi/ZSI/address.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/address.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -5,7 +5,7 @@ import time, urlparse, socket from ZSI import _seqtypes, EvaluateException, WSActionException -from ZSI.TC import _get_global_element_declaration, _get_type_definition, \ +from ZSI.TC import _get_global_element_declaration as GED, _get_type_definition as GTD, \ _has_type_definition, AnyElement, AnyType, TypeCode from ZSI.TCcompound import ComplexType from ZSI.wstools.Namespaces import WSA_LIST @@ -13,6 +13,10 @@ class Address(object): '''WS-Address + + Implemented is dependent on the default "wsdl2py" convention of generating aname, + so the attributes representing element declaration names should be prefixed with + an underscore. ''' def __init__(self, addressTo=None, wsAddressURI=None, action=None): self.wsAddressURI = wsAddressURI @@ -107,7 +111,7 @@ try: for nsuri,elements in kw.items(): for el in elements: - typecode = _get_global_element_declaration(nsuri, el) + typecode = GED(nsuri, el) if typecode is None: raise WSActionException, 'Missing namespace, import "%s"' %nsuri @@ -153,19 +157,19 @@ # Set Message Information Headers # MessageID - typecode = _get_global_element_declaration(namespaceURI, "MessageID") + typecode = GED(namespaceURI, "MessageID") pyobjs.append(typecode.pyclass(messageID)) # Action - typecode = _get_global_element_declaration(namespaceURI, "Action") + typecode = GED(namespaceURI, "Action") pyobjs.append(typecode.pyclass(action)) # To - typecode = _get_global_element_declaration(namespaceURI, "To") + typecode = GED(namespaceURI, "To") pyobjs.append(typecode.pyclass(addressTo)) # From - typecode = _get_global_element_declaration(namespaceURI, "From") + typecode = GED(namespaceURI, "From") mihFrom = typecode.pyclass() mihFrom._Address = self.anonymousURI pyobjs.append(mihFrom) @@ -175,33 +179,15 @@ raise EvaluateException, 'endPointReference must have a typecode attribute' if isinstance(endPointReference.typecode, \ - _get_type_definition(namespaceURI ,'EndpointReferenceType')) is False: + GTD(namespaceURI ,'EndpointReferenceType')) is False: raise EvaluateException, 'endPointReference must be of type %s' \ - %_get_type_definition(namespaceURI ,'EndpointReferenceType') + %GTD(namespaceURI ,'EndpointReferenceType') - find = lambda what: isinstance(what,tc) - ncname = 'ReferencePropertiesType' - tc = _get_type_definition(namespaceURI, ncname) - what = filter(find, endPointReference.typecode.ofwhat) - if len(what) != 1: - raise EvaluateException,\ - 'EPR must contain one element of type (%s,%s)' %(namespaceURI,ncname) + ReferenceProperties = endPointReference._ReferenceProperties + any = ReferenceProperties._any or [] + #if not (what.maxOccurs=='unbounded' and type(any) in _seqtypes): + # raise EvaluateException, 'ReferenceProperties <any> assumed maxOccurs unbounded' - what = what[0] - ReferenceProperties = getattr(endPointReference, what.aname) - - #Assuming maxOccurs=1 - tc = AnyElement - what = filter(find, what.ofwhat) - if len(what) != 1: - raise EvaluateException, 'EPR must contain one <any>' - - what = what[0] - any = getattr(ReferenceProperties, what.aname) - - if not (what.maxOccurs=='unbounded' and type(any) in _seqtypes): - raise EvaluateException, 'ReferenceProperties <any> assumed maxOccurs unbounded' - for v in any: if not hasattr(v,'typecode'): raise EvaluateException, '<any> element, instance missing typecode attribute' @@ -227,10 +213,10 @@ (namespaceURI, "RelatesTo", address.getMessageID()), (namespaceURI, "To", self.anonymousURI),): - typecode = _get_global_element_declaration(nsuri, name) + typecode = GED(nsuri, name) pyobjs.append(typecode.pyclass(value)) - typecode = _get_global_element_declaration(nsuri, "From") + typecode = GED(nsuri, "From") pyobj = typecode.pyclass() pyobj._Address = self.From pyobjs.append(pyobj) Modified: trunk/zsi/ZSI/generate/commands.py =================================================================== --- trunk/zsi/ZSI/generate/commands.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/generate/commands.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -36,6 +36,11 @@ ServiceHeaderContainer.imports.remove('from ZSI import client') ServiceHeaderContainer.imports.append('from ZSI.twisted import client') + +def SetUpLazyEvaluation(option, opt, value, parser, *args, **kwargs): + from ZSI.generate.containers import TypecodeContainerBase + TypecodeContainerBase.lazy = True + def formatSchemaObject(fname, schemaObj): """ In the case of a 'schema only' generation (-s) this creates @@ -99,6 +104,12 @@ 'metaclass':'pyclass_type'}, help="add convenience functions for complexTypes, including Getters, Setters, factory methods, and properties (via metaclass). *** DONT USE WITH --simple-naming ***") + # Lazy Evaluation of Typecodes (done at serialization/parsing when needed). + op.add_option("-l", "--lazy", + action="callback", callback=SetUpLazyEvaluation, + callback_kwargs={}, + help="EXPERIMENTAL: recursion error solution, lazy evalution of typecodes") + # Use Twisted op.add_option("-w", "--twisted", action="callback", callback=SetUpTwistedClient, Modified: trunk/zsi/ZSI/generate/containers.py =================================================================== --- trunk/zsi/ZSI/generate/containers.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/generate/containers.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -1036,6 +1036,7 @@ 'import ZSI', 'import ZSI.TCcompound', 'from ZSI.TC import ElementDeclaration,TypeDefinition', + 'from ZSI.TC import _get_type_definition as GTD, _get_global_element_declaration as GED', ] logger = _GetLogger("TypesHeaderContainer") @@ -1087,6 +1088,7 @@ mixed_content_aname = 'text' attributes_aname = 'attrs' metaclass = None + lazy = False logger = _GetLogger("TypecodeContainerBase") def __init__(self, do_extended=False, extPyClasses=None): @@ -1111,12 +1113,14 @@ self.extraFlags = '' self.attrComponents = None + # --> EXTENDED # Used if an external pyclass was specified for this type. self.do_extended = do_extended if extPyClasses is None: self.extPyClasses = {} else: self.extPyClasses = extPyClasses + # <-- def getvalue(self): out = ContainerBase.getvalue(self) @@ -1193,38 +1197,46 @@ return self.mangle( classname ) + # --> EXTENDED def hasExtPyClass(self): if self.name in self.extPyClasses: return True else: return False + # <-- def getPyClass(self): '''Name of generated inner class that will be specified as pyclass. ''' + # --> EXTENDED if self.hasExtPyClass(): classInfo = self.extPyClasses[self.name] return ".".join(classInfo) - else: - return 'Holder' + # <-- + + return 'Holder' def getPyClassDefinition(self): '''Return a list containing pyclass definition. ''' kw = KW.copy() + + # --> EXTENDED if self.hasExtPyClass(): classInfo = self.extPyClasses[self.name] kw['classInfo'] = classInfo[0] return ["%(ID3)simport %(classInfo)s" %kw ] + # <-- kw['pyclass'] = self.getPyClass() - definition = [] definition.append('%(ID3)sclass %(pyclass)s:' %kw) if self.metaclass is not None: kw['type'] = self.metaclass definition.append('%(ID4)s__metaclass__ = %(type)s' %kw) definition.append('%(ID4)stypecode = self' %kw) + + #TODO: Remove pyclass holder __init__ --> definition.append('%(ID4)sdef __init__(self):' %kw) definition.append('%(ID5)s# pyclass' %kw) @@ -1236,8 +1248,9 @@ kw['element'] = el definition.append('%(ID2)s%(element)s' %kw) definition.append('%(ID5)sreturn' %kw) - - # JRB give pyclass a descriptive name + # <-- + + # pyclass descriptive name if self.name is not None: kw['name'] = self.name definition.append(\ @@ -1291,7 +1304,9 @@ def _setUpElements(self): - """This method ONLY sets up the instance attributes. + """TODO: Remove this method + + This method ONLY sets up the instance attributes. Dependency instance attribute: mgContent -- expected to be either a complex definition with model group content, a model group, or model group @@ -1530,23 +1545,26 @@ if ns in SCHEMA.XSD_LIST: tpc = BTI.get_typeclass(global_type[1],global_type[0]) tc.klass = tpc - elif (self.ns,self.name) == global_type: - # elif self._isRecursiveElement(c) - # TODO: Remove this, it only works for 1 level. - tc.setStyleRecursion() +# elif (self.ns,self.name) == global_type: +# # elif self._isRecursiveElement(c) +# # TODO: Remove this, it only works for 1 level. +# tc.setStyleRecursion() else: - tc.klass = '%s.%s' % (NAD.getAlias(ns), - type_class_name(global_type[1])) + tc.setGlobalType(*global_type) +# tc.klass = '%s.%s' % (NAD.getAlias(ns), +# type_class_name(global_type[1])) del ns elif content is not None and content.isLocal() and content.isComplex(): tc.name = c.getAttribute('name') - tc.klass = 'self.__class__.%s' % (element_class_name(tc.name) ) + tc.klass = 'self.__class__.%s' % (element_class_name(tc.name)) + #TODO: Not an element reference, confusing nomenclature tc.setStyleElementReference() self.localTypes.append(c) elif content is not None and content.isLocal() and content.isSimple(): # Local Simple Type tc.name = c.getAttribute('name') tc.klass = 'self.__class__.%s' % (element_class_name(tc.name)) + #TODO: Not an element reference, confusing nomenclature tc.setStyleElementReference() self.localTypes.append(c) else: @@ -1554,10 +1572,11 @@ elif c.isReference(): # element references - ns = c.getAttribute('ref')[0] - tc.klass = '%s.%s' % (NAD.getAlias(ns), - element_class_name(c.getAttribute('ref')[1]) ) + ref = c.getAttribute('ref') +# tc.klass = '%s.%s' % (NAD.getAlias(ref[0]), +# element_class_name(ref[1]) ) tc.setStyleElementReference() + tc.setGlobalType(*ref) else: raise ContainerError, 'unexpected item: %s' % c.getItemTrace() @@ -1723,6 +1742,7 @@ self.qualified = qualified self.name = None self.klass = None + self.global_type = None self.min = None self.max = None @@ -1738,6 +1758,9 @@ def setProcessContents(self, processContents): self.processContents = processContents + def setGlobalType(self, namespace, name): + self.global_type = (namespace, name) + def setStyleElementDeclaration(self): '''set the element style. standard -- GED or local element @@ -1758,9 +1781,7 @@ self.style = 'anyElement' def setStyleRecursion(self): - '''set the element style. - recursion -- do lazy evaluation of element/type because - the element contains an instance of itself. + '''TODO: Change name or remove. For Element Declarations? not recursion ''' self.style = 'recursion' @@ -1778,22 +1799,39 @@ % (self.processContents) def _getvalue(self): + kw = {'occurs':self._getOccurs(), + 'aname':self.getAttributeName(self.name), + 'klass':self.klass, + 'lazy':TypecodeContainerBase.lazy, + 'typed':'typed=False', + 'encoded':'encoded=kw.get("encoded")'} + + gt = self.global_type + if gt is not None: + kw['nsuri'],kw['type'] = gt + if self.style == 'standard': - pname = '"%s"' %self.name + kw['pname'] = '"%s"' %self.name if self.qualified is True: - pname = '(ns,"%s")' %self.name - return '%s(pname=%s, aname="%s", %s, encoded=kw.get("encoded"))' \ - % (self.klass, pname, - self.getAttributeName(self.name), self._getOccurs()) - elif self.style == 'ref': - return '%s(%s, encoded=kw.get("encoded"))' % (self.klass, self._getOccurs()) - elif self.style == 'anyElement': - return 'ZSI.TC.AnyElement(aname="%s", %s, %s)' \ - %(self.getAttributeName(self.name), self._getOccurs(), self._getProcessContents()) - elif self.style == 'recursion': - return 'ZSI.TC.AnyElement(aname="%s", %s, %s)' \ - % (self.getAttributeName(self.name), self._getOccurs(), self._getProcessContents()) + kw['pname'] = '(ns,"%s")' %self.name + if gt is None: + return '%(klass)s(pname=%(pname)s, aname="%(aname)s", %(occurs)s, %(typed)s, %(encoded)s)' %kw + return 'GTD("%(nsuri)s","%(type)s",lazy=%(lazy)s)(pname=%(pname)s, aname="%(aname)s", %(occurs)s, %(typed)s, %(encoded)s)' %kw + + if self.style == 'ref': + if gt is None: + return '%(klass)s(%(occurs)s, %(encoded)s)' %kw + return 'GED("%(nsuri)s","%(type)s",lazy=%(lazy)s, isref=True)(%(occurs)s, %(encoded)s)' %kw + + kw['process'] = self._getProcessContents() + if self.style == 'anyElement': + return 'ZSI.TC.AnyElement(aname="%(aname)s", %(occurs)s, %(process)s)' %kw + + if self.style == 'recursion': + return 'ZSI.TC.AnyElement(aname="%(aname)s", %(occurs)s, %(process)s)' %kw + raise RuntimeError, 'Must set style for typecode list generation' + def __str__(self): return self._getvalue() @@ -1819,7 +1857,7 @@ pname = '"%s"' %self.name if self.qualified is True: pname = '(ns,"%s")' %self.name - return '%s(pname=%s, aname="%s", encoded=%s, %s)' \ + return '%s(pname=%s, aname="%s", typed=False, encoded=%s, %s)' \ %(self.klass, pname, self.getAttributeName(self.name), encoded, self._getOccurs()) elif self.style == 'ref': Modified: trunk/zsi/ZSI/generate/pyclass.py =================================================================== --- trunk/zsi/ZSI/generate/pyclass.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/ZSI/generate/pyclass.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -143,7 +143,6 @@ return type.__new__(cls,classname,bases,classdict) def __create_functions_from_what(what): - def get(self): return getattr(self, what.aname) get.im_func = 'get_element_%s' %what.aname @@ -151,34 +150,54 @@ if what.maxOccurs > 1: def set(self, value): if not (value is None or hasattr(value, '__iter__')): - value = [value] + raise TypeError, 'expecting an iterable instance' setattr(self, what.aname, value) else: def set(self, value): setattr(self, what.aname, value) - pyclass = what.pyclass if isinstance(what, TC.ComplexType) or isinstance(what, TC.Array): + def new_func(self): '''returns a mutable type ''' - return pyclass() + return what.pyclass() new_func.__name__ = 'new%s' %what.aname - elif pyclass is None: + + elif not callable(what): + def new_func(self, value): '''value -- initialize value - NOT IMPLEMENTED FOR %s, UNSUPPORTED TYPECODE. - ''' %what.__class__ - raise NotImplementedError,\ - 'no support built in for %s right now' %what.__class__ - - new_func = None + returns an immutable type + ''' + return what.pyclass(value) + new_func.__name__ = 'new%s' %what.aname + + elif (issubclass(what.klass, TC.ComplexType) or + issubclass(what.klass, TC.Array)): + + def new_func(self): + '''returns a mutable type + ''' + return what().pyclass() + new_func.__name__ = 'new%s' %what.aname + +# elif what.pyclass is None: +# def new_func(self, value): +# '''value -- initialize value +# NOT IMPLEMENTED FOR %s, UNSUPPORTED TYPECODE. +# ''' %what.__class__ +# raise NotImplementedError,\ +# 'no support built in for %s right now' %what.__class__ +# +# new_func = None else: + def new_func(self, value): '''value -- initialize value returns an immutable type ''' - return pyclass(value) + return what().pyclass(value) new_func.__name__ = 'new%s' %what.aname get.func_name = 'get_element_%s' %what.aname Modified: trunk/zsi/test/wsdl2py/ServiceTest.py =================================================================== --- trunk/zsi/test/wsdl2py/ServiceTest.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/test/wsdl2py/ServiceTest.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -42,6 +42,7 @@ DEBUG = CONFIG_PARSER.getboolean(SECTION_CONFIGURATION, 'debug') SKIP = CONFIG_PARSER.getboolean(SECTION_CONFIGURATION, 'skip') TWISTED = CONFIG_PARSER.getboolean(SECTION_CONFIGURATION, 'twisted') +LAZY = CONFIG_PARSER.getboolean(SECTION_CONFIGURATION, 'lazy') OUTPUT = CONFIG_PARSER.get(SECTION_CONFIGURATION, 'output') or sys.stdout if DEBUG: @@ -155,6 +156,9 @@ if TWISTED: self.wsdl2py_args.append('--twisted') + if LAZY: + self.wsdl2py_args.append('--lazy') + unittest.TestCase.__init__(self, methodName) write = lambda self, arg: self.out.write(arg) @@ -271,6 +275,7 @@ exit = subprocess.call(wsdl2py) except OSError, ex: warnings.warn("TODO: Not sure what is going on here?") + exit = -1 #TODO: returncode WINDOWS? self.failUnless(os.WIFEXITED(exit), Modified: trunk/zsi/test/wsdl2py/config.txt =================================================================== --- trunk/zsi/test/wsdl2py/config.txt 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/test/wsdl2py/config.txt 2006-06-28 22:14:03 UTC (rev 1241) @@ -8,6 +8,7 @@ # debug -- turn on debugging # skip -- skip generation steps, code generated don't generate again # twisted -- Use twisted web client +# lazy -- use lazy typecode evaluation # output -- file name where output will be stored, if unspecified test output goes to stdout # # [dispatch] -- configuration for test_dispatch* tests @@ -22,7 +23,8 @@ debug = False skip = False twisted = False -output = +lazy = False +output = [dispatch] host = localhost Modified: trunk/zsi/test/wsdl2py/test_OpcDaGateway.py =================================================================== --- trunk/zsi/test/wsdl2py/test_OpcDaGateway.py 2006-06-27 13:28:26 UTC (rev 1240) +++ trunk/zsi/test/wsdl2py/test_OpcDaGateway.py 2006-06-28 22:14:03 UTC (rev 1241) @@ -66,7 +66,8 @@ import time pyobj = self.client_module.ReadSoapOut() pyobj.RItemList = pyobj.new_RItemList() - item = pyobj.RItemList.Items = pyobj.RItemList.new_Items() + item = pyobj.RItemList.new_Items() + pyobj.RItemList.Items = [item,] item.typecode.ofwhat[1].processContents = 'lax' item.Value = 123 s = str(ZSI.SoapWriter().serialize(pyobj)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |