diff --git a/README b/README index 198b2e5a9bc9656698208510a0a4d2865d5066f7..61e09ebfa2b5f890007371886e4e60a9d81136a3 100644 --- a/README +++ b/README @@ -141,9 +141,15 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- -Version 2.13b (09/14/2014) +Version 2.14a (10/08/2014) - Fixed export of simpleType lists (added "' '.join(data)". Thanks to Per Rosengren for catching this. +- Added new style validation of simpleType data. Validation + requirements are captured from the XML schema definition of the + simpleType, e.g. 'restriction base="..."' etc. Thanks to + azer gh for implementing this extended capability. +- Added unit test for simpleType validation, including test for + proper detection of bad (invalid) data. Version 2.13a (09/09/2014) - Minor fix to function generateToEtreeChildren. Must generate diff --git a/generateDS.html b/generateDS.html index 4ed9fd4217980343a74581d3fa526cd0cf5da606..90dfb325439b740baa17e719174413cdabd1b9b0 100644 --- a/generateDS.html +++ b/generateDS.html @@ -205,7 +205,7 @@ ul.auto-toc { <tr><th class="docinfo-name">Author:</th> <td>Dave Kuhlman</td></tr> <tr><th class="docinfo-name">Contact:</th> -<td><a class="first last reference external" href="mailto:dkuhlman@davekuhlman.org">dkuhlman@davekuhlman.org</a></td></tr> +<td>dkuhlman (at) davekuhlman (dot) org</td></tr> <tr><th class="docinfo-name">Address:</th> <td><pre class="address"> <a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a> @@ -220,7 +220,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td> </tr> </tbody> </table> @@ -229,7 +229,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td> </tr> </tbody> </table> @@ -552,6 +552,11 @@ Options: module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -729,6 +734,17 @@ an optional ".py" extension. If a file is not provided for a given type, an empty body (<tt class="docutils literal">pass</tt>) is generated. In these files, lines with "##" in the first two columns are ignored and are not inserted.</dd> +<dt>use-old-simpletype-validators</dt> +<dd><tt class="docutils literal">generateDS.py</tt> is capable of generating validator bodies -- +the code that validates data content in an XML instance +docuement and writes out warning messages if that data does not +satisfy the facets in the <tt class="docutils literal">xs:restriction</tt> in the +<tt class="docutils literal">xs:simpleType</tt> defintion in the XML schema. Use this option +if you want to use your own validation bodies/code defined in a +specified directory . See option <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> for +information on that. <em>Without</em> this option +(<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>), the validator code will +be generated directly from the XML schema, which is the default.</dd> <dt>use-getter-setter</dt> <dd><p class="first"><tt class="docutils literal">generateDS.py</tt> now generates getter and setter methods (for variable "abc", for example) with the names get_abc() and @@ -761,7 +777,12 @@ changes to the generated python code.</dd> <dd>Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by <tt class="docutils literal"><include ... /></tt> elements into the XML Schema to be processed. -See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.</dd> +See section <a class="reference internal" href="#include-file-processing">Include file processing</a>. Note that include +processing, which is performed in <tt class="docutils literal">process_includes.py</tt> is +required for generating validator bodies from the XML schema, +because the Lxml ElementTree produced in <tt class="docutils literal">process_includes.py</tt> +is needed to generate the validator code. So, using this option +also turns off automatic generation of validator code.</dd> <dt>silence</dt> <dd>Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, @@ -2886,7 +2907,7 @@ following among others:</p> <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateDS.txt">View document source</a>. -Generated on: 2014-09-09 20:05 UTC. +Generated on: 2014-10-08 22:22 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/generateDS.py b/generateDS.py index 12f65cd114dab88ff1b35410a0971f79d840b625..145f99531d3502816210e03d116c1eab5015fd26 100755 --- a/generateDS.py +++ b/generateDS.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ Synopsis: - Generate Python classes from XML Schema definition. + Generate Python classes from XML schema definition. Input is read from in_xsd_file or, if "-" (dash) arg, from stdin. Output is written to files named in "-o" and "-s" options. Usage: @@ -35,6 +35,11 @@ Options: module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -51,10 +56,10 @@ Options: generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code. - --no-process-includes Do not process included XML Schema files. By + --no-process-includes Do not process included XML schema files. By default, generateDS.py will insert content from files referenced by <include ... /> - elements into the XML Schema to be processed. + elements into the XML schema to be processed. --silence Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, use the --silence switch. @@ -148,11 +153,6 @@ import keyword import StringIO import textwrap - - -#sorry :couldnt pass the filename but with global variable,as i want to use it in validations try to correct this -xsdFileName=[] - # Default logger configuration logging.basicConfig( level=logging.DEBUG, @@ -184,11 +184,14 @@ logging.disable(logging.INFO) # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.13b' +VERSION = '2.14a' ##VERSION## GenerateProperties = 0 UseGetterSetter = 'new' +UseOldSimpleTypeValidators = False +SchemaLxmlTree = None +XsdFileName=[] MemberSpecs = None DelayedElements = set() DelayedElements_subclass = set() @@ -3933,9 +3936,11 @@ def generateCtor(wrt, prefix, element): wrt(' self.%s = %s\n' % (name, name)) else: wrt(' self.%s = %s\n' % (name, name)) - #azg: validate if it is a simple type: validation shows warning so no fear that an error would rise + # validate if it is a simple type. Validation shows + # a warning so no fear that an error would rise. if (child.getSimpleType()): - wrt(' self.validate_%s(self.%s)\n' % (child.getSimpleType(), name)) + wrt(' self.validate_%s(self.%s)\n' % ( + child.getSimpleType(), name)) eltype = element.getType() if (element.getSimpleContent() or element.isMixed() or @@ -3951,145 +3956,197 @@ def generateCtor(wrt, prefix, element): # end generateCtor -#validate directly from xsd file, no need to specify directory for validation -def getValidatorBody(stName,typexs,base): -#azg - - az_s1 = ' if value is not None and all_validtion:\n' - from lxml import etree - ns = {'xs': 'http://www.w3.org/2001/XMLSchema'} - file = xsdFileName[0] - tree = etree.parse(file) - ns= {"xs": "http://www.w3.org/2001/XMLSchema"} - - #on determine l elemnt ou le type est definit - bases = tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]",namespaces=ns,n=stName,b=base) - enumerations = [] - #une liste qui contient les restrictions deja traitees - already_processed=[] - for restriction in bases[0]: - restriction_name = restriction.tag - if 'pattern' in restriction_name and 'pattern' not in already_processed: - pattern =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:pattern/@value",namespaces=ns,n=stName,b=base)[0] - #convertir en string si le type n est pas string (car on ne peut pas comparer un pattern qu avec un type string - valuestring ='(str(value))' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='(value)' - toencode = '% {"value" : value}.encode("utf-8")' - az_s1+=" a = re_.compile('%(pattern)s')\n" %{"pattern": pattern} - az_s1+=" if not a.match%(valuestring)s:\n" % {"valuestring":valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd pattern restriction on %(typename)s' %(express)s )\n" %{ "val":'%(value)s' , "typename" : stName, "express": toencode } - already_processed.append('pattern') - elif 'enumeration' in restriction_name and 'enumeration' not in already_processed: - enumerations =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:enumeration/@value",namespaces=ns,n=stName,b=base) - already_processed.append('enumeration') - if len(enumerations)>0: - az_s1+=" enumerations=%(enumerations)s\n" % {'enumerations' : enumerations} - az_s1+=" enumeration_respectee = False\n" - az_s1+=" for enum in enumerations:\n" - az_s1+=" if value == enum:\n" - az_s1+=" enumeration_respectee=True\n" - az_s1+=" break\n" - az_s1+=" if not enumeration_respectee:\n" - az_s1+=" warnings.warn('Value %(val)s dosent match xsd enumeration restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": '% {"value" : value.encode("utf-8")}'} - elif 'maxLength' in restriction_name and 'maxLength' not in already_processed: - valuestring ='(str(value))' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='(value)' - toencode = '% {"value" : value}.encode("utf-8")' - maxLength =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:maxLength/@value",namespaces=ns,n=stName,b=base)[0] - az_s1+=" if len%(valuestring)s > %(maxLength)s:\n" % {'maxLength' : maxLength, "valuestring" :valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd maxLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode} - elif 'minLength' in restriction_name and 'minLength' not in already_processed: - valuestring ='(str(value))' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='(value)' - toencode = '% {"value" : value}.encode("utf-8")' - minLength =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:minLength/@value",namespaces=ns,n=stName,b=base)[0] - az_s1+=" if len%(valuestring)s < %(minLength)s:\n" % {'minLength' : minLength, "valuestring" :valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd minLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode} - already_processed.append('minLength') - elif 'minInclusive' in restriction_name and 'minInclusive' not in already_processed: - valuestring ='(value)' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='len(str(value))' - toencode = '% {"value" : value}.encode("utf-8")' - minInclusive =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:minInclusive/@value",namespaces=ns,n=stName,b=base)[0] - az_s1+=" if %(valuestring)s <= %(minInclusive)s:\n" % {'minInclusive' : minInclusive, "valuestring" :valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd minInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } - already_processed.append('minInclusive') - elif 'maxInclusive' in restriction_name and 'maxInclusive' not in already_processed: - valuestring ='(value)' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='len(str(value))' - toencode = '% {"value" : value}.encode("utf-8")' - maxInclusive =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:maxInclusive/@value",namespaces=ns,n=stName,b=base)[0] - az_s1+=" if %(valuestring)s >= %(maxInclusive)s:\n" % {'maxInclusive' : maxInclusive, "valuestring" :valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } - already_processed.append('maxInclusive') - elif 'totalDigits' in restriction_name and 'totalDigits' not in already_processed: - valuestring ='(str(value))' - toencode = '% {"value" : value}' - if 'string' in base: - valuestring ='(value)' - toencode = '% {"value" : value}.encode("utf-8")' - totalDigits =tree.xpath("//xs:simpleType[@name=$n]/xs:restriction[@base=$b]/xs:totalDigits/@value",namespaces=ns,n=stName,b=base)[0] - az_s1+=" if len%(valuestring)s >= %(totalDigits)s:\n" % {'totalDigits' : totalDigits, "valuestring" :valuestring} - az_s1+=" warnings.warn('Value %(val)s dosent match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } - already_processed.append('totalDigits') - - - - - - - - - - - - - - - az_s1+= ' pass\n' - - - return az_s1 - -#/azg - - - - - - retrieved = 0 - if ValidatorBodiesBasePath: - found = 0 - path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, ) - if os.path.exists(path): - found = 1 +# find the simple type, either a named simpleType or an anonymous one. +def find_simple_type_def(tree, stName, element, child, ns, base): + st = None + if stName: + st_defs = tree.xpath("//xs:simpleType[@name=$n]", namespaces=ns, n=stName) + if st_defs: + st = st_defs[0] else: - path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, ) + typeName = element.getType() + childName = child.getName() + # search for an anonymous simpleType. + el_defs = tree.xpath("//xs:complexType[@name=$typeName]//xs:element[@name=$childName]/xs:simpleType", + namespaces=ns, typeName=typeName, childName=childName) + if el_defs: + st = el_defs[0] + else: + # search for an anonymous simpleType inside an anonymous complexType. + el_defs = tree.xpath("//xs:element[@name=$typeName]/xs:complexType//xs:element[@name=$childName]/xs:simpleType", + namespaces=ns, typeName=typeName, childName=childName) + return st + + +#validate directly from xsd file, no need to specify directory for validation +def getValidatorBody(stName, base, element, child): + if not UseOldSimpleTypeValidators and SchemaLxmlTree is not None: + # generate validator bodies directly from the XML schema. + s1 = ' if value is not None and Validate_simpletypes_:\n' + initial_len = len(s1) + ns = {'xs': 'http://www.w3.org/2001/XMLSchema'} + fileName = XsdFileName[0] + tree = SchemaLxmlTree + ns= {"xs": "http://www.w3.org/2001/XMLSchema"} + #on determine l elemnt ou le type est definit + st = find_simple_type_def(tree, stName, element, child, ns, base) + if st is not None: + bases = st.xpath("xs:restriction[@base=$b]", namespaces=ns, n=stName, b=base) + #une liste qui contient les restrictions deja traitees + already_processed=[] + if bases: + for restriction in bases[0]: + restriction_name = restriction.tag + if 'pattern' in restriction_name and 'pattern' not in already_processed: + pattern = st.xpath("xs:restriction[@base=$b]/xs:pattern/@value", namespaces=ns, n=stName, b=base) + if pattern: + pattern = pattern[0] + already_processed.append('pattern') + #convertir en string si le type n est pas string (car on ne peut pas comparer un pattern qu avec un type string + valuestring ='(str(value))' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " a = re_.compile('%(pattern)s')\n" %{"pattern": pattern} + s1 += " if not a.match%(valuestring)s:\n" % {"valuestring":valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd pattern restriction on %(typename)s' %(express)s )\n" %{ "val":'%(value)s' , "typename" : stName, "express": toencode } + elif 'enumeration' in restriction_name and 'enumeration' not in already_processed: + enumerations = st.xpath("xs:restriction[@base=$b]/xs:enumeration/@value", namespaces=ns, n=stName, b=base) + if enumerations: + already_processed.append('enumeration') + s1 += " enumerations = %(enumerations)s\n" % {'enumerations' : enumerations} + s1 += " enumeration_respectee = False\n" + s1 += " for enum in enumerations:\n" + s1 += " if value == enum:\n" + s1 += " enumeration_respectee = True\n" + s1 += " break\n" + s1 += " if not enumeration_respectee:\n" + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd enumeration restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": '% {"value" : value.encode("utf-8")}'} + elif 'maxLength' in restriction_name and 'maxLength' not in already_processed: + valuestring = '(str(value))' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + maxLength = st.xpath("xs:restriction[@base=$b]/xs:maxLength/@value", namespaces=ns, n=stName, b=base) + if maxLength: + maxLength = maxLength[0] + already_processed.append('maxLength') + s1 += " if len%(valuestring)s > %(maxLength)s:\n" % {'maxLength' : maxLength, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd maxLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode} + elif 'minLength' in restriction_name and 'minLength' not in already_processed: + valuestring = '(str(value))' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + minLength = st.xpath("xs:restriction[@base=$b]/xs:minLength/@value", namespaces=ns, n=stName, b=base) + if minLength: + minLength = minLength[0] + already_processed.append('minLength') + s1 += " if len%(valuestring)s < %(minLength)s:\n" % {'minLength' : minLength, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd minLength restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode} + elif 'length' in restriction_name and 'length' not in already_processed: + valuestring = '(str(value))' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + length = st.xpath("xs:restriction[@base=$b]/xs:length/@value", namespaces=ns, n=stName, b=base) + if length: + length = length[0] + already_processed.append('length') + s1 += " if len%(valuestring)s != %(length)s:\n" % {'length' : length, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd length restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode} + elif 'minInclusive' in restriction_name and 'minInclusive' not in already_processed: + valuestring = 'value' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + minInclusive = st.xpath("xs:restriction[@base=$b]/xs:minInclusive/@value", namespaces=ns, n=stName, b=base) + if minInclusive: + minInclusive = minInclusive[0] + already_processed.append('minInclusive') + s1 += " if %(valuestring)s <= %(minInclusive)s:\n" % {'minInclusive' : minInclusive, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd minInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } + elif 'maxInclusive' in restriction_name and 'maxInclusive' not in already_processed: + valuestring = 'value' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + maxInclusive = st.xpath("xs:restriction[@base=$b]/xs:maxInclusive/@value", namespaces=ns, n=stName, b=base) + if maxInclusive: + maxInclusive = maxInclusive[0] + already_processed.append('maxInclusive') + s1 += " if %(valuestring)s >= %(maxInclusive)s:\n" % {'maxInclusive' : maxInclusive, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } + elif 'minExclusive' in restriction_name and 'minExclusive' not in already_processed: + valuestring = 'value' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + minExclusive = st.xpath("xs:restriction[@base=$b]/xs:minExclusive/@value", namespaces=ns, n=stName, b=base) + if minExclusive: + minExclusive = minExclusive[0] + already_processed.append('minExclusive') + s1 += " if %(valuestring)s < %(minExclusive)s:\n" % {'minExclusive' : minExclusive, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd minExclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } + elif 'maxExclusive' in restriction_name and 'maxExclusive' not in already_processed: + valuestring = 'value' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + maxExclusive = st.xpath("xs:restriction[@base=$b]/xs:maxExclusive/@value", namespaces=ns, n=stName, b=base) + if maxExclusive: + maxExclusive = maxExclusive[0] + already_processed.append('maxExclusive') + s1 += " if %(valuestring)s > %(maxExclusive)s:\n" % {'maxExclusive' : maxExclusive, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd maxExclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } + elif 'totalDigits' in restriction_name and 'totalDigits' not in already_processed: + valuestring = '(str(value))' + toencode = '% {"value" : value}' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + totalDigits = st.xpath("xs:restriction[@base=$b]/xs:totalDigits/@value", namespaces=ns, n=stName, b=base) + if totalDigits: + totalDigits = totalDigits[0] + already_processed.append('totalDigits') + s1 += " if len%(valuestring)s >= %(totalDigits)s:\n" % {'totalDigits' : totalDigits, "valuestring" :valuestring} + s1 += " warnings.warn('Value \"%(val)s\" does not match xsd maxInclusive restriction on %(typename)s' %(express)s )\n" % {"val":'%(value)s' , "typename" : stName, "express": toencode } + if len(s1) == initial_len: + s1 += ' pass\n' + return s1 + else: + # if UseOldSimpleTypeValidators -- generate validator bodies from use code. + retrieved = 0 + if ValidatorBodiesBasePath: + found = 0 + path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, ) if os.path.exists(path): found = 1 - if found: - infile = open(path, 'r') - lines = infile.readlines() - infile.close() - lines1 = [] - for line in lines: - if not line.startswith('##'): - lines1.append(line) - s1 = ''.join(lines1) - retrieved = 1 - if not retrieved: - s1 = ' pass\n' - return s1 + else: + path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, ) + if os.path.exists(path): + found = 1 + if found: + infile = open(path, 'r') + lines = infile.readlines() + infile.close() + lines1 = [] + for line in lines: + if not line.startswith('##'): + lines1.append(line) + s1 = ''.join(lines1) + retrieved = 1 + if not retrieved: + s1 = ' pass\n' + return s1 # end getValidatorBody @@ -4178,7 +4235,7 @@ def generateValidatorDefs(wrt, element): (typeName, stObj.getBase(), )) else: wrt(' # validate type %s\n' % (typeName, )) - wrt(getValidatorBody(typeName,child.getType(),stObj.getBase())) + wrt(getValidatorBody(typeName, stObj.getBase(), element, child)) attrDefs = element.getAttributeDefs() for key in attrDefs: attrDef = attrDefs[key] @@ -4194,7 +4251,7 @@ def generateValidatorDefs(wrt, element): typeName, stObj.getBase(), )) else: wrt(' # validate type %s\n' % (typeName, )) - wrt(getValidatorBody(typeName,attrDef.getType(),attrDef.getBase())) + wrt(getValidatorBody(typeName, stObj.getBase(), None, None)) # end generateValidatorDefs @@ -4430,9 +4487,10 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings -all_validtion = True +Validate_simpletypes_ = True etree_ = None @@ -6033,7 +6091,8 @@ def parseAndGenerate( processIncludes, options, args, superModule='???'): global DelayedElements, DelayedElements_subclass, \ AlreadyGenerated, SaxDelayedElements, \ - AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule + AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule, \ + SchemaLxmlTree DelayedElements = set() DelayedElements_subclass = set() AlreadyGenerated = set() @@ -6058,13 +6117,14 @@ def parseAndGenerate( if processIncludes: import process_includes outfile = StringIO.StringIO() - process_includes.process_include_files( + doc = process_includes.process_include_files( infile, outfile, inpath=xschemaFileName, catalogpath=catalogFilename, fixtypenames=FixTypeNames) outfile.seek(0) infile = outfile + SchemaLxmlTree = doc.getroot() parser.parse(infile) root = dh.getRoot() root.annotate() @@ -6257,7 +6317,7 @@ def main(): ExternalEncoding, MemberSpecs, NoQuestions, \ ExportWrite, ExportEtree, ExportLiteral, \ FixTypeNames, SingleFileOutput, OutputDirectory, \ - ModuleSuffix + ModuleSuffix, UseOldSimpleTypeValidators outputText = True args = sys.argv[1:] try: @@ -6273,7 +6333,7 @@ def main(): 'no-questions', 'session=', 'fix-type-names=', 'version', 'export=', 'one-file-per-xsd', 'output-directory=', - 'module-suffix=' + 'module-suffix=', 'use-old-simpletype-validators', ]) except getopt.GetoptError: usage() @@ -6392,6 +6452,8 @@ def main(): err_msg('*** Option use-getter-setter must ' '"old" or "new" or "none".\n') sys.exit(1) + elif option[0] == '--use-old-simpletype-validators': + UseOldSimpleTypeValidators = True elif option[0] in ('-u', '--user-methods'): UserMethodsPath = option[1] elif option[0] == '--no-process-includes': @@ -6444,7 +6506,7 @@ def main(): usage() else: xschemaFileName = args[0] - xsdFileName.append(xschemaFileName) + XsdFileName.append(xschemaFileName) silent = not outputText TEMPLATE_MAIN = fixSilence(TEMPLATE_MAIN, silent) TEMPLATE_SUBCLASS_FOOTER = fixSilence(TEMPLATE_SUBCLASS_FOOTER, silent) diff --git a/generateDS.txt b/generateDS.txt index d8e2df54e0af1cf217e4bccb6f71ce16d65e47fe..ad40547ce277a5ccb298a9b6c9fc86020318d2b2 100644 --- a/generateDS.txt +++ b/generateDS.txt @@ -3,7 +3,7 @@ generateDS -- Generate Data Structures from XML Schema ====================================================== :author: Dave Kuhlman -:contact: dkuhlman@davekuhlman.org +:contact: dkuhlman (at) davekuhlman (dot) org :address: http://www.davekuhlman.org @@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema .. version -:revision: 2.13b +:revision: 2.14a .. version @@ -253,6 +253,11 @@ Here is the usage message displayed by ``generateDS.py``:: module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -442,6 +447,18 @@ validator-bodies=<path> files, lines with "##" in the first two columns are ignored and are not inserted. +use-old-simpletype-validators + ``generateDS.py`` is capable of generating validator bodies -- + the code that validates data content in an XML instance + docuement and writes out warning messages if that data does not + satisfy the facets in the ``xs:restriction`` in the + ``xs:simpleType`` defintion in the XML schema. Use this option + if you want to use your own validation bodies/code defined in a + specified directory . See option ``--validator-bodies`` for + information on that. *Without* this option + (``--use-old-simpletype-validators``), the validator code will + be generated directly from the XML schema, which is the default. + use-getter-setter ``generateDS.py`` now generates getter and setter methods (for variable "abc", for example) with the names get_abc() and @@ -477,7 +494,12 @@ no-process-includes Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by ``<include ... />`` elements into the XML Schema to be processed. - See section `Include file processing`_. + See section `Include file processing`_. Note that include + processing, which is performed in ``process_includes.py`` is + required for generating validator bodies from the XML schema, + because the Lxml ElementTree produced in ``process_includes.py`` + is needed to generate the validator code. So, using this option + also turns off automatic generation of validator code. silence Normally, the code generated with generateDS echoes the diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py index 3e2bc3f5e09004812aacf3dd65fb78c794bb5994..d0e31e8d94ef565f7de3aa6f9324eb5a3c4a81fd 100755 --- a/gui/generateds_gui.py +++ b/gui/generateds_gui.py @@ -31,7 +31,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.13b' +VERSION = '2.14a' ##VERSION## diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html index db0373e6e90e744f1717cc761f486d098c96ccf3..fe924753791188c975bf76e74f53345a04f6e24e 100644 --- a/librarytemplate_howto.html +++ b/librarytemplate_howto.html @@ -217,7 +217,7 @@ ul.auto-toc { <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td> </tr> </tbody> </table> @@ -226,7 +226,7 @@ ul.auto-toc { <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td> </tr> </tbody> </table> @@ -380,7 +380,7 @@ this command for your needs. For example, you may need to use <div class="footer"> <hr class="footer" /> <a class="reference external" href="librarytemplate_howto.txt">View document source</a>. -Generated on: 2014-09-09 19:14 UTC. +Generated on: 2014-10-08 22:22 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt index ed399ce928bb610f7ced13220da55fe01043c6ee..1c3c5212fd0676891e4ae201f23b60fc316a6728 100644 --- a/librarytemplate_howto.txt +++ b/librarytemplate_howto.txt @@ -8,7 +8,7 @@ How to package a generateDS.py generated library .. version -:revision: 2.13b +:revision: 2.14a .. version diff --git a/process_includes.py b/process_includes.py index 8ea77859c2bf97a3d67887b05b86c0adf33a6c4c..166239bf4e7f9f2dfe40f5522d55acaf82f5d73b 100755 --- a/process_includes.py +++ b/process_includes.py @@ -30,7 +30,7 @@ from lxml import etree # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.13b' +VERSION = '2.14a' ##VERSION## CatalogDict = {} @@ -59,7 +59,8 @@ def process_include_files( 'force': False, 'fixtypenames': fixtypenames, }) - prep_schema_doc(infile, outfile, inpath, options) + doc = prep_schema_doc(infile, outfile, inpath, options) + return doc def get_all_root_file_paths(infile, inpath='', catalogpath=None): diff --git a/setup.py b/setup.py index e73b0d4e0f8be568894c0e786e5c11dd56734b9d..6f85b8b23e9cd416707f87f600c4043844ba07eb 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup(name="generateDS", # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## - version="2.13b", + version="2.14a", ##VERSION## author="Dave Kuhlman", author_email="dkuhlman@davekuhlman.org", diff --git a/tests/OnePer/oneperType00_1One.py b/tests/OnePer/oneperType00_1One.py index eb028c4604959d7621d32ea8f889405d23a8e790..36917905171fbe2b866028065559526b76b08fc4 100644 --- a/tests/OnePer/oneperType00_1One.py +++ b/tests/OnePer/oneperType00_1One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py index eb028c4604959d7621d32ea8f889405d23a8e790..36917905171fbe2b866028065559526b76b08fc4 100644 --- a/tests/OnePer/oneperType00_2One.py +++ b/tests/OnePer/oneperType00_2One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType01_1One.py b/tests/OnePer/oneperType01_1One.py index 96afe49ff4181b2b7b329987f737859b0ead3eb6..af63e675c32c93aa04d78f748504b81fbc102c9d 100644 --- a/tests/OnePer/oneperType01_1One.py +++ b/tests/OnePer/oneperType01_1One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py index 96afe49ff4181b2b7b329987f737859b0ead3eb6..af63e675c32c93aa04d78f748504b81fbc102c9d 100644 --- a/tests/OnePer/oneperType01_2One.py +++ b/tests/OnePer/oneperType01_2One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType02_1One.py b/tests/OnePer/oneperType02_1One.py index 63667bb9ba0a9f8c81aece4c9fe8bf1258246c77..b2a887174188943f0a522b795f8321e06d9c2462 100644 --- a/tests/OnePer/oneperType02_1One.py +++ b/tests/OnePer/oneperType02_1One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py index 63667bb9ba0a9f8c81aece4c9fe8bf1258246c77..b2a887174188943f0a522b795f8321e06d9c2462 100644 --- a/tests/OnePer/oneperType02_2One.py +++ b/tests/OnePer/oneperType02_2One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType03_1One.py b/tests/OnePer/oneperType03_1One.py index c3102f49f208040c8c5757041542e1e002870af6..ef4bbbb12f696557371ff383e4cbc8305df10843 100644 --- a/tests/OnePer/oneperType03_1One.py +++ b/tests/OnePer/oneperType03_1One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py index c3102f49f208040c8c5757041542e1e002870af6..ef4bbbb12f696557371ff383e4cbc8305df10843 100644 --- a/tests/OnePer/oneperType03_2One.py +++ b/tests/OnePer/oneperType03_2One.py @@ -30,6 +30,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py index 74747978d07ec88dbd96d5bcc38dca593835cef3..5b2555f46b5ee212888c447bc2273c37dc003db0 100644 --- a/tests/abstract_type1_sup.py +++ b/tests/abstract_type1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/abstract_type2_sup.py b/tests/abstract_type2_sup.py index 74747978d07ec88dbd96d5bcc38dca593835cef3..5b2555f46b5ee212888c447bc2273c37dc003db0 100644 --- a/tests/abstract_type2_sup.py +++ b/tests/abstract_type2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py index ba6a3807446f43ecd2bdc8ed365f8f28c5c4783e..98b240a5b47c1a8df36ed3250e8d652c560b4735 100644 --- a/tests/annotations1_sup.py +++ b/tests/annotations1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/annotations2_sup.py b/tests/annotations2_sup.py index ba6a3807446f43ecd2bdc8ed365f8f28c5c4783e..98b240a5b47c1a8df36ed3250e8d652c560b4735 100644 --- a/tests/annotations2_sup.py +++ b/tests/annotations2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/anonymous_type.xsd b/tests/anonymous_type.xsd index 271664ff92562b1bcb22d7cd32b197bc09b40f0c..a9bb07f4c162ed205f5d13cdb95fc3423f768c7c 100644 --- a/tests/anonymous_type.xsd +++ b/tests/anonymous_type.xsd @@ -14,6 +14,8 @@ <xs:element name="FooType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="10"/> + <xs:maxLength value="19"/> </xs:restriction> </xs:simpleType> </xs:element> @@ -26,6 +28,8 @@ <xs:element name="BarType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="20"/> + <xs:maxLength value="29"/> </xs:restriction> </xs:simpleType> </xs:element> @@ -38,6 +42,8 @@ <xs:element name="BazType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="30"/> + <xs:maxLength value="39"/> </xs:restriction> </xs:simpleType> </xs:element> diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py index 21f333e2c1c5aed468c315c90a185e9eb4f97e4b..3d0bc3a796976afd0437707e9122c3213e7ee995 100644 --- a/tests/anonymous_type1_sup.py +++ b/tests/anonymous_type1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -762,6 +767,7 @@ class FooType1(GeneratedsSuper): def __init__(self, FooType=None): self.original_tagname_ = None self.FooType = FooType + self.validate_FooTypeType(self.FooType) def factory(*args_, **kwargs_): if FooType1.subclass: return FooType1.subclass(*args_, **kwargs_) @@ -772,7 +778,11 @@ class FooType1(GeneratedsSuper): def set_FooType(self, FooType): self.FooType = FooType def validate_FooTypeType(self, value): # Validate type FooTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 10: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 19: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.FooType is not None @@ -847,6 +857,7 @@ class BarType2(GeneratedsSuper): def __init__(self, BarType=None): self.original_tagname_ = None self.BarType = BarType + self.validate_BarTypeType(self.BarType) def factory(*args_, **kwargs_): if BarType2.subclass: return BarType2.subclass(*args_, **kwargs_) @@ -857,7 +868,11 @@ class BarType2(GeneratedsSuper): def set_BarType(self, BarType): self.BarType = BarType def validate_BarTypeType(self, value): # Validate type BarTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 20: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 29: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BarType is not None @@ -932,6 +947,7 @@ class BazType3(GeneratedsSuper): def __init__(self, BazType=None): self.original_tagname_ = None self.BazType = BazType + self.validate_BazTypeType(self.BazType) def factory(*args_, **kwargs_): if BazType3.subclass: return BazType3.subclass(*args_, **kwargs_) @@ -942,7 +958,11 @@ class BazType3(GeneratedsSuper): def set_BazType(self, BazType): self.BazType = BazType def validate_BazTypeType(self, value): # Validate type BazTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 30: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 39: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BazType is not None diff --git a/tests/anonymous_type2_sup.py b/tests/anonymous_type2_sup.py index 21f333e2c1c5aed468c315c90a185e9eb4f97e4b..3d0bc3a796976afd0437707e9122c3213e7ee995 100644 --- a/tests/anonymous_type2_sup.py +++ b/tests/anonymous_type2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -762,6 +767,7 @@ class FooType1(GeneratedsSuper): def __init__(self, FooType=None): self.original_tagname_ = None self.FooType = FooType + self.validate_FooTypeType(self.FooType) def factory(*args_, **kwargs_): if FooType1.subclass: return FooType1.subclass(*args_, **kwargs_) @@ -772,7 +778,11 @@ class FooType1(GeneratedsSuper): def set_FooType(self, FooType): self.FooType = FooType def validate_FooTypeType(self, value): # Validate type FooTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 10: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 19: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.FooType is not None @@ -847,6 +857,7 @@ class BarType2(GeneratedsSuper): def __init__(self, BarType=None): self.original_tagname_ = None self.BarType = BarType + self.validate_BarTypeType(self.BarType) def factory(*args_, **kwargs_): if BarType2.subclass: return BarType2.subclass(*args_, **kwargs_) @@ -857,7 +868,11 @@ class BarType2(GeneratedsSuper): def set_BarType(self, BarType): self.BarType = BarType def validate_BarTypeType(self, value): # Validate type BarTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 20: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 29: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BarType is not None @@ -932,6 +947,7 @@ class BazType3(GeneratedsSuper): def __init__(self, BazType=None): self.original_tagname_ = None self.BazType = BazType + self.validate_BazTypeType(self.BazType) def factory(*args_, **kwargs_): if BazType3.subclass: return BazType3.subclass(*args_, **kwargs_) @@ -942,7 +958,11 @@ class BazType3(GeneratedsSuper): def set_BazType(self, BazType): self.BazType = BazType def validate_BazTypeType(self, value): # Validate type BazTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) < 30: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 39: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BazType is not None diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py index 8965b0841e90cc5bf9065239aef33ec417e010d5..d1d826b51a4923e412a2f99474cbe0b8986503de 100644 --- a/tests/anysimpletype1_sup.py +++ b/tests/anysimpletype1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/anysimpletype2_sup.py b/tests/anysimpletype2_sup.py index 8965b0841e90cc5bf9065239aef33ec417e010d5..d1d826b51a4923e412a2f99474cbe0b8986503de 100644 --- a/tests/anysimpletype2_sup.py +++ b/tests/anysimpletype2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py index 6fe49290abe6edf80958b798ee7b58f85e0d39dc..5fad0db50417f970c3411aa3b710009aa36681e3 100644 --- a/tests/anywildcard1_sup.py +++ b/tests/anywildcard1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/anywildcard2_sup.py b/tests/anywildcard2_sup.py index 6fe49290abe6edf80958b798ee7b58f85e0d39dc..5fad0db50417f970c3411aa3b710009aa36681e3 100644 --- a/tests/anywildcard2_sup.py +++ b/tests/anywildcard2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py index 75755fea7a66890468a0edf9d74159616bfc835f..ec108a244c1ce4e0ef71d05bc4cf29a4b8fa3544 100644 --- a/tests/attr_groups1_sup.py +++ b/tests/attr_groups1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/attr_groups2_sup.py b/tests/attr_groups2_sup.py index 75755fea7a66890468a0edf9d74159616bfc835f..ec108a244c1ce4e0ef71d05bc4cf29a4b8fa3544 100644 --- a/tests/attr_groups2_sup.py +++ b/tests/attr_groups2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py index 56df5a9b293af5de105730154977deee6e81f859..4b81152849b379c2a88aacf6c029a5060e091fb1 100644 --- a/tests/extensions1_sup.py +++ b/tests/extensions1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1011,6 +1016,7 @@ class simpleFactoidType(GeneratedsSuper): def __init__(self, relation=None): self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) def factory(*args_, **kwargs_): if simpleFactoidType.subclass: return simpleFactoidType.subclass(*args_, **kwargs_) @@ -1021,7 +1027,15 @@ class simpleFactoidType(GeneratedsSuper): def set_relation(self, relation): self.relation = relation def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + enumerations = ['down', 'add'] + 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 RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None @@ -1097,6 +1111,7 @@ class mixedFactoidType(GeneratedsSuper): def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None): self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) self.valueOf_ = valueOf_ if mixedclass_ is None: self.mixedclass_ = MixedContainer @@ -1119,7 +1134,15 @@ class mixedFactoidType(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + enumerations = ['down', 'add'] + 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 RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None or diff --git a/tests/extensions2_sup.py b/tests/extensions2_sup.py index 56df5a9b293af5de105730154977deee6e81f859..4b81152849b379c2a88aacf6c029a5060e091fb1 100644 --- a/tests/extensions2_sup.py +++ b/tests/extensions2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1011,6 +1016,7 @@ class simpleFactoidType(GeneratedsSuper): def __init__(self, relation=None): self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) def factory(*args_, **kwargs_): if simpleFactoidType.subclass: return simpleFactoidType.subclass(*args_, **kwargs_) @@ -1021,7 +1027,15 @@ class simpleFactoidType(GeneratedsSuper): def set_relation(self, relation): self.relation = relation def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + enumerations = ['down', 'add'] + 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 RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None @@ -1097,6 +1111,7 @@ class mixedFactoidType(GeneratedsSuper): def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None): self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) self.valueOf_ = valueOf_ if mixedclass_ is None: self.mixedclass_ = MixedContainer @@ -1119,7 +1134,15 @@ class mixedFactoidType(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + enumerations = ['down', 'add'] + 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 RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None or diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py index 9776f19e070adcbe15d01b72c7664ffd71d54461..0d05b131625a0ea66976829174d02f7b72a8da34 100644 --- a/tests/mapcleanname1_sup.py +++ b/tests/mapcleanname1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/mapcleanname2_sup.py b/tests/mapcleanname2_sup.py index 9776f19e070adcbe15d01b72c7664ffd71d54461..0d05b131625a0ea66976829174d02f7b72a8da34 100644 --- a/tests/mapcleanname2_sup.py +++ b/tests/mapcleanname2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/out1_sup.py b/tests/out1_sup.py index 0ce418cf302b1bfbb6e58651ec3c926b35b90b39..3890019e075ad177cbe5ca7067aa57f319317142 100644 --- a/tests/out1_sup.py +++ b/tests/out1_sup.py @@ -28,6 +28,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1449,6 +1454,7 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmer.subclass: @@ -1496,7 +1502,15 @@ class programmer(person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/out2_sup.py b/tests/out2_sup.py index 0ce418cf302b1bfbb6e58651ec3c926b35b90b39..3890019e075ad177cbe5ca7067aa57f319317142 100644 --- a/tests/out2_sup.py +++ b/tests/out2_sup.py @@ -28,6 +28,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1449,6 +1454,7 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmer.subclass: @@ -1496,7 +1502,15 @@ class programmer(person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py index c2d2220da05b010ac0d70aa90825f3df957778bc..1c3537946e36cd79bd59b2575cb84c0b960f784b 100644 --- a/tests/people_procincl1_sup.py +++ b/tests/people_procincl1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -2520,6 +2525,7 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmer.subclass: @@ -2565,7 +2571,15 @@ class programmer(person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py index c2d2220da05b010ac0d70aa90825f3df957778bc..1c3537946e36cd79bd59b2575cb84c0b960f784b 100644 --- a/tests/people_procincl2_sup.py +++ b/tests/people_procincl2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -2520,6 +2525,7 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmer.subclass: @@ -2565,7 +2571,15 @@ class programmer(person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py index 96730d24716cbd34de2c74b933f7557338849990..404810c4257c53b1e958bacd00cf1290da0ff8f7 100644 --- a/tests/prefix_classname1_sup.py +++ b/tests/prefix_classname1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1307,6 +1312,7 @@ class tomato_programmer(tomato_person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if tomato_programmer.subclass: @@ -1354,7 +1360,15 @@ class tomato_programmer(tomato_person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/prefix_classname2_sup.py b/tests/prefix_classname2_sup.py index 96730d24716cbd34de2c74b933f7557338849990..404810c4257c53b1e958bacd00cf1290da0ff8f7 100644 --- a/tests/prefix_classname2_sup.py +++ b/tests/prefix_classname2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -1307,6 +1312,7 @@ class tomato_programmer(tomato_person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if tomato_programmer.subclass: @@ -1354,7 +1360,15 @@ class tomato_programmer(tomato_person): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py index 956f2f67816e5d0d9a954634149d7f3cdcc3c44f..b793adefb925bd7d9ea4ebb2d8d3cb62a4493aee 100644 --- a/tests/recursive_simpletype1_sup.py +++ b/tests/recursive_simpletype1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/recursive_simpletype2_sup.py b/tests/recursive_simpletype2_sup.py index 956f2f67816e5d0d9a954634149d7f3cdcc3c44f..b793adefb925bd7d9ea4ebb2d8d3cb62a4493aee 100644 --- a/tests/recursive_simpletype2_sup.py +++ b/tests/recursive_simpletype2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py index 3c59aa995a702ddbd80a4f77f48262c7a786e508..817e86e04744a5525e4aea96730c7c1b0e19274a 100644 --- a/tests/simplecontent_restriction1_sup.py +++ b/tests/simplecontent_restriction1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simplecontent_restriction2_sup.py b/tests/simplecontent_restriction2_sup.py index 3c59aa995a702ddbd80a4f77f48262c7a786e508..817e86e04744a5525e4aea96730c7c1b0e19274a 100644 --- a/tests/simplecontent_restriction2_sup.py +++ b/tests/simplecontent_restriction2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py index 8dae63aca4afb82bb72c84ba6c4290beaa542440..6bdaf95e36dd150e97a460b270d33190e8b00cd2 100644 --- a/tests/simpletype_memberspecs1_sup.py +++ b/tests/simpletype_memberspecs1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simpletype_memberspecs2_sup.py b/tests/simpletype_memberspecs2_sup.py index 8dae63aca4afb82bb72c84ba6c4290beaa542440..6bdaf95e36dd150e97a460b270d33190e8b00cd2 100644 --- a/tests/simpletype_memberspecs2_sup.py +++ b/tests/simpletype_memberspecs2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py index 84e2ae739c1cd821cde3a4337311f006bd75caa0..a51ea60e08a13725f56e760212fe8d03ed9cf26f 100644 --- a/tests/simpletypes_other1_sup.py +++ b/tests/simpletypes_other1_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py index 84e2ae739c1cd821cde3a4337311f006bd75caa0..a51ea60e08a13725f56e760212fe8d03ed9cf26f 100644 --- a/tests/simpletypes_other2_sup.py +++ b/tests/simpletypes_other2_sup.py @@ -29,6 +29,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False diff --git a/tests/test.py b/tests/test.py index 5e965bc05c34b9442b2ea2097573b446115ac1cc..90ee2b6b4b1c219a6cdf5aef55203fd8e44ec57d 100755 --- a/tests/test.py +++ b/tests/test.py @@ -331,8 +331,8 @@ class GenTest(unittest.TestCase): cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) result, err = self.execute(cmd) self.check_result(result, err, ()) - cmdTempl = 'python tests/%s2_sup.py tests/ipo.xml > tests/%s2_out.xml' - cmd = cmdTempl % (t_, t_, ) + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) result, _ = self.execute(cmd, cwd='..') cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, ) result, err = self.execute(cmd) @@ -550,6 +550,36 @@ class GenTest(unittest.TestCase): result, err = self.execute(cmd) self.check_result(result, err, ()) + def test_025_validate_simpletypes(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'validate_simpletypes' + cmd = cmdTempl % (t_, t_, t_, t_, ) + result, _ = self.execute(cmd, cwd='..') + cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ('sys.stdout.write',)) + cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ()) + cmdTempl = ( + 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml ' + '2> tests/%s2_warnings.txt' + ) + cmd = cmdTempl % (t_, t_, t_, t_, ) + result, _ = self.execute(cmd, cwd='..') + cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ()) + cmd = 'diff %s1_warnings.txt %s2_warnings.txt' % (t_, t_, ) + result, err = self.execute(cmd) + self.check_result(result, err, ()) + def check_result(self, result, err, ignore_strings): self.failUnlessEqual(len(result), 0) self.failUnlessEqual(len(err), 0) diff --git a/tests/to_etree.xsd b/tests/to_etree.xsd index 71d28600fccf70894bb542fd9f17a7e4e01a433f..132497174e072133b1add242791d77426b973ee5 100644 --- a/tests/to_etree.xsd +++ b/tests/to_etree.xsd @@ -337,4 +337,3 @@ </xs:complexType> </xs:schema> - diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py index 8d7435a442e1af61b94ebde6a515b29f3dc2c27b..4fe09cdc814e532da48af005a15dc5725655d8f9 100644 --- a/tests/to_etree1_sup.py +++ b/tests/to_etree1_sup.py @@ -31,6 +31,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -924,6 +929,7 @@ class personType(GeneratedsSuper): self.promoter = promoter self.description = description self.range_ = range_ + self.validate_RangeType(self.range_) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if personType.subclass: @@ -970,7 +976,8 @@ class personType(GeneratedsSuper): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_RangeType(self, value): # Validate type RangeType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.name is not None or @@ -1212,6 +1219,7 @@ class programmerType(personType): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmerType.subclass: @@ -1261,7 +1269,15 @@ class programmerType(personType): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -1532,7 +1548,8 @@ class paramType(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.valueOf_ @@ -1624,6 +1641,7 @@ class python_programmerType(programmerType): self.gui_developer = _cast(bool, gui_developer) self.favorite_editor = favorite_editor self.flowvalue = flowvalue + self.validate_FlowType(self.flowvalue) self.drcs = drcs def factory(*args_, **kwargs_): if python_programmerType.subclass: @@ -1645,7 +1663,8 @@ class python_programmerType(programmerType): def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.favorite_editor is not None or diff --git a/tests/to_etree2_sup.py b/tests/to_etree2_sup.py index 8d7435a442e1af61b94ebde6a515b29f3dc2c27b..4fe09cdc814e532da48af005a15dc5725655d8f9 100644 --- a/tests/to_etree2_sup.py +++ b/tests/to_etree2_sup.py @@ -31,6 +31,11 @@ import getopt import re as re_ import base64 import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + etree_ = None Verbose_import_ = False @@ -924,6 +929,7 @@ class personType(GeneratedsSuper): self.promoter = promoter self.description = description self.range_ = range_ + self.validate_RangeType(self.range_) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if personType.subclass: @@ -970,7 +976,8 @@ class personType(GeneratedsSuper): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_RangeType(self, value): # Validate type RangeType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.name is not None or @@ -1212,6 +1219,7 @@ class programmerType(personType): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): if programmerType.subclass: @@ -1261,7 +1269,15 @@ class programmerType(personType): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + 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 ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -1532,7 +1548,8 @@ class paramType(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.valueOf_ @@ -1624,6 +1641,7 @@ class python_programmerType(programmerType): self.gui_developer = _cast(bool, gui_developer) self.favorite_editor = favorite_editor self.flowvalue = flowvalue + self.validate_FlowType(self.flowvalue) self.drcs = drcs def factory(*args_, **kwargs_): if python_programmerType.subclass: @@ -1645,7 +1663,8 @@ class python_programmerType(programmerType): def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.favorite_editor is not None or diff --git a/tests/validate_simpletypes.xml b/tests/validate_simpletypes.xml new file mode 100644 index 0000000000000000000000000000000000000000..a4d15e920c709cae794293fdd40b0c04a1538f13 --- /dev/null +++ b/tests/validate_simpletypes.xml @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<container> + <sample1> + <token_enum_value>float</token_enum_value> + <integer_range_incl_value>2</integer_range_incl_value> + <integer_range_excl_value>7</integer_range_excl_value> + <min_max_length_value>abc def ghi</min_max_length_value> + <length_value>0123456789</length_value> + <totaldigits_value>12.456</totaldigits_value> + <anonymous_float_value>2.2</anonymous_float_value> + </sample1> + <sample2_bad> + <token_enum_value>floatxx</token_enum_value> + <integer_range_incl_value>22</integer_range_incl_value> + <integer_range_excl_value>-40</integer_range_excl_value> + <min_max_length_value>mno pqr</min_max_length_value> + <length_value>012345</length_value> + <totaldigits_value>12.456789</totaldigits_value> + <anonymous_float_value>0.2</anonymous_float_value> + </sample2_bad> + <sample3_bad> + <integer_range_incl_value>-50</integer_range_incl_value> + <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value> + <length_value>01234567890</length_value> + <totaldigits_value>12345678.45678901</totaldigits_value> + <anonymous_float_value>6.6</anonymous_float_value> + </sample3_bad> +</container> diff --git a/tests/validate_simpletypes.xsd b/tests/validate_simpletypes.xsd new file mode 100644 index 0000000000000000000000000000000000000000..35b3598787edd32481ebe9379877082b73d32e4c --- /dev/null +++ b/tests/validate_simpletypes.xsd @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="container" type="containerType"/> + + <xs:complexType name="containerType"> + <xs:sequence> + <xs:element name="sample1" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample2_bad" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample3_bad" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample2" type="simpleTwoType" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="simpleOneType" mixed="0"> + <xs:sequence> + <xs:element name="token_enum_value" type="token_enum_st"/> + <xs:element name="token_enum_value" type="token_enum_st"/> + <xs:element name="integer_range_incl_value" type="integer_range_incl_st"/> + <xs:element name="integer_range_excl_value" type="integer_range_excl_st"/> + <xs:element name="min_max_length_value" type="min_max_length_st"/> + <xs:element name="length_value" type="length_st"/> + <xs:element name="totaldigits_value" type="totaldigits_st"/> + <!-- Test for use of anonymous simple type. --> + <xs:element name="anonymous_float_value"> + <xs:simpleType> + <xs:restriction base="xs:float"> + <xs:minInclusive value="1.1"/> + <xs:maxInclusive value="4.4"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:sequence> + </xs:complexType> + <!-- Test for use of an anonymous simple type inside an anonymous complexType. --> + <xs:element name="simpleTwoType"> + <xs:complexType> + <xs:sequence> + <xs:element name="Foo"> + <xs:complexType> + <xs:all> + <xs:element name="FooType"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:minLength value="12"/> + <xs:maxLength value="24"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:all> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:simpleType name="token_enum_st"> + <xs:restriction base="xs:NMTOKEN"> + <xs:enumeration value="float"/> + <xs:enumeration value="int"/> + <xs:enumeration value="Name"/> + <xs:enumeration value="token"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="integer_range_incl_st"> + <xs:restriction base="xs:integer"> + <xs:minInclusive value="-5"/> + <xs:maxInclusive value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="integer_range_excl_st"> + <xs:restriction base="xs:integer"> + <xs:minExclusive value="-5"/> + <xs:maxExclusive value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="min_max_length_st"> + <xs:restriction base="xs:string"> + <xs:minLength value="10"/> + <xs:maxLength value="20"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="length_st"> + <xs:restriction base="xs:string"> + <xs:length value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="totaldigits_st"> + <xs:restriction base="xs:float"> + <xs:totalDigits value="15"/> + <xs:fractionDigits value="5"/> + </xs:restriction> + </xs:simpleType> +</xs:schema> diff --git a/tests/validate_simpletypes1_out.xml b/tests/validate_simpletypes1_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..70c8feb1ec0e915aff1bbc3156b10111cc1422b7 --- /dev/null +++ b/tests/validate_simpletypes1_out.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" ?> +<container> + <sample1> + <token_enum_value>float</token_enum_value> + <token_enum_value>float</token_enum_value> + <integer_range_incl_value>2</integer_range_incl_value> + <integer_range_excl_value>7</integer_range_excl_value> + <min_max_length_value>abc def ghi</min_max_length_value> + <length_value>0123456789</length_value> + <totaldigits_value>12.456</totaldigits_value> + <anonymous_float_value>2.2</anonymous_float_value> + </sample1> + <sample2_bad> + <token_enum_value>floatxx</token_enum_value> + <token_enum_value>floatxx</token_enum_value> + <integer_range_incl_value>22</integer_range_incl_value> + <integer_range_excl_value>-40</integer_range_excl_value> + <min_max_length_value>mno pqr</min_max_length_value> + <length_value>012345</length_value> + <totaldigits_value>12.456789000000001</totaldigits_value> + <anonymous_float_value>0.2</anonymous_float_value> + </sample2_bad> + <sample3_bad> + <integer_range_incl_value>-50</integer_range_incl_value> + <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value> + <length_value>01234567890</length_value> + <totaldigits_value>12345678.456789009273052</totaldigits_value> + <anonymous_float_value>6.6</anonymous_float_value> + </sample3_bad> +</container> diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py new file mode 100644 index 0000000000000000000000000000000000000000..6b50bce01c83794f83b8427c5fb2688fc2b2d969 --- /dev/null +++ b/tests/validate_simpletypes1_sub.py @@ -0,0 +1,235 @@ +#!/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 + +import validate_simpletypes2_sup as supermod + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None): + super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class simpleOneTypeSub(supermod.simpleOneType): + def __init__(self, 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, anonymous_float_value=None): + super(simpleOneTypeSub, self).__init__(token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totaldigits_value, anonymous_float_value, ) +supermod.simpleOneType.subclass = simpleOneTypeSub +# end class simpleOneTypeSub + + +class simpleTwoTypeSub(supermod.simpleTwoType): + def __init__(self, Foo=None): + super(simpleTwoTypeSub, self).__init__(Foo, ) +supermod.simpleTwoType.subclass = simpleTwoTypeSub +# end class simpleTwoTypeSub + + +class FooType1Sub(supermod.FooType1): + def __init__(self, FooType=None): + super(FooType1Sub, self).__init__(FooType, ) +supermod.FooType1.subclass = FooType1Sub +# end class FooType1Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '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): + doc = parsexml_(inFilename) + 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 + doc = parsexml_(StringIO(inString)) + 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): + doc = parsexml_(inFilename) + 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_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py new file mode 100644 index 0000000000000000000000000000000000000000..77d98861db36a2720da12ff49737ec755775b1d7 --- /dev/null +++ b/tests/validate_simpletypes1_sup.py @@ -0,0 +1,1396 @@ +#!/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 getopt +import re as re_ +import base64 +import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError, exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return 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=''): + 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, 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, 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, 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, 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, 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, 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, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'ascii' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + if not inStr: + return '' + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + if XMLParser_import_library == XMLParser_import_lxml: + msg = '%s (element %s/line %d)' % ( + msg, node.tag, node.sourceline, ) + else: + msg = '%s (element %s)' % (msg, node.tag, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name + def export(self, outfile, level, name, namespace, pretty_print=True): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + outfile.write(self.value) + elif self.category == MixedContainer.CategorySimple: + self.exportSimple(outfile, level, name) + else: # category == MixedContainer.CategoryComplex + self.value.export(outfile, level, namespace, name, pretty_print) + def exportSimple(self, outfile, level, name): + if self.content_type == MixedContainer.TypeString: + outfile.write('<%s>%s</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeInteger or \ + self.content_type == MixedContainer.TypeBoolean: + outfile.write('<%s>%d</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeFloat or \ + self.content_type == MixedContainer.TypeDecimal: + outfile.write('<%s>%f</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeDouble: + outfile.write('<%s>%g</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeBase64: + outfile.write('<%s>%s</%s>' % ( + self.name, base64.b64encode(self.value), self.name)) + def to_etree(self, element): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + if len(element) > 0: + if element[-1].tail is None: + element[-1].tail = self.value + else: + element[-1].tail += self.value + else: + if element.text is None: + element.text = self.value + else: + element.text += self.value + elif self.category == MixedContainer.CategorySimple: + subelement = etree_.SubElement(element, '%s' % self.name) + subelement.text = self.to_etree_simple() + else: # category == MixedContainer.CategoryComplex + self.value.to_etree(element) + def to_etree_simple(self): + if self.content_type == MixedContainer.TypeString: + text = self.value + elif (self.content_type == MixedContainer.TypeInteger or + self.content_type == MixedContainer.TypeBoolean): + text = '%d' % self.value + elif (self.content_type == MixedContainer.TypeFloat or + self.content_type == MixedContainer.TypeDecimal): + text = '%f' % self.value + elif self.content_type == MixedContainer.TypeDouble: + text = '%g' % self.value + elif self.content_type == MixedContainer.TypeBase64: + text = '%s' % base64.b64encode(self.value) + return text + def exportLiteral(self, outfile, level, name): + if self.category == MixedContainer.CategoryText: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + elif self.category == MixedContainer.CategorySimple: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + else: # category == MixedContainer.CategoryComplex + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s",\n' % ( + self.category, self.content_type, self.name,)) + self.value.exportLiteral(outfile, level + 1) + showIndent(outfile, level) + outfile.write(')\n') + + +class MemberSpec_(object): + def __init__(self, name='', data_type='', container=0): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('sample1', 'simpleOneType', 1), + MemberSpec_('sample2_bad', 'simpleOneType', 1), + MemberSpec_('sample3_bad', 'simpleOneType', 1), + MemberSpec_('sample2', 'simpleTwoType', 1), + ] + subclass = None + superclass = None + def __init__(self, sample1=None, sample2_bad=None, sample3_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 sample2 is None: + self.sample2 = [] + else: + self.sample2 = sample2 + def factory(*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_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.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 sample2_ in self.sample2: + sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='containerType'): + 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('sample1=[\n') + level += 1 + for sample1_ in self.sample1: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample1_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample2_bad=[\n') + level += 1 + for sample2_bad_ in self.sample2_bad: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample2_bad_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample3_bad=[\n') + level += 1 + for sample3_bad_ in self.sample3_bad: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample3_bad_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample2=[\n') + level += 1 + for sample2_ in self.sample2: + showIndent(outfile, level) + outfile.write('model_.simpleTwoType(\n') + sample2_.exportLiteral(outfile, level, name_='simpleTwoType') + 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) + 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_ == '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_('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:float'], 0), + MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), + ] + subclass = None + superclass = None + def __init__(self, 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, anonymous_float_value=None): + self.original_tagname_ = None + 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) + self.anonymous_float_value = anonymous_float_value + self.validate_anonymous_float_valueType(self.anonymous_float_value) + def factory(*args_, **kwargs_): + if simpleOneType.subclass: + return simpleOneType.subclass(*args_, **kwargs_) + else: + return simpleOneType(*args_, **kwargs_) + factory = staticmethod(factory) + 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_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 validate_token_enum_st(self, value): + # Validate type token_enum_st, a restriction on xs:NMTOKEN. + if value is not None and Validate_simpletypes_: + 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) < 10: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + 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")} ) + 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:float. + 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_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.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.anonymous_float_value 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.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.length_value).encode(ExternalEncoding), 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.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_)) + def exportLiteral(self, outfile, level, name_='simpleOneType'): + 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.token_enum_value is not None: + showIndent(outfile, level) + outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding)) + if self.token_enum_value is not None: + showIndent(outfile, level) + outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding)) + if self.integer_range_incl_value is not None: + showIndent(outfile, level) + outfile.write('integer_range_incl_value=%d,\n' % self.integer_range_incl_value) + if self.integer_range_excl_value is not None: + showIndent(outfile, level) + outfile.write('integer_range_excl_value=%d,\n' % self.integer_range_excl_value) + if self.min_max_length_value is not None: + showIndent(outfile, level) + outfile.write('min_max_length_value=%s,\n' % quote_python(self.min_max_length_value).encode(ExternalEncoding)) + if self.length_value is not None: + showIndent(outfile, level) + outfile.write('length_value=%s,\n' % quote_python(self.length_value).encode(ExternalEncoding)) + if self.totaldigits_value is not None: + showIndent(outfile, level) + outfile.write('totaldigits_value=%f,\n' % self.totaldigits_value) + if self.anonymous_float_value is not None: + showIndent(outfile, level) + outfile.write('anonymous_float_value=%f,\n' % self.anonymous_float_value) + 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_ == '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_ + self.validate_token_enum_st(self.token_enum_value) # validate type token_enum_st + 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_ + self.validate_token_enum_st(self.token_enum_value) # validate type token_enum_st + elif nodeName_ == 'integer_range_incl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') + self.integer_range_incl_value = ival_ + self.validate_integer_range_incl_st(self.integer_range_incl_value) # validate type integer_range_incl_st + elif nodeName_ == 'integer_range_excl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') + self.integer_range_excl_value = ival_ + self.validate_integer_range_excl_st(self.integer_range_excl_value) # validate type integer_range_excl_st + 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_ + self.validate_min_max_length_st(self.min_max_length_value) # validate type min_max_length_st + elif nodeName_ == 'length_value': + length_value_ = child_.text + length_value_ = self.gds_validate_string(length_value_, node, 'length_value') + self.length_value = length_value_ + self.validate_length_st(self.length_value) # validate type length_st + elif nodeName_ == 'totaldigits_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'totaldigits_value') + self.totaldigits_value = fval_ + self.validate_totaldigits_st(self.totaldigits_value) # validate type totaldigits_st + elif nodeName_ == 'anonymous_float_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') + self.anonymous_float_value = fval_ + self.validate_anonymous_float_valueType(self.anonymous_float_value) # validate type anonymous_float_valueType +# end class simpleOneType + + +class simpleTwoType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('Foo', 'FooType1', 0), + ] + subclass = None + superclass = None + def __init__(self, Foo=None): + self.original_tagname_ = None + self.Foo = Foo + def factory(*args_, **kwargs_): + if simpleTwoType.subclass: + return simpleTwoType.subclass(*args_, **kwargs_) + else: + return simpleTwoType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_Foo(self): return self.Foo + def set_Foo(self, Foo): self.Foo = Foo + def hasContent_(self): + if ( + self.Foo 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.Foo is not None: + self.Foo.export(outfile, level, namespace_, name_='Foo', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='simpleTwoType'): + 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.Foo is not None: + showIndent(outfile, level) + outfile.write('Foo=model_.FooType1(\n') + self.Foo.exportLiteral(outfile, level, name_='Foo') + showIndent(outfile, level) + outfile.write('),\n') + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'Foo': + obj_ = FooType1.factory() + obj_.build(child_) + self.Foo = obj_ + obj_.original_tagname_ = 'Foo' +# end class simpleTwoType + + +class FooType1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0), + ] + subclass = None + superclass = None + def __init__(self, FooType=None): + self.original_tagname_ = None + self.FooType = FooType + self.validate_FooTypeType(self.FooType) + def factory(*args_, **kwargs_): + if FooType1.subclass: + return FooType1.subclass(*args_, **kwargs_) + else: + return FooType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_FooType(self): return self.FooType + def set_FooType(self, FooType): self.FooType = FooType + def validate_FooTypeType(self, value): + # Validate type FooTypeType, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) < 12: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 24: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + def hasContent_(self): + if ( + self.FooType is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='FooType1', 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_='FooType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', 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_='FooType1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='FooType1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.FooType is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='FooType1'): + 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.FooType is not None: + showIndent(outfile, level) + outfile.write('FooType=%s,\n' % quote_python(self.FooType).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_ == 'FooType': + FooType_ = child_.text + FooType_ = self.gds_validate_string(FooType_, node, 'FooType') + self.FooType = FooType_ + self.validate_FooTypeType(self.FooType) # validate type FooTypeType +# end class FooType1 + + +GDSClassesMapping = { + 'container': containerType, + 'sample2_bad': simpleOneType, + 'sample1': simpleOneType, + 'sample3_bad': simpleOneType, + 'sample2': simpleTwoType, + 'Foo': FooType1, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '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): + doc = parsexml_(inFileName) + 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 + doc = parsexml_(StringIO(inString)) + 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): + doc = parsexml_(inFileName) + 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__ = [ + "FooType1", + "containerType", + "simpleOneType", + "simpleTwoType" +] diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt new file mode 100644 index 0000000000000000000000000000000000000000..39f77515058044c0e5ebed5561ebf2c1296410d0 --- /dev/null +++ b/tests/validate_simpletypes1_warnings.txt @@ -0,0 +1,20 @@ +tests/validate_simpletypes2_sup.py:889: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st + warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:896: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st + warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:901: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st + warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:908: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:915: UserWarning: Value "012345" does not match xsd length restriction on length_st + warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:925: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType + warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:894: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st + warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:910: UserWarning: Value "asdf asdf asdf adf asdf asdf" does not match xsd maxLength restriction on min_max_length_st + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:915: UserWarning: Value "01234567890" does not match xsd length restriction on length_st + warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:927: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType + warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) diff --git a/tests/validate_simpletypes2_out.xml b/tests/validate_simpletypes2_out.xml new file mode 100644 index 0000000000000000000000000000000000000000..70c8feb1ec0e915aff1bbc3156b10111cc1422b7 --- /dev/null +++ b/tests/validate_simpletypes2_out.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" ?> +<container> + <sample1> + <token_enum_value>float</token_enum_value> + <token_enum_value>float</token_enum_value> + <integer_range_incl_value>2</integer_range_incl_value> + <integer_range_excl_value>7</integer_range_excl_value> + <min_max_length_value>abc def ghi</min_max_length_value> + <length_value>0123456789</length_value> + <totaldigits_value>12.456</totaldigits_value> + <anonymous_float_value>2.2</anonymous_float_value> + </sample1> + <sample2_bad> + <token_enum_value>floatxx</token_enum_value> + <token_enum_value>floatxx</token_enum_value> + <integer_range_incl_value>22</integer_range_incl_value> + <integer_range_excl_value>-40</integer_range_excl_value> + <min_max_length_value>mno pqr</min_max_length_value> + <length_value>012345</length_value> + <totaldigits_value>12.456789000000001</totaldigits_value> + <anonymous_float_value>0.2</anonymous_float_value> + </sample2_bad> + <sample3_bad> + <integer_range_incl_value>-50</integer_range_incl_value> + <min_max_length_value>asdf asdf asdf adf asdf asdf</min_max_length_value> + <length_value>01234567890</length_value> + <totaldigits_value>12345678.456789009273052</totaldigits_value> + <anonymous_float_value>6.6</anonymous_float_value> + </sample3_bad> +</container> diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py new file mode 100644 index 0000000000000000000000000000000000000000..6b50bce01c83794f83b8427c5fb2688fc2b2d969 --- /dev/null +++ b/tests/validate_simpletypes2_sub.py @@ -0,0 +1,235 @@ +#!/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 + +import validate_simpletypes2_sup as supermod + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample2=None): + super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class simpleOneTypeSub(supermod.simpleOneType): + def __init__(self, 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, anonymous_float_value=None): + super(simpleOneTypeSub, self).__init__(token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totaldigits_value, anonymous_float_value, ) +supermod.simpleOneType.subclass = simpleOneTypeSub +# end class simpleOneTypeSub + + +class simpleTwoTypeSub(supermod.simpleTwoType): + def __init__(self, Foo=None): + super(simpleTwoTypeSub, self).__init__(Foo, ) +supermod.simpleTwoType.subclass = simpleTwoTypeSub +# end class simpleTwoTypeSub + + +class FooType1Sub(supermod.FooType1): + def __init__(self, FooType=None): + super(FooType1Sub, self).__init__(FooType, ) +supermod.FooType1.subclass = FooType1Sub +# end class FooType1Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + doc = parsexml_(inFilename) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '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): + doc = parsexml_(inFilename) + 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 + doc = parsexml_(StringIO(inString)) + 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): + doc = parsexml_(inFilename) + 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 new file mode 100644 index 0000000000000000000000000000000000000000..77d98861db36a2720da12ff49737ec755775b1d7 --- /dev/null +++ b/tests/validate_simpletypes2_sup.py @@ -0,0 +1,1396 @@ +#!/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 getopt +import re as re_ +import base64 +import datetime as datetime_ +import warnings + + +Validate_simpletypes_ = True + + +etree_ = None +Verbose_import_ = False +( + XMLParser_import_none, XMLParser_import_lxml, + XMLParser_import_elementtree +) = range(3) +XMLParser_import_library = None +try: + # lxml + from lxml import etree as etree_ + XMLParser_import_library = XMLParser_import_lxml + if Verbose_import_: + print("running with lxml.etree") +except ImportError: + try: + # cElementTree from Python 2.5+ + import xml.etree.cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree on Python 2.5+") + except ImportError: + try: + # ElementTree from Python 2.5+ + import xml.etree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree on Python 2.5+") + except ImportError: + try: + # normal cElementTree install + import cElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with cElementTree") + except ImportError: + try: + # normal ElementTree install + import elementtree.ElementTree as etree_ + XMLParser_import_library = XMLParser_import_elementtree + if Verbose_import_: + print("running with ElementTree") + except ImportError: + raise ImportError( + "Failed to import ElementTree from any known place") + + +def parsexml_(*args, **kwargs): + if (XMLParser_import_library == XMLParser_import_lxml and + 'parser' not in kwargs): + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + kwargs['parser'] = etree_.ETCompatXMLParser() + doc = etree_.parse(*args, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError, exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list(self, input_data, node, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return 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=''): + 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, 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, 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, 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, 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, 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, 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, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'ascii' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + if not inStr: + return '' + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, basestring) and inStr or + '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + if XMLParser_import_library == XMLParser_import_lxml: + msg = '%s (element %s/line %d)' % ( + msg, node.tag, node.sourceline, ) + else: + msg = '%s (element %s)' % (msg, node.tag, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name + def export(self, outfile, level, name, namespace, pretty_print=True): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + outfile.write(self.value) + elif self.category == MixedContainer.CategorySimple: + self.exportSimple(outfile, level, name) + else: # category == MixedContainer.CategoryComplex + self.value.export(outfile, level, namespace, name, pretty_print) + def exportSimple(self, outfile, level, name): + if self.content_type == MixedContainer.TypeString: + outfile.write('<%s>%s</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeInteger or \ + self.content_type == MixedContainer.TypeBoolean: + outfile.write('<%s>%d</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeFloat or \ + self.content_type == MixedContainer.TypeDecimal: + outfile.write('<%s>%f</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeDouble: + outfile.write('<%s>%g</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeBase64: + outfile.write('<%s>%s</%s>' % ( + self.name, base64.b64encode(self.value), self.name)) + def to_etree(self, element): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + if len(element) > 0: + if element[-1].tail is None: + element[-1].tail = self.value + else: + element[-1].tail += self.value + else: + if element.text is None: + element.text = self.value + else: + element.text += self.value + elif self.category == MixedContainer.CategorySimple: + subelement = etree_.SubElement(element, '%s' % self.name) + subelement.text = self.to_etree_simple() + else: # category == MixedContainer.CategoryComplex + self.value.to_etree(element) + def to_etree_simple(self): + if self.content_type == MixedContainer.TypeString: + text = self.value + elif (self.content_type == MixedContainer.TypeInteger or + self.content_type == MixedContainer.TypeBoolean): + text = '%d' % self.value + elif (self.content_type == MixedContainer.TypeFloat or + self.content_type == MixedContainer.TypeDecimal): + text = '%f' % self.value + elif self.content_type == MixedContainer.TypeDouble: + text = '%g' % self.value + elif self.content_type == MixedContainer.TypeBase64: + text = '%s' % base64.b64encode(self.value) + return text + def exportLiteral(self, outfile, level, name): + if self.category == MixedContainer.CategoryText: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + elif self.category == MixedContainer.CategorySimple: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + else: # category == MixedContainer.CategoryComplex + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s",\n' % ( + self.category, self.content_type, self.name,)) + self.value.exportLiteral(outfile, level + 1) + showIndent(outfile, level) + outfile.write(')\n') + + +class MemberSpec_(object): + def __init__(self, name='', data_type='', container=0): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('sample1', 'simpleOneType', 1), + MemberSpec_('sample2_bad', 'simpleOneType', 1), + MemberSpec_('sample3_bad', 'simpleOneType', 1), + MemberSpec_('sample2', 'simpleTwoType', 1), + ] + subclass = None + superclass = None + def __init__(self, sample1=None, sample2_bad=None, sample3_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 sample2 is None: + self.sample2 = [] + else: + self.sample2 = sample2 + def factory(*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_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.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 sample2_ in self.sample2: + sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='containerType'): + 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('sample1=[\n') + level += 1 + for sample1_ in self.sample1: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample1_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample2_bad=[\n') + level += 1 + for sample2_bad_ in self.sample2_bad: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample2_bad_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample3_bad=[\n') + level += 1 + for sample3_bad_ in self.sample3_bad: + showIndent(outfile, level) + outfile.write('model_.simpleOneType(\n') + sample3_bad_.exportLiteral(outfile, level, name_='simpleOneType') + showIndent(outfile, level) + outfile.write('),\n') + level -= 1 + showIndent(outfile, level) + outfile.write('],\n') + showIndent(outfile, level) + outfile.write('sample2=[\n') + level += 1 + for sample2_ in self.sample2: + showIndent(outfile, level) + outfile.write('model_.simpleTwoType(\n') + sample2_.exportLiteral(outfile, level, name_='simpleTwoType') + 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) + 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_ == '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_('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:float'], 0), + MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), + ] + subclass = None + superclass = None + def __init__(self, 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, anonymous_float_value=None): + self.original_tagname_ = None + 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) + self.anonymous_float_value = anonymous_float_value + self.validate_anonymous_float_valueType(self.anonymous_float_value) + def factory(*args_, **kwargs_): + if simpleOneType.subclass: + return simpleOneType.subclass(*args_, **kwargs_) + else: + return simpleOneType(*args_, **kwargs_) + factory = staticmethod(factory) + 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_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 validate_token_enum_st(self, value): + # Validate type token_enum_st, a restriction on xs:NMTOKEN. + if value is not None and Validate_simpletypes_: + 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) < 10: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + 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")} ) + 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:float. + 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_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.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.anonymous_float_value 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.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.token_enum_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.min_max_length_value).encode(ExternalEncoding), 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_format_string(quote_xml(self.length_value).encode(ExternalEncoding), 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.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_)) + def exportLiteral(self, outfile, level, name_='simpleOneType'): + 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.token_enum_value is not None: + showIndent(outfile, level) + outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding)) + if self.token_enum_value is not None: + showIndent(outfile, level) + outfile.write('token_enum_value=%s,\n' % quote_python(self.token_enum_value).encode(ExternalEncoding)) + if self.integer_range_incl_value is not None: + showIndent(outfile, level) + outfile.write('integer_range_incl_value=%d,\n' % self.integer_range_incl_value) + if self.integer_range_excl_value is not None: + showIndent(outfile, level) + outfile.write('integer_range_excl_value=%d,\n' % self.integer_range_excl_value) + if self.min_max_length_value is not None: + showIndent(outfile, level) + outfile.write('min_max_length_value=%s,\n' % quote_python(self.min_max_length_value).encode(ExternalEncoding)) + if self.length_value is not None: + showIndent(outfile, level) + outfile.write('length_value=%s,\n' % quote_python(self.length_value).encode(ExternalEncoding)) + if self.totaldigits_value is not None: + showIndent(outfile, level) + outfile.write('totaldigits_value=%f,\n' % self.totaldigits_value) + if self.anonymous_float_value is not None: + showIndent(outfile, level) + outfile.write('anonymous_float_value=%f,\n' % self.anonymous_float_value) + 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_ == '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_ + self.validate_token_enum_st(self.token_enum_value) # validate type token_enum_st + 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_ + self.validate_token_enum_st(self.token_enum_value) # validate type token_enum_st + elif nodeName_ == 'integer_range_incl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') + self.integer_range_incl_value = ival_ + self.validate_integer_range_incl_st(self.integer_range_incl_value) # validate type integer_range_incl_st + elif nodeName_ == 'integer_range_excl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') + self.integer_range_excl_value = ival_ + self.validate_integer_range_excl_st(self.integer_range_excl_value) # validate type integer_range_excl_st + 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_ + self.validate_min_max_length_st(self.min_max_length_value) # validate type min_max_length_st + elif nodeName_ == 'length_value': + length_value_ = child_.text + length_value_ = self.gds_validate_string(length_value_, node, 'length_value') + self.length_value = length_value_ + self.validate_length_st(self.length_value) # validate type length_st + elif nodeName_ == 'totaldigits_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'totaldigits_value') + self.totaldigits_value = fval_ + self.validate_totaldigits_st(self.totaldigits_value) # validate type totaldigits_st + elif nodeName_ == 'anonymous_float_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError), exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') + self.anonymous_float_value = fval_ + self.validate_anonymous_float_valueType(self.anonymous_float_value) # validate type anonymous_float_valueType +# end class simpleOneType + + +class simpleTwoType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('Foo', 'FooType1', 0), + ] + subclass = None + superclass = None + def __init__(self, Foo=None): + self.original_tagname_ = None + self.Foo = Foo + def factory(*args_, **kwargs_): + if simpleTwoType.subclass: + return simpleTwoType.subclass(*args_, **kwargs_) + else: + return simpleTwoType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_Foo(self): return self.Foo + def set_Foo(self, Foo): self.Foo = Foo + def hasContent_(self): + if ( + self.Foo 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.Foo is not None: + self.Foo.export(outfile, level, namespace_, name_='Foo', pretty_print=pretty_print) + def exportLiteral(self, outfile, level, name_='simpleTwoType'): + 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.Foo is not None: + showIndent(outfile, level) + outfile.write('Foo=model_.FooType1(\n') + self.Foo.exportLiteral(outfile, level, name_='Foo') + showIndent(outfile, level) + outfile.write('),\n') + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'Foo': + obj_ = FooType1.factory() + obj_.build(child_) + self.Foo = obj_ + obj_.original_tagname_ = 'Foo' +# end class simpleTwoType + + +class FooType1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('FooType', ['FooTypeType', 'xs:string'], 0), + ] + subclass = None + superclass = None + def __init__(self, FooType=None): + self.original_tagname_ = None + self.FooType = FooType + self.validate_FooTypeType(self.FooType) + def factory(*args_, **kwargs_): + if FooType1.subclass: + return FooType1.subclass(*args_, **kwargs_) + else: + return FooType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_FooType(self): return self.FooType + def set_FooType(self, FooType): self.FooType = FooType + def validate_FooTypeType(self, value): + # Validate type FooTypeType, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) < 12: + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) > 24: + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + def hasContent_(self): + if ( + self.FooType is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='FooType1', 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_='FooType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', 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_='FooType1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='FooType1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.FooType is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_)) + def exportLiteral(self, outfile, level, name_='FooType1'): + 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.FooType is not None: + showIndent(outfile, level) + outfile.write('FooType=%s,\n' % quote_python(self.FooType).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_ == 'FooType': + FooType_ = child_.text + FooType_ = self.gds_validate_string(FooType_, node, 'FooType') + self.FooType = FooType_ + self.validate_FooTypeType(self.FooType) # validate type FooTypeType +# end class FooType1 + + +GDSClassesMapping = { + 'container': containerType, + 'sample2_bad': simpleOneType, + 'sample1': simpleOneType, + 'sample3_bad': simpleOneType, + 'sample2': simpleTwoType, + 'Foo': FooType1, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + doc = parsexml_(inFileName) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '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): + doc = parsexml_(inFileName) + 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 + doc = parsexml_(StringIO(inString)) + 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): + doc = parsexml_(inFileName) + 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__ = [ + "FooType1", + "containerType", + "simpleOneType", + "simpleTwoType" +] diff --git a/tests/validate_simpletypes2_warnings.txt b/tests/validate_simpletypes2_warnings.txt new file mode 100644 index 0000000000000000000000000000000000000000..39f77515058044c0e5ebed5561ebf2c1296410d0 --- /dev/null +++ b/tests/validate_simpletypes2_warnings.txt @@ -0,0 +1,20 @@ +tests/validate_simpletypes2_sup.py:889: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st + warnings.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:896: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st + warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:901: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st + warnings.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:908: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st + warnings.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:915: UserWarning: Value "012345" does not match xsd length restriction on length_st + warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:925: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType + warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:894: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st + warnings.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) +tests/validate_simpletypes2_sup.py:910: UserWarning: Value "asdf asdf asdf adf asdf asdf" does not match xsd maxLength restriction on min_max_length_st + warnings.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:915: UserWarning: Value "01234567890" does not match xsd length restriction on length_st + warnings.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) +tests/validate_simpletypes2_sup.py:927: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType + warnings.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html index 4229ff0389cb521dbff0011e11f149f05c3835ae..4ede248ee3eae4014f50dbe89a93b689b3d93375 100644 --- a/tutorial/generateds_tutorial.html +++ b/tutorial/generateds_tutorial.html @@ -219,7 +219,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.13a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.14a</td> </tr> </tbody> </table> @@ -228,7 +228,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">September 09, 2014</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">October 08, 2014</td> </tr> </tbody> </table> @@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateds_tutorial.txt">View document source</a>. -Generated on: 2014-09-09 19:14 UTC. +Generated on: 2014-10-08 22:22 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt index 46348ce28b43e0d40a9c67523c0b9e625d12a898..7f91fd9f9d084a5850275558d92409a430db33f5 100644 --- a/tutorial/generateds_tutorial.txt +++ b/tutorial/generateds_tutorial.txt @@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial .. version -:revision: 2.13b +:revision: 2.14a .. version diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip index 157eecae050a3a0201ce0ca0984aaeb93fe97c59..8a4d0465c6f1bb77ab1c106245753ca94932221a 100644 Binary files a/tutorial/generateds_tutorial.zip and b/tutorial/generateds_tutorial.zip differ