diff --git a/README b/README index c8fd5c346b777e0d3fdd10d962c80599954a51cb..bca66273267948a78c0ec12dace2723ac84222c3 100644 --- a/README +++ b/README @@ -141,6 +141,17 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- +Version 2.12d (04/02/2014) +- Fix for an infinite loop caused by inconsistent use of + mapped/clean names with list AlreadyGenerated. Thanks to Jerome + Allasia for catching this and for suggesting a fix. +- Added a unit test for the use of mapped/clean names, in particular + when one xs:complexType is an xs:extension of another. +- Changed several lists to sets for faster look-up, for example + AlreadyGenerated, AlreadyGenerated_subclass, DelayedElements, etc. +- Cleaned up the use of functions mapName() and cleanupName() to + avoid duplicate transformations. + Version 2.12c (03/28/2014) - Fix for "one module per XSD file" to handle an include or import element that refers to a *remote* schema on the Net (i.e. the diff --git a/generateDS.html b/generateDS.html index 29646502b44262edb6433b63bb3b46e07820c53b..b1e88d9389decadcd65d429f69f7c6f3667066d6 100644 --- a/generateDS.html +++ b/generateDS.html @@ -220,7 +220,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12d</td> </tr> </tbody> </table> @@ -229,7 +229,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">March 19, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">April 02, 2014</td> </tr> </tbody> </table> @@ -2872,7 +2872,7 @@ following among others:</p> <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateDS.txt">View document source</a>. -Generated on: 2014-03-19 16:03 UTC. +Generated on: 2014-04-02 22:08 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/generateDS.py b/generateDS.py index f47d77187157e88d9da1bf063c677c854e1041aa..87a07ca651c30ed9baa2fff59b9939b3a75df4e1 100755 --- a/generateDS.py +++ b/generateDS.py @@ -179,16 +179,16 @@ logging.disable(logging.INFO) # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.12c' +VERSION = '2.12d' ##VERSION## GenerateProperties = 0 UseGetterSetter = 'new' MemberSpecs = None -DelayedElements = [] -DelayedElements_subclass = [] -AlreadyGenerated = [] -AlreadyGenerated_subclass = [] +DelayedElements = set() +DelayedElements_subclass = set() +AlreadyGenerated = set() +AlreadyGenerated_subclass = set() PostponedExtensions = [] ElementsForSubclasses = [] ElementDict = {} @@ -1218,7 +1218,7 @@ class XschemaElement(XschemaElementBase): def collectElementNames(self, elementNames, count): for child in self.children: - elementNames.add(mapName(cleanupName(child.cleanName))) + elementNames.add(child.getCleanName()) base = self.getBase() if base and base in ElementDict: parent = ElementDict[base] @@ -2222,7 +2222,7 @@ def generateToEtreeChildren(wrt, element, Targetnamespace): else: for child in element.getChildren(): unmappedName = child.getName() - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() child_type = child.getType() if child_type == AnyTypeIdentifier: if child.getMaxOccurs() > 1: @@ -2469,7 +2469,7 @@ def generateExportChildren(wrt, element, hasChildren, namespace): any_type_child = None for child in element.getChildren(): unmappedName = child.getName() - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() # fix_abstract type_element = None abstract_child = False @@ -2532,11 +2532,11 @@ def getParentName(element): parentObj = None if base and base in ElementDict: parentObj = ElementDict[base] - parentName = cleanupName(parentObj.getName()) + parentName = parentObj.getCleanName() elif rBase: base = element.getRestrictionBase() parentObj = ElementDict[base] - parentName = cleanupName(parentObj.getName()) + parentName = parentObj.getCleanName() return parentName, parentObj @@ -3236,8 +3236,8 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): if type_element and type_element.isAbstract(): abstract_child = True if not delayed and not child in DelayedElements: - DelayedElements.append(child) - DelayedElements_subclass.append(child) + DelayedElements.add(child) + DelayedElements_subclass.add(child) wrt(" %s nodeName_ == '%s':\n" % (keyword, origName, )) if abstract_child: wrt(TEMPLATE_ABSTRACT_CHILD % (mappedName, )) @@ -3459,8 +3459,8 @@ def generateBuildStandard_1( if type_element and type_element.isAbstract(): abstract_child = True if not delayed and not child in DelayedElements: - DelayedElements.append(child) - DelayedElements_subclass.append(child) + DelayedElements.add(child) + DelayedElements_subclass.add(child) wrt(" %s nodeName_ == '%s':\n" % (keyword, origName, )) # Is this a simple type? if child.getSimpleType(): @@ -4162,7 +4162,7 @@ def generateHascontentMethod(wrt, element): if child.getType() == AnyTypeIdentifier: name = 'anytypeobjs_' else: - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() if not firstTime: wrt(' or\n') firstTime = False @@ -4190,6 +4190,7 @@ def generateHascontentMethod(wrt, element): def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''): logging.debug("Generating class for: %s" % element) + mappedName = element.getCleanName() parentName, base = getParentName(element) logging.debug("Element base: %s" % base) if not element.isExplicitDefine(): @@ -4203,9 +4204,9 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''): if parentName not in AlreadyGenerated: PostponedExtensions.append(element) return - if mapName(element.getName()) in AlreadyGenerated: + if mappedName in AlreadyGenerated: return - AlreadyGenerated.append(element.getName()) + AlreadyGenerated.add(mappedName) if element.getMixedExtensionError(): err_msg('*** Element %s extension chain contains mixed and ' 'non-mixed content. Not generated.\n' % @@ -4234,7 +4235,7 @@ def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''): parentName, parent = getParentName(element) superclass_name = 'None' if parentName and parentName in AlreadyGenerated: - superclass_name = mapName(cleanupName(parentName)) + superclass_name = parentName wrt(' superclass = %s\n' % (superclass_name, )) generateCtor(wrt, element) wrt(' def factory(*args_, **kwargs_):\n') @@ -5062,10 +5063,11 @@ if __name__ == '__main__': def generateMain(outfile, prefix, root): exportDictLine = "GDSClassesMapping = {\n" for classType in MappingTypes: - if MappingTypes[classType] in AlreadyGenerated: + mappedName = mapName(cleanupName(MappingTypes[classType])) + if mappedName in AlreadyGenerated: exportDictLine += " '%s': %s,\n" % ( - classType, - cleanupName(mapName(MappingTypes[classType]))) + classType, mappedName, + ) exportDictLine += "}\n\n\n" outfile.write(exportDictLine) children = root.getChildren() @@ -5284,9 +5286,10 @@ def generateClassBehaviors(wrt, classBehaviors, baseImplUrl): def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl): if not element.isComplex(): return - if element.getName() in AlreadyGenerated_subclass: + mappedName = element.getCleanName() + if mappedName in AlreadyGenerated_subclass: return - AlreadyGenerated_subclass.append(element.getName()) + AlreadyGenerated_subclass.add(mappedName) name = element.getCleanName() wrt('class %s%s%s(supermod.%s):\n' % (prefix, name, SubclassSuffix, name)) childCount = countChildren(element, 0) @@ -5754,7 +5757,7 @@ def generate(outfileName, subclassFilename, behaviorFilename, # because it produces data structures needed during generation of # subclasses. MappingTypes.clear() - AlreadyGenerated = [] + AlreadyGenerated = set() outfile = None if outfileName: outfile = makeFile(outfileName) @@ -5765,8 +5768,8 @@ def generate(outfileName, subclassFilename, behaviorFilename, externalImports = getImportsForExternalXsds(root) generateHeader(wrt, prefix, options, args, externalImports) #generateSimpleTypes(outfile, prefix, SimpleTypeDict) - DelayedElements = [] - DelayedElements_subclass = [] + DelayedElements = set() + DelayedElements_subclass = set() elements = root.getChildren() generateFromTree(wrt, prefix, elements, processed) while 1: @@ -5889,10 +5892,10 @@ def parseAndGenerate( global DelayedElements, DelayedElements_subclass, \ AlreadyGenerated, SaxDelayedElements, \ AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule - DelayedElements = [] - DelayedElements_subclass = [] - AlreadyGenerated = [] - AlreadyGenerated_subclass = [] + DelayedElements = set() + DelayedElements_subclass = set() + AlreadyGenerated = set() + AlreadyGenerated_subclass = set() if UserMethodsPath: # UserMethodsModule = __import__(UserMethodsPath) path_list = UserMethodsPath.split('.') @@ -5935,7 +5938,7 @@ def parseAndGenerate( # can do a reasonably safe "from parser import *" if outfileName: exportableClassList = [ - '"%s"' % mapName(cleanupName(name)) + '"%s"' % name for name in AlreadyGenerated] exportableClassList.sort() exportableClassNames = ',\n '.join(exportableClassList) @@ -6009,7 +6012,7 @@ def parseAndGenerate( # to isolate important classes from internal ones. This way one # can do a reasonably safe "from parser import *" exportableClassList = [ - '"%s"' % mapName(cleanupName(name)) + '"%s"' % name for name in AlreadyGenerated] exportableClassList.sort() exportableClassNames = ',\n '.join(exportableClassList) diff --git a/generateDS.txt b/generateDS.txt index 0f2f866d9cbd9b442b33273e2186eef93749aa6a..9cab68ce1d159ed644936fa3a2d3e07e0b797635 100644 --- a/generateDS.txt +++ b/generateDS.txt @@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema .. version -:revision: 2.12c +:revision: 2.12d .. version diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py index f080d53c20b5e5c3b1e8dc86d4b7fed401564916..43bcb6d52b7cf0a1b870a92634faa7a3d088c041 100755 --- a/gui/generateds_gui.py +++ b/gui/generateds_gui.py @@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.12c' +VERSION = '2.12d' ##VERSION## diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py index f080d53c20b5e5c3b1e8dc86d4b7fed401564916..43bcb6d52b7cf0a1b870a92634faa7a3d088c041 100755 --- a/libgenerateDS/gui/generateds_gui.py +++ b/libgenerateDS/gui/generateds_gui.py @@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.12c' +VERSION = '2.12d' ##VERSION## diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html index f6402d70f4eb2c07a0263e862aaf1ab0205191a6..3d35551c9337b6a8e6cf94f5c8e4fcf4b5a348ca 100644 --- a/librarytemplate_howto.html +++ b/librarytemplate_howto.html @@ -217,7 +217,7 @@ ul.auto-toc { <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12d</td> </tr> </tbody> </table> @@ -226,7 +226,7 @@ ul.auto-toc { <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">March 18, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">April 02, 2014</td> </tr> </tbody> </table> @@ -380,7 +380,7 @@ this command for your needs. For example, you may need to use <div class="footer"> <hr class="footer" /> <a class="reference external" href="librarytemplate_howto.txt">View document source</a>. -Generated on: 2014-03-18 20:35 UTC. +Generated on: 2014-04-02 22:08 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt index 7cacd251507ca11c68c798e8d61b93511a21f924..aa8320eb2321e8ebfd26da4b0b1e20965f3c3736 100644 --- a/librarytemplate_howto.txt +++ b/librarytemplate_howto.txt @@ -8,7 +8,7 @@ How to package a generateDS.py generated library .. version -:revision: 2.12c +:revision: 2.12d .. version diff --git a/process_includes.py b/process_includes.py index 93804d7966e34a97893dbc0fbae71c262de5d689..296e2929aa12213d537956faa8587371bb727589 100755 --- a/process_includes.py +++ b/process_includes.py @@ -30,7 +30,7 @@ from lxml import etree # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.12c' +VERSION = '2.12d' ##VERSION## CatalogDict = {} diff --git a/setup.py b/setup.py index 994ca23158d139e3843af64b562dca3a5ee187e9..28ea05e38e1f7edd911650509f206084d97019e4 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup(name="generateDS", # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## - version="2.12c", + version="2.12d", ##VERSION## author="Dave Kuhlman", author_email="dkuhlman@rexx.com", diff --git a/tests/mapcleanname.xsd b/tests/mapcleanname.xsd new file mode 100644 index 0000000000000000000000000000000000000000..7e6396978ea78f7b78bc98f8e551b305a06ffe42 --- /dev/null +++ b/tests/mapcleanname.xsd @@ -0,0 +1,74 @@ +<?xml version="1.0"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:complexType name="complex-type01"> + <xs:sequence> + <xs:element name="string_value01" type="xs:string"/> + <xs:element name="integer_value01" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value01" type="xs:float"/> + <xs:element name="field01" type="complex-type02"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type02"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type03"> + <xs:extension base="complex-type02"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + + <xs:complexType name="type"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type04"> + <xs:extension base="type"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + + <xs:complexType name="build"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type05"> + <xs:extension base="build"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + +</xs:schema> diff --git a/tests/mapcleanname1_sub.py b/tests/mapcleanname1_sub.py new file mode 100644 index 0000000000000000000000000000000000000000..29b2d560cae9e4fd1620e337b071856ea3a4ca2d --- /dev/null +++ b/tests/mapcleanname1_sub.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys + +import mapcleanname2_sup as supermod + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class complex_type01Sub(supermod.complex_type01): + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + super(complex_type01Sub, self).__init__(string_value01, integer_value01, float_value01, field01, ) +supermod.complex_type01.subclass = complex_type01Sub +# end class complex_type01Sub + + +class complex_type02Sub(supermod.complex_type02): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(complex_type02Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.complex_type02.subclass = complex_type02Sub +# end class complex_type02Sub + + +class complex_type03Sub(supermod.complex_type03): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type03Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type03.subclass = complex_type03Sub +# end class complex_type03Sub + + +class type_Sub(supermod.type_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(type_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.type_.subclass = type_Sub +# end class type_Sub + + +class complex_type04Sub(supermod.complex_type04): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type04Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type04.subclass = complex_type04Sub +# end class complex_type04Sub + + +class build_Sub(supermod.build_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(build_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.build_.subclass = build_Sub +# end class build_Sub + + +class complex_type05Sub(supermod.complex_type05): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type05Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type05.subclass = complex_type05Sub +# end class complex_type05Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + doc = parsexml_(StringIO(inString)) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py new file mode 100644 index 0000000000000000000000000000000000000000..71a2c784ab44bf7300c71152ee99562941f8f8d8 --- /dev/null +++ b/tests/mapcleanname1_sup.py @@ -0,0 +1,1733 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import getopt +import re as re_ +import base64 +import datetime as datetime_ + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError, exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_integer_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return input_data + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_float_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return input_data + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_double_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return input_data + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_boolean_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return input_data + def gds_validate_datetime(self, input_data, node, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'ascii' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + if not inStr: + return '' + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + if XMLParser_import_library == XMLParser_import_lxml: + msg = '%s (element %s/line %d)' % ( + msg, node.tag, node.sourceline, ) + else: + msg = '%s (element %s)' % (msg, node.tag, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name + def export(self, outfile, level, name, namespace, pretty_print=True): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + outfile.write(self.value) + elif self.category == MixedContainer.CategorySimple: + self.exportSimple(outfile, level, name) + else: # category == MixedContainer.CategoryComplex + self.value.export(outfile, level, namespace, name, pretty_print) + def exportSimple(self, outfile, level, name): + if self.content_type == MixedContainer.TypeString: + outfile.write('<%s>%s</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeInteger or \ + self.content_type == MixedContainer.TypeBoolean: + outfile.write('<%s>%d</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeFloat or \ + self.content_type == MixedContainer.TypeDecimal: + outfile.write('<%s>%f</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeDouble: + outfile.write('<%s>%g</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeBase64: + outfile.write('<%s>%s</%s>' % ( + self.name, base64.b64encode(self.value), self.name)) + def to_etree(self, element): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + if len(element) > 0: + if element[-1].tail is None: + element[-1].tail = self.value + else: + element[-1].tail += self.value + else: + if element.text is None: + element.text = self.value + else: + element.text += self.value + elif self.category == MixedContainer.CategorySimple: + subelement = etree_.SubElement(element, '%s' % self.name) + subelement.text = self.to_etree_simple() + else: # category == MixedContainer.CategoryComplex + self.value.to_etree(element) + def to_etree_simple(self): + if self.content_type == MixedContainer.TypeString: + text = self.value + elif (self.content_type == MixedContainer.TypeInteger or + self.content_type == MixedContainer.TypeBoolean): + text = '%d' % self.value + elif (self.content_type == MixedContainer.TypeFloat or + self.content_type == MixedContainer.TypeDecimal): + text = '%f' % self.value + elif self.content_type == MixedContainer.TypeDouble: + text = '%g' % self.value + elif self.content_type == MixedContainer.TypeBase64: + text = '%s' % base64.b64encode(self.value) + return text + def exportLiteral(self, outfile, level, name): + if self.category == MixedContainer.CategoryText: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + elif self.category == MixedContainer.CategorySimple: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + else: # category == MixedContainer.CategoryComplex + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s",\n' % ( + self.category, self.content_type, self.name,)) + self.value.exportLiteral(outfile, level + 1) + showIndent(outfile, level) + outfile.write(')\n') + + +class MemberSpec_(object): + def __init__(self, name='', data_type='', container=0): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class complex_type01(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value01', 'xs:string', 0), + MemberSpec_('integer_value01', 'xs:integer', 1), + MemberSpec_('float_value01', 'xs:float', 0), + MemberSpec_('field01', 'complex-type02', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + self.original_tagname_ = None + self.string_value01 = string_value01 + if integer_value01 is None: + self.integer_value01 = [] + else: + self.integer_value01 = integer_value01 + self.float_value01 = float_value01 + self.field01 = field01 + def factory(*args_, **kwargs_): + if complex_type01.subclass: + return complex_type01.subclass(*args_, **kwargs_) + else: + return complex_type01(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value01(self): return self.string_value01 + def set_string_value01(self, string_value01): self.string_value01 = string_value01 + def get_integer_value01(self): return self.integer_value01 + def set_integer_value01(self, integer_value01): self.integer_value01 = integer_value01 + def add_integer_value01(self, value): self.integer_value01.append(value) + def insert_integer_value01(self, index, value): self.integer_value01[index] = value + def get_float_value01(self): return self.float_value01 + def set_float_value01(self, float_value01): self.float_value01 = float_value01 + def get_field01(self): return self.field01 + def set_field01(self, field01): self.field01 = field01 + def hasContent_(self): + if ( + self.string_value01 is not None or + self.integer_value01 or + self.float_value01 is not None or + self.field01 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type01', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type01') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type01', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type01'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type01', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value01).encode(ExternalEncoding), input_name='string_value01'), namespace_, eol_)) + for integer_value01_ in self.integer_value01: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value01>%s</%sinteger_value01>%s' % (namespace_, self.gds_format_integer(integer_value01_, input_name='integer_value01'), namespace_, eol_)) + if self.float_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value01>%s</%sfloat_value01>%s' % (namespace_, self.gds_format_float(self.float_value01, input_name='float_value01'), namespace_, eol_)) + if self.field01 is not None: + self.field01.export(outfile, level, namespace_, name_='field01', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='complex-type01'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value01 is not None: + showIndent(outfile, level) + outfile.write('string_value01=%s,\n' % quote_python(self.string_value01).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value01=[\n') + level += 1 + for integer_value01_ in self.integer_value01: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value01_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value01 is not None: + showIndent(outfile, level) + outfile.write('float_value01=%f,\n' % self.float_value01) + if self.field01 is not None: + showIndent(outfile, level) + outfile.write('field01=model_.complex_type02(\n') + self.field01.exportLiteral(outfile, level, name_='field01') + showIndent(outfile, level) + outfile.write('),\n') + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value01': + string_value01_ = child_.text + string_value01_ = self.gds_validate_string(string_value01_, node, 'string_value01') + self.string_value01 = string_value01_ + elif nodeName_ == 'integer_value01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value01') + self.integer_value01.append(ival_) + elif nodeName_ == 'float_value01': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value01') + self.float_value01 = fval_ + elif nodeName_ == 'field01': + obj_ = complex_type02.factory() + obj_.build(child_) + self.field01 = obj_ + obj_.original_tagname_ = 'field01' +# end class complex_type01 + + +class complex_type02(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if complex_type02.subclass: + return complex_type02.subclass(*args_, **kwargs_) + else: + return complex_type02(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type02', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type02') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type02', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type02'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type02', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type02'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class complex_type02 + + +class complex_type03(complex_type02): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = complex_type02 + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type03, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type03.subclass: + return complex_type03.subclass(*args_, **kwargs_) + else: + return complex_type03(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type03, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type03', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type03', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type03'): + super(complex_type03, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type03', fromsubclass_=False, pretty_print=True): + super(complex_type03, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type03'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type03, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type03, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type03, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type03, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type03 + + +class type_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if type_.subclass: + return type_.subclass(*args_, **kwargs_) + else: + return type_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='type', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='type') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='type', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='type'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='type', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='type'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class type_ + + +class complex_type04(type_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = type_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type04, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type04.subclass: + return complex_type04.subclass(*args_, **kwargs_) + else: + return complex_type04(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type04, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type04', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type04', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type04'): + super(complex_type04, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type04', fromsubclass_=False, pretty_print=True): + super(complex_type04, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type04'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type04, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type04, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type04, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type04, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type04 + + +class build_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if build_.subclass: + return build_.subclass(*args_, **kwargs_) + else: + return build_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='build', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='build') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='build', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='build'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='build', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='build'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class build_ + + +class complex_type05(build_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = build_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type05, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type05.subclass: + return complex_type05.subclass(*args_, **kwargs_) + else: + return complex_type05(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type05, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type05', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type05', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type05'): + super(complex_type05, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type05', fromsubclass_=False, pretty_print=True): + super(complex_type05, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type05'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type05, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type05, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type05, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type05, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type05 + + +GDSClassesMapping = { + 'field01': complex_type02, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + doc = parsexml_(StringIO(inString)) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "build_", + "complex_type01", + "complex_type02", + "complex_type03", + "complex_type04", + "complex_type05", + "type_" +] diff --git a/tests/mapcleanname2_sub.py b/tests/mapcleanname2_sub.py new file mode 100644 index 0000000000000000000000000000000000000000..29b2d560cae9e4fd1620e337b071856ea3a4ca2d --- /dev/null +++ b/tests/mapcleanname2_sub.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys + +import mapcleanname2_sup as supermod + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class complex_type01Sub(supermod.complex_type01): + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + super(complex_type01Sub, self).__init__(string_value01, integer_value01, float_value01, field01, ) +supermod.complex_type01.subclass = complex_type01Sub +# end class complex_type01Sub + + +class complex_type02Sub(supermod.complex_type02): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(complex_type02Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.complex_type02.subclass = complex_type02Sub +# end class complex_type02Sub + + +class complex_type03Sub(supermod.complex_type03): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type03Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type03.subclass = complex_type03Sub +# end class complex_type03Sub + + +class type_Sub(supermod.type_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(type_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.type_.subclass = type_Sub +# end class type_Sub + + +class complex_type04Sub(supermod.complex_type04): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type04Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type04.subclass = complex_type04Sub +# end class complex_type04Sub + + +class build_Sub(supermod.build_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(build_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.build_.subclass = build_Sub +# end class build_Sub + + +class complex_type05Sub(supermod.complex_type05): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type05Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type05.subclass = complex_type05Sub +# end class complex_type05Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + doc = parsexml_(StringIO(inString)) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/mapcleanname2_sup.py b/tests/mapcleanname2_sup.py new file mode 100644 index 0000000000000000000000000000000000000000..71a2c784ab44bf7300c71152ee99562941f8f8d8 --- /dev/null +++ b/tests/mapcleanname2_sup.py @@ -0,0 +1,1733 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import getopt +import re as re_ +import base64 +import datetime as datetime_ + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError, exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_integer_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return input_data + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_float_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return input_data + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_double_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return input_data + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % input_data + def gds_validate_boolean_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return input_data + def gds_validate_datetime(self, input_data, node, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'ascii' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + if not inStr: + return '' + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + if XMLParser_import_library == XMLParser_import_lxml: + msg = '%s (element %s/line %d)' % ( + msg, node.tag, node.sourceline, ) + else: + msg = '%s (element %s)' % (msg, node.tag, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name + def export(self, outfile, level, name, namespace, pretty_print=True): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + outfile.write(self.value) + elif self.category == MixedContainer.CategorySimple: + self.exportSimple(outfile, level, name) + else: # category == MixedContainer.CategoryComplex + self.value.export(outfile, level, namespace, name, pretty_print) + def exportSimple(self, outfile, level, name): + if self.content_type == MixedContainer.TypeString: + outfile.write('<%s>%s</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeInteger or \ + self.content_type == MixedContainer.TypeBoolean: + outfile.write('<%s>%d</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeFloat or \ + self.content_type == MixedContainer.TypeDecimal: + outfile.write('<%s>%f</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeDouble: + outfile.write('<%s>%g</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeBase64: + outfile.write('<%s>%s</%s>' % ( + self.name, base64.b64encode(self.value), self.name)) + def to_etree(self, element): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + if len(element) > 0: + if element[-1].tail is None: + element[-1].tail = self.value + else: + element[-1].tail += self.value + else: + if element.text is None: + element.text = self.value + else: + element.text += self.value + elif self.category == MixedContainer.CategorySimple: + subelement = etree_.SubElement(element, '%s' % self.name) + subelement.text = self.to_etree_simple() + else: # category == MixedContainer.CategoryComplex + self.value.to_etree(element) + def to_etree_simple(self): + if self.content_type == MixedContainer.TypeString: + text = self.value + elif (self.content_type == MixedContainer.TypeInteger or + self.content_type == MixedContainer.TypeBoolean): + text = '%d' % self.value + elif (self.content_type == MixedContainer.TypeFloat or + self.content_type == MixedContainer.TypeDecimal): + text = '%f' % self.value + elif self.content_type == MixedContainer.TypeDouble: + text = '%g' % self.value + elif self.content_type == MixedContainer.TypeBase64: + text = '%s' % base64.b64encode(self.value) + return text + def exportLiteral(self, outfile, level, name): + if self.category == MixedContainer.CategoryText: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + elif self.category == MixedContainer.CategorySimple: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + else: # category == MixedContainer.CategoryComplex + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s",\n' % ( + self.category, self.content_type, self.name,)) + self.value.exportLiteral(outfile, level + 1) + showIndent(outfile, level) + outfile.write(')\n') + + +class MemberSpec_(object): + def __init__(self, name='', data_type='', container=0): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class complex_type01(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value01', 'xs:string', 0), + MemberSpec_('integer_value01', 'xs:integer', 1), + MemberSpec_('float_value01', 'xs:float', 0), + MemberSpec_('field01', 'complex-type02', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + self.original_tagname_ = None + self.string_value01 = string_value01 + if integer_value01 is None: + self.integer_value01 = [] + else: + self.integer_value01 = integer_value01 + self.float_value01 = float_value01 + self.field01 = field01 + def factory(*args_, **kwargs_): + if complex_type01.subclass: + return complex_type01.subclass(*args_, **kwargs_) + else: + return complex_type01(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value01(self): return self.string_value01 + def set_string_value01(self, string_value01): self.string_value01 = string_value01 + def get_integer_value01(self): return self.integer_value01 + def set_integer_value01(self, integer_value01): self.integer_value01 = integer_value01 + def add_integer_value01(self, value): self.integer_value01.append(value) + def insert_integer_value01(self, index, value): self.integer_value01[index] = value + def get_float_value01(self): return self.float_value01 + def set_float_value01(self, float_value01): self.float_value01 = float_value01 + def get_field01(self): return self.field01 + def set_field01(self, field01): self.field01 = field01 + def hasContent_(self): + if ( + self.string_value01 is not None or + self.integer_value01 or + self.float_value01 is not None or + self.field01 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type01', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type01') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type01', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type01'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type01', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value01).encode(ExternalEncoding), input_name='string_value01'), namespace_, eol_)) + for integer_value01_ in self.integer_value01: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value01>%s</%sinteger_value01>%s' % (namespace_, self.gds_format_integer(integer_value01_, input_name='integer_value01'), namespace_, eol_)) + if self.float_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value01>%s</%sfloat_value01>%s' % (namespace_, self.gds_format_float(self.float_value01, input_name='float_value01'), namespace_, eol_)) + if self.field01 is not None: + self.field01.export(outfile, level, namespace_, name_='field01', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='complex-type01'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value01 is not None: + showIndent(outfile, level) + outfile.write('string_value01=%s,\n' % quote_python(self.string_value01).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value01=[\n') + level += 1 + for integer_value01_ in self.integer_value01: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value01_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value01 is not None: + showIndent(outfile, level) + outfile.write('float_value01=%f,\n' % self.float_value01) + if self.field01 is not None: + showIndent(outfile, level) + outfile.write('field01=model_.complex_type02(\n') + self.field01.exportLiteral(outfile, level, name_='field01') + showIndent(outfile, level) + outfile.write('),\n') + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value01': + string_value01_ = child_.text + string_value01_ = self.gds_validate_string(string_value01_, node, 'string_value01') + self.string_value01 = string_value01_ + elif nodeName_ == 'integer_value01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value01') + self.integer_value01.append(ival_) + elif nodeName_ == 'float_value01': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value01') + self.float_value01 = fval_ + elif nodeName_ == 'field01': + obj_ = complex_type02.factory() + obj_.build(child_) + self.field01 = obj_ + obj_.original_tagname_ = 'field01' +# end class complex_type01 + + +class complex_type02(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if complex_type02.subclass: + return complex_type02.subclass(*args_, **kwargs_) + else: + return complex_type02(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type02', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type02') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type02', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type02'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type02', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type02'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class complex_type02 + + +class complex_type03(complex_type02): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = complex_type02 + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type03, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type03.subclass: + return complex_type03.subclass(*args_, **kwargs_) + else: + return complex_type03(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type03, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type03', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type03', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type03'): + super(complex_type03, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type03', fromsubclass_=False, pretty_print=True): + super(complex_type03, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type03'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type03, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type03, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type03, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type03, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type03 + + +class type_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if type_.subclass: + return type_.subclass(*args_, **kwargs_) + else: + return type_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='type', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='type') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='type', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='type'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='type', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='type'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class type_ + + +class complex_type04(type_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = type_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type04, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type04.subclass: + return complex_type04.subclass(*args_, **kwargs_) + else: + return complex_type04(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type04, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type04', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type04', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type04'): + super(complex_type04, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type04', fromsubclass_=False, pretty_print=True): + super(complex_type04, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type04'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type04, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type04, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type04, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type04, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type04 + + +class build_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if build_.subclass: + return build_.subclass(*args_, **kwargs_) + else: + return build_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='build', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='build') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='build', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='build'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='build', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value02).encode(ExternalEncoding), input_name='string_value02'), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='build'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + pass + def exportLiteralChildren(self, outfile, level, name_): + if self.string_value02 is not None: + showIndent(outfile, level) + outfile.write('string_value02=%s,\n' % quote_python(self.string_value02).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value02=[\n') + level += 1 + for integer_value02_ in self.integer_value02: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value02_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value02 is not None: + showIndent(outfile, level) + outfile.write('float_value02=%f,\n' % self.float_value02) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class build_ + + +class complex_type05(build_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = build_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type05, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if complex_type05.subclass: + return complex_type05.subclass(*args_, **kwargs_) + else: + return complex_type05(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type05, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type05', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type05', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type05'): + super(complex_type05, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type05', fromsubclass_=False, pretty_print=True): + super(complex_type05, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_format_string(quote_xml(self.string_value03).encode(ExternalEncoding), input_name='string_value03'), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='complex-type05'): + level += 1 + already_processed = set() + self.exportLiteralAttributes(outfile, level, already_processed, name_) + if self.hasContent_(): + self.exportLiteralChildren(outfile, level, name_) + def exportLiteralAttributes(self, outfile, level, already_processed, name_): + super(complex_type05, self).exportLiteralAttributes(outfile, level, already_processed, name_) + def exportLiteralChildren(self, outfile, level, name_): + super(complex_type05, self).exportLiteralChildren(outfile, level, name_) + if self.string_value03 is not None: + showIndent(outfile, level) + outfile.write('string_value03=%s,\n' % quote_python(self.string_value03).encode(ExternalEncoding)) + showIndent(outfile, level) + outfile.write('integer_value03=[\n') + level += 1 + for integer_value03_ in self.integer_value03: + showIndent(outfile, level) + outfile.write('%d,\n' % integer_value03_) + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + if self.float_value03 is not None: + showIndent(outfile, level) + outfile.write('float_value03=%f,\n' % self.float_value03) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type05, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type05, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type05 + + +GDSClassesMapping = { + 'field01': complex_type02, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + doc = parsexml_(StringIO(inString)) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "build_", + "complex_type01", + "complex_type02", + "complex_type03", + "complex_type04", + "complex_type05", + "type_" +] diff --git a/tests/test.py b/tests/test.py index 225770984b09b73bc52e4339c66f37f30a1c16c9..96a05e27068e50e1ce9cacc523e85333f8f02732 100755 --- a/tests/test.py +++ b/tests/test.py @@ -507,6 +507,24 @@ class GenTest(unittest.TestCase): result, err = self.execute(cmd) self.check_result(result, err, ('sys.stdout.write',)) + def test_023_mapcleanname(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'mapcleanname' + cmd = cmdTempl % (t_, t_, t_, t_, ) + result, _ = self.execute(cmd, cwd='..') + cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ('sys.stdout.write',)) + cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ()) + def check_result(self, result, err, ignore_strings): self.failUnlessEqual(len(result), 0) self.failUnlessEqual(len(err), 0) diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html index 20364ff954c383f4e55666177284be5ff9f7df16..0a4c830a2a4c63a4500af089f71c911f67961e9d 100644 --- a/tutorial/generateds_tutorial.html +++ b/tutorial/generateds_tutorial.html @@ -219,7 +219,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12c</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.12d</td> </tr> </tbody> </table> @@ -228,7 +228,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">March 18, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">April 02, 2014</td> </tr> </tbody> </table> @@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateds_tutorial.txt">View document source</a>. -Generated on: 2014-03-18 20:35 UTC. +Generated on: 2014-04-02 22:08 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt index c84446bfb8bb06f2b0ca5789d3f31b01d9b205bd..37695598dcaa3a893f13d710c4603043034a2da3 100644 --- a/tutorial/generateds_tutorial.txt +++ b/tutorial/generateds_tutorial.txt @@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial .. version -:revision: 2.12c +:revision: 2.12d .. version diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip index bc1fc6b45e7b182561537dee010543f6c8cb9534..27248db2bc871061f8a52482dad9d2925992564e 100644 Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ