From d0c4cd29d7812eb9d7923b9240186c33a4e167e1 Mon Sep 17 00:00:00 2001 From: Dave Kuhlman <dkuhlman@davekuhlman.org> Date: Fri, 23 Jun 2017 16:20:33 -0700 Subject: [PATCH] Enhancements for one-per and CL options --disable-generatedssuper-lookup and --disable-xml --- MANIFEST.in | 18 +- README.rst | 33 +- generateDS.html | 45 +- generateDS.py | 54 +- generateDS.txt | 42 +- generateds_gui_notes.html | 8 +- generateds_gui_notes.txt | 2 +- gui/generateds_gui.py | 2 +- librarytemplate_howto.html | 8 +- librarytemplate_howto.txt | 2 +- process_includes.py | 2 +- setup.py | 2 +- tests/OnePer/oneperType00_2One.py | 22 +- tests/OnePer/oneperType01_2One.py | 22 +- tests/OnePer/oneperType02_2One.py | 22 +- tests/OnePer/oneperType03_2One.py | 22 +- tests/abstract_type1_sup.py | 22 +- tests/annotations1_sup.py | 22 +- tests/anonymous_type1_sup.py | 22 +- tests/anysimpletype1_sup.py | 22 +- tests/anywildcard1_sup.py | 22 +- tests/attr_groups1_sup.py | 22 +- tests/catalogtest1_sup.py | 22 +- tests/cdata1_sup.py | 22 +- tests/check_results.rb | 0 tests/cleanupname1_sup.py | 22 +- tests/defaults_cases1_sup.py | 22 +- tests/defaults_coverage1_sup.py | 22 +- tests/disable_xml_super.xsd | 16 + tests/disable_xml_super1_sub.py | 59 ++ tests/disable_xml_super1_sup.py | 758 +++++++++++++++++++++++ tests/extensions1_sup.py | 22 +- tests/ipo1_sup.py | 22 +- tests/ipo2_sup.py | 22 +- tests/mapcleanname1_sup.py | 22 +- tests/nested_def1_sup.py | 22 +- tests/out1_sup.py | 22 +- tests/people_procincl1_sup.py | 22 +- tests/prefix_classname1_sup.py | 22 +- tests/recursive_simpletype1_sup.py | 22 +- tests/reference_simpletype1_sup.py | 22 +- tests/rem_dup_elems1_sup.py | 22 +- tests/simplecontent_restriction1_sup.py | 22 +- tests/simpletype_memberspecs1_sup.py | 22 +- tests/simpletypes_other1_sup.py | 22 +- tests/test.py | 23 + tests/to_etree1_sup.py | 22 +- tests/validate_simpletypes1_sup.py | 22 +- tests/validate_simpletypes1_warnings.txt | 60 +- tests/validate_simpletypes2_sup.py | 22 +- tutorial/generateds_tutorial.html | 8 +- tutorial/generateds_tutorial.txt | 2 +- tutorial/generateds_tutorial.zip | Bin 48766 -> 48768 bytes updateversion.py | 0 54 files changed, 1548 insertions(+), 300 deletions(-) mode change 100644 => 100755 tests/check_results.rb create mode 100644 tests/disable_xml_super.xsd create mode 100644 tests/disable_xml_super1_sub.py create mode 100644 tests/disable_xml_super1_sup.py mode change 100644 => 100755 tests/test.py mode change 100644 => 100755 updateversion.py diff --git a/MANIFEST.in b/MANIFEST.in index 268eadd..849b168 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -81,7 +81,7 @@ include tests/abstract_type.xsd include tests/abstract_type1_sup.py tests/abstract_type1_sub.py include tests/abstract_type2_sup.py tests/abstract_type2_sub.py include tests/simpletypes_other.xsd -include tests/simpletypes_other1_sub.py tests/simpletypes1_other_sup.py +include tests/simpletypes_other1_sub.py tests/simpletypes_other1_sup.py include tests/simpletypes_other2_sub.py tests/simpletypes_other2_sup.py include tests/attr_groups.xsd include tests/attr_groups1_sup.py tests/attr_groups1_sub.py @@ -121,6 +121,17 @@ include tests/validate_simpletypes1_sub.py tests/validate_simpletypes1_sup.py include tests/validate_simpletypes1_warnings.txt include tests/validate_simpletypes2_sub.py tests/validate_simpletypes2_sup.py include tests/validate_simpletypes.xml tests/validate_simpletypes.xsd +include tests/disable_xml_super.xsd +include tests/disable_xml_super1_sup.py +include tests/disable_xml_super1_sub.py +include tests/rem_dup_elems.xsd +include tests/rem_dup_elems.xml +include tests/rem_dup_elems1_out.xml +include tests/rem_dup_elems1_sup.py +include tests/rem_dup_elems1_sub.py +include tests/reference_simpletype.xsd +include tests/reference_simpletype1_sup.py +include tests/reference_simpletype1_sub.py include gui/generateds_gui.py include gui/generateds_gui.glade @@ -146,4 +157,7 @@ include tutorial/Code/people_appl1.py include tutorial/Code/upcase_names.py include tutorial/Code/upcase_names_appl.py - +include utils/batch_generate.py* +include utils/collect_schema_locations.py* +include utils/README.txt +include utils/show_schema_hierarchy.py* diff --git a/README.rst b/README.rst index 95532ba..8c9435b 100644 --- a/README.rst +++ b/README.rst @@ -141,6 +141,37 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- +Version 2.28a (06/23/2017) + +Significant work by Alim Gokkaya. Thank you, Alim. + +Here's a summary of what's been changed: + +- Added new command-line options: + + - ``--disable-xml``: Toggles the generation of XML serialization + related code + - ``--disable-generatedssuper-lookup``: Disables generation of the + try-except lookup for a `generatedssuper` module + - ``--use-source-file-as-module-name``: Sets the source XSD file name as + the target module name in the one file per XSD mode + +- Retained ``xsd:choice`` related information in the generated class + ``MemberSpec``. +- Retained the original XML schema attribute definitions in the generated + class members. +- Fixed generation of ``import`` statements for the base classes. +- Fixed class not being generated when parent class is defined in + another XML schema file. +- Fixed fqn-module mapping being unavailable for the classes defined + in imported XML schema files. +- Fixed attribute names are sometimes not cleaned-up from the prefix +- Fixed ``xsd:simpleType`` validations methods are not being generated in + ``one-file-per-xsd`` mode. +- Fixed equality check against objects defining extra attributes. +- Added unit test for command line options ``--disable-xml`` and + ``--disable-generatedssuper-lookup``. + Version 2.27b (06/09/2017) - Fixed a bug that occurred when an element definition contains a @@ -329,7 +360,7 @@ Version 2.21a (04/01/2016) The GUI front end must be run under Python 3, and you must install Python support for Gtk. Aleksandr has also provided a Russian translation of the labels - etc in the user interface. You can run that with: + etc in the user interface. You can run that with:: $ cd /path/to/generateds/gui $ python3 generateds_gui.py --impl-gui=generateds_gui_ru.glade diff --git a/generateDS.html b/generateDS.html index 49a5d29..bc11789 100644 --- a/generateDS.html +++ b/generateDS.html @@ -3,7 +3,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.1: http://docutils.sourceforge.net/" /> <title>generateDS -- Generate Data Structures from XML Schema</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -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.27a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.28a</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">June 01, 2017</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">June 23, 2017</td> </tr> </tbody> </table> @@ -580,6 +580,10 @@ Options: "new" - Name getters/setters get_var()/set_var(). "none" - Do not generate getter/setter methods. Default is "new". + --use-source-file-as-module-name + Used in conjunction with --one-file-per-xsd to + use the source XSD file names to determine the + module name of the generated classes. --user-methods= <module>, -u <module> Optional module containing user methods. See section "User Methods" in the documentation. @@ -639,6 +643,12 @@ Options: to XML) Example: "write etree" Default: "write" + --disable-generatedssuper-lookup + Disables the generatetion of the lookup logic for + presence of an external module from which to load + a custom `GeneratedsSuper` base-class definition. + --disable-xml Disables generation of all XML build/export + methods and command line interface --preserve-cdata-tags Preserve CDATA tags. Default: False --cleanup-name-list=<replacement-map> Specifies list of 2-tuples used for cleaning @@ -807,6 +817,12 @@ methods. Possible values are:</p> </ul> <p class="last">The default is "new".</p> </dd> +<dt>use-source-file-as-module-name</dt> +<dd>Used in conjunction with and only has an effect when used with +<tt class="docutils literal"><span class="pre">--one-file-per-xsd</span></tt>. The effect of this option is to use the +source XML schema file names to determine the module name of the +generated classes. Without this option, the first root element +is used to construct module names. The default is False.</dd> <dt>u, user-methods=<module></dt> <dd>If specified, <tt class="docutils literal">generateDS.py</tt> will add methods to generated classes as specified in the indicated module. For more @@ -906,6 +922,27 @@ and use any of lxml's other capabilities.</li> <p class="last">For example: <tt class="docutils literal"><span class="pre">--export="write</span> etree"</tt> and <tt class="docutils literal"><span class="pre">--export="write"</span></tt>. The default is: <tt class="docutils literal"><span class="pre">--export="write"</span></tt>.</p> </dd> +<dt>disable-generatedssuper-lookup</dt> +<dd>Disables the generation of code implementing the lookup for +presence of an external module from which to load a custom +replacement for the default <tt class="docutils literal">GeneratedsSuper</tt> base-class. +With this flag, unconditionally uses the built-in implementation +of <tt class="docutils literal">GeneratedsSuper</tt>. (Suggestion: In order to get a picture +of what difference this option makes, you might consider +generating modules both with and without it, and then comparing +the results with <tt class="docutils literal">diff</tt>.) The default is False.</dd> +<dt>disable-xml</dt> +<dd>Disables generation of code that enables XML build/export +methods and command line interface. Actually, the code is +there, but is commented out. If you enable this option, the +generated modules will <em>not</em> contain code for the following: (1) +run as a script without explicitly running <tt class="docutils literal">python</tt> (the +<tt class="docutils literal"><span class="pre">#!/usr/bin/env</span> python</tt> line is omitted); (2) import +<tt class="docutils literal">lxml.etree</tt>; (3) parse an XML file; (4) export an XML file. +(Suggestion: In order to get a picture of what difference this +option makes, you might consider generating modules both with +and without it, and then comparing the results with <tt class="docutils literal">diff</tt>.) +The default is False.</dd> <dt>preserve-cdata-tags</dt> <dd>Preserve CDATA tags. Normally, CDATA tags ("<![CDATA[ ... ]]>") are dropped while parsing an XML instance document. If this @@ -3343,7 +3380,7 @@ following among others:</p> <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateDS.txt">View document source</a>. -Generated on: 2017-06-01 16:04 UTC. +Generated on: 2017-06-23 23:12 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 061d136..9b591ec 100755 --- a/generateDS.py +++ b/generateDS.py @@ -109,10 +109,9 @@ Options: Example: "write etree" Default: "write" --disable-generatedssuper-lookup - Disables the generatetion of the lookup logic for - presence of an external module to load a custom - `GeneratedsSuper` base-class definition from. - be generated. + Disables the generatetion of the lookup logic for + presence of an external module from which to load + a custom `GeneratedsSuper` base-class definition. --disable-xml Disables generation of all XML build/export methods and command line interface --preserve-cdata-tags Preserve CDATA tags. Default: False @@ -228,7 +227,7 @@ logging.disable(logging.INFO) # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.27a' +VERSION = '2.28a' ##VERSION## if sys.version_info.major == 2: @@ -1805,7 +1804,7 @@ class XschemaHandler(handler.ContentHandler): self.stack[-1].setSimpleType(1) element = SimpleTypeElement(stName) SimpleTypeDict[stName] = element - SimpleTypeDict[Targetnamespace+":"+stName] = element + SimpleTypeDict[Targetnamespace + ":" + stName] = element self.stack.append(element) self.inSimpleType += 1 elif name == RestrictionType: @@ -4797,10 +4796,12 @@ def generateMemberSpec(wrt, element): item4 = 1 if attrDef.getUse() == 'optional' else 0 if generateDict: item = " '%s': MemberSpec_('%s', '%s', %d, %d, %s)," % ( - item1, item1, item2, item3, item4, repr({'use':attrDef.getUse()})) + item1, item1, item2, item3, item4, repr( + {'use': attrDef.getUse()})) else: item = " MemberSpec_('%s', '%s', %d, %d, %s)," % ( - item1, item2, item3, item4, repr({'use':attrDef.getUse()})) + item1, item2, item3, item4, repr( + {'use': attrDef.getUse()})) add(item) for child in element.getChildren(): name = cleanupName(child.getCleanName()) @@ -5260,7 +5261,8 @@ class MixedContainer: return self.value def getName(self): return self.name -#xmldisable# def export(self, outfile, level, name, namespace, pretty_print=True): +#xmldisable# def export(self, outfile, level, name, namespace, +#xmldisable# pretty_print=True): #xmldisable# if self.category == MixedContainer.CategoryText: #xmldisable# # Prevent exporting empty content as empty lines. #xmldisable# if self.value.strip(): @@ -5269,7 +5271,8 @@ class MixedContainer: #xmldisable# self.exportSimple(outfile, level, name) #xmldisable# else: # category == MixedContainer.CategoryComplex #xmldisable# self.value.export( -#xmldisable# outfile, level, namespace, name, pretty_print=pretty_print) +#xmldisable# outfile, level, namespace, name, +#xmldisable# pretty_print=pretty_print) #xmldisable# def exportSimple(self, outfile, level, name): #xmldisable# if self.content_type == MixedContainer.TypeString: #xmldisable# outfile.write('<%s>%s</%s>' % ( @@ -5287,7 +5290,9 @@ class MixedContainer: #xmldisable# self.name, self.value, self.name)) #xmldisable# elif self.content_type == MixedContainer.TypeBase64: #xmldisable# outfile.write('<%s>%s</%s>' % ( -#xmldisable# self.name, base64.b64encode(self.value), self.name)) +#xmldisable# self.name, +#xmldisable# base64.b64encode(self.value), +#xmldisable# self.name)) #xmldisable# def to_etree(self, element): #xmldisable# if self.category == MixedContainer.CategoryText: #xmldisable# # Prevent exporting empty content as empty lines. @@ -5303,7 +5308,8 @@ class MixedContainer: #xmldisable# else: #xmldisable# element.text += self.value #xmldisable# elif self.category == MixedContainer.CategorySimple: -#xmldisable# subelement = etree_.SubElement(element, '%s' % self.name) +#xmldisable# subelement = etree_.SubElement( +#xmldisable# element, '%s' % self.name) #xmldisable# subelement.text = self.to_etree_simple() #xmldisable# else: # category == MixedContainer.CategoryComplex #xmldisable# self.value.to_etree(element) @@ -5326,12 +5332,14 @@ class MixedContainer: #xmldisable# showIndent(outfile, level) #xmldisable# outfile.write( #xmldisable# 'model_.MixedContainer(%d, %d, "%s", "%s"),\\n' % ( -#xmldisable# self.category, self.content_type, self.name, self.value)) +#xmldisable# self.category, self.content_type, +#xmldisable# self.name, self.value)) #xmldisable# elif self.category == MixedContainer.CategorySimple: #xmldisable# showIndent(outfile, level) #xmldisable# outfile.write( #xmldisable# 'model_.MixedContainer(%d, %d, "%s", "%s"),\\n' % ( -#xmldisable# self.category, self.content_type, self.name, self.value)) +#xmldisable# self.category, self.content_type, +#xmldisable# self.name, self.value)) #xmldisable# else: # category == MixedContainer.CategoryComplex #xmldisable# showIndent(outfile, level) #xmldisable# outfile.write( @@ -5343,7 +5351,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container @@ -5801,8 +5810,12 @@ def generateHeader(wrt, prefix, options, args, externalImports): from generatedssuper import GeneratedsSuper except ImportError as exp: """ - for line in StringIO.StringIO(import_string).readlines(): - s0 += " "+line + if sys.version_info.major == 2: + outfile = StringIO.StringIO + else: + outfile = io.StringIO + for line in outfile(import_string).readlines(): + s0 += " " + line import_string = s0 s1 = TEMPLATE_HEADER.format( @@ -6617,9 +6630,9 @@ def getImportsForExternalXsds(root): type = schemaElement.getType() if type == "xs:string": type = schemaElement.getName() - externalImports.add("from %s%s import %s" % - (moduleName, ModuleSuffix, - type)) + externalImports.add( + "from %s%s import %s" % ( + moduleName, ModuleSuffix, type)) if child.getBase(): parentName, parentObj = getParentName(child) if parentObj.targetNamespace and \ @@ -7048,6 +7061,7 @@ def fixXmlDisable(txt, disabled): txt = txt.replace('#xmldisable#', '') return txt + def capture_cleanup_name_list(option): cleanupNameList = [] if not option: diff --git a/generateDS.txt b/generateDS.txt index fba8742..c4cb9b8 100644 --- a/generateDS.txt +++ b/generateDS.txt @@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema .. version -:revision: 2.27a +:revision: 2.28a .. version @@ -267,6 +267,10 @@ Here is the usage message displayed by ``generateDS.py``:: "new" - Name getters/setters get_var()/set_var(). "none" - Do not generate getter/setter methods. Default is "new". + --use-source-file-as-module-name + Used in conjunction with --one-file-per-xsd to + use the source XSD file names to determine the + module name of the generated classes. --user-methods= <module>, -u <module> Optional module containing user methods. See section "User Methods" in the documentation. @@ -326,6 +330,12 @@ Here is the usage message displayed by ``generateDS.py``:: to XML) Example: "write etree" Default: "write" + --disable-generatedssuper-lookup + Disables the generatetion of the lookup logic for + presence of an external module from which to load + a custom `GeneratedsSuper` base-class definition. + --disable-xml Disables generation of all XML build/export + methods and command line interface --preserve-cdata-tags Preserve CDATA tags. Default: False --cleanup-name-list=<replacement-map> Specifies list of 2-tuples used for cleaning @@ -508,6 +518,13 @@ use-getter-setter The default is "new". +use-source-file-as-module-name + Used in conjunction with and only has an effect when used with + ``--one-file-per-xsd``. The effect of this option is to use the + source XML schema file names to determine the module name of the + generated classes. Without this option, the first root element + is used to construct module names. The default is False. + u, user-methods=<module> If specified, ``generateDS.py`` will add methods to generated classes as specified in the indicated module. For more @@ -620,6 +637,29 @@ export For example: ``--export="write etree"`` and ``--export="write"``. The default is: ``--export="write"``. +disable-generatedssuper-lookup + Disables the generation of code implementing the lookup for + presence of an external module from which to load a custom + replacement for the default ``GeneratedsSuper`` base-class. + With this flag, unconditionally uses the built-in implementation + of ``GeneratedsSuper``. (Suggestion: In order to get a picture + of what difference this option makes, you might consider + generating modules both with and without it, and then comparing + the results with ``diff``.) The default is False. + +disable-xml + Disables generation of code that enables XML build/export + methods and command line interface. Actually, the code is + there, but is commented out. If you enable this option, the + generated modules will *not* contain code for the following: (1) + run as a script without explicitly running ``python`` (the + ``#!/usr/bin/env python`` line is omitted); (2) import + ``lxml.etree``; (3) parse an XML file; (4) export an XML file. + (Suggestion: In order to get a picture of what difference this + option makes, you might consider generating modules both with + and without it, and then comparing the results with ``diff``.) + The default is False. + preserve-cdata-tags Preserve CDATA tags. Normally, CDATA tags ("<![CDATA[ ... ]]>") are dropped while parsing an XML instance document. If this diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html index 41fd9cf..e0e7cd2 100644 --- a/generateds_gui_notes.html +++ b/generateds_gui_notes.html @@ -3,7 +3,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.1: http://docutils.sourceforge.net/" /> <title>GenerateDS GUI Notes</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -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.27a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.28a</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">June 01, 2017</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">June 23, 2017</td> </tr> </tbody> </table> @@ -401,7 +401,7 @@ $ mv generateds_gui.mo locale/ru/LC_MESSAGES/ <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateds_gui_notes.txt">View document source</a>. -Generated on: 2017-06-01 16:04 UTC. +Generated on: 2017-06-23 23:12 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_gui_notes.txt b/generateds_gui_notes.txt index ac0da3a..4830511 100644 --- a/generateds_gui_notes.txt +++ b/generateds_gui_notes.txt @@ -12,7 +12,7 @@ GenerateDS GUI Notes .. version -:revision: 2.27a +:revision: 2.28a .. version diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py index a7e3541..fc1e734 100644 --- a/gui/generateds_gui.py +++ b/gui/generateds_gui.py @@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.27a' +VERSION = '2.28a' ##VERSION## diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html index 8a4f0a1..cb45e02 100644 --- a/librarytemplate_howto.html +++ b/librarytemplate_howto.html @@ -3,7 +3,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.1: http://docutils.sourceforge.net/" /> <title>How to package a generateDS.py generated library</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -217,7 +217,7 @@ dkuhlman (at) davekuhlman (dot) org <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.27a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.28a</td> </tr> </tbody> </table> @@ -226,7 +226,7 @@ dkuhlman (at) davekuhlman (dot) org <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">June 01, 2017</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">June 23, 2017</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: 2017-06-01 16:04 UTC. +Generated on: 2017-06-23 23:12 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 808eeb8..6e2f826 100644 --- a/librarytemplate_howto.txt +++ b/librarytemplate_howto.txt @@ -8,7 +8,7 @@ How to package a generateDS.py generated library .. version -:revision: 2.27a +:revision: 2.28a .. version diff --git a/process_includes.py b/process_includes.py index 43aa474..1fe384b 100644 --- a/process_includes.py +++ b/process_includes.py @@ -40,7 +40,7 @@ except ImportError: # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.27a' +VERSION = '2.28a' ##VERSION## CatalogDict = {} diff --git a/setup.py b/setup.py index 0e95961..145feeb 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.27a", + version="2.28a", ##VERSION## author="Dave Kuhlman", author_email="dkuhlman@davekuhlman.org", diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py index 9799e13..6a9383a 100644 --- a/tests/OnePer/oneperType00_2One.py +++ b/tests/OnePer/oneperType00_2One.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py index 6caef49..9cb957b 100644 --- a/tests/OnePer/oneperType01_2One.py +++ b/tests/OnePer/oneperType01_2One.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py index d4c54a9..2cc43fd 100644 --- a/tests/OnePer/oneperType02_2One.py +++ b/tests/OnePer/oneperType02_2One.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py index c59d06a..cf8139e 100644 --- a/tests/OnePer/oneperType03_2One.py +++ b/tests/OnePer/oneperType03_2One.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py index 2b58825..72181e6 100644 --- a/tests/abstract_type1_sup.py +++ b/tests/abstract_type1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py index 6c9582a..784711b 100644 --- a/tests/annotations1_sup.py +++ b/tests/annotations1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py index 3f740cb..757d76b 100644 --- a/tests/anonymous_type1_sup.py +++ b/tests/anonymous_type1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py index af82c11..a42b892 100644 --- a/tests/anysimpletype1_sup.py +++ b/tests/anysimpletype1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py index 8b67cf3..863dd05 100644 --- a/tests/anywildcard1_sup.py +++ b/tests/anywildcard1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py index 6ebc213..1e8f030 100644 --- a/tests/attr_groups1_sup.py +++ b/tests/attr_groups1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py index 0695675..b63985e 100644 --- a/tests/catalogtest1_sup.py +++ b/tests/catalogtest1_sup.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py index 9b7146c..6058986 100644 --- a/tests/cdata1_sup.py +++ b/tests/cdata1_sup.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/check_results.rb b/tests/check_results.rb old mode 100644 new mode 100755 diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py index 053a39c..dcdd1aa 100644 --- a/tests/cleanupname1_sup.py +++ b/tests/cleanupname1_sup.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py index 0c5f722..119f2dc 100644 --- a/tests/defaults_cases1_sup.py +++ b/tests/defaults_cases1_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py index 22f7fe3..7bd6d4f 100644 --- a/tests/defaults_coverage1_sup.py +++ b/tests/defaults_coverage1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/disable_xml_super.xsd b/tests/disable_xml_super.xsd new file mode 100644 index 0000000..3d08fa9 --- /dev/null +++ b/tests/disable_xml_super.xsd @@ -0,0 +1,16 @@ +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + + <xs:element name="Package" type="PackageType"/> + + <xs:complexType name="PackageType"> + <xs:sequence> + <xs:element name="Address" type="xs:string" + minOccurs="0" maxOccurs="unbounded"> + </xs:element> + </xs:sequence> + </xs:complexType> + +</xs:schema> diff --git a/tests/disable_xml_super1_sub.py b/tests/disable_xml_super1_sub.py new file mode 100644 index 0000000..4f116e8 --- /dev/null +++ b/tests/disable_xml_super1_sub.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--disable-xml', '') +# ('--disable-generatedssuper-lookup', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-a', 'xsd:') +# ('-o', 'tests/disable_xml_super2_sup.py') +# ('-s', 'tests/disable_xml_super2_sub.py') +# ('--super', 'disable_xml_super2_sup') +# ('--no-warnings', '') +# +# Command line arguments: +# tests/disable_xml_super.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --disable-xml --disable-generatedssuper-lookup --member-specs="list" -f -a "xsd:" -o "tests/disable_xml_super2_sup.py" -s "tests/disable_xml_super2_sub.py" --super="disable_xml_super2_sup" --no-warnings tests/disable_xml_super.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +## from lxml import etree as etree_ + +import disable_xml_super2_sup as supermod + +## def parsexml_(infile, parser=None, **kwargs): +## if parser is None: +## # Use the lxml ElementTree compatible parser so that, e.g., +## # we ignore comments. +## parser = etree_.ETCompatXMLParser() +## doc = etree_.parse(infile, parser=parser, **kwargs) +## return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class PackageTypeSub(supermod.PackageType): + def __init__(self, Address=None): + super(PackageTypeSub, self).__init__(Address, ) +supermod.PackageType.subclass = PackageTypeSub +# end class PackageTypeSub + + diff --git a/tests/disable_xml_super1_sup.py b/tests/disable_xml_super1_sup.py new file mode 100644 index 0000000..9ad8be9 --- /dev/null +++ b/tests/disable_xml_super1_sup.py @@ -0,0 +1,758 @@ +## #!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--disable-xml', '') +# ('--disable-generatedssuper-lookup', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-a', 'xsd:') +# ('-o', 'tests/disable_xml_super2_sup.py') +# ('-s', 'tests/disable_xml_super2_sub.py') +# ('--super', 'disable_xml_super2_sup') +# ('--no-warnings', '') +# +# Command line arguments: +# tests/disable_xml_super.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --disable-xml --disable-generatedssuper-lookup --member-specs="list" -f -a "xsd:" -o "tests/disable_xml_super2_sup.py" -s "tests/disable_xml_super2_sub.py" --super="disable_xml_super2_sup" --no-warnings tests/disable_xml_super.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +## try: +## from lxml import etree as etree_ +## except ImportError: +## from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +## def parsexml_(infile, parser=None, **kwargs): +## if parser is None: +## # Use the lxml ElementTree compatible parser so that, e.g., +## # we ignore comments. +## try: +## parser = etree_.ETCompatXMLParser() +## except AttributeError: +## # fallback to xml.etree +## parser = etree_.XMLParser() +## doc = etree_.parse(infile, parser=parser, **kwargs) +## return doc + +# +# Namespace prefix definition table (and other attributes, too) +# +# The module generatedsnamespaces, if it is importable, must contain +# a dictionary named GeneratedsNamespaceDefs. This Python dictionary +# should map element type names (strings) to XML schema namespace prefix +# definitions. The export method for any class for which there is +# a namespace prefix definition, will export that definition in the +# XML representation of that element. See the export method of +# any generated element type class for a example of the use of this +# table. +# A sample table is: +# +# # File: generatedsnamespaces.py +# +# GenerateDSNamespaceDefs = { +# "ElementtypeA": "http://www.xxx.com/namespaceA", +# "ElementtypeB": "http://www.xxx.com/namespaceB", +# } +# + +try: + from generatedsnamespaces import GenerateDSNamespaceDefs as GenerateDSNamespaceDefs_ +except ImportError: + GenerateDSNamespaceDefs_ = {} + +# +# The root super-class for element type classes +# +# 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. + + +class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @staticmethod + def convert_unicode(instring): + if isinstance(instring, str): + result = quote_xml(instring) + elif sys.version_info.major == 2 and isinstance(instring, unicode): + result = quote_xml(instring).encode('utf8') + else: + result = GeneratedsSuper.gds_encode(str(instring)) + return result + def __eq__(self, other): + if type(self) != type(other): + return False + return self.__dict__ == other.__dict__ + def __ne__(self, other): + return not self.__eq__(other) + +def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'ascii' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." + if not inStr: + return '' + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name +## def export(self, outfile, level, name, namespace, +## pretty_print=True): +## if self.category == MixedContainer.CategoryText: +## # Prevent exporting empty content as empty lines. +## if self.value.strip(): +## outfile.write(self.value) +## elif self.category == MixedContainer.CategorySimple: +## self.exportSimple(outfile, level, name) +## else: # category == MixedContainer.CategoryComplex +## self.value.export( +## outfile, level, namespace, name, +## pretty_print=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, + optional=0, child_attrs=None, choice=None): + self.name = name + self.data_type = data_type + self.container = container + self.child_attrs = child_attrs + self.choice = choice + self.optional = optional + 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 set_child_attrs(self, child_attrs): self.child_attrs = child_attrs + def get_child_attrs(self): return self.child_attrs + def set_choice(self, choice): self.choice = choice + def get_choice(self): return self.choice + def set_optional(self, optional): self.optional = optional + def get_optional(self): return self.optional + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class PackageType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('Address', 'xs:string', 1, 1, {u'maxOccurs': u'unbounded', u'type': u'xs:string', u'name': u'Address', u'minOccurs': u'0'}, None), + ] + subclass = None + superclass = None + def __init__(self, Address=None): + self.original_tagname_ = None + if Address is None: + self.Address = [] + else: + self.Address = Address + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PackageType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if PackageType.subclass: + return PackageType.subclass(*args_, **kwargs_) + else: + return PackageType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_Address(self): return self.Address + def set_Address(self, Address): self.Address = Address + def add_Address(self, value): self.Address.append(value) + def insert_Address_at(self, index, value): self.Address.insert(index, value) + def replace_Address_at(self, index, value): self.Address[index] = value + def hasContent_(self): + if ( + self.Address + ): + return True + else: + return False +# end class PackageType + + +GDSClassesMapping = { + 'Package': PackageType, +} + + + +__all__ = [ + "PackageType" +] diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py index bd04c01..dd9b80a 100644 --- a/tests/extensions1_sup.py +++ b/tests/extensions1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py index 8757c5d..9828532 100644 --- a/tests/ipo1_sup.py +++ b/tests/ipo1_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py index 8757c5d..9828532 100644 --- a/tests/ipo2_sup.py +++ b/tests/ipo2_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py index 997f110..b93a409 100644 --- a/tests/mapcleanname1_sup.py +++ b/tests/mapcleanname1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py index c5da762..0032b18 100644 --- a/tests/nested_def1_sup.py +++ b/tests/nested_def1_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/out1_sup.py b/tests/out1_sup.py index 159a3fe..26c0190 100644 --- a/tests/out1_sup.py +++ b/tests/out1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py index c36f6cb..9689e83 100644 --- a/tests/people_procincl1_sup.py +++ b/tests/people_procincl1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py index 17b686e..e4db412 100644 --- a/tests/prefix_classname1_sup.py +++ b/tests/prefix_classname1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py index ab4dea2..45de91d 100644 --- a/tests/recursive_simpletype1_sup.py +++ b/tests/recursive_simpletype1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py index 103b10e..cc8178a 100644 --- a/tests/reference_simpletype1_sup.py +++ b/tests/reference_simpletype1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py index c2771cb..c21b87f 100644 --- a/tests/rem_dup_elems1_sup.py +++ b/tests/rem_dup_elems1_sup.py @@ -580,7 +580,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -589,7 +590,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -607,7 +609,9 @@ class MixedContainer: 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)) + 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. @@ -623,7 +627,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -646,12 +651,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -663,7 +670,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py index 7ebc8e9..ae5f74a 100644 --- a/tests/simplecontent_restriction1_sup.py +++ b/tests/simplecontent_restriction1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py index fc90e22..ec34c2a 100644 --- a/tests/simpletype_memberspecs1_sup.py +++ b/tests/simpletype_memberspecs1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py index ab855a6..1c58d5c 100644 --- a/tests/simpletypes_other1_sup.py +++ b/tests/simpletypes_other1_sup.py @@ -579,7 +579,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -588,7 +589,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -606,7 +608,9 @@ class MixedContainer: 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)) + 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. @@ -622,7 +626,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -645,12 +650,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -662,7 +669,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/test.py b/tests/test.py old mode 100644 new mode 100755 index dea1aea..5a93f77 --- a/tests/test.py +++ b/tests/test.py @@ -823,6 +823,29 @@ class GenTest(unittest.TestCase): self.remove('{}2_sub.py'.format(t_)) self.remove('{}2_out.xml'.format(t_)) + def test_033_disable_xml_super(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--disable-xml --disable-generatedssuper-lookup ' + '--member-specs=list -f -a "xsd:" ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup --no-warnings ' + 'tests/%s.xsd' + ) + t_ = 'disable_xml_super' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # Need to preserve generated files for next command, cleanup at end + # cleanup generated files + #self.remove('{}2_sup.py'.format(t_)) + #self.remove('{}2_sub.py'.format(t_)) + #self.remove('{}2_out.xml'.format(t_)) + def compareFiles(self, left, right, ignore=None): with open(left) as left_file: with open(right) as right_file: diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py index f330869..09ba4c3 100644 --- a/tests/to_etree1_sup.py +++ b/tests/to_etree1_sup.py @@ -581,7 +581,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -590,7 +591,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -608,7 +610,9 @@ class MixedContainer: 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)) + 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. @@ -624,7 +628,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -647,12 +652,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -664,7 +671,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py index 84a01e9..03af44f 100644 --- a/tests/validate_simpletypes1_sup.py +++ b/tests/validate_simpletypes1_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt index 913f375..c166f0e 100644 --- a/tests/validate_simpletypes1_warnings.txt +++ b/tests/validate_simpletypes1_warnings.txt @@ -1,60 +1,60 @@ -tests/validate_simpletypes2_sup.py:1034: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st +tests/validate_simpletypes2_sup.py:1042: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1044: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] +tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) -tests/validate_simpletypes2_sup.py:1057: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st +tests/validate_simpletypes2_sup.py:1065: 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:1064: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st +tests/validate_simpletypes2_sup.py:1072: 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:1069: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st +tests/validate_simpletypes2_sup.py:1077: 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:1078: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st +tests/validate_simpletypes2_sup.py:1086: 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:1083: UserWarning: Value "012345" does not match xsd length restriction on length_st +tests/validate_simpletypes2_sup.py:1091: 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:1160: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType +tests/validate_simpletypes2_sup.py:1168: 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:1154: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']] +tests/validate_simpletypes2_sup.py:1162: UserWarning: Value "efgh" does not match xsd pattern restrictions: [['^abcd$|^ef\\|gh$']] warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, )) -tests/validate_simpletypes2_sup.py:1036: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st +tests/validate_simpletypes2_sup.py:1044: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1044: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] +tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) -tests/validate_simpletypes2_sup.py:1062: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st +tests/validate_simpletypes2_sup.py:1070: 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:1076: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st +tests/validate_simpletypes2_sup.py:1084: UserWarning: Value "asdf asdf asdf asdf 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:1083: UserWarning: Value "01234567890" does not match xsd length restriction on length_st +tests/validate_simpletypes2_sup.py:1091: 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:1093: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st +tests/validate_simpletypes2_sup.py:1101: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1098: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st +tests/validate_simpletypes2_sup.py:1106: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1103: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st +tests/validate_simpletypes2_sup.py:1111: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1108: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st +tests/validate_simpletypes2_sup.py:1116: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1113: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st +tests/validate_simpletypes2_sup.py:1121: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1118: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st +tests/validate_simpletypes2_sup.py:1126: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1123: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st +tests/validate_simpletypes2_sup.py:1131: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1128: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st +tests/validate_simpletypes2_sup.py:1136: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1133: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st +tests/validate_simpletypes2_sup.py:1141: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1138: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st +tests/validate_simpletypes2_sup.py:1146: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1143: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st +tests/validate_simpletypes2_sup.py:1151: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1148: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st +tests/validate_simpletypes2_sup.py:1156: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1162: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType +tests/validate_simpletypes2_sup.py:1170: 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} ) -tests/validate_simpletypes2_sup.py:1041: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st +tests/validate_simpletypes2_sup.py:1049: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} ) -tests/validate_simpletypes2_sup.py:1044: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] +tests/validate_simpletypes2_sup.py:1052: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) -tests/validate_simpletypes2_sup.py:1580: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType +tests/validate_simpletypes2_sup.py:1588: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py index 84a01e9..03af44f 100644 --- a/tests/validate_simpletypes2_sup.py +++ b/tests/validate_simpletypes2_sup.py @@ -578,7 +578,8 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): + 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(): @@ -587,7 +588,8 @@ class MixedContainer: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex self.value.export( - outfile, level, namespace, name, pretty_print=pretty_print) + outfile, level, namespace, name, + pretty_print=pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: outfile.write('<%s>%s</%s>' % ( @@ -605,7 +607,9 @@ class MixedContainer: 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)) + 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. @@ -621,7 +625,8 @@ class MixedContainer: else: element.text += self.value elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) + subelement = etree_.SubElement( + element, '%s' % self.name) subelement.text = self.to_etree_simple() else: # category == MixedContainer.CategoryComplex self.value.to_etree(element) @@ -644,12 +649,14 @@ class MixedContainer: showIndent(outfile, level) outfile.write( 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) + 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)) + self.category, self.content_type, + self.name, self.value)) else: # category == MixedContainer.CategoryComplex showIndent(outfile, level) outfile.write( @@ -661,7 +668,8 @@ class MixedContainer: class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0, optional=0, child_attrs=None, choice=None): + def __init__(self, name='', data_type='', container=0, + optional=0, child_attrs=None, choice=None): self.name = name self.data_type = data_type self.container = container diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html index 01aaa3d..648e52e 100644 --- a/tutorial/generateds_tutorial.html +++ b/tutorial/generateds_tutorial.html @@ -3,7 +3,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> -<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.1: http://docutils.sourceforge.net/" /> <title>generateDS -- Introduction and Tutorial</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -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.27a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.28a</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">June 01, 2017</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">June 23, 2017</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: 2017-06-01 16:04 UTC. +Generated on: 2017-06-23 23:12 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 7bab582..69e9efd 100644 --- a/tutorial/generateds_tutorial.txt +++ b/tutorial/generateds_tutorial.txt @@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial .. version -:revision: 2.27a +:revision: 2.28a .. version diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip index 1b2323353b8fcd5873483ee1ad4054286c6aef18..f103919d46c6d0eb3cb7128d9d41e5a87326d436 100644 GIT binary patch delta 13558 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 X)YAYdj%oicRj-c}#=P_ITl0Sa*8xEs delta 13551 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 ZmXgqpoubr@@DGQ6Hz|y1`(NHc{}28kW!wM& diff --git a/updateversion.py b/updateversion.py old mode 100644 new mode 100755 -- GitLab