diff --git a/README b/README index 1e776eeab18a1eafeb7ab9f3333b0599cbdb8846..9b748fbd6592d51567b9a207e0147c62844d18bd 100644 --- a/README +++ b/README @@ -141,6 +141,15 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- +Version 2.23a (09/14/2016) + +- Integrated Clayton Daley's fixes to the unit tests. Thanks much, + Clayton. +- Clayton's fixes to the unit tests uncovered several errors that + had been masked and hidden. Fixed those errors, for example: (1) + eliminated generation of erroneous call to validation method; (2) + added catalog file. + Version 2.22c (04/26/2016) - Fixes to generation of validation methods for xs:date, xs:time, diff --git a/generateDS.py b/generateDS.py index 13b0812f7e610698be19bb570584bddaf402dd85..26fa8284adffb85d930371f524bfa506bb2dbc42 100755 --- a/generateDS.py +++ b/generateDS.py @@ -4207,9 +4207,10 @@ def generateCtor(wrt, prefix, element): wrt(' self.%s = %s\n' % (name, mbrname)) # validate if it is a simple type. Validation shows # a warning so no fear that an error would rise. - if (child.getSimpleType()): + typeName = child.getSimpleType() + if typeName and typeName in SimpleTypeDict: wrt(' self.validate_%s(self.%s)\n' % ( - child.getSimpleType(), name)) + cleanupName(typeName), mapName(name))) eltype = element.getType() if (element.getSimpleContent() or element.isMixed() or diff --git a/tests/address.xsd b/tests/address.xsd new file mode 100644 index 0000000000000000000000000000000000000000..1793e803eaaddf70d97c8ce011052b34c675e10e --- /dev/null +++ b/tests/address.xsd @@ -0,0 +1,56 @@ +<schema targetNamespace="http://www.example.com/IPO" + xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:ipo="http://www.example.com/IPO"> + + <annotation> + <documentation xml:lang="en"> + Addresses for International Purchase order schema + Copyright 2000 Example.com. All rights reserved. + </documentation> + </annotation> + + <complexType name="Address"> + <sequence> + <element name="name" type="string"/> + <element name="street" type="string"/> + <element name="city" type="string"/> + </sequence> + </complexType> + + <complexType name="USAddress"> + <complexContent> + <extension base="ipo:Address"> + <sequence> + <element name="state" type="ipo:USState"/> + <element name="zip" type="positiveInteger"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <complexType name="UKAddress"> + <complexContent> + <extension base="ipo:Address"> + <sequence> + <element name="postcode" type="ipo:UKPostcode"/> + </sequence> + <attribute name="exportCode" type="positiveInteger" fixed="1"/> + </extension> + </complexContent> + </complexType> + + <!-- other Address derivations for more countries --> + + <simpleType name="USState"> + <restriction base="string"> + <enumeration value="AK"/> + <enumeration value="AL"/> + <enumeration value="AR"/> + <enumeration value="PA"/> + <!-- and so on ... --> + </restriction> + </simpleType> + + <!-- simple type definition for UKPostcode --> + +</schema> diff --git a/tests/catalog.xml b/tests/catalog.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4d0c615dc58e58aea876dbfc8aa5ca74a6d4030 --- /dev/null +++ b/tests/catalog.xml @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> + +</catalog> diff --git a/tests/catalogtest.xsd b/tests/catalogtest.xsd index adb07afb6ea0aca78b4a34d573cafe85a839a2c7..aaa3f577778474f549e786994e2c3651f5e69c50 100644 --- a/tests/catalogtest.xsd +++ b/tests/catalogtest.xsd @@ -1,6 +1,8 @@ <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <!-- <xs:include namespace="http://www.generateds.com/catalog-part1"/> + --> </xs:schema> diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py index 2db2120a0eb908dd37fa465063fbebd0bdc28559..ba9ea614fe4a8e5e16f4db9a065983f6bd543eaf 100644 --- a/tests/catalogtest1_sub.py +++ b/tests/catalogtest1_sub.py @@ -25,62 +25,16 @@ # import sys +from lxml import etree as etree_ import catalogtest2_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): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -94,13 +48,6 @@ ExternalEncoding = 'ascii' # -class airplaneSub(supermod.airplane): - def __init__(self, pilotname=None): - super(airplaneSub, self).__init__(pilotname, ) -supermod.airplane.subclass = airplaneSub -# end class airplaneSub - - def get_root_tag(node): tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] rootClass = None @@ -111,12 +58,13 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = supermod.airplane + rootTag = '' + rootClass = supermod. rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -131,12 +79,13 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = supermod.airplane + rootTag = '' + rootClass = supermod. rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -155,12 +104,13 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = supermod.airplane + rootTag = '' + rootClass = supermod. rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -174,12 +124,13 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = supermod.airplane + rootTag = '' + rootClass = supermod. rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -199,7 +150,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py index 4c93875cb07bbd8a328f93ace3bb8e9ff155d74c..d3b484e7cc6d196f3fd6603087ec9d0e566ef00d 100644 --- a/tests/catalogtest1_sup.py +++ b/tests/catalogtest1_sup.py @@ -26,64 +26,33 @@ # 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 +import warnings as warnings_ 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): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -95,7 +64,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -111,64 +80,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): + def gds_validate_string(self, input_data, node=None, 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=''): + def gds_validate_base64(self, input_data, node=None, 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=''): + def gds_validate_integer(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values 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=''): + def gds_validate_float(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, 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 + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, 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 + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -176,8 +149,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -242,7 +215,7 @@ except ImportError, exp: 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=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -265,7 +238,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -288,7 +262,7 @@ except ImportError, exp: 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=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -320,6 +294,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -375,6 +364,20 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None # @@ -400,6 +403,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -413,19 +421,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -485,11 +506,7 @@ class GDSParseError(Exception): 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, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -634,88 +651,6 @@ def _cast(typ, value): # -class airplane(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('pilotname', 'xs:string', 0), - ] - subclass = None - superclass = None - def __init__(self, pilotname=None): - self.original_tagname_ = None - self.pilotname = pilotname - def factory(*args_, **kwargs_): - if airplane.subclass: - return airplane.subclass(*args_, **kwargs_) - else: - return airplane(*args_, **kwargs_) - factory = staticmethod(factory) - def get_pilotname(self): return self.pilotname - def set_pilotname(self, pilotname): self.pilotname = pilotname - def hasContent_(self): - if ( - self.pilotname is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='airplane', 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_='airplane') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='airplane', 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_='airplane'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='airplane', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.pilotname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='airplane'): - 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.pilotname is not None: - showIndent(outfile, level) - outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding)) - 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_ == 'pilotname': - pilotname_ = child_.text - pilotname_ = self.gds_validate_string(pilotname_, node, 'pilotname') - self.pilotname = pilotname_ - super(airplane, self).buildChildren(child_, node, nodeName_, True) -# end class airplane - - GDSClassesMapping = { } @@ -726,7 +661,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -739,12 +674,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = airplane + rootTag = '' + rootClass = rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -759,12 +695,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = airplane + rootTag = '' + rootClass = rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -783,12 +720,13 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = airplane + rootTag = '' + rootClass = rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -802,12 +740,13 @@ def parseString(inString, silence=False): def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'airplane' - rootClass = airplane + rootTag = '' + rootClass = rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -835,5 +774,5 @@ if __name__ == '__main__': __all__ = [ - "airplane" + ] diff --git a/tests/ipo1_out.xml b/tests/ipo1_out.xml index c6da399281a0ff8d96ad0c4617acfaf78c72922b..44ae582b319375939713951bbf2dec8af5936cb6 100644 --- a/tests/ipo1_out.xml +++ b/tests/ipo1_out.xml @@ -1,11 +1,10 @@ <?xml version="1.0" ?> <ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01"> - <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" category="1-a" exportCode="1"> + <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" exportCode="1"> <ipo:name>Helen Zoe</ipo:name> <ipo:street>47 Eden Street</ipo:street> <ipo:city>Cambridge</ipo:city> <ipo:postcode>CB1 1JR</ipo:postcode> - <ipo:category>oneA</ipo:category> </ipo:shipTo> <ipo:billTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress"> <ipo:name>Robert Smith</ipo:name> diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py index f8d3e536c9a41ab65e96dad5d7b1c8b3d5be1fbf..01e596514819536707a7954533bca6e10faad35e 100644 --- a/tests/ipo1_sub.py +++ b/tests/ipo1_sub.py @@ -23,62 +23,16 @@ # import sys +from lxml import etree as etree_ import ipo2_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): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -128,8 +82,8 @@ supermod.USAddress.subclass = USAddressSub class UKAddressSub(supermod.UKAddress): - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): - super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, ) + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, ) supermod.UKAddress.subclass = UKAddressSub # end class UKAddressSub @@ -144,7 +98,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -164,7 +119,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -188,7 +144,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -207,7 +164,8 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -232,7 +190,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py index ce50af0e1d5acbf155d52c14551cecd7ce3c2d9a..2356f805f27fb508a456356798689ed6b614536f 100644 --- a/tests/ipo1_sup.py +++ b/tests/ipo1_sup.py @@ -24,64 +24,33 @@ # 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 +import warnings as warnings_ 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): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -93,7 +62,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -109,64 +78,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): + def gds_validate_string(self, input_data, node=None, 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=''): + def gds_validate_base64(self, input_data, node=None, 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=''): + def gds_validate_integer(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values 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=''): + def gds_validate_float(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, 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 + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, 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 + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -174,8 +147,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -240,7 +213,7 @@ except ImportError, exp: 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=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -263,7 +236,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -286,7 +260,7 @@ except ImportError, exp: 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=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -318,6 +292,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -373,6 +362,20 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None # @@ -398,6 +401,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -411,19 +419,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -483,11 +504,7 @@ class GDSParseError(Exception): 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, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -644,7 +661,7 @@ class PurchaseOrderType(GeneratedsSuper): superclass = None def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None): self.original_tagname_ = None - if isinstance(orderDate, basestring): + if isinstance(orderDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date() else: initvalue_ = orderDate @@ -654,6 +671,11 @@ class PurchaseOrderType(GeneratedsSuper): self.comment = comment self.items = items def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PurchaseOrderType) + if subclass is not None: + return subclass(*args_, **kwargs_) if PurchaseOrderType.subclass: return PurchaseOrderType.subclass(*args_, **kwargs_) else: @@ -712,42 +734,9 @@ class PurchaseOrderType(GeneratedsSuper): self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.items is not None: self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PurchaseOrderType'): - 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_): - if self.orderDate is not None and 'orderDate' not in already_processed: - already_processed.add('orderDate') - showIndent(outfile, level) - outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate')) - def exportLiteralChildren(self, outfile, level, name_): - if self.shipTo is not None: - showIndent(outfile, level) - outfile.write('shipTo=model_.Address(\n') - self.shipTo.exportLiteral(outfile, level, name_='shipTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.billTo is not None: - showIndent(outfile, level) - outfile.write('billTo=model_.Address(\n') - self.billTo.exportLiteral(outfile, level, name_='billTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.items is not None: - showIndent(outfile, level) - outfile.write('items=model_.Items(\n') - self.items.exportLiteral(outfile, level, name_='items') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -761,7 +750,7 @@ class PurchaseOrderType(GeneratedsSuper): already_processed.add('orderDate') try: self.orderDate = self.gds_parse_date(value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad date attribute (orderDate): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'shipTo': @@ -801,6 +790,11 @@ class Items(GeneratedsSuper): else: self.item = item def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Items) + if subclass is not None: + return subclass(*args_, **kwargs_) if Items.subclass: return Items.subclass(*args_, **kwargs_) else: @@ -845,27 +839,6 @@ class Items(GeneratedsSuper): eol_ = '' for item_ in self.item: item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='Items'): - 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_): - showIndent(outfile, level) - outfile.write('item=[\n') - level += 1 - for item_ in self.item: - showIndent(outfile, level) - outfile.write('model_.item(\n') - item_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -902,12 +875,17 @@ class item(GeneratedsSuper): self.quantity = quantity self.USPrice = USPrice self.comment = comment - if isinstance(shipDate, basestring): + if isinstance(shipDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() else: initvalue_ = shipDate self.shipDate = initvalue_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, item) + if subclass is not None: + return subclass(*args_, **kwargs_) if item.subclass: return item.subclass(*args_, **kwargs_) else: @@ -965,7 +943,7 @@ class item(GeneratedsSuper): eol_ = '' if self.productName is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_)) + outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_)) if self.quantity is not None: showIndent(outfile, level, pretty_print) outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) @@ -974,37 +952,10 @@ class item(GeneratedsSuper): outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.shipDate is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='item'): - 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_): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - showIndent(outfile, level) - outfile.write('partNum=%s,\n' % (self.partNum,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.productName is not None: - showIndent(outfile, level) - outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding)) - if self.quantity is not None: - showIndent(outfile, level) - outfile.write('quantity=%d,\n' % self.quantity) - if self.USPrice is not None: - showIndent(outfile, level) - outfile.write('USPrice=%f,\n' % self.USPrice) - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.shipDate is not None: - showIndent(outfile, level) - outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate')) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1026,7 +977,7 @@ class item(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1036,7 +987,7 @@ class item(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'USPrice') self.USPrice = fval_ @@ -1060,6 +1011,11 @@ class quantity(GeneratedsSuper): self.original_tagname_ = None self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, quantity) + if subclass is not None: + return subclass(*args_, **kwargs_) if quantity.subclass: return quantity.subclass(*args_, **kwargs_) else: @@ -1093,16 +1049,6 @@ class quantity(GeneratedsSuper): pass def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='quantity'): - 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_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1132,6 +1078,11 @@ class Address(GeneratedsSuper): self.city = city self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Address) + if subclass is not None: + return subclass(*args_, **kwargs_) if Address.subclass: return Address.subclass(*args_, **kwargs_) else: @@ -1185,31 +1136,13 @@ class Address(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.street is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_)) + outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_)) if self.city is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='Address'): - 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.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.street is not None: - showIndent(outfile, level) - outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding)) - if self.city is not None: - showIndent(outfile, level) - outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding)) + outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1249,8 +1182,14 @@ class USAddress(Address): self.original_tagname_ = None super(USAddress, self).__init__(name, street, city, ) self.state = state + self.validate_USState(self.state) self.zip = zip def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, USAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if USAddress.subclass: return USAddress.subclass(*args_, **kwargs_) else: @@ -1262,7 +1201,16 @@ class USAddress(Address): def set_zip(self, zip): self.zip = zip def validate_USState(self, value): # Validate type USState, a restriction on string. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['AK', 'AL', 'AR', 'PA'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.state is not None or @@ -1300,26 +1248,10 @@ class USAddress(Address): eol_ = '' if self.state is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_)) + outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_)) if self.zip is not None: showIndent(outfile, level, pretty_print) outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='USAddress'): - 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(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(USAddress, self).exportLiteralChildren(outfile, level, name_) - if self.state is not None: - showIndent(outfile, level) - outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding)) - if self.zip is not None: - showIndent(outfile, level) - outfile.write('zip=%d,\n' % self.zip) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1334,12 +1266,13 @@ class USAddress(Address): state_ = child_.text state_ = self.gds_validate_string(state_, node, 'state') self.state = state_ - self.validate_USState(self.state) # validate type USState + # validate type USState + self.validate_USState(self.state) elif nodeName_ == 'zip': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1351,21 +1284,22 @@ class USAddress(Address): class UKAddress(Address): member_data_items_ = [ - MemberSpec_('category_attr', 'xs:string', 0), MemberSpec_('exportCode', 'positiveInteger', 0), - MemberSpec_('postcode', ['UKPostcode', 'string'], 0), - MemberSpec_('category', 'string', 0), + MemberSpec_('postcode', 'string', 0), ] subclass = None superclass = Address - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): self.original_tagname_ = None super(UKAddress, self).__init__(name, street, city, ) - self.category_attr = _cast(None, category_attr) self.exportCode = _cast(int, exportCode) self.postcode = postcode - self.category = category def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, UKAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if UKAddress.subclass: return UKAddress.subclass(*args_, **kwargs_) else: @@ -1373,19 +1307,11 @@ class UKAddress(Address): factory = staticmethod(factory) def get_postcode(self): return self.postcode def set_postcode(self, postcode): self.postcode = postcode - def get_category(self): return self.category - def set_category(self, category): self.category = category - def get_category_attr(self): return self.category_attr - def set_category_attr(self, category_attr): self.category_attr = category_attr def get_exportCode(self): return self.exportCode def set_exportCode(self, exportCode): self.exportCode = exportCode - def validate_UKPostcode(self, value): - # Validate type UKPostcode, a restriction on string. - pass def hasContent_(self): if ( self.postcode is not None or - self.category is not None or super(UKAddress, self).hasContent_() ): return True @@ -1411,9 +1337,6 @@ class UKAddress(Address): outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'): super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - outfile.write(' category=%s' % (quote_attrib(self.category_attr), )) if self.exportCode is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode')) @@ -1425,34 +1348,7 @@ class UKAddress(Address): eol_ = '' if self.postcode is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_)) - if self.category is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='UKAddress'): - 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_): - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - showIndent(outfile, level) - outfile.write('category_attr=%s,\n' % (self.category_attr,)) - if self.exportCode is not None and 'exportCode' not in already_processed: - already_processed.add('exportCode') - showIndent(outfile, level) - outfile.write('exportCode=%d,\n' % (self.exportCode,)) - super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(UKAddress, self).exportLiteralChildren(outfile, level, name_) - if self.postcode is not None: - showIndent(outfile, level) - outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding)) - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding)) + outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1461,16 +1357,12 @@ class UKAddress(Address): self.buildChildren(child, node, nodeName_) return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('category', node) - if value is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - self.category_attr = value value = find_attr_value_('exportCode', node) if value is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') try: self.exportCode = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.exportCode <= 0: raise_parse_error(node, 'Invalid PositiveInteger') @@ -1480,20 +1372,15 @@ class UKAddress(Address): postcode_ = child_.text postcode_ = self.gds_validate_string(postcode_, node, 'postcode') self.postcode = postcode_ - self.validate_UKPostcode(self.postcode) # validate type UKPostcode - elif nodeName_ == 'category': - category_ = child_.text - category_ = self.gds_validate_string(category_, node, 'category') - self.category = category_ super(UKAddress, self).buildChildren(child_, node, nodeName_, True) # end class UKAddress GDSClassesMapping = { + 'billTo': Address, 'items': Items, 'purchaseOrder': PurchaseOrderType, 'shipTo': Address, - 'billTo': Address, } @@ -1503,7 +1390,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1516,7 +1403,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1536,7 +1424,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1560,7 +1449,8 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1579,7 +1469,8 @@ def parseString(inString, silence=False): def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py index f8d3e536c9a41ab65e96dad5d7b1c8b3d5be1fbf..01e596514819536707a7954533bca6e10faad35e 100644 --- a/tests/ipo2_sub.py +++ b/tests/ipo2_sub.py @@ -23,62 +23,16 @@ # import sys +from lxml import etree as etree_ import ipo2_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): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -128,8 +82,8 @@ supermod.USAddress.subclass = USAddressSub class UKAddressSub(supermod.UKAddress): - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): - super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, ) + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, ) supermod.UKAddress.subclass = UKAddressSub # end class UKAddressSub @@ -144,7 +98,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -164,7 +119,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -188,7 +144,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -207,7 +164,8 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -232,7 +190,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py index ce50af0e1d5acbf155d52c14551cecd7ce3c2d9a..2356f805f27fb508a456356798689ed6b614536f 100644 --- a/tests/ipo2_sup.py +++ b/tests/ipo2_sup.py @@ -24,64 +24,33 @@ # 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 +import warnings as warnings_ 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): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -93,7 +62,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -109,64 +78,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): + def gds_validate_string(self, input_data, node=None, 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=''): + def gds_validate_base64(self, input_data, node=None, 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=''): + def gds_validate_integer(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values 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=''): + def gds_validate_float(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, 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 + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, 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 + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, 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=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -174,8 +147,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -240,7 +213,7 @@ except ImportError, exp: 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=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -263,7 +236,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -286,7 +260,7 @@ except ImportError, exp: 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=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -318,6 +292,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -373,6 +362,20 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None # @@ -398,6 +401,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -411,19 +419,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -483,11 +504,7 @@ class GDSParseError(Exception): 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, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -644,7 +661,7 @@ class PurchaseOrderType(GeneratedsSuper): superclass = None def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None): self.original_tagname_ = None - if isinstance(orderDate, basestring): + if isinstance(orderDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date() else: initvalue_ = orderDate @@ -654,6 +671,11 @@ class PurchaseOrderType(GeneratedsSuper): self.comment = comment self.items = items def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PurchaseOrderType) + if subclass is not None: + return subclass(*args_, **kwargs_) if PurchaseOrderType.subclass: return PurchaseOrderType.subclass(*args_, **kwargs_) else: @@ -712,42 +734,9 @@ class PurchaseOrderType(GeneratedsSuper): self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.items is not None: self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PurchaseOrderType'): - 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_): - if self.orderDate is not None and 'orderDate' not in already_processed: - already_processed.add('orderDate') - showIndent(outfile, level) - outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate')) - def exportLiteralChildren(self, outfile, level, name_): - if self.shipTo is not None: - showIndent(outfile, level) - outfile.write('shipTo=model_.Address(\n') - self.shipTo.exportLiteral(outfile, level, name_='shipTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.billTo is not None: - showIndent(outfile, level) - outfile.write('billTo=model_.Address(\n') - self.billTo.exportLiteral(outfile, level, name_='billTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.items is not None: - showIndent(outfile, level) - outfile.write('items=model_.Items(\n') - self.items.exportLiteral(outfile, level, name_='items') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -761,7 +750,7 @@ class PurchaseOrderType(GeneratedsSuper): already_processed.add('orderDate') try: self.orderDate = self.gds_parse_date(value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad date attribute (orderDate): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'shipTo': @@ -801,6 +790,11 @@ class Items(GeneratedsSuper): else: self.item = item def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Items) + if subclass is not None: + return subclass(*args_, **kwargs_) if Items.subclass: return Items.subclass(*args_, **kwargs_) else: @@ -845,27 +839,6 @@ class Items(GeneratedsSuper): eol_ = '' for item_ in self.item: item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='Items'): - 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_): - showIndent(outfile, level) - outfile.write('item=[\n') - level += 1 - for item_ in self.item: - showIndent(outfile, level) - outfile.write('model_.item(\n') - item_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -902,12 +875,17 @@ class item(GeneratedsSuper): self.quantity = quantity self.USPrice = USPrice self.comment = comment - if isinstance(shipDate, basestring): + if isinstance(shipDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() else: initvalue_ = shipDate self.shipDate = initvalue_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, item) + if subclass is not None: + return subclass(*args_, **kwargs_) if item.subclass: return item.subclass(*args_, **kwargs_) else: @@ -965,7 +943,7 @@ class item(GeneratedsSuper): eol_ = '' if self.productName is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_)) + outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_)) if self.quantity is not None: showIndent(outfile, level, pretty_print) outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) @@ -974,37 +952,10 @@ class item(GeneratedsSuper): outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.shipDate is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='item'): - 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_): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - showIndent(outfile, level) - outfile.write('partNum=%s,\n' % (self.partNum,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.productName is not None: - showIndent(outfile, level) - outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding)) - if self.quantity is not None: - showIndent(outfile, level) - outfile.write('quantity=%d,\n' % self.quantity) - if self.USPrice is not None: - showIndent(outfile, level) - outfile.write('USPrice=%f,\n' % self.USPrice) - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.shipDate is not None: - showIndent(outfile, level) - outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate')) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1026,7 +977,7 @@ class item(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1036,7 +987,7 @@ class item(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'USPrice') self.USPrice = fval_ @@ -1060,6 +1011,11 @@ class quantity(GeneratedsSuper): self.original_tagname_ = None self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, quantity) + if subclass is not None: + return subclass(*args_, **kwargs_) if quantity.subclass: return quantity.subclass(*args_, **kwargs_) else: @@ -1093,16 +1049,6 @@ class quantity(GeneratedsSuper): pass def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='quantity'): - 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_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1132,6 +1078,11 @@ class Address(GeneratedsSuper): self.city = city self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Address) + if subclass is not None: + return subclass(*args_, **kwargs_) if Address.subclass: return Address.subclass(*args_, **kwargs_) else: @@ -1185,31 +1136,13 @@ class Address(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.street is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_)) + outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_)) if self.city is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='Address'): - 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.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.street is not None: - showIndent(outfile, level) - outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding)) - if self.city is not None: - showIndent(outfile, level) - outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding)) + outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1249,8 +1182,14 @@ class USAddress(Address): self.original_tagname_ = None super(USAddress, self).__init__(name, street, city, ) self.state = state + self.validate_USState(self.state) self.zip = zip def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, USAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if USAddress.subclass: return USAddress.subclass(*args_, **kwargs_) else: @@ -1262,7 +1201,16 @@ class USAddress(Address): def set_zip(self, zip): self.zip = zip def validate_USState(self, value): # Validate type USState, a restriction on string. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['AK', 'AL', 'AR', 'PA'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.state is not None or @@ -1300,26 +1248,10 @@ class USAddress(Address): eol_ = '' if self.state is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_)) + outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_)) if self.zip is not None: showIndent(outfile, level, pretty_print) outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='USAddress'): - 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(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(USAddress, self).exportLiteralChildren(outfile, level, name_) - if self.state is not None: - showIndent(outfile, level) - outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding)) - if self.zip is not None: - showIndent(outfile, level) - outfile.write('zip=%d,\n' % self.zip) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1334,12 +1266,13 @@ class USAddress(Address): state_ = child_.text state_ = self.gds_validate_string(state_, node, 'state') self.state = state_ - self.validate_USState(self.state) # validate type USState + # validate type USState + self.validate_USState(self.state) elif nodeName_ == 'zip': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1351,21 +1284,22 @@ class USAddress(Address): class UKAddress(Address): member_data_items_ = [ - MemberSpec_('category_attr', 'xs:string', 0), MemberSpec_('exportCode', 'positiveInteger', 0), - MemberSpec_('postcode', ['UKPostcode', 'string'], 0), - MemberSpec_('category', 'string', 0), + MemberSpec_('postcode', 'string', 0), ] subclass = None superclass = Address - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): self.original_tagname_ = None super(UKAddress, self).__init__(name, street, city, ) - self.category_attr = _cast(None, category_attr) self.exportCode = _cast(int, exportCode) self.postcode = postcode - self.category = category def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, UKAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if UKAddress.subclass: return UKAddress.subclass(*args_, **kwargs_) else: @@ -1373,19 +1307,11 @@ class UKAddress(Address): factory = staticmethod(factory) def get_postcode(self): return self.postcode def set_postcode(self, postcode): self.postcode = postcode - def get_category(self): return self.category - def set_category(self, category): self.category = category - def get_category_attr(self): return self.category_attr - def set_category_attr(self, category_attr): self.category_attr = category_attr def get_exportCode(self): return self.exportCode def set_exportCode(self, exportCode): self.exportCode = exportCode - def validate_UKPostcode(self, value): - # Validate type UKPostcode, a restriction on string. - pass def hasContent_(self): if ( self.postcode is not None or - self.category is not None or super(UKAddress, self).hasContent_() ): return True @@ -1411,9 +1337,6 @@ class UKAddress(Address): outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'): super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - outfile.write(' category=%s' % (quote_attrib(self.category_attr), )) if self.exportCode is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode')) @@ -1425,34 +1348,7 @@ class UKAddress(Address): eol_ = '' if self.postcode is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_)) - if self.category is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='UKAddress'): - 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_): - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - showIndent(outfile, level) - outfile.write('category_attr=%s,\n' % (self.category_attr,)) - if self.exportCode is not None and 'exportCode' not in already_processed: - already_processed.add('exportCode') - showIndent(outfile, level) - outfile.write('exportCode=%d,\n' % (self.exportCode,)) - super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(UKAddress, self).exportLiteralChildren(outfile, level, name_) - if self.postcode is not None: - showIndent(outfile, level) - outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding)) - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding)) + outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1461,16 +1357,12 @@ class UKAddress(Address): self.buildChildren(child, node, nodeName_) return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('category', node) - if value is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - self.category_attr = value value = find_attr_value_('exportCode', node) if value is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') try: self.exportCode = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.exportCode <= 0: raise_parse_error(node, 'Invalid PositiveInteger') @@ -1480,20 +1372,15 @@ class UKAddress(Address): postcode_ = child_.text postcode_ = self.gds_validate_string(postcode_, node, 'postcode') self.postcode = postcode_ - self.validate_UKPostcode(self.postcode) # validate type UKPostcode - elif nodeName_ == 'category': - category_ = child_.text - category_ = self.gds_validate_string(category_, node, 'category') - self.category = category_ super(UKAddress, self).buildChildren(child_, node, nodeName_, True) # end class UKAddress GDSClassesMapping = { + 'billTo': Address, 'items': Items, 'purchaseOrder': PurchaseOrderType, 'shipTo': Address, - 'billTo': Address, } @@ -1503,7 +1390,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1516,7 +1403,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1536,7 +1424,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1560,7 +1449,8 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1579,7 +1469,8 @@ def parseString(inString, silence=False): def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/nested_def1_sub.py b/tests/nested_def1_sub.py index 0bb693dd202009498e6fcb894f81a6d4dfd5066b..14bfb18c7cdb5a1d2fc6eb7c9f5934e551d212c3 100644 --- a/tests/nested_def1_sub.py +++ b/tests/nested_def1_sub.py @@ -67,18 +67,18 @@ supermod.classBType.subclass = classBTypeSub # end class classBTypeSub -class inner_001Sub(supermod.inner_001): +class innerTypeSub(supermod.innerType): def __init__(self, attrA1=None, attrA2=None): - super(inner_001Sub, self).__init__(attrA1, attrA2, ) -supermod.inner_001.subclass = inner_001Sub -# end class inner_001Sub + super(innerTypeSub, self).__init__(attrA1, attrA2, ) +supermod.innerType.subclass = innerTypeSub +# end class innerTypeSub -class inner_002Sub(supermod.inner_002): +class innerType1Sub(supermod.innerType1): def __init__(self, attrB1=None, attrB2=None): - super(inner_002Sub, self).__init__(attrB1, attrB2, ) -supermod.inner_002.subclass = inner_002Sub -# end class inner_002Sub + super(innerType1Sub, self).__init__(attrB1, attrB2, ) +supermod.innerType1.subclass = innerType1Sub +# end class innerType1Sub def get_root_tag(node): diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py index 4f98a349b648f462855517de7b2ab4a3a5b039b5..cf12e33f7197c6b1fa6a5cdcfb385de89394234d 100644 --- a/tests/nested_def1_sup.py +++ b/tests/nested_def1_sup.py @@ -737,7 +737,7 @@ class containerType(GeneratedsSuper): class classAType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('inner', 'inner_001', 0), + MemberSpec_('inner', 'innerType', 0), ] subclass = None superclass = None @@ -802,7 +802,7 @@ class classAType(GeneratedsSuper): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'inner': - obj_ = inner_001.factory() + obj_ = innerType.factory() obj_.build(child_) self.inner = obj_ obj_.original_tagname_ = 'inner' @@ -811,7 +811,7 @@ class classAType(GeneratedsSuper): class classBType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('inner', 'inner_002', 0), + MemberSpec_('inner', 'innerType1', 0), ] subclass = None superclass = None @@ -876,14 +876,14 @@ class classBType(GeneratedsSuper): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'inner': - obj_ = inner_002.factory() + obj_ = innerType1.factory() obj_.build(child_) self.inner = obj_ obj_.original_tagname_ = 'inner' # end class classBType -class inner_001(GeneratedsSuper): +class innerType(GeneratedsSuper): member_data_items_ = [ MemberSpec_('attrA1', 'xs:string', 0), MemberSpec_('attrA2', 'xs:string', 0), @@ -897,13 +897,13 @@ class inner_001(GeneratedsSuper): def factory(*args_, **kwargs_): if CurrentSubclassModule_ is not None: subclass = getSubclassFromModule_( - CurrentSubclassModule_, inner_001) + CurrentSubclassModule_, innerType) if subclass is not None: return subclass(*args_, **kwargs_) - if inner_001.subclass: - return inner_001.subclass(*args_, **kwargs_) + if innerType.subclass: + return innerType.subclass(*args_, **kwargs_) else: - return inner_001(*args_, **kwargs_) + return innerType(*args_, **kwargs_) factory = staticmethod(factory) def get_attrA1(self): return self.attrA1 def set_attrA1(self, attrA1): self.attrA1 = attrA1 @@ -916,7 +916,7 @@ class inner_001(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='', name_='inner_001', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='innerType', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: @@ -926,21 +926,21 @@ class inner_001(GeneratedsSuper): 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_='inner_001') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='inner_001', pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='innerType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_001'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType'): if self.attrA1 is not None and 'attrA1' not in already_processed: already_processed.add('attrA1') outfile.write(' attrA1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA1), input_name='attrA1')), )) if self.attrA2 is not None and 'attrA2' not in already_processed: already_processed.add('attrA2') outfile.write(' attrA2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA2), input_name='attrA2')), )) - def exportChildren(self, outfile, level, namespace_='', name_='inner_001', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='innerType', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -960,10 +960,10 @@ class inner_001(GeneratedsSuper): self.attrA2 = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass -# end class inner_001 +# end class innerType -class inner_002(GeneratedsSuper): +class innerType1(GeneratedsSuper): member_data_items_ = [ MemberSpec_('attrB1', 'xs:string', 0), MemberSpec_('attrB2', 'xs:string', 0), @@ -977,13 +977,13 @@ class inner_002(GeneratedsSuper): def factory(*args_, **kwargs_): if CurrentSubclassModule_ is not None: subclass = getSubclassFromModule_( - CurrentSubclassModule_, inner_002) + CurrentSubclassModule_, innerType1) if subclass is not None: return subclass(*args_, **kwargs_) - if inner_002.subclass: - return inner_002.subclass(*args_, **kwargs_) + if innerType1.subclass: + return innerType1.subclass(*args_, **kwargs_) else: - return inner_002(*args_, **kwargs_) + return innerType1(*args_, **kwargs_) factory = staticmethod(factory) def get_attrB1(self): return self.attrB1 def set_attrB1(self, attrB1): self.attrB1 = attrB1 @@ -996,7 +996,7 @@ class inner_002(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='', name_='inner_002', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='innerType1', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: @@ -1006,21 +1006,21 @@ class inner_002(GeneratedsSuper): 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_='inner_002') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType1') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='inner_002', pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='innerType1', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='inner_002'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType1'): if self.attrB1 is not None and 'attrB1' not in already_processed: already_processed.add('attrB1') outfile.write(' attrB1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB1), input_name='attrB1')), )) if self.attrB2 is not None and 'attrB2' not in already_processed: already_processed.add('attrB2') outfile.write(' attrB2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB2), input_name='attrB2')), )) - def exportChildren(self, outfile, level, namespace_='', name_='inner_002', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='innerType1', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -1040,14 +1040,14 @@ class inner_002(GeneratedsSuper): self.attrB2 = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass -# end class inner_002 +# end class innerType1 GDSClassesMapping = { 'classA': classAType, 'classB': classBType, 'container': containerType, - 'inner': inner_002, + 'inner': innerType1, 'item1': classAType, 'item2': classBType, } @@ -1175,6 +1175,6 @@ __all__ = [ "classAType", "classBType", "containerType", - "inner_001", - "inner_002" + "innerType", + "innerType1" ] diff --git a/tests/test.py b/tests/test.py index b52b4db3c40ea7a4ae246a1a813146278ebccbc0..71a7463ebff28125bb6044b0759e754166a8085b 100755 --- a/tests/test.py +++ b/tests/test.py @@ -11,7 +11,7 @@ import unittest from lxml import etree -import generateDS +#import generateDS class GenTest(unittest.TestCase): @@ -28,8 +28,10 @@ class GenTest(unittest.TestCase): if env is None: env = os.environ stdout, stderr = self.execute(cmd, cwd, env) - self.assertEqual(len(stdout), 0, "stdout was not empty:\n{}".format(stdout)) - self.assertEqual(len(stderr), 0, "stderr was not empty:\n{}".format(stderr)) + self.assertEqual( + len(stdout), 0, "stdout was not empty:\n{}".format(stdout)) + self.assertEqual( + len(stderr), 0, "stderr was not empty:\n{}".format(stderr)) ## def setUp(self): ## print('running setUp') @@ -204,7 +206,10 @@ class GenTest(unittest.TestCase): t_ = 'anysimpletype' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('anysimpletype1_sup.py', '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + 'anysimpletype1_sup.py', + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('anysimpletype1_sub.py', '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -220,7 +225,10 @@ class GenTest(unittest.TestCase): t_ = 'simpletype_memberspecs' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -236,13 +244,23 @@ class GenTest(unittest.TestCase): t_ = 'extensions' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) os.remove('{}2_sub.py'.format(t_)) def test_009_literal(self): + cmd = ( + 'python generateDS.py --no-dates --no-versions -f ' + '-o tests/out2_sup.py -s tests/out2_sub.py ' + '--export="write literal" ' + '--super=out2_sup -u gends_user_methods tests/people.xsd' + ) + self.executeClean(cmd, cwd='..') import out2_sup save_stdout = sys.stdout sys.stdout = open('literal2.py', 'w') @@ -258,6 +276,8 @@ class GenTest(unittest.TestCase): self.failUnlessEqual(content1, content2) # cleanup generated files os.remove('literal2.py') + os.remove('out2_sup.py') + os.remove('out2_sub.py') def test_010_simplecontent_restriction(self): cmdTempl = ( @@ -269,7 +289,10 @@ class GenTest(unittest.TestCase): t_ = 'simplecontent_restriction' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -285,7 +308,10 @@ class GenTest(unittest.TestCase): t_ = 'annotations' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -301,7 +327,10 @@ class GenTest(unittest.TestCase): t_ = 'abstract_type' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -318,7 +347,10 @@ class GenTest(unittest.TestCase): t_ = 'people_procincl' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -334,7 +366,10 @@ class GenTest(unittest.TestCase): t_ = 'ipo' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' cmd = cmdTempl % (t_, t_, t_, ) @@ -343,7 +378,6 @@ class GenTest(unittest.TestCase): # cleanup generated files os.remove('{}2_out.xml'.format(t_)) - def test_015_recursive_simpletype(self): cmdTempl = ( 'python generateDS.py --no-dates --no-versions ' @@ -355,7 +389,10 @@ class GenTest(unittest.TestCase): t_ = 'recursive_simpletype' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -372,7 +409,10 @@ class GenTest(unittest.TestCase): t_ = 'anywildcard' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -389,7 +429,10 @@ class GenTest(unittest.TestCase): t_ = 'attr_groups' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -406,7 +449,10 @@ class GenTest(unittest.TestCase): t_ = 'simpletypes_other' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -424,7 +470,10 @@ class GenTest(unittest.TestCase): t_ = 'to_etree' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) import to_etree2_sup rootObj, rootElement, mapping, reverse_mapping = \ @@ -453,8 +502,11 @@ class GenTest(unittest.TestCase): t_ = 'catalogtest' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) - self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) os.remove('{}2_sub.py'.format(t_)) @@ -470,7 +522,10 @@ class GenTest(unittest.TestCase): t_ = 'anonymous_type' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -488,10 +543,22 @@ class GenTest(unittest.TestCase): t_ = 'oneper' cmd = cmdTempl % (t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('OnePer{}{}Type00_1One.py'.format(os.sep, t_), 'OnePer{}{}Type00_2One.py'.format(os.sep, t_), ('sys.stdout.write',)) - self.compareFiles('OnePer{}{}Type01_1One.py'.format(os.sep, t_), 'OnePer{}{}Type01_2One.py'.format(os.sep, t_), ('sys.stdout.write',)) - self.compareFiles('OnePer{}{}Type02_1One.py'.format(os.sep, t_), 'OnePer{}{}Type02_2One.py'.format(os.sep, t_), ('sys.stdout.write',)) - self.compareFiles('OnePer{}{}Type03_1One.py'.format(os.sep, t_), 'OnePer{}{}Type03_2One.py'.format(os.sep, t_), ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type00_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type00_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type01_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type01_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type02_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type02_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type03_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type03_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) # cleanup generated files os.remove('OnePer{}{}Type00_1One.py'.format(os.sep, t_)) os.remove('OnePer{}{}Type01_1One.py'.format(os.sep, t_)) @@ -509,7 +576,10 @@ class GenTest(unittest.TestCase): t_ = 'mapcleanname' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -527,7 +597,10 @@ class GenTest(unittest.TestCase): t_ = 'prefix_classname' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' cmd = cmdTempl % (t_, t_, t_, ) @@ -549,7 +622,10 @@ class GenTest(unittest.TestCase): t_ = 'validate_simpletypes' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) cmdTempl = ( 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml ' @@ -557,13 +633,14 @@ class GenTest(unittest.TestCase): ) cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) - self.compareFiles('{}1_warnings.txt'.format(t_), '{}2_warnings.txt'.format(t_)) + self.compareFiles( + '{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + self.compareFiles( + '{}1_warnings.txt'.format(t_), '{}2_warnings.txt'.format(t_)) # cleanup generated files os.remove('{}2_out.xml'.format(t_)) os.remove('{}2_warnings.txt'.format(t_)) - def test_026_reference_simpletype(self): cmdTempl = ( 'python generateDS.py --no-dates --no-versions ' @@ -575,7 +652,10 @@ class GenTest(unittest.TestCase): t_ = 'reference_simpletype' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -593,11 +673,11 @@ class GenTest(unittest.TestCase): t_ = 'cdata' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) - # cleanup generated files - os.remove('{}2_sup.py'.format(t_)) - os.remove('{}2_sub.py'.format(t_)) import cdata2_sup as cdatalib cdatalist = cdatalib.cdataListType() @@ -614,6 +694,8 @@ class GenTest(unittest.TestCase): cdatalist.export(outfile, 0) self.compareFiles('{}1.xml'.format(t_), '{}2.xml'.format(t_)) # cleanup generated files + os.remove('{}2_sup.py'.format(t_)) + os.remove('{}2_sub.py'.format(t_)) os.remove('{}2.xml'.format(t_)) def test_028_defaults_coverage(self): @@ -627,7 +709,10 @@ class GenTest(unittest.TestCase): t_ = 'defaults_coverage' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -644,7 +729,10 @@ class GenTest(unittest.TestCase): t_ = 'defaults_cases' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' cmd = cmdTempl % (t_, t_, t_, ) @@ -666,7 +754,10 @@ class GenTest(unittest.TestCase): t_ = 'nested_def' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # Need to preserve generated files for next command, cleanup at end cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' @@ -678,7 +769,6 @@ class GenTest(unittest.TestCase): os.remove('{}2_sub.py'.format(t_)) os.remove('{}2_out.xml'.format(t_)) - # # Test enhancements to cleanupName function. def test_031_cleanupname(self): @@ -698,7 +788,10 @@ class GenTest(unittest.TestCase): t_ = 'cleanupname' cmd = cmdTempl % (t_, t_, t_, t_, ) self.executeClean(cmd, cwd='..') - self.compareFiles('{}1_sup.py'.format(t_), '{}2_sup.py'.format(t_), ('sys.stdout.write',)) + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) # cleanup generated files os.remove('{}2_sup.py'.format(t_)) @@ -707,9 +800,11 @@ class GenTest(unittest.TestCase): def compareFiles(self, left, right, ignore=None): with open(left) as left_file: with open(right) as right_file: - diffs = ''.join(difflib.unified_diff(left_file.readlines(), right_file.readlines())) - + diffs = difflib.unified_diff( + left_file.readlines(), right_file.readlines()) + diffs = list(diffs) if diffs: + diffs = ''.join(diffs[2:12]) self.fail("Files differed:\n{}".format(diffs)) diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py index 58e617b2cd094c361a1b40a387d4f92684a600b2..e15d9a7b4c64df1f148abdab52ecc20eddd5f5cc 100644 --- a/tests/validate_simpletypes2_sub.py +++ b/tests/validate_simpletypes2_sub.py @@ -1,193 +1,193 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# -# Command line options: -# ('--no-dates', '') -# ('--no-versions', '') -# ('--member-specs', 'list') -# ('-f', '') -# ('-o', 'tests/validate_simpletypes2_sup.py') -# ('-s', 'tests/validate_simpletypes2_sub.py') -# ('--super', 'validate_simpletypes2_sup') -# -# Command line arguments: -# tests/validate_simpletypes.xsd -# -# Command line: -# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd -# -# Current working directory (os.getcwd()): -# generateds -# - -import sys -from lxml import etree as etree_ - -import validate_simpletypes2_sup as supermod - -def parsexml_(infile, parser=None, **kwargs): - if parser is None: - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - parser = etree_.ETCompatXMLParser() - doc = etree_.parse(infile, parser=parser, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class containerTypeSub(supermod.containerType): - def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): - super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, ) -supermod.containerType.subclass = containerTypeSub -# end class containerTypeSub - - -class simpleOneTypeSub(supermod.simpleOneType): - def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): - super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, anonymous_float_value, primative_integer, primative_float, ) -supermod.simpleOneType.subclass = simpleOneTypeSub -# end class simpleOneTypeSub - - -class simpleTwoTypeSub(supermod.simpleTwoType): - def __init__(self, simpleTwoElementOne=None): - super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, ) -supermod.simpleTwoType.subclass = simpleTwoTypeSub -# end class simpleTwoTypeSub - - -class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType): - def __init__(self, simpleTwoElementTwo=None): - super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, ) -supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub -# end class simpleTwoElementOneTypeSub - - -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): - parser = None - doc = parsexml_(inFilename, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = supermod.containerType - 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): - parser = None - doc = parsexml_(inFilename, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = supermod.containerType - 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 - parser = None - doc = parsexml_(StringIO(inString), parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = supermod.containerType - 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): - parser = None - doc = parsexml_(inFilename, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = supermod.containerType - 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 validate_simpletypes2_sup import *\n\n') - sys.stdout.write('import validate_simpletypes2_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() +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import validate_simpletypes2_sup as supermod + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class simpleOneTypeSub(supermod.simpleOneType): + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, anonymous_float_value, primative_integer, primative_float, ) +supermod.simpleOneType.subclass = simpleOneTypeSub +# end class simpleOneTypeSub + + +class simpleTwoTypeSub(supermod.simpleTwoType): + def __init__(self, simpleTwoElementOne=None): + super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, ) +supermod.simpleTwoType.subclass = simpleTwoTypeSub +# end class simpleTwoTypeSub + + +class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType): + def __init__(self, simpleTwoElementTwo=None): + super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, ) +supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub +# end class simpleTwoElementOneTypeSub + + +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): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + 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): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + 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 + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + 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): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + 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 validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_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/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py index 5b810b04af6bd3fa12c08d3641ae3e14e20a9019..bdfb38bff9b5ff6619df88bae8cce2c3536883ab 100644 --- a/tests/validate_simpletypes2_sup.py +++ b/tests/validate_simpletypes2_sup.py @@ -1,1703 +1,1703 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Generated by generateDS.py. -# -# Command line options: -# ('--no-dates', '') -# ('--no-versions', '') -# ('--member-specs', 'list') -# ('-f', '') -# ('-o', 'tests/validate_simpletypes2_sup.py') -# ('-s', 'tests/validate_simpletypes2_sub.py') -# ('--super', 'validate_simpletypes2_sup') -# -# Command line arguments: -# tests/validate_simpletypes.xsd -# -# Command line: -# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd -# -# Current working directory (os.getcwd()): -# generateds -# - -import sys -import re as re_ -import base64 -import datetime as datetime_ -import warnings as warnings_ -try: - from lxml import etree as etree_ -except ImportError: - from xml.etree import ElementTree as etree_ - - -Validate_simpletypes_ = True -if sys.version_info.major == 2: - BaseStrType_ = basestring -else: - BaseStrType_ = str - - -def parsexml_(infile, parser=None, **kwargs): - if parser is None: - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - try: - parser = etree_.ETCompatXMLParser() - except AttributeError: - # fallback to xml.etree - parser = etree_.XMLParser() - doc = etree_.parse(infile, parser=parser, **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 as 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=None, 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=None, 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=None, input_name=''): - return input_data - def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % ' '.join(input_data) - def gds_validate_integer_list( - self, input_data, node=None, input_name=''): - values = input_data.split() - for value in values: - try: - int(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of integers') - return values - def gds_format_float(self, input_data, input_name=''): - return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node=None, input_name=''): - return input_data - def gds_format_float_list(self, input_data, input_name=''): - return '%s' % ' '.join(input_data) - def gds_validate_float_list( - self, input_data, node=None, 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 values - def gds_format_double(self, input_data, input_name=''): - return '%e' % input_data - def gds_validate_double(self, input_data, node=None, input_name=''): - return input_data - def gds_format_double_list(self, input_data, input_name=''): - return '%s' % ' '.join(input_data) - def gds_validate_double_list( - self, input_data, node=None, 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 values - def gds_format_boolean(self, input_data, input_name=''): - return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node=None, input_name=''): - return input_data - def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % ' '.join(input_data) - def gds_validate_boolean_list( - self, input_data, node=None, 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 values - def gds_validate_datetime(self, input_data, node=None, 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] - time_parts = input_data.split('.') - if len(time_parts) > 1: - micro_seconds = int(float('0.' + time_parts[1]) * 1000000) - input_data = '%s.%s' % (time_parts[0], micro_seconds, ) - 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=None, 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=None, 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 - def gds_validate_simple_patterns(self, patterns, target): - # pat is a list of lists of strings/patterns. We should: - # - AND the outer elements - # - OR the inner elements - found1 = True - for patterns1 in patterns: - found2 = False - for patterns2 in patterns1: - if re_.search(patterns2, target) is not None: - found2 = True - break - if not found2: - found1 = False - break - return found1 - @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())) - @staticmethod - def gds_encode(instring): - if sys.version_info.major == 2: - return instring.encode(ExternalEncoding) - else: - return instring - - def getSubclassFromModule_(module, class_): - '''Get the subclass of a class from a specific module.''' - name = class_.__name__ + 'Sub' - if hasattr(module, name): - return getattr(module, name) - else: - return None - - -# -# 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'{(.*)}(.*)') -CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) - -# Change this to redirect the generated superclass module to use a -# specific subclass module. -CurrentSubclassModule_ = None - -# -# Support/utility functions. -# - - -def showIndent(outfile, level, pretty_print=True): - if pretty_print: - for idx in range(level): - outfile.write(' ') - - -def quote_xml(inStr): - "Escape markup chars, but do not modify CDATA sections." - if not inStr: - return '' - s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) - s2 = '' - pos = 0 - matchobjects = CDATA_pattern_.finditer(s1) - for mo in matchobjects: - s3 = s1[pos:mo.start()] - s2 += quote_xml_aux(s3) - s2 += s1[mo.start():mo.end()] - pos = mo.end() - s3 = s1[pos:] - s2 += quote_xml_aux(s3) - return s2 - - -def quote_xml_aux(inStr): - s1 = inStr.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - return s1 - - -def quote_attrib(inStr): - s1 = (isinstance(inStr, BaseStrType_) 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): - msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) - 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 containerType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('sample1', 'simpleOneType', 1), - MemberSpec_('sample2_bad', 'simpleOneType', 1), - MemberSpec_('sample3_bad', 'simpleOneType', 1), - MemberSpec_('sample4_bad', 'simpleOneType', 1), - MemberSpec_('sample2', 'simpleTwoType', 1), - ] - subclass = None - superclass = None - def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): - self.original_tagname_ = None - if sample1 is None: - self.sample1 = [] - else: - self.sample1 = sample1 - if sample2_bad is None: - self.sample2_bad = [] - else: - self.sample2_bad = sample2_bad - if sample3_bad is None: - self.sample3_bad = [] - else: - self.sample3_bad = sample3_bad - if sample4_bad is None: - self.sample4_bad = [] - else: - self.sample4_bad = sample4_bad - if sample2 is None: - self.sample2 = [] - else: - self.sample2 = sample2 - def factory(*args_, **kwargs_): - if CurrentSubclassModule_ is not None: - subclass = getSubclassFromModule_( - CurrentSubclassModule_, containerType) - if subclass is not None: - return subclass(*args_, **kwargs_) - if containerType.subclass: - return containerType.subclass(*args_, **kwargs_) - else: - return containerType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_sample1(self): return self.sample1 - def set_sample1(self, sample1): self.sample1 = sample1 - def add_sample1(self, value): self.sample1.append(value) - def insert_sample1_at(self, index, value): self.sample1.insert(index, value) - def replace_sample1_at(self, index, value): self.sample1[index] = value - def get_sample2_bad(self): return self.sample2_bad - def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad - def add_sample2_bad(self, value): self.sample2_bad.append(value) - def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value) - def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value - def get_sample3_bad(self): return self.sample3_bad - def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad - def add_sample3_bad(self, value): self.sample3_bad.append(value) - def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value) - def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value - def get_sample4_bad(self): return self.sample4_bad - def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad - def add_sample4_bad(self, value): self.sample4_bad.append(value) - def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value) - def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value - def get_sample2(self): return self.sample2 - def set_sample2(self, sample2): self.sample2 = sample2 - def add_sample2(self, value): self.sample2.append(value) - def insert_sample2_at(self, index, value): self.sample2.insert(index, value) - def replace_sample2_at(self, index, value): self.sample2[index] = value - def hasContent_(self): - if ( - self.sample1 or - self.sample2_bad or - self.sample3_bad or - self.sample4_bad or - self.sample2 - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='containerType', 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_='containerType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', 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_='containerType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - for sample1_ in self.sample1: - sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print) - for sample2_bad_ in self.sample2_bad: - sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print) - for sample3_bad_ in self.sample3_bad: - sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print) - for sample4_bad_ in self.sample4_bad: - sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print) - for sample2_ in self.sample2: - sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) - 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_ == 'sample1': - obj_ = simpleOneType.factory() - obj_.build(child_) - self.sample1.append(obj_) - obj_.original_tagname_ = 'sample1' - elif nodeName_ == 'sample2_bad': - obj_ = simpleOneType.factory() - obj_.build(child_) - self.sample2_bad.append(obj_) - obj_.original_tagname_ = 'sample2_bad' - elif nodeName_ == 'sample3_bad': - obj_ = simpleOneType.factory() - obj_.build(child_) - self.sample3_bad.append(obj_) - obj_.original_tagname_ = 'sample3_bad' - elif nodeName_ == 'sample4_bad': - obj_ = simpleOneType.factory() - obj_.build(child_) - self.sample4_bad.append(obj_) - obj_.original_tagname_ = 'sample4_bad' - elif nodeName_ == 'sample2': - obj_ = simpleTwoType.factory() - obj_.build(child_) - self.sample2.append(obj_) - obj_.original_tagname_ = 'sample2' -# end class containerType - - -class simpleOneType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0), - MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0), - MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), - MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), - MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0), - MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0), - MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0), - MemberSpec_('length_value', ['length_st', 'xs:string'], 0), - MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0), - MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0), - MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0), - MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0), - MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0), - MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0), - MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0), - MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0), - MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0), - MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0), - MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0), - MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0), - MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0), - MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), - MemberSpec_('primative_integer', 'xs:integer', 0), - MemberSpec_('primative_float', 'xs:float', 0), - ] - subclass = None - superclass = None - def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): - self.original_tagname_ = None - self.integer_range_1_value = integer_range_1_value - self.validate_integer_range_1_st(self.integer_range_1_value) - self.pattern_value = pattern_value - self.validate_pattern_st(self.pattern_value) - self.token_enum_value = token_enum_value - self.validate_token_enum_st(self.token_enum_value) - self.token_enum_value = token_enum_value - self.validate_token_enum_st(self.token_enum_value) - self.integer_range_incl_value = integer_range_incl_value - self.validate_integer_range_incl_st(self.integer_range_incl_value) - self.integer_range_excl_value = integer_range_excl_value - self.validate_integer_range_excl_st(self.integer_range_excl_value) - self.min_max_length_value = min_max_length_value - self.validate_min_max_length_st(self.min_max_length_value) - self.length_value = length_value - self.validate_length_st(self.length_value) - self.totalDigits_value = totalDigits_value - self.validate_totalDigits_st(self.totalDigits_value) - if isinstance(date_minincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date() - else: - initvalue_ = date_minincl_value - self.date_minincl_value = initvalue_ - if isinstance(date_maxincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date() - else: - initvalue_ = date_maxincl_value - self.date_maxincl_value = initvalue_ - if isinstance(date_minexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date() - else: - initvalue_ = date_minexcl_value - self.date_minexcl_value = initvalue_ - if isinstance(date_maxexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date() - else: - initvalue_ = date_maxexcl_value - self.date_maxexcl_value = initvalue_ - if isinstance(time_minincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time() - else: - initvalue_ = time_minincl_value - self.time_minincl_value = initvalue_ - if isinstance(time_maxincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time() - else: - initvalue_ = time_maxincl_value - self.time_maxincl_value = initvalue_ - if isinstance(time_minexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time() - else: - initvalue_ = time_minexcl_value - self.time_minexcl_value = initvalue_ - if isinstance(time_maxexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time() - else: - initvalue_ = time_maxexcl_value - self.time_maxexcl_value = initvalue_ - if isinstance(datetime_minincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S') - else: - initvalue_ = datetime_minincl_value - self.datetime_minincl_value = initvalue_ - if isinstance(datetime_maxincl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S') - else: - initvalue_ = datetime_maxincl_value - self.datetime_maxincl_value = initvalue_ - if isinstance(datetime_minexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S') - else: - initvalue_ = datetime_minexcl_value - self.datetime_minexcl_value = initvalue_ - if isinstance(datetime_maxexcl_value, BaseStrType_): - initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S') - else: - initvalue_ = datetime_maxexcl_value - self.datetime_maxexcl_value = initvalue_ - self.anonymous_float_value = anonymous_float_value - self.validate_anonymous_float_valueType(self.anonymous_float_value) - self.primative_integer = primative_integer - self.primative_float = primative_float - def factory(*args_, **kwargs_): - if CurrentSubclassModule_ is not None: - subclass = getSubclassFromModule_( - CurrentSubclassModule_, simpleOneType) - if subclass is not None: - return subclass(*args_, **kwargs_) - if simpleOneType.subclass: - return simpleOneType.subclass(*args_, **kwargs_) - else: - return simpleOneType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_integer_range_1_value(self): return self.integer_range_1_value - def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value - def get_pattern_value(self): return self.pattern_value - def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value - def get_token_enum_value(self): return self.token_enum_value - def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value - def get_token_enum_value(self): return self.token_enum_value - def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value - def get_integer_range_incl_value(self): return self.integer_range_incl_value - def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value - def get_integer_range_excl_value(self): return self.integer_range_excl_value - def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value - def get_min_max_length_value(self): return self.min_max_length_value - def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value - def get_length_value(self): return self.length_value - def set_length_value(self, length_value): self.length_value = length_value - def get_totalDigits_value(self): return self.totalDigits_value - def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value - def get_date_minincl_value(self): return self.date_minincl_value - def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value - def get_date_maxincl_value(self): return self.date_maxincl_value - def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value - def get_date_minexcl_value(self): return self.date_minexcl_value - def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value - def get_date_maxexcl_value(self): return self.date_maxexcl_value - def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value - def get_time_minincl_value(self): return self.time_minincl_value - def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value - def get_time_maxincl_value(self): return self.time_maxincl_value - def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value - def get_time_minexcl_value(self): return self.time_minexcl_value - def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value - def get_time_maxexcl_value(self): return self.time_maxexcl_value - def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value - def get_datetime_minincl_value(self): return self.datetime_minincl_value - def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value - def get_datetime_maxincl_value(self): return self.datetime_maxincl_value - def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value - def get_datetime_minexcl_value(self): return self.datetime_minexcl_value - def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value - def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value - def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value - def get_anonymous_float_value(self): return self.anonymous_float_value - def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value - def get_primative_integer(self): return self.primative_integer - def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer - def get_primative_float(self): return self.primative_float - def set_primative_float(self, primative_float): self.primative_float = primative_float - def validate_integer_range_1_st(self, value): - # Validate type integer_range_1_st, a restriction on integer_range_2_st. - if value is not None and Validate_simpletypes_: - if value <= 4: - warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} ) - if value >= 8: - warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} ) - def validate_pattern_st(self, value): - # Validate type pattern_st, a restriction on pattern_1_st. - if value is not None and Validate_simpletypes_: - if len(str(value)) < 10: - warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} ) - if not self.gds_validate_simple_patterns( - self.validate_pattern_st_patterns_, value): - warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) - validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] - def validate_token_enum_st(self, value): - # Validate type token_enum_st, a restriction on xs:NMTOKEN. - if value is not None and Validate_simpletypes_: - value = str(value) - enumerations = ['float', 'int', 'Name', 'token'] - enumeration_respectee = False - for enum in enumerations: - if value == enum: - enumeration_respectee = True - break - if not enumeration_respectee: - warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) - def validate_integer_range_incl_st(self, value): - # Validate type integer_range_incl_st, a restriction on xs:integer. - if value is not None and Validate_simpletypes_: - if value < -5: - warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) - if value > 10: - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) - def validate_integer_range_excl_st(self, value): - # Validate type integer_range_excl_st, a restriction on xs:integer. - if value is not None and Validate_simpletypes_: - if value <= -5: - warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) - if value >= 10: - warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} ) - def validate_min_max_length_st(self, value): - # Validate type min_max_length_st, a restriction on xs:string. - if value is not None and Validate_simpletypes_: - if len(value) > 20: - warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) - if len(value) < 10: - warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) - def validate_length_st(self, value): - # Validate type length_st, a restriction on xs:string. - if value is not None and Validate_simpletypes_: - if len(value) != 10: - warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) - def validate_totalDigits_st(self, value): - # Validate type totalDigits_st, a restriction on xs:decimal. - if value is not None and Validate_simpletypes_: - if len(str(value)) >= 15: - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} ) - def validate_date_minincl_st(self, value): - # Validate type date_minincl_st, a restriction on xs:date. - if value is not None and Validate_simpletypes_: - if value < self.gds_parse_date('2015-06-01'): - warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} ) - def validate_date_maxincl_st(self, value): - # Validate type date_maxincl_st, a restriction on xs:date. - if value is not None and Validate_simpletypes_: - if value > self.gds_parse_date('2015-10-31'): - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} ) - def validate_date_minexcl_st(self, value): - # Validate type date_minexcl_st, a restriction on xs:date. - if value is not None and Validate_simpletypes_: - if value <= self.gds_parse_date('2015-06-01'): - warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} ) - def validate_date_maxexcl_st(self, value): - # Validate type date_maxexcl_st, a restriction on xs:date. - if value is not None and Validate_simpletypes_: - if value >= self.gds_parse_date('2015-10-31'): - warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} ) - def validate_time_minincl_st(self, value): - # Validate type time_minincl_st, a restriction on xs:time. - if value is not None and Validate_simpletypes_: - if value < self.gds_parse_time('14:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} ) - def validate_time_maxincl_st(self, value): - # Validate type time_maxincl_st, a restriction on xs:time. - if value is not None and Validate_simpletypes_: - if value > self.gds_parse_time('16:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} ) - def validate_time_minexcl_st(self, value): - # Validate type time_minexcl_st, a restriction on xs:time. - if value is not None and Validate_simpletypes_: - if value <= self.gds_parse_time('14:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} ) - def validate_time_maxexcl_st(self, value): - # Validate type time_maxexcl_st, a restriction on xs:time. - if value is not None and Validate_simpletypes_: - if value >= self.gds_parse_time('16:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} ) - def validate_datetime_minincl_st(self, value): - # Validate type datetime_minincl_st, a restriction on xs:dateTime. - if value is not None and Validate_simpletypes_: - if value < self.gds_parse_datetime('2015-06-01T14:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} ) - def validate_datetime_maxincl_st(self, value): - # Validate type datetime_maxincl_st, a restriction on xs:dateTime. - if value is not None and Validate_simpletypes_: - if value > self.gds_parse_datetime('2015-10-31T16:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} ) - def validate_datetime_minexcl_st(self, value): - # Validate type datetime_minexcl_st, a restriction on xs:dateTime. - if value is not None and Validate_simpletypes_: - if value <= self.gds_parse_datetime('2015-06-01T14:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} ) - def validate_datetime_maxexcl_st(self, value): - # Validate type datetime_maxexcl_st, a restriction on xs:dateTime. - if value is not None and Validate_simpletypes_: - if value >= self.gds_parse_datetime('2015-10-31T16:20:10'): - warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} ) - def validate_anonymous_float_valueType(self, value): - # Validate type anonymous_float_valueType, a restriction on xs:float. - if value is not None and Validate_simpletypes_: - if value < 1.1: - warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) - if value > 4.4: - warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) - def hasContent_(self): - if ( - self.integer_range_1_value is not None or - self.pattern_value is not None or - self.token_enum_value is not None or - self.token_enum_value is not None or - self.integer_range_incl_value is not None or - self.integer_range_excl_value is not None or - self.min_max_length_value is not None or - self.length_value is not None or - self.totalDigits_value is not None or - self.date_minincl_value is not None or - self.date_maxincl_value is not None or - self.date_minexcl_value is not None or - self.date_maxexcl_value is not None or - self.time_minincl_value is not None or - self.time_maxincl_value is not None or - self.time_minexcl_value is not None or - self.time_maxexcl_value is not None or - self.datetime_minincl_value is not None or - self.datetime_maxincl_value is not None or - self.datetime_minexcl_value is not None or - self.datetime_maxexcl_value is not None or - self.anonymous_float_value is not None or - self.primative_integer is not None or - self.primative_float is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='simpleOneType', 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_='simpleOneType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', 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_='simpleOneType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.integer_range_1_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_)) - if self.pattern_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_)) - if self.token_enum_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) - if self.token_enum_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) - if self.integer_range_incl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_)) - if self.integer_range_excl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_)) - if self.min_max_length_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_)) - if self.length_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_)) - if self.totalDigits_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_)) - if self.date_minincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_)) - if self.date_maxincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_)) - if self.date_minexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_)) - if self.date_maxexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_)) - if self.time_minincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_)) - if self.time_maxincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_)) - if self.time_minexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_)) - if self.time_maxexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_)) - if self.datetime_minincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_)) - if self.datetime_maxincl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_)) - if self.datetime_minexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_)) - if self.datetime_maxexcl_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_)) - if self.anonymous_float_value is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_)) - if self.primative_integer is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_)) - if self.primative_float is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_)) - 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_ == 'integer_range_1_value': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value') - self.integer_range_1_value = ival_ - # validate type integer_range_1_st - self.validate_integer_range_1_st(self.integer_range_1_value) - elif nodeName_ == 'pattern_value': - pattern_value_ = child_.text - pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value') - self.pattern_value = pattern_value_ - # validate type pattern_st - self.validate_pattern_st(self.pattern_value) - elif nodeName_ == 'token_enum_value': - token_enum_value_ = child_.text - token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') - self.token_enum_value = token_enum_value_ - # validate type token_enum_st - self.validate_token_enum_st(self.token_enum_value) - elif nodeName_ == 'token_enum_value': - token_enum_value_ = child_.text - token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') - self.token_enum_value = token_enum_value_ - # validate type token_enum_st - self.validate_token_enum_st(self.token_enum_value) - elif nodeName_ == 'integer_range_incl_value': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') - self.integer_range_incl_value = ival_ - # validate type integer_range_incl_st - self.validate_integer_range_incl_st(self.integer_range_incl_value) - elif nodeName_ == 'integer_range_excl_value': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') - self.integer_range_excl_value = ival_ - # validate type integer_range_excl_st - self.validate_integer_range_excl_st(self.integer_range_excl_value) - elif nodeName_ == 'min_max_length_value': - min_max_length_value_ = child_.text - min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value') - self.min_max_length_value = min_max_length_value_ - # validate type min_max_length_st - self.validate_min_max_length_st(self.min_max_length_value) - elif nodeName_ == 'length_value': - length_value_ = child_.text - length_value_ = self.gds_validate_string(length_value_, node, 'length_value') - self.length_value = length_value_ - # validate type length_st - self.validate_length_st(self.length_value) - elif nodeName_ == 'totalDigits_value': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value') - self.totalDigits_value = fval_ - # validate type totalDigits_st - self.validate_totalDigits_st(self.totalDigits_value) - elif nodeName_ == 'date_minincl_value': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.date_minincl_value = dval_ - # validate type date_minincl_st - self.validate_date_minincl_st(self.date_minincl_value) - elif nodeName_ == 'date_maxincl_value': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.date_maxincl_value = dval_ - # validate type date_maxincl_st - self.validate_date_maxincl_st(self.date_maxincl_value) - elif nodeName_ == 'date_minexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.date_minexcl_value = dval_ - # validate type date_minexcl_st - self.validate_date_minexcl_st(self.date_minexcl_value) - elif nodeName_ == 'date_maxexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.date_maxexcl_value = dval_ - # validate type date_maxexcl_st - self.validate_date_maxexcl_st(self.date_maxexcl_value) - elif nodeName_ == 'time_minincl_value': - sval_ = child_.text - dval_ = self.gds_parse_time(sval_) - self.time_minincl_value = dval_ - # validate type time_minincl_st - self.validate_time_minincl_st(self.time_minincl_value) - elif nodeName_ == 'time_maxincl_value': - sval_ = child_.text - dval_ = self.gds_parse_time(sval_) - self.time_maxincl_value = dval_ - # validate type time_maxincl_st - self.validate_time_maxincl_st(self.time_maxincl_value) - elif nodeName_ == 'time_minexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_time(sval_) - self.time_minexcl_value = dval_ - # validate type time_minexcl_st - self.validate_time_minexcl_st(self.time_minexcl_value) - elif nodeName_ == 'time_maxexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_time(sval_) - self.time_maxexcl_value = dval_ - # validate type time_maxexcl_st - self.validate_time_maxexcl_st(self.time_maxexcl_value) - elif nodeName_ == 'datetime_minincl_value': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.datetime_minincl_value = dval_ - # validate type datetime_minincl_st - self.validate_datetime_minincl_st(self.datetime_minincl_value) - elif nodeName_ == 'datetime_maxincl_value': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.datetime_maxincl_value = dval_ - # validate type datetime_maxincl_st - self.validate_datetime_maxincl_st(self.datetime_maxincl_value) - elif nodeName_ == 'datetime_minexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.datetime_minexcl_value = dval_ - # validate type datetime_minexcl_st - self.validate_datetime_minexcl_st(self.datetime_minexcl_value) - elif nodeName_ == 'datetime_maxexcl_value': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.datetime_maxexcl_value = dval_ - # validate type datetime_maxexcl_st - self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value) - elif nodeName_ == 'anonymous_float_value': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') - self.anonymous_float_value = fval_ - # validate type anonymous_float_valueType - self.validate_anonymous_float_valueType(self.anonymous_float_value) - elif nodeName_ == 'primative_integer': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'primative_integer') - self.primative_integer = ival_ - elif nodeName_ == 'primative_float': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError) as exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'primative_float') - self.primative_float = fval_ -# end class simpleOneType - - -class simpleTwoType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0), - ] - subclass = None - superclass = None - def __init__(self, simpleTwoElementOne=None): - self.original_tagname_ = None - self.simpleTwoElementOne = simpleTwoElementOne - def factory(*args_, **kwargs_): - if CurrentSubclassModule_ is not None: - subclass = getSubclassFromModule_( - CurrentSubclassModule_, simpleTwoType) - if subclass is not None: - return subclass(*args_, **kwargs_) - if simpleTwoType.subclass: - return simpleTwoType.subclass(*args_, **kwargs_) - else: - return simpleTwoType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_simpleTwoElementOne(self): return self.simpleTwoElementOne - def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne - def hasContent_(self): - if ( - self.simpleTwoElementOne is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='simpleTwoType', 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_='simpleTwoType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', 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_='simpleTwoType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.simpleTwoElementOne is not None: - self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print) - 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_ == 'simpleTwoElementOne': - obj_ = simpleTwoElementOneType.factory() - obj_.build(child_) - self.simpleTwoElementOne = obj_ - obj_.original_tagname_ = 'simpleTwoElementOne' -# end class simpleTwoType - - -class simpleTwoElementOneType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0), - ] - subclass = None - superclass = None - def __init__(self, simpleTwoElementTwo=None): - self.original_tagname_ = None - self.simpleTwoElementTwo = simpleTwoElementTwo - self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) - def factory(*args_, **kwargs_): - if CurrentSubclassModule_ is not None: - subclass = getSubclassFromModule_( - CurrentSubclassModule_, simpleTwoElementOneType) - if subclass is not None: - return subclass(*args_, **kwargs_) - if simpleTwoElementOneType.subclass: - return simpleTwoElementOneType.subclass(*args_, **kwargs_) - else: - return simpleTwoElementOneType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo - def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo - def validate_simpleTwoElementTwoType(self, value): - # Validate type simpleTwoElementTwoType, a restriction on xs:string. - if value is not None and Validate_simpletypes_: - if len(value) > 24: - warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) - if len(value) < 12: - warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) - def hasContent_(self): - if ( - self.simpleTwoElementTwo is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', 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_='simpleTwoElementOneType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', 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_='simpleTwoElementOneType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.simpleTwoElementTwo is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_)) - 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_ == 'simpleTwoElementTwo': - simpleTwoElementTwo_ = child_.text - simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo') - self.simpleTwoElementTwo = simpleTwoElementTwo_ - # validate type simpleTwoElementTwoType - self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) -# end class simpleTwoElementOneType - - -GDSClassesMapping = { - 'container': containerType, - 'sample1': simpleOneType, - 'sample2': simpleTwoType, - 'sample2_bad': simpleOneType, - 'sample3_bad': simpleOneType, - 'sample4_bad': simpleOneType, - 'simpleTwoElementOne': simpleTwoElementOneType, - 'simpleTypeData': simpleTwoType, -} - - -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): - parser = None - doc = parsexml_(inFileName, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = containerType - 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): - parser = None - doc = parsexml_(inFileName, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = containerType - 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 - parser = None - doc = parsexml_(StringIO(inString), parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = containerType - 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): - parser = None - doc = parsexml_(inFileName, parser) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'containerType' - rootClass = containerType - 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 validate_simpletypes2_sup import *\n\n') - sys.stdout.write('import validate_simpletypes2_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__ = [ - "containerType", - "simpleOneType", - "simpleTwoElementOneType", - "simpleTwoType" -] +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **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 as 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=None, 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=None, 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=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, 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 values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, 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 values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, 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 values + def gds_validate_datetime(self, input_data, node=None, 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] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + 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=None, 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=None, 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 + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @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())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None + + +# +# 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'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." + if not inStr: + return '' + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, BaseStrType_) 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): + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) + 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 containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('sample1', 'simpleOneType', 1), + MemberSpec_('sample2_bad', 'simpleOneType', 1), + MemberSpec_('sample3_bad', 'simpleOneType', 1), + MemberSpec_('sample4_bad', 'simpleOneType', 1), + MemberSpec_('sample2', 'simpleTwoType', 1), + ] + subclass = None + superclass = None + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + self.original_tagname_ = None + if sample1 is None: + self.sample1 = [] + else: + self.sample1 = sample1 + if sample2_bad is None: + self.sample2_bad = [] + else: + self.sample2_bad = sample2_bad + if sample3_bad is None: + self.sample3_bad = [] + else: + self.sample3_bad = sample3_bad + if sample4_bad is None: + self.sample4_bad = [] + else: + self.sample4_bad = sample4_bad + if sample2 is None: + self.sample2 = [] + else: + self.sample2 = sample2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, containerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if containerType.subclass: + return containerType.subclass(*args_, **kwargs_) + else: + return containerType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_sample1(self): return self.sample1 + def set_sample1(self, sample1): self.sample1 = sample1 + def add_sample1(self, value): self.sample1.append(value) + def insert_sample1_at(self, index, value): self.sample1.insert(index, value) + def replace_sample1_at(self, index, value): self.sample1[index] = value + def get_sample2_bad(self): return self.sample2_bad + def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad + def add_sample2_bad(self, value): self.sample2_bad.append(value) + def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value) + def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value + def get_sample3_bad(self): return self.sample3_bad + def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad + def add_sample3_bad(self, value): self.sample3_bad.append(value) + def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value) + def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value + def get_sample4_bad(self): return self.sample4_bad + def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad + def add_sample4_bad(self, value): self.sample4_bad.append(value) + def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value) + def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value + def get_sample2(self): return self.sample2 + def set_sample2(self, sample2): self.sample2 = sample2 + def add_sample2(self, value): self.sample2.append(value) + def insert_sample2_at(self, index, value): self.sample2.insert(index, value) + def replace_sample2_at(self, index, value): self.sample2[index] = value + def hasContent_(self): + if ( + self.sample1 or + self.sample2_bad or + self.sample3_bad or + self.sample4_bad or + self.sample2 + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='containerType', 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_='containerType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', 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_='containerType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for sample1_ in self.sample1: + sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print) + for sample2_bad_ in self.sample2_bad: + sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print) + for sample3_bad_ in self.sample3_bad: + sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print) + for sample4_bad_ in self.sample4_bad: + sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print) + for sample2_ in self.sample2: + sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) + 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_ == 'sample1': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample1.append(obj_) + obj_.original_tagname_ = 'sample1' + elif nodeName_ == 'sample2_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample2_bad.append(obj_) + obj_.original_tagname_ = 'sample2_bad' + elif nodeName_ == 'sample3_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample3_bad.append(obj_) + obj_.original_tagname_ = 'sample3_bad' + elif nodeName_ == 'sample4_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample4_bad.append(obj_) + obj_.original_tagname_ = 'sample4_bad' + elif nodeName_ == 'sample2': + obj_ = simpleTwoType.factory() + obj_.build(child_) + self.sample2.append(obj_) + obj_.original_tagname_ = 'sample2' +# end class containerType + + +class simpleOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0), + MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0), + MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), + MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), + MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0), + MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0), + MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0), + MemberSpec_('length_value', ['length_st', 'xs:string'], 0), + MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0), + MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0), + MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0), + MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0), + MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0), + MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0), + MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0), + MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0), + MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0), + MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0), + MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), + MemberSpec_('primative_integer', 'xs:integer', 0), + MemberSpec_('primative_float', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + self.original_tagname_ = None + self.integer_range_1_value = integer_range_1_value + self.validate_integer_range_1_st(self.integer_range_1_value) + self.pattern_value = pattern_value + self.validate_pattern_st(self.pattern_value) + self.token_enum_value = token_enum_value + self.validate_token_enum_st(self.token_enum_value) + self.token_enum_value = token_enum_value + self.validate_token_enum_st(self.token_enum_value) + self.integer_range_incl_value = integer_range_incl_value + self.validate_integer_range_incl_st(self.integer_range_incl_value) + self.integer_range_excl_value = integer_range_excl_value + self.validate_integer_range_excl_st(self.integer_range_excl_value) + self.min_max_length_value = min_max_length_value + self.validate_min_max_length_st(self.min_max_length_value) + self.length_value = length_value + self.validate_length_st(self.length_value) + self.totalDigits_value = totalDigits_value + self.validate_totalDigits_st(self.totalDigits_value) + if isinstance(date_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minincl_value + self.date_minincl_value = initvalue_ + if isinstance(date_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxincl_value + self.date_maxincl_value = initvalue_ + if isinstance(date_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minexcl_value + self.date_minexcl_value = initvalue_ + if isinstance(date_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxexcl_value + self.date_maxexcl_value = initvalue_ + if isinstance(time_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minincl_value + self.time_minincl_value = initvalue_ + if isinstance(time_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxincl_value + self.time_maxincl_value = initvalue_ + if isinstance(time_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minexcl_value + self.time_minexcl_value = initvalue_ + if isinstance(time_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxexcl_value + self.time_maxexcl_value = initvalue_ + if isinstance(datetime_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minincl_value + self.datetime_minincl_value = initvalue_ + if isinstance(datetime_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxincl_value + self.datetime_maxincl_value = initvalue_ + if isinstance(datetime_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minexcl_value + self.datetime_minexcl_value = initvalue_ + if isinstance(datetime_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxexcl_value + self.datetime_maxexcl_value = initvalue_ + self.anonymous_float_value = anonymous_float_value + self.validate_anonymous_float_valueType(self.anonymous_float_value) + self.primative_integer = primative_integer + self.primative_float = primative_float + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleOneType.subclass: + return simpleOneType.subclass(*args_, **kwargs_) + else: + return simpleOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_integer_range_1_value(self): return self.integer_range_1_value + def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value + def get_pattern_value(self): return self.pattern_value + def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value + def get_token_enum_value(self): return self.token_enum_value + def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value + def get_token_enum_value(self): return self.token_enum_value + def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value + def get_integer_range_incl_value(self): return self.integer_range_incl_value + def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value + def get_integer_range_excl_value(self): return self.integer_range_excl_value + def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value + def get_min_max_length_value(self): return self.min_max_length_value + def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value + def get_length_value(self): return self.length_value + def set_length_value(self, length_value): self.length_value = length_value + def get_totalDigits_value(self): return self.totalDigits_value + def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value + def get_date_minincl_value(self): return self.date_minincl_value + def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value + def get_date_maxincl_value(self): return self.date_maxincl_value + def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value + def get_date_minexcl_value(self): return self.date_minexcl_value + def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value + def get_date_maxexcl_value(self): return self.date_maxexcl_value + def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value + def get_time_minincl_value(self): return self.time_minincl_value + def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value + def get_time_maxincl_value(self): return self.time_maxincl_value + def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value + def get_time_minexcl_value(self): return self.time_minexcl_value + def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value + def get_time_maxexcl_value(self): return self.time_maxexcl_value + def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value + def get_datetime_minincl_value(self): return self.datetime_minincl_value + def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value + def get_datetime_maxincl_value(self): return self.datetime_maxincl_value + def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value + def get_datetime_minexcl_value(self): return self.datetime_minexcl_value + def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value + def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value + def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value + def get_anonymous_float_value(self): return self.anonymous_float_value + def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value + def get_primative_integer(self): return self.primative_integer + def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer + def get_primative_float(self): return self.primative_float + def set_primative_float(self, primative_float): self.primative_float = primative_float + def validate_integer_range_1_st(self, value): + # Validate type integer_range_1_st, a restriction on integer_range_2_st. + if value is not None and Validate_simpletypes_: + if value <= 4: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} ) + if value >= 8: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} ) + def validate_pattern_st(self, value): + # Validate type pattern_st, a restriction on pattern_1_st. + if value is not None and Validate_simpletypes_: + if len(str(value)) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} ) + if not self.gds_validate_simple_patterns( + self.validate_pattern_st_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) + validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] + def validate_token_enum_st(self, value): + # Validate type token_enum_st, a restriction on xs:NMTOKEN. + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) + def validate_integer_range_incl_st(self, value): + # Validate type integer_range_incl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value < -5: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) + if value > 10: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) + def validate_integer_range_excl_st(self, value): + # Validate type integer_range_excl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value <= -5: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) + if value >= 10: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} ) + def validate_min_max_length_st(self, value): + # Validate type min_max_length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 20: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + if len(value) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + def validate_length_st(self, value): + # Validate type length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) != 10: + warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) + def validate_totalDigits_st(self, value): + # Validate type totalDigits_st, a restriction on xs:decimal. + if value is not None and Validate_simpletypes_: + if len(str(value)) >= 15: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} ) + def validate_date_minincl_st(self, value): + # Validate type date_minincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} ) + def validate_date_maxincl_st(self, value): + # Validate type date_maxincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} ) + def validate_date_minexcl_st(self, value): + # Validate type date_minexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} ) + def validate_date_maxexcl_st(self, value): + # Validate type date_maxexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} ) + def validate_time_minincl_st(self, value): + # Validate type time_minincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} ) + def validate_time_maxincl_st(self, value): + # Validate type time_maxincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} ) + def validate_time_minexcl_st(self, value): + # Validate type time_minexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} ) + def validate_time_maxexcl_st(self, value): + # Validate type time_maxexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} ) + def validate_datetime_minincl_st(self, value): + # Validate type datetime_minincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} ) + def validate_datetime_maxincl_st(self, value): + # Validate type datetime_maxincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} ) + def validate_datetime_minexcl_st(self, value): + # Validate type datetime_minexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} ) + def validate_datetime_maxexcl_st(self, value): + # Validate type datetime_maxexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} ) + def validate_anonymous_float_valueType(self, value): + # Validate type anonymous_float_valueType, a restriction on xs:float. + if value is not None and Validate_simpletypes_: + if value < 1.1: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + if value > 4.4: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + def hasContent_(self): + if ( + self.integer_range_1_value is not None or + self.pattern_value is not None or + self.token_enum_value is not None or + self.token_enum_value is not None or + self.integer_range_incl_value is not None or + self.integer_range_excl_value is not None or + self.min_max_length_value is not None or + self.length_value is not None or + self.totalDigits_value is not None or + self.date_minincl_value is not None or + self.date_maxincl_value is not None or + self.date_minexcl_value is not None or + self.date_maxexcl_value is not None or + self.time_minincl_value is not None or + self.time_maxincl_value is not None or + self.time_minexcl_value is not None or + self.time_maxexcl_value is not None or + self.datetime_minincl_value is not None or + self.datetime_maxincl_value is not None or + self.datetime_minexcl_value is not None or + self.datetime_maxexcl_value is not None or + self.anonymous_float_value is not None or + self.primative_integer is not None or + self.primative_float is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleOneType', 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_='simpleOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', 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_='simpleOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.integer_range_1_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_)) + if self.pattern_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_)) + if self.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) + if self.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) + if self.integer_range_incl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_)) + if self.integer_range_excl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_)) + if self.min_max_length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_)) + if self.length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_)) + if self.totalDigits_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_)) + if self.date_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_)) + if self.date_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_)) + if self.date_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_)) + if self.date_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_)) + if self.time_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_)) + if self.time_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_)) + if self.time_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_)) + if self.time_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_)) + if self.datetime_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_)) + if self.datetime_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_)) + if self.datetime_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_)) + if self.datetime_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_)) + if self.anonymous_float_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_)) + if self.primative_integer is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_)) + if self.primative_float is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_)) + 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_ == 'integer_range_1_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value') + self.integer_range_1_value = ival_ + # validate type integer_range_1_st + self.validate_integer_range_1_st(self.integer_range_1_value) + elif nodeName_ == 'pattern_value': + pattern_value_ = child_.text + pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value') + self.pattern_value = pattern_value_ + # validate type pattern_st + self.validate_pattern_st(self.pattern_value) + elif nodeName_ == 'token_enum_value': + token_enum_value_ = child_.text + token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') + self.token_enum_value = token_enum_value_ + # validate type token_enum_st + self.validate_token_enum_st(self.token_enum_value) + elif nodeName_ == 'token_enum_value': + token_enum_value_ = child_.text + token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') + self.token_enum_value = token_enum_value_ + # validate type token_enum_st + self.validate_token_enum_st(self.token_enum_value) + elif nodeName_ == 'integer_range_incl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') + self.integer_range_incl_value = ival_ + # validate type integer_range_incl_st + self.validate_integer_range_incl_st(self.integer_range_incl_value) + elif nodeName_ == 'integer_range_excl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') + self.integer_range_excl_value = ival_ + # validate type integer_range_excl_st + self.validate_integer_range_excl_st(self.integer_range_excl_value) + elif nodeName_ == 'min_max_length_value': + min_max_length_value_ = child_.text + min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value') + self.min_max_length_value = min_max_length_value_ + # validate type min_max_length_st + self.validate_min_max_length_st(self.min_max_length_value) + elif nodeName_ == 'length_value': + length_value_ = child_.text + length_value_ = self.gds_validate_string(length_value_, node, 'length_value') + self.length_value = length_value_ + # validate type length_st + self.validate_length_st(self.length_value) + elif nodeName_ == 'totalDigits_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value') + self.totalDigits_value = fval_ + # validate type totalDigits_st + self.validate_totalDigits_st(self.totalDigits_value) + elif nodeName_ == 'date_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minincl_value = dval_ + # validate type date_minincl_st + self.validate_date_minincl_st(self.date_minincl_value) + elif nodeName_ == 'date_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxincl_value = dval_ + # validate type date_maxincl_st + self.validate_date_maxincl_st(self.date_maxincl_value) + elif nodeName_ == 'date_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minexcl_value = dval_ + # validate type date_minexcl_st + self.validate_date_minexcl_st(self.date_minexcl_value) + elif nodeName_ == 'date_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxexcl_value = dval_ + # validate type date_maxexcl_st + self.validate_date_maxexcl_st(self.date_maxexcl_value) + elif nodeName_ == 'time_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minincl_value = dval_ + # validate type time_minincl_st + self.validate_time_minincl_st(self.time_minincl_value) + elif nodeName_ == 'time_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxincl_value = dval_ + # validate type time_maxincl_st + self.validate_time_maxincl_st(self.time_maxincl_value) + elif nodeName_ == 'time_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minexcl_value = dval_ + # validate type time_minexcl_st + self.validate_time_minexcl_st(self.time_minexcl_value) + elif nodeName_ == 'time_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxexcl_value = dval_ + # validate type time_maxexcl_st + self.validate_time_maxexcl_st(self.time_maxexcl_value) + elif nodeName_ == 'datetime_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minincl_value = dval_ + # validate type datetime_minincl_st + self.validate_datetime_minincl_st(self.datetime_minincl_value) + elif nodeName_ == 'datetime_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxincl_value = dval_ + # validate type datetime_maxincl_st + self.validate_datetime_maxincl_st(self.datetime_maxincl_value) + elif nodeName_ == 'datetime_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minexcl_value = dval_ + # validate type datetime_minexcl_st + self.validate_datetime_minexcl_st(self.datetime_minexcl_value) + elif nodeName_ == 'datetime_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxexcl_value = dval_ + # validate type datetime_maxexcl_st + self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value) + elif nodeName_ == 'anonymous_float_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') + self.anonymous_float_value = fval_ + # validate type anonymous_float_valueType + self.validate_anonymous_float_valueType(self.anonymous_float_value) + elif nodeName_ == 'primative_integer': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'primative_integer') + self.primative_integer = ival_ + elif nodeName_ == 'primative_float': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'primative_float') + self.primative_float = fval_ +# end class simpleOneType + + +class simpleTwoType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementOne=None): + self.original_tagname_ = None + self.simpleTwoElementOne = simpleTwoElementOne + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoType.subclass: + return simpleTwoType.subclass(*args_, **kwargs_) + else: + return simpleTwoType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementOne(self): return self.simpleTwoElementOne + def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne + def hasContent_(self): + if ( + self.simpleTwoElementOne is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoType', 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_='simpleTwoType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', 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_='simpleTwoType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementOne is not None: + self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print) + 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_ == 'simpleTwoElementOne': + obj_ = simpleTwoElementOneType.factory() + obj_.build(child_) + self.simpleTwoElementOne = obj_ + obj_.original_tagname_ = 'simpleTwoElementOne' +# end class simpleTwoType + + +class simpleTwoElementOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementTwo=None): + self.original_tagname_ = None + self.simpleTwoElementTwo = simpleTwoElementTwo + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoElementOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoElementOneType.subclass: + return simpleTwoElementOneType.subclass(*args_, **kwargs_) + else: + return simpleTwoElementOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo + def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo + def validate_simpleTwoElementTwoType(self, value): + # Validate type simpleTwoElementTwoType, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 24: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + if len(value) < 12: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + def hasContent_(self): + if ( + self.simpleTwoElementTwo is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', 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_='simpleTwoElementOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', 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_='simpleTwoElementOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementTwo is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_)) + 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_ == 'simpleTwoElementTwo': + simpleTwoElementTwo_ = child_.text + simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo') + self.simpleTwoElementTwo = simpleTwoElementTwo_ + # validate type simpleTwoElementTwoType + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) +# end class simpleTwoElementOneType + + +GDSClassesMapping = { + 'container': containerType, + 'sample1': simpleOneType, + 'sample2': simpleTwoType, + 'sample2_bad': simpleOneType, + 'sample3_bad': simpleOneType, + 'sample4_bad': simpleOneType, + 'simpleTwoElementOne': simpleTwoElementOneType, + 'simpleTypeData': simpleTwoType, +} + + +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): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + 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): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + 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 + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + 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): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + 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 validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_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__ = [ + "containerType", + "simpleOneType", + "simpleTwoElementOneType", + "simpleTwoType" +]