From 84b3dd11649619e9df9aad8f75a66583bba2278c Mon Sep 17 00:00:00 2001 From: Alim Gokkaya <alim.gokkaya@gmail.com> Date: Thu, 16 Mar 2017 18:15:20 +0300 Subject: [PATCH] Merge branch 'branches/default' of hg::https://alimg@bitbucket.org/dkuhlman/generateds # Conflicts: # generateDS.py * * * Merge local changes --- .hgignore | 1 + Demos/People/run_test | 2 +- Docs/objectify_notes.html | 858 ++++ Docs/objectify_notes.txt | 633 +++ MANIFEST.in | 44 +- README | 499 ++- build_dist | 15 + django/gends_extract_simple_types.py | 61 +- django/gends_generate_django.py | 42 +- django/gends_run_gen_django.py | 41 +- django/generatedssuper.py | 31 +- fix_subclass_refs.py | 89 + generateDS.html | 840 +++- generateDS.py | 3206 +++++++++----- generateDS.txt | 571 ++- generateds_config.py | 4 + generateds_gui_notes.html | 409 ++ generateds_gui_notes.txt | 188 + gui/README.txt | 74 + gui/en.dictionary | 0 gui/forGUI.xsd | 287 ++ gui/forgui.py | 3911 +++++++++++++++++ gui/generateds_gui.glade | 2552 ++++++----- gui/generateds_gui.py | 2995 ++++++++----- gui/generateds_gui_rus.glade | 1691 +++++++ gui/generateds_gui_session.py | 1070 +++-- gui/generateds_gui_session.xsd | 6 + gui/run_generate_session | 5 + gui/rus.dictionary | 108 + libgenerateDS/gui/generateds_gui.py | 2159 +-------- libgenerateDS/gui/generateds_gui_session.py | 863 +--- librarytemplate-1.0a.zip | Bin 13398 -> 13459 bytes librarytemplate_howto.html | 22 +- librarytemplate_howto.txt | 12 +- process_includes.py | 221 +- setup.py | 21 +- tests/OnePer/compare | 7 + tests/OnePer/copy | 6 + .../oneperType00_2One.py} | 389 +- .../oneperType01_2One.py} | 578 +-- tests/OnePer/oneperType02_2One.py | 954 ++++ tests/OnePer/oneperType03_2One.py | 953 ++++ tests/abstract_type1_sub.py | 103 +- tests/abstract_type1_sup.py | 372 +- tests/abstract_type2_sub.py | 217 - tests/address.xsd | 56 + tests/annotations1_sub.py | 103 +- tests/annotations1_sup.py | 360 +- tests/annotations2_sub.py | 210 - tests/anonymous_type.xsd | 6 + tests/anonymous_type1_sub.py | 97 +- tests/anonymous_type1_sup.py | 401 +- tests/anysimpletype1_sub.py | 97 +- tests/anysimpletype1_sup.py | 316 +- tests/anywildcard.xsd | 2 + tests/anywildcard1_sub.py | 97 +- tests/anywildcard1_sup.py | 445 +- tests/anywildcard2_sub.py | 231 - tests/attr_groups.xsd | 7 + tests/attr_groups1_sub.py | 107 +- tests/attr_groups1_sup.py | 436 +- tests/attr_groups2_sub.py | 196 - tests/catalog.xml | 4 + tests/catalogtest.xsd | 8 + tests/catalogtest1_sub.py | 167 + tests/catalogtest1_sup.py | 791 ++++ tests/cdata.xsd | 20 + tests/cdata1.xml | 8 + tests/cdata1_sub.py | 181 + .../{abstract_type2_sup.py => cdata1_sup.py} | 579 +-- tests/check_results.rb | 95 + tests/cleanupname.xsd | 48 + tests/cleanupname1_sub.py | 209 + ...nywildcard2_sup.py => cleanupname1_sup.py} | 857 ++-- tests/compare_sub | 3 + tests/compare_sup | 3 + tests/copy_all | 59 + tests/copy_both | 3 + tests/defaults_cases.xml | 31 + tests/defaults_cases.xsd | 97 + tests/defaults_cases1_out.xml | 16 + tests/defaults_cases1_sub.py | 186 + tests/defaults_cases1_sup.py | 1182 +++++ tests/defaults_coverage.xsd | 78 + tests/defaults_coverage1_sub.py | 187 + tests/defaults_coverage1_sup.py | 1545 +++++++ tests/extensions.xsd | 8 +- tests/extensions1_sub.py | 103 +- tests/extensions1_sup.py | 725 +-- tests/gds_inner_name_map.py | 7 + tests/ipo1_out.xml | 9 +- tests/ipo1_sub.py | 120 +- tests/ipo1_sup.py | 948 ++-- tests/ipo2_out.xml | 26 - tests/ipo2_sub.py | 120 +- tests/ipo2_sup.py | 948 ++-- tests/literal1.py | 42 +- tests/mapcleanname.xsd | 74 + tests/mapcleanname1_sub.py | 215 + tests/mapcleanname1_sup.py | 1635 +++++++ tests/nested_def.xml | 9 + tests/nested_def.xsd | 38 + tests/nested_def1_out.xml | 9 + tests/nested_def1_sub.py | 200 + tests/nested_def1_sup.py | 1193 +++++ tests/oneper00.xsd | 18 + tests/oneper01.xsd | 21 + tests/oneper02.xsd | 21 + tests/oneper03.xsd | 26 + tests/out1_sub.py | 121 +- tests/out1_sup.py | 965 ++-- tests/out2_sub.py | 273 -- tests/people_procincl1_sub.py | 125 +- tests/people_procincl1_sup.py | 1435 +++--- tests/people_procincl2_sub.py | 301 -- tests/people_procincl2_sup.py | 3223 -------------- tests/people_procincl_a.xsd | 2 +- tests/prefix_classname.xml | 118 + tests/prefix_classname.xsd | 203 + tests/prefix_classname1_out.xml | 91 + tests/prefix_classname1_sub.py | 250 ++ .../{out2_sup.py => prefix_classname1_sup.py} | 2116 +++------ tests/recursive_simpletype1_sub.py | 103 +- tests/recursive_simpletype1_sup.py | 294 +- tests/reference_simpletype.xsd | 20 + ...e2_sub.py => reference_simpletype1_sub.py} | 129 +- ...s2_sup.py => reference_simpletype1_sup.py} | 512 +-- tests/rem_dup_elems.xml | 18 + tests/rem_dup_elems.xsd | 22 + tests/rem_dup_elems1_out.xml | 18 + tests/rem_dup_elems1_sub.py | 181 + tests/rem_dup_elems1_sup.py | 965 ++++ tests/simplecontent_restriction1_sub.py | 109 +- tests/simplecontent_restriction1_sup.py | 447 +- tests/simpletype_memberspecs1_sub.py | 97 +- tests/simpletype_memberspecs1_sup.py | 321 +- tests/simpletypes_other.xml | 15 + tests/simpletypes_other.xsd | 8 +- ...ther2_sub.py => simpletypes_other1_sub.py} | 111 +- tests/simpletypes_other1_sup.py | 513 +-- tests/simpletypes_other2_sup.py | 1338 ------ tests/test.py | 682 ++- tests/to_etree.xsd | 1 - tests/to_etree1.xml | 18 +- tests/to_etree1_sub.py | 133 +- tests/to_etree1_sup.py | 892 ++-- tests/validate_simpletypes.xml | 84 + tests/validate_simpletypes.xsd | 217 + tests/validate_simpletypes1_out.xml | 72 + tests/validate_simpletypes1_sub.py | 193 + tests/validate_simpletypes1_sup.py | 1723 ++++++++ tests/validate_simpletypes1_warnings.txt | 60 + tests/validate_simpletypes2_sub.py | 193 + tests/validate_simpletypes2_sup.py | 1723 ++++++++ tutorial/generateds_tutorial.html | 20 +- tutorial/generateds_tutorial.txt | 6 +- tutorial/generateds_tutorial.zip | Bin 48722 -> 48767 bytes tutorial/generateds_tutoriala.txt | 4 +- updateversion.py | 139 + upload_pypi | 4 + 160 files changed, 41614 insertions(+), 22143 deletions(-) create mode 100644 .hgignore create mode 100644 Docs/objectify_notes.html create mode 100644 Docs/objectify_notes.txt create mode 100755 build_dist create mode 100755 fix_subclass_refs.py create mode 100644 generateds_config.py create mode 100644 generateds_gui_notes.html create mode 100644 generateds_gui_notes.txt create mode 100644 gui/README.txt create mode 100644 gui/en.dictionary create mode 100644 gui/forGUI.xsd create mode 100644 gui/forgui.py create mode 100644 gui/generateds_gui_rus.glade create mode 100755 gui/run_generate_session create mode 100644 gui/rus.dictionary mode change 100755 => 120000 libgenerateDS/gui/generateds_gui.py mode change 100644 => 120000 libgenerateDS/gui/generateds_gui_session.py create mode 100755 tests/OnePer/compare create mode 100755 tests/OnePer/copy rename tests/{recursive_simpletype2_sup.py => OnePer/oneperType00_2One.py} (73%) rename tests/{annotations2_sup.py => OnePer/oneperType01_2One.py} (62%) create mode 100644 tests/OnePer/oneperType02_2One.py create mode 100644 tests/OnePer/oneperType03_2One.py delete mode 100644 tests/abstract_type2_sub.py create mode 100644 tests/address.xsd delete mode 100644 tests/annotations2_sub.py delete mode 100644 tests/anywildcard2_sub.py delete mode 100644 tests/attr_groups2_sub.py create mode 100644 tests/catalog.xml create mode 100644 tests/catalogtest.xsd create mode 100644 tests/catalogtest1_sub.py create mode 100644 tests/catalogtest1_sup.py create mode 100644 tests/cdata.xsd create mode 100644 tests/cdata1.xml create mode 100644 tests/cdata1_sub.py rename tests/{abstract_type2_sup.py => cdata1_sup.py} (62%) create mode 100755 tests/check_results.rb create mode 100644 tests/cleanupname.xsd create mode 100644 tests/cleanupname1_sub.py rename tests/{anywildcard2_sup.py => cleanupname1_sup.py} (60%) create mode 100755 tests/compare_sub create mode 100755 tests/compare_sup create mode 100755 tests/copy_all create mode 100755 tests/copy_both create mode 100644 tests/defaults_cases.xml create mode 100644 tests/defaults_cases.xsd create mode 100644 tests/defaults_cases1_out.xml create mode 100644 tests/defaults_cases1_sub.py create mode 100644 tests/defaults_cases1_sup.py create mode 100644 tests/defaults_coverage.xsd create mode 100644 tests/defaults_coverage1_sub.py create mode 100644 tests/defaults_coverage1_sup.py create mode 100644 tests/gds_inner_name_map.py delete mode 100644 tests/ipo2_out.xml create mode 100644 tests/mapcleanname.xsd create mode 100644 tests/mapcleanname1_sub.py create mode 100644 tests/mapcleanname1_sup.py create mode 100644 tests/nested_def.xml create mode 100644 tests/nested_def.xsd create mode 100644 tests/nested_def1_out.xml create mode 100644 tests/nested_def1_sub.py create mode 100644 tests/nested_def1_sup.py create mode 100644 tests/oneper00.xsd create mode 100644 tests/oneper01.xsd create mode 100644 tests/oneper02.xsd create mode 100644 tests/oneper03.xsd delete mode 100644 tests/out2_sub.py delete mode 100644 tests/people_procincl2_sub.py delete mode 100644 tests/people_procincl2_sup.py create mode 100644 tests/prefix_classname.xml create mode 100644 tests/prefix_classname.xsd create mode 100644 tests/prefix_classname1_out.xml create mode 100644 tests/prefix_classname1_sub.py rename tests/{out2_sup.py => prefix_classname1_sup.py} (59%) create mode 100644 tests/reference_simpletype.xsd rename tests/{recursive_simpletype2_sub.py => reference_simpletype1_sub.py} (50%) rename tests/{attr_groups2_sup.py => reference_simpletype1_sup.py} (63%) create mode 100644 tests/rem_dup_elems.xml create mode 100644 tests/rem_dup_elems.xsd create mode 100644 tests/rem_dup_elems1_out.xml create mode 100644 tests/rem_dup_elems1_sub.py create mode 100644 tests/rem_dup_elems1_sup.py create mode 100644 tests/simpletypes_other.xml rename tests/{simpletypes_other2_sub.py => simpletypes_other1_sub.py} (58%) delete mode 100644 tests/simpletypes_other2_sup.py create mode 100644 tests/validate_simpletypes.xml create mode 100644 tests/validate_simpletypes.xsd create mode 100644 tests/validate_simpletypes1_out.xml create mode 100644 tests/validate_simpletypes1_sub.py create mode 100644 tests/validate_simpletypes1_sup.py create mode 100644 tests/validate_simpletypes1_warnings.txt create mode 100644 tests/validate_simpletypes2_sub.py create mode 100644 tests/validate_simpletypes2_sup.py create mode 100755 updateversion.py create mode 100755 upload_pypi diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..2b0f609 --- /dev/null +++ b/.hgignore @@ -0,0 +1 @@ +.pyc \ No newline at end of file diff --git a/Demos/People/run_test b/Demos/People/run_test index ca85c05..86ada73 100755 --- a/Demos/People/run_test +++ b/Demos/People/run_test @@ -7,7 +7,7 @@ if [ $# -ne 1 ]; then exit 0 fi -generateDS.py -f -m \ +../../generateDS.py -f -m \ --namespacedef='xmlns:pl="http://kuhlman.com/people.xsd"' \ --super=$1sup -o $1sup.py -s $1sub.py \ --member-specs=dict \ diff --git a/Docs/objectify_notes.html b/Docs/objectify_notes.html new file mode 100644 index 0000000..98be392 --- /dev/null +++ b/Docs/objectify_notes.html @@ -0,0 +1,858 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<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: http://docutils.sourceforge.net/" /> +<title>lxml.objectify notes</title> +<meta name="author" content="Dave Kuhlman" /> +<meta name="date" content="July 06, 2015" /> +<style type="text/css"> + +/* css */ + +body { + font: 90% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + background: #ffffff; + color: black; + margin: 2em; + padding: 2em; +} + +a[href] { + color: #436976; + background-color: transparent; +} + +a.toc-backref { + text-decoration: none; +} + +h1 a[href] { + text-decoration: none; + color: #fcb100; + background-color: transparent; +} + +a.strong { + font-weight: bold; +} + +img { + margin: 0; + border: 0; +} + +p { + margin: 0.5em 0 1em 0; + line-height: 1.5em; +} +p a { + text-decoration: underline; +} +p a:visited { + color: purple; + background-color: transparent; +} +p a:active { + color: red; + background-color: transparent; +} +a:hover { + text-decoration: none; +} +p img { + border: 0; + margin: 0; +} + +h1, h2, h3, h4, h5, h6 { + color: #003a6b; + background-color: transparent; + font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + margin: 0; + padding-top: 0.5em; +} + +h1 { + font-size: 160%; + margin-bottom: 0.5em; + border-bottom: 1px solid #fcb100; +} +h2 { + font-size: 140%; + margin-bottom: 0.5em; + border-bottom: 1px solid #aaa; +} +h3 { + font-size: 130%; + margin-bottom: 0.5em; + text-decoration: underline; +} +h4 { + font-size: 110%; + font-weight: bold; +} +h5 { + font-size: 100%; + font-weight: bold; +} +h6 { + font-size: 80%; + font-weight: bold; +} + +ul a, ol a { + text-decoration: underline; +} + +dt { + font-weight: bold; +} +dt a { + text-decoration: none; +} + +dd { + line-height: 1.5em; + margin-bottom: 1em; +} + +legend { + background: #ffffff; + padding: 0.5em; +} + +form { + margin: 0; +} + + +dl.form { + margin: 0; + padding: 1em; +} + +dl.form dt { + width: 30%; + float: left; + margin: 0; + padding: 0 0.5em 0.5em 0; + text-align: right; +} + +input { + font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + color: black; + background-color: white; + vertical-align: middle; +} + +abbr, acronym, .explain { + color: black; + background-color: transparent; +} + +q, blockquote { +} + +code, pre { + font-family: monospace; + font-size: 1.2em; + display: block; + padding: 10px; + border: 1px solid #838183; + background-color: #eee; + color: #000; + overflow: auto; + margin: 0.5em 1em; +} + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +tt.docutils { + background-color: #dddddd; +} + +ul.auto-toc { + list-style-type: none } + +</style> +</head> +<body> +<div class="document" id="lxml-objectify-notes"> +<h1 class="title">lxml.objectify notes</h1> +<table class="docinfo" frame="void" rules="none"> +<col class="docinfo-name" /> +<col class="docinfo-content" /> +<tbody valign="top"> +<tr><th class="docinfo-name">Author:</th> +<td>Dave Kuhlman</td></tr> +<tr><th class="docinfo-name">Address:</th> +<td><pre class="address"> +dkuhlman (at) davekuhlman (dot) org +</pre> +</td></tr> +<tr><th class="docinfo-name">Revision:</th> +<td>1.1a</td></tr> +<tr><th class="docinfo-name">Date:</th> +<td>July 06, 2015</td></tr> +</tbody> +</table> +<!-- vim:ft=rst: --> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Copyright (c) 2015 Dave Kuhlman. All Rights Reserved. +This software is subject to the provisions of the MIT License +<a class="reference external" href="http://www.opensource.org/licenses/mit-license.php">http://www.opensource.org/licenses/mit-license.php</a>.</td> +</tr> +<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">A document intended to help those getting started with +<tt class="docutils literal">lxml.objectify</tt> and, in particular, to help those +attempting to transition from <tt class="docutils literal">generateDS.py</tt>.</td> +</tr> +</tbody> +</table> +<div class="contents topic" id="contents"> +<p class="topic-title first">Contents</p> +<ul class="auto-toc simple"> +<li><a class="reference internal" href="#introduction" id="id1">1 Introduction</a></li> +<li><a class="reference internal" href="#migrating-from-generateds-py-to-lxml-objectify" id="id2">2 Migrating from generateDS.py to lxml.objectify</a><ul class="auto-toc"> +<li><a class="reference internal" href="#parsing-an-xml-instance-document" id="id3">2.1 Parsing an XML instance document</a></li> +<li><a class="reference internal" href="#exporting-an-xml-document" id="id4">2.2 Exporting an XML document</a><ul class="auto-toc"> +<li><a class="reference internal" href="#exporting-without-ignorable-whitespace" id="id5">2.2.1 Exporting without "ignorable whitespace"</a></li> +</ul> +</li> +<li><a class="reference internal" href="#the-lxml-objectify-api-access-to-children-and-attributes" id="id6">2.3 The lxml.objectify API -- access to children and attributes</a></li> +<li><a class="reference internal" href="#manipulating-and-modifying-the-element-tree" id="id7">2.4 Manipulating and modifying the element tree</a></li> +</ul> +</li> +<li><a class="reference internal" href="#useful-tips-and-hints" id="id8">3 Useful tips and hints</a><ul class="auto-toc"> +<li><a class="reference internal" href="#a-mini-library-of-helpful-functions" id="id9">3.1 A mini-library of helpful functions</a></li> +<li><a class="reference internal" href="#printing-a-more-readable-representation" id="id10">3.2 Printing a (more) readable representation</a></li> +<li><a class="reference internal" href="#exploring-element-specific-api" id="id11">3.3 Exploring element-specific API</a></li> +<li><a class="reference internal" href="#searching-an-xml-document" id="id12">3.4 Searching an XML document</a></li> +</ul> +</li> +<li><a class="reference internal" href="#sample-applications-with-lxml-objectify" id="id13">4 Sample applications with lxml.objectify</a></li> +<li><a class="reference internal" href="#evaluation-and-comparison-lxml-objectify-vs-generateds-py" id="id14">5 Evaluation and comparison -- lxml.objectify vs. generateDS.py</a><ul class="auto-toc"> +<li><a class="reference internal" href="#api-discovery" id="id15">5.1 API discovery</a></li> +<li><a class="reference internal" href="#namespaces" id="id16">5.2 Namespaces</a></li> +<li><a class="reference internal" href="#summary" id="id17">5.3 Summary</a></li> +</ul> +</li> +</ul> +</div> +<div class="section" id="introduction"> +<h1><a class="toc-backref" href="#id1">1 Introduction</a></h1> +<p>This document is an attempt to give a little help to those starting +out with <tt class="docutils literal">lxml.objectify</tt>. But, it does not attempt to replace +the official doc, which you can find here: +<a class="reference external" href="http://lxml.de/objectify.html">http://lxml.de/objectify.html</a>.</p> +<p>Much of the code in this document assumes that you have done the +following in your Python code:</p> +<pre class="literal-block"> +from lxml import objectify +</pre> +</div> +<div class="section" id="migrating-from-generateds-py-to-lxml-objectify"> +<h1><a class="toc-backref" href="#id2">2 Migrating from generateDS.py to lxml.objectify</a></h1> +<p>With <tt class="docutils literal">lxml.objectify</tt>, unlike <tt class="docutils literal">generateDS.py</tt>, there is no need +to generate code before processing an XML instance document.</p> +<div class="section" id="parsing-an-xml-instance-document"> +<h2><a class="toc-backref" href="#id3">2.1 Parsing an XML instance document</a></h2> +<p>Use something like the following:</p> +<pre class="literal-block"> +def objectify_parse(infilename): + doctree = objectify.parse(infilename) + root = doctree.getroot() + return doctree, root +</pre> +<p>Or, when you want to validate against a schema while parsing, use:</p> +<pre class="literal-block"> +def objectify_parse_with_schema(schemaname, infilename): + schema = etree.XMLSchema(file=schemaname) + parser = objectify.makeparser(schema=schema) + doctree = objectify.parse(infilename, parser=parser) + root = doctree.getroot() + return doctree, root +</pre> +<p>And, if validation against a schema is one of your needs, don't +forget the <tt class="docutils literal">xmllint</tt> command line tool. For example:</p> +<pre class="literal-block"> +$ xmllint --noout --schema my_schema.xsd my_instancedoc.xml +</pre> +</div> +<div class="section" id="exporting-an-xml-document"> +<h2><a class="toc-backref" href="#id4">2.2 Exporting an XML document</a></h2> +<p>There are several ways:</p> +<pre class="literal-block"> +>>> print etree.tostring(doctree) +>>> print etree.tostring(root) +>>> doctree.write(sys.stdout) +>>> doctree.write(sys.stdout, pretty_print=True) +</pre> +<p>You can also export a sub-tree:</p> +<pre class="literal-block"> +In [163]: person = root.person[1] +In [164]: print etree.tostring(person, pretty_print=True) +</pre> +<p>And, with optional pretty printing (indenting) and an XML +declaration:</p> +<pre class="literal-block"> +>>> doctree.write(my_output_file, pretty_print=True) +>>> doctree.write(my_output_file, xml_declaration=True) +>>> doctree.write(my_output_file, pretty_print=True, xml_declaration=True) +</pre> +<p>Yet more examples:</p> +<pre class="literal-block"> +>>> a = obj.fromstring('<aaa><bbb>111</bbb><bbb><ccc>222</ccc></bbb></aaa>') +>>> etree.tostring(a) +>>> print etree.tostring(a) +>>> print etree.tostring(a, pretty_print=True) +>>> print etree.tostring(a.bbb[1], pretty_print=True) # pretty print a subtree +</pre> +<div class="section" id="exporting-without-ignorable-whitespace"> +<h3><a class="toc-backref" href="#id5">2.2.1 Exporting without "ignorable whitespace"</a></h3> +<p>The <tt class="docutils literal">export</tt> methods generated by <tt class="docutils literal">generateDS.py</tt> support an +optional argument (<tt class="docutils literal">pretty_print=True</tt>) that enables you to export +a document <em>without</em> ignorable whitespace. <tt class="docutils literal">lxml.objectify</tt> has +support for that also:</p> +<ol class="arabic"> +<li><p class="first">Parse the document initially without the ignorable whitespace. +Example:</p> +<pre class="literal-block"> +parser = etree.XMLParser(remove_blank_text=True) +doc = etree.parse(filename, parser) +root = doc.getroot() +</pre> +</li> +<li><p class="first">In some cases you might need to remove ignorable whitespace with +something like the following:</p> +<pre class="literal-block"> +for element in root.iter(): + element.tail = None +</pre> +</li> +</ol> +<p>The above code examples and more information on ignorable whitespace +and formatting serialized output (also known as "export" in +<tt class="docutils literal">generateDS.py</tt>) can be found in the <tt class="docutils literal">lxml</tt> FAQ: +<a class="reference external" href="http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output">http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output</a></p> +</div> +</div> +<div class="section" id="the-lxml-objectify-api-access-to-children-and-attributes"> +<h2><a class="toc-backref" href="#id6">2.3 The lxml.objectify API -- access to children and attributes</a></h2> +<p><strong>Attributes</strong> -- The attributes of an <tt class="docutils literal">lxml.objectify</tt> XML element are +available in a dictionary-like object. But you can also access them +directly throught the element. Examples:</p> +<pre class="literal-block"> +In [81]: element.attrib +Out[81]: {'ratio': '3.2', 'id': '1', 'value': 'abcd'} +In [82]: +In [82]: element.get('ratio') +Out[82]: '3.2' +In [83]: print element.get('ratio') +3.2 +In [84]: print element.get('ratioxxx') +None +</pre> +<p>And, use <tt class="docutils literal">element.set(key, value)</tt> to set an attribute's value.</p> +<p>Iterate over the attributes using the standard dictionary API on the +elements <tt class="docutils literal">el.attrib</tt> attribute. Example:</p> +<pre class="literal-block"> +In [48]: link = root.Link[2] +In [49]: for key, value in link.attrib.items(): + ....: print 'key: {} value: {}'.format(key, value) + ....: +key: rel value: down +key: type value: application/vnd.vmware.admin.vmwExtension+xml +key: href value: https://vcloud.example.com/api/admin/extension +</pre> +<p><strong>Children</strong> -- The children of an XML element are available by using +the child's tag as an attribute. For example, if the element +<tt class="docutils literal">people</tt> has one or more children whose tag is <tt class="docutils literal">person</tt>, then +those children can be accessed as follows:</p> +<pre class="literal-block"> +In [87]: people.person # first person available without index +Out[87]: <Element person at 0x7fa0f1814ea8> +In [88]: people.person[0] # same as previous +Out[88]: <Element person at 0x7fa0f1814ea8> +In [89]: people.person[1] +Out[89]: <Element person at 0x7fa0f1814e60> +</pre> +<p>You can also use <tt class="docutils literal">getattr()</tt> to access child elements. You may +need to do this when there are children from different namespaces +within the same element. Examples:</p> +<pre class="literal-block"> +In [50]: rootgroup = root.RootGroup +In [51]: rootgroup.Group +Out[51]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> +In [52]: +In [52]: getattr(rootgroup, 'Group') +Out[52]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> +In [53]: +In [53]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group') +Out[53]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> +In [54]: +In [54]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')[1] +Out[54]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05ab8> +</pre> +<p>Iterate over the children by using the element's +<tt class="docutils literal">el.iterchildren()</tt> method. Example:</p> +<pre class="literal-block"> +In [47]: for child in root.iterchildren(): + print child.tag + ....: +{http://www.vmware.com/vcloud/v1.5}Link +{http://www.vmware.com/vcloud/v1.5}Link +{http://www.vmware.com/vcloud/v1.5}Link +{http://www.vmware.com/vcloud/v1.5}Link +{http://www.vmware.com/vcloud/v1.5}Link +</pre> +</div> +<div class="section" id="manipulating-and-modifying-the-element-tree"> +<h2><a class="toc-backref" href="#id7">2.4 Manipulating and modifying the element tree</a></h2> +<p>Modify text content -- You can assign to a leaf element to modify +its text content, for example:</p> +<pre class="literal-block"> +>>> dataset.datanode = 'a simple string' +</pre> +<p>However, you may want to use <tt class="docutils literal">lxml.objectify</tt> data types. If you +do not, <tt class="docutils literal">lxml.objectify</tt> may put them in a different namespace. +Here are examples that preserve the existing data types:</p> +<pre class="literal-block"> +>>> dataset.datanode = objectify.StringElement('a simple string') +>>> dataset.datanode = objectify.IntElement('200') +>>> dataset.datanode = objectify.FloatElement('300.5') +</pre> +<p>See the following for more on how to work with Python data types: +<a class="reference external" href="http://lxml.de/objectify.html#python-data-types">http://lxml.de/objectify.html#python-data-types</a></p> +<p>Creating new elements -- See this for information on how to add +elements to the XML element tree: +<a class="reference external" href="http://lxml.de/objectify.html#creating-objectify-trees">http://lxml.de/objectify.html#creating-objectify-trees</a></p> +<p>You can also copy existing elements or sub-trees of elements, for +example:</p> +<pre class="literal-block"> +>>> import copy +>>> new_element = copy.deepcopy(old_element) +>>> parent_element.append(new_element) +</pre> +</div> +</div> +<div class="section" id="useful-tips-and-hints"> +<h1><a class="toc-backref" href="#id8">3 Useful tips and hints</a></h1> +<div class="section" id="a-mini-library-of-helpful-functions"> +<h2><a class="toc-backref" href="#id9">3.1 A mini-library of helpful functions</a></h2> +<p>Some of the helper functions mentioned below are available here: +<a class="reference external" href="Objectify_files/objectify_helpers.py">objectify_helpers.py</a>.</p> +</div> +<div class="section" id="printing-a-more-readable-representation"> +<h2><a class="toc-backref" href="#id10">3.2 Printing a (more) readable representation</a></h2> +<p>In order to get a picture of the API available at various elements, +you can use the <tt class="docutils literal">objectify.dump(element)</tt>. For example:</p> +<pre class="literal-block"> +In [237]: print objectify.dump(root.programmer) +programmer = None [ObjectifiedElement] + * id = '2' + * language = 'python' + * editor = 'xml' + name = 'Charles Carlson' [StringElement] + interest = 'programming' [StringElement] + category = 2233 [IntElement] + description = 'A very happy programmer' [StringElement] + email = 'charles@happyprogrammers.com' [StringElement] + elposint = 14 [IntElement] + elnonposint = 0 [IntElement] + elnegint = -12 [IntElement] + elnonnegint = 4 [IntElement] + eldate = '2005-04-26' [StringElement] + eldatetime = '2005-04-26T10:11:12' [StringElement] + eldatetime1 = '2006-05-27T10:11:12.40' [StringElement] + eltoken = 'aa bb cc\tdd\n ee' [StringElement] + elshort = 123 [IntElement] + ellong = 1324123412 [IntElement] + elparam = u'' [StringElement] + * id = 'id001' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'abc' + elparam = u'' [StringElement] + * id = 'id002' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'int' +</pre> +<p>A similar display can be gotten by using <tt class="docutils literal">str(element)</tt>. But, +in order to do so, you may need to call +<tt class="docutils literal">objectify.enable_recursive_str()</tt>, first. For +example:</p> +<pre class="literal-block"> +In [238]: print str(root.programmer) +programmer = None [ObjectifiedElement] + * id = '2' + * language = 'python' + * editor = 'xml' + name = 'Charles Carlson' [StringElement] + interest = 'programming' [StringElement] + category = 2233 [IntElement] + description = 'A very happy programmer' [StringElement] + email = 'charles@happyprogrammers.com' [StringElement] + elposint = 14 [IntElement] + elnonposint = 0 [IntElement] + elnegint = -12 [IntElement] + elnonnegint = 4 [IntElement] + eldate = '2005-04-26' [StringElement] + eldatetime = '2005-04-26T10:11:12' [StringElement] + eldatetime1 = '2006-05-27T10:11:12.40' [StringElement] + eltoken = 'aa bb cc\tdd\n ee' [StringElement] + elshort = 123 [IntElement] + ellong = 1324123412 [IntElement] + elparam = u'' [StringElement] + * id = 'id001' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'abc' + elparam = u'' [StringElement] + * id = 'id002' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'int' +</pre> +<p>This behavior of <tt class="docutils literal">str(o)</tt> can be turned on and off with the +following:</p> +<pre class="literal-block"> +In [75]: objectify.enable_recursive_str(True) +In [76]: objectify.enable_recursive_str(False) +</pre> +<p>And, here is an implementation that mimics <tt class="docutils literal">objectify.dump(o)</tt> but has +several additional features:</p> +<ul class="simple"> +<li>It enables you to limit the number of levels of nesting and +display of children and their children etc. Imagine displaying +the root node of a very large file containing many levels of +nested children.</li> +<li>It writes to a file rather than accumulating a string. For some +situations, this saves having to type <tt class="docutils literal">print</tt> in order to format +the output. And, again thinking about very large documents, it +might save us from building up a huge string.</li> +</ul> +<pre class="literal-block"> +def swrite(element, maxlevels=None, outfile=sys.stdout): + """Recursively write out a formatted, readable representation of element. + Possibly do shallow recursion. + Limit recursion to maxlevels (default is all levels). + Write output to file outfile (default is sys.stdout). + """ + wrt = outfile.write + swrite_(element, 0, maxlevels, wrt) + + +def swrite_(element, indent, maxlevels, wrt): + indentstr = ' ' * indent + wrt('{}{}: {}\n'.format(indentstr, element.tag, repr(element), )) + for name, value in element.attrib.iteritems(): + wrt(' {}* {}: {}\n'.format(indentstr, name, value, )) + indent += 1 + if maxlevels is not None and indent > maxlevels: + return + for child in element.iterchildren(): + swrite_(child, indent, maxlevels, wrt) +</pre> +</div> +<div class="section" id="exploring-element-specific-api"> +<h2><a class="toc-backref" href="#id11">3.3 Exploring element-specific API</a></h2> +<p>With <tt class="docutils literal">lxml.objectify</tt>, inspecting objects to determine the API for +that specific element type is a frequent task. You may find a +function something like the following helpful:</p> +<pre class="literal-block"> +Standard_attrs = set([ '__dict__', '__getattr__', 'addattr', + 'countchildren', 'descendantpaths', '__class__', '__contains__', + '__copy__', '__deepcopy__', '__delattr__', '__delitem__', + '__doc__', '__format__', '__getattribute__', '__getitem__', + '__hash__', '__init__', '__iter__', '__len__', '__new__', + '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', + '__reversed__', '__setattr__', '__setitem__', '__sizeof__', + '__str__', '__subclasshook__', '_init', 'addnext', + 'addprevious', 'append', 'attrib', 'base', 'clear', 'extend', + 'find', 'findall', 'findtext', 'get', 'getchildren', + 'getiterator', 'getnext', 'getparent', 'getprevious', + 'getroottree', 'index', 'insert', 'items', 'iter', + 'iterancestors', 'iterchildren', 'iterdescendants', 'iterfind', + 'itersiblings', 'itertext', 'keys', 'makeelement', 'nsmap', + 'prefix', 'remove', 'replace', 'set', 'sourceline', 'tag', + 'tail', 'text', 'values', 'xpath', ]) + +def members(element): + names = [attr for attr in dir(element) if attr not in Standard_attrs] + return names +</pre> +<p>I obtained that list of <tt class="docutils literal">Standard_attrs</tt> by doing <tt class="docutils literal">print +dir(element)</tt> on a standard element (and then modifying it a bit).</p> +<p>However, instead of calling that <tt class="docutils literal">members(o)</tt> function (above), +the following snippet is likely just as useful:</p> +<pre class="literal-block"> +In [96]: [child.tag for child in element.iterchildren()] +Out[96]: ['example1', 'name', 'interest', 'interest', 'category', 'hot.agent'] +In [97]: +In [97]: sorted([child.tag for child in element.iterchildren()]) +Out[97]: ['category', 'example1', 'hot.agent', 'interest', 'interest', 'name'] +</pre> +<p>And, to save typing, the following functions might be helpful:</p> +<pre class="literal-block"> +def children(element, tag=None): + """Return a list of children of an element. + Optional argument tag can be a single string or list of strings + to select only children with that tag name. + """ + child_list = [child for child in element.iterchildren(tag=tag)] + return child_list + +def child_tags(element, tag=None): + """Return a list of the tag names of the children of an element. + Optional argument tag can be a single string or list of strings + to select only children with that tag name. + """ + tags = [child.tag for child in element.iterchildren(tag=tag)] + return tags +</pre> +<p>Or, you may find this shallow dump function useful. It uses +<tt class="docutils literal">objectify.dump(o)</tt>, but attempts to <em>only</em> return the description +of the top level object:</p> +<pre class="literal-block"> +def sdump(element): + content = objectify.dump(element) + content = content.splitlines() + prefix = ' ' + content = [line for line in content if not line.startswith(prefix)] + content = '\n'.join(content) + return content +</pre> +</div> +<div class="section" id="searching-an-xml-document"> +<h2><a class="toc-backref" href="#id12">3.4 Searching an XML document</a></h2> +<p><tt class="docutils literal">lxml.objectify</tt> has its own XPath-like search capability with a +(possibly) simpler form of the XPath/XQuery language. See this for +information about ObjectPath: <a class="reference external" href="http://lxml.de/objectify.html#objectpath">http://lxml.de/objectify.html#objectpath</a></p> +<p>And, you can also use that lxml xpath on <tt class="docutils literal">lxml.objectify</tt> +elements. Example:</p> +<pre class="literal-block"> +In [68]: root.xpath('.//@Name') +Out[68]: +['dataset1-1', + 'dataset1-2', + 'subgroup01', + 'dataset2-1', + 'dataset2-2', + 'subgroup02', + 'dataset3-1', + 'dataset3-2', + 'subgroup03', + 'dataset3-3'] +</pre> +<p>See this for information about the <tt class="docutils literal">lxml</tt> support for +<tt class="docutils literal">xpath</tt>: <a class="reference external" href="http://lxml.de/xpathxslt.html">http://lxml.de/xpathxslt.html</a>. And, see this for +information about the XPath path language:</p> +<ul class="simple"> +<li><a class="reference external" href="http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev">http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev</a></li> +<li><a class="reference external" href="http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev">http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev</a></li> +</ul> +</div> +</div> +<div class="section" id="sample-applications-with-lxml-objectify"> +<h1><a class="toc-backref" href="#id13">4 Sample applications with lxml.objectify</a></h1> +<ol class="arabic"> +<li><p class="first">Here is a sample application that parses and displays weather +information from an XML document: <a class="reference external" href="Objectify_files/weather_test.py">weather_test.py</a>.</p> +</li> +<li><p class="first">This sample application picks data out of an XML document that +was generated with <tt class="docutils literal">h5dump</tt>. For example:</p> +<pre class="literal-block"> +$ h5dump -x my_data.hdf5 > my_data.hdf5.xml +</pre> +<p>This sample application attempts to create a new hdf5 data file from that XML +document. The code is here: +<a class="reference external" href="Objectify_files/obj_hdf_xml.py">obj_hdf_xml.py</a></p> +<p>Here is more information about HDF5:</p> +<ul class="simple"> +<li><a class="reference external" href="http://www.hdfgroup.org/">http://www.hdfgroup.org/</a></li> +<li><a class="reference external" href="http://docs.h5py.org/en/latest/index.html">http://docs.h5py.org/en/latest/index.html</a> -- HDF5 for Python</li> +</ul> +</li> +<li><p class="first">Here are several small applications that pick data out of files +related to Vcloud. I've included the Python code, a sample XML +file, and a dump of the XML file produced by +<tt class="docutils literal">objectify.dump(root)</tt>. The code is here: +<a class="reference external" href="Objectify_files/vcloud_samples.zip">vcloud_samples.zip</a> And, you can learn +more about Vcloud here: +<a class="reference external" href="http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html">http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html</a></p> +</li> +</ol> +</div> +<div class="section" id="evaluation-and-comparison-lxml-objectify-vs-generateds-py"> +<h1><a class="toc-backref" href="#id14">5 Evaluation and comparison -- lxml.objectify vs. generateDS.py</a></h1> +<div class="section" id="api-discovery"> +<h2><a class="toc-backref" href="#id15">5.1 API discovery</a></h2> +<p><tt class="docutils literal">generateDS.py</tt> generates a class for each <tt class="docutils literal">xs:complexType</tt>. +Therefore, there is Python code that you can inspect to determine +the (generated) API, for example, getters, setters, constructor, +export function, etc. In order to do that, you will need to +identify which generated class is the implementation for the element +in which you are interested.</p> +<p><tt class="docutils literal">lxml.objectify</tt> objects can be inspected using +<tt class="docutils literal">objectify.dump(o)</tt> or one of the helper functions described in +this document in section <a class="reference internal" href="#useful-tips-and-hints">Useful tips and hints</a>. In order to +perform this inspection, you must get access to an object of the +type that you want to inspect. Here are several ways to do that +(and you may think of others):</p> +<ul> +<li><p class="first">Drop into the Python debugger by placing this code in your +application where you have access to an object of the type you are +interested in:</p> +<pre class="literal-block"> +import pdb +pdb.set_trace() +</pre> +<p>Or, if you have installed <tt class="docutils literal">ipython</tt> and <tt class="docutils literal">ipdb</tt>, use:</p> +<pre class="literal-block"> +import ipdb +ipdb.set_trace() +</pre> +<p><tt class="docutils literal">ipdb</tt> gives you tab completion for names available in the +current scope.</p> +</li> +<li><p class="first">Parse and dump an XML instance document (using +<tt class="docutils literal">objectify.dump(el)</tt>), capture it in a file, then look for the +element of interest with your text editor. Here is a simple +utility script to help do that:</p> +<pre class="literal-block"> +#!/usr/bin/env python + +import sys +from lxml import objectify + +def dump(infilename): + doc = objectify.parse(infilename) + root = doc.getroot() + print objectify.dump(root) + +def main(): + args = sys.argv[1:] + infilename = args[0] + dump(infilename) + +if __name__ == '__main__': + main() +</pre> +</li> +<li><p class="first">Insert the the following code in your application at some point +where it will have access to the element whose API you wish to +discover:</p> +<pre class="literal-block"> +print objectify.dump(element) +</pre> +<p>Or, if stdout (standard output) is not available and visible to +you, something like the following:</p> +<pre class="literal-block"> +import tempfile + +with tempfile.NamedTemporaryFile('w', delete=False) as outfile: + outfile.write(objectify.dump(element)) + outfilename = outfile.name +</pre> +</li> +<li><p class="first">Or, use one of the helpers above, for example:</p> +<pre class="literal-block"> +print objectify_helpers.child_tags(element) +</pre> +</li> +</ul> +</div> +<div class="section" id="namespaces"> +<h2><a class="toc-backref" href="#id16">5.2 Namespaces</a></h2> +<p><tt class="docutils literal">lxml.objectify</tt> handles namespaces correctly; <tt class="docutils literal">generateDS.py</tt>, +especially when there are multiple namespaces in the same XML +document, does not.</p> +<p>Mostly, <tt class="docutils literal">lxml.objectify</tt> handles namespaces for you without +additional effort on your part. If you are working with an element +that contains items from different namespaces, then see this: +<a class="reference external" href="http://lxml.de/objectify.html#namespace-handling">http://lxml.de/objectify.html#namespace-handling</a>. Sometimes, when +you use <tt class="docutils literal">getattr(el, 'xxx')</tt> or el.iterchildren(tag='xxx'), you +will need to include the namespace. Examples:</p> +<pre class="literal-block"> +In [15]: rootgroup = root.RootGroup +In [16]: rootgroup.Group.tag +Out[16]: '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group' +In [17]: [el.tag for el in rootgroup.iterchildren(tag="{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group")] +Out[17]: +['{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group', + '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group', + '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group'] +</pre> +<p>and:</p> +<pre class="literal-block"> +In [24]: rootgroup.Dataset +Out[24]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68> +In [25]: getattr(rootgroup, "{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset") +Out[25]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68> +</pre> +</div> +<div class="section" id="summary"> +<h2><a class="toc-backref" href="#id17">5.3 Summary</a></h2> +<p>Although their approaches are very different, <tt class="docutils literal">generateDS.py</tt> and +<tt class="docutils literal">lxml.objectify</tt> seem to solve the same set of problems and answer +equivalent sets of needs. <tt class="docutils literal">generateDS.py</tt> generates and gives you +an API for each element type, specifically a Python class. With +<tt class="docutils literal">lxml.objectify</tt>, you can discover a (simulated) API by inspecting +a dump produced by <tt class="docutils literal">lxml.objectify.dump(o)</tt> or by using +<tt class="docutils literal">lxml.objectify</tt> and <tt class="docutils literal">lxml</tt> capabilities in each element to +inspect the element.</p> +<p>When might you want to use one rather than the other?</p> +<ul class="simple"> +<li>Since <tt class="docutils literal">generateDS.py</tt> requires an XML schema in order to +generate code, if you do <em>not</em> have an XML schema for your +document type, then <tt class="docutils literal">generateDS.py</tt> is not an option for you.</li> +<li>If you must handle an XML document that is defined by an XML +schema that contains multiple namespaces, then, because of the +problems that <tt class="docutils literal">generateDS.py</tt> has with namespaces, you should +choose <tt class="docutils literal">lxml.objectify</tt>.</li> +<li>If you want to produce Python code that defines and implements an +API for a specific XML document type and you have an XML schema +that defines that document type, then you may want to consider +<tt class="docutils literal">generateDS.py</tt>. If you want to be able to send that generated +API for use by other developers, then the <tt class="docutils literal">generateDS.py</tt> +approach might be an advantage to you. However, the content +produced by <tt class="docutils literal">lxml.objectify.dump(o)</tt> is very close to a +description of an API for accessing an manipulating each element +in an XML document.</li> +</ul> +</div> +</div> +</div> +<div class="footer"> +<hr class="footer" /> +<a class="reference external" href="objectify_notes.txt">View document source</a>. +Generated on: 2015-07-06 20:48 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> +</body> +</html> diff --git a/Docs/objectify_notes.txt b/Docs/objectify_notes.txt new file mode 100644 index 0000000..3dc2cdd --- /dev/null +++ b/Docs/objectify_notes.txt @@ -0,0 +1,633 @@ +.. vim:ft=rst: + +====================== +lxml.objectify notes +====================== + +:author: Dave Kuhlman +:address: + dkuhlman (at) davekuhlman (dot) org + +:revision: 1.1a +:date: |date| + +.. |date| date:: %B %d, %Y + +:Copyright: Copyright (c) 2015 Dave Kuhlman. All Rights Reserved. + This software is subject to the provisions of the MIT License + http://www.opensource.org/licenses/mit-license.php. + +:Abstract: A document intended to help those getting started with + ``lxml.objectify`` and, in particular, to help those + attempting to transition from ``generateDS.py``. + +.. sectnum:: + +.. contents:: + +Introduction +============== + +This document is an attempt to give a little help to those starting +out with ``lxml.objectify``. But, it does not attempt to replace +the official doc, which you can find here: +http://lxml.de/objectify.html. + +Much of the code in this document assumes that you have done the +following in your Python code:: + + from lxml import objectify + + +Migrating from generateDS.py to lxml.objectify +================================================ + +With ``lxml.objectify``, unlike ``generateDS.py``, there is no need +to generate code before processing an XML instance document. + +Parsing an XML instance document +---------------------------------- + +Use something like the following:: + + def objectify_parse(infilename): + doctree = objectify.parse(infilename) + root = doctree.getroot() + return doctree, root + +Or, when you want to validate against a schema while parsing, use:: + + def objectify_parse_with_schema(schemaname, infilename): + schema = etree.XMLSchema(file=schemaname) + parser = objectify.makeparser(schema=schema) + doctree = objectify.parse(infilename, parser=parser) + root = doctree.getroot() + return doctree, root + +And, if validation against a schema is one of your needs, don't +forget the ``xmllint`` command line tool. For example:: + + $ xmllint --noout --schema my_schema.xsd my_instancedoc.xml + + +Exporting an XML document +--------------------------- + +There are several ways:: + + >>> print etree.tostring(doctree) + >>> print etree.tostring(root) + >>> doctree.write(sys.stdout) + >>> doctree.write(sys.stdout, pretty_print=True) + +You can also export a sub-tree:: + + In [163]: person = root.person[1] + In [164]: print etree.tostring(person, pretty_print=True) + +And, with optional pretty printing (indenting) and an XML +declaration:: + + >>> doctree.write(my_output_file, pretty_print=True) + >>> doctree.write(my_output_file, xml_declaration=True) + >>> doctree.write(my_output_file, pretty_print=True, xml_declaration=True) + +Yet more examples:: + + >>> a = obj.fromstring('<aaa><bbb>111</bbb><bbb><ccc>222</ccc></bbb></aaa>') + >>> etree.tostring(a) + >>> print etree.tostring(a) + >>> print etree.tostring(a, pretty_print=True) + >>> print etree.tostring(a.bbb[1], pretty_print=True) # pretty print a subtree + + +Exporting without "ignorable whitespace" +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``export`` methods generated by ``generateDS.py`` support an +optional argument (``pretty_print=True``) that enables you to export +a document *without* ignorable whitespace. ``lxml.objectify`` has +support for that also: + +1. Parse the document initially without the ignorable whitespace. + Example:: + + parser = etree.XMLParser(remove_blank_text=True) + doc = etree.parse(filename, parser) + root = doc.getroot() + +2. In some cases you might need to remove ignorable whitespace with + something like the following:: + + for element in root.iter(): + element.tail = None + +The above code examples and more information on ignorable whitespace +and formatting serialized output (also known as "export" in +``generateDS.py``) can be found in the ``lxml`` FAQ: +http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output + + +The lxml.objectify API -- access to children and attributes +------------------------------------------------------------- + +**Attributes** -- The attributes of an ``lxml.objectify`` XML element are +available in a dictionary-like object. But you can also access them +directly throught the element. Examples:: + + In [81]: element.attrib + Out[81]: {'ratio': '3.2', 'id': '1', 'value': 'abcd'} + In [82]: + In [82]: element.get('ratio') + Out[82]: '3.2' + In [83]: print element.get('ratio') + 3.2 + In [84]: print element.get('ratioxxx') + None + +And, use ``element.set(key, value)`` to set an attribute's value. + +Iterate over the attributes using the standard dictionary API on the +elements ``el.attrib`` attribute. Example:: + + In [48]: link = root.Link[2] + In [49]: for key, value in link.attrib.items(): + ....: print 'key: {} value: {}'.format(key, value) + ....: + key: rel value: down + key: type value: application/vnd.vmware.admin.vmwExtension+xml + key: href value: https://vcloud.example.com/api/admin/extension + +**Children** -- The children of an XML element are available by using +the child's tag as an attribute. For example, if the element +``people`` has one or more children whose tag is ``person``, then +those children can be accessed as follows:: + + In [87]: people.person # first person available without index + Out[87]: <Element person at 0x7fa0f1814ea8> + In [88]: people.person[0] # same as previous + Out[88]: <Element person at 0x7fa0f1814ea8> + In [89]: people.person[1] + Out[89]: <Element person at 0x7fa0f1814e60> + +You can also use ``getattr()`` to access child elements. You may +need to do this when there are children from different namespaces +within the same element. Examples:: + + In [50]: rootgroup = root.RootGroup + In [51]: rootgroup.Group + Out[51]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> + In [52]: + In [52]: getattr(rootgroup, 'Group') + Out[52]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> + In [53]: + In [53]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group') + Out[53]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05b48> + In [54]: + In [54]: getattr(rootgroup, '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group')[1] + Out[54]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group at 0x7f8d34a05ab8> + +Iterate over the children by using the element's +``el.iterchildren()`` method. Example:: + + In [47]: for child in root.iterchildren(): + print child.tag + ....: + {http://www.vmware.com/vcloud/v1.5}Link + {http://www.vmware.com/vcloud/v1.5}Link + {http://www.vmware.com/vcloud/v1.5}Link + {http://www.vmware.com/vcloud/v1.5}Link + {http://www.vmware.com/vcloud/v1.5}Link + + + +Manipulating and modifying the element tree +--------------------------------------------- + +Modify text content -- You can assign to a leaf element to modify +its text content, for example:: + + >>> dataset.datanode = 'a simple string' + +However, you may want to use ``lxml.objectify`` data types. If you +do not, ``lxml.objectify`` may put them in a different namespace. +Here are examples that preserve the existing data types:: + + >>> dataset.datanode = objectify.StringElement('a simple string') + >>> dataset.datanode = objectify.IntElement('200') + >>> dataset.datanode = objectify.FloatElement('300.5') + +See the following for more on how to work with Python data types: +http://lxml.de/objectify.html#python-data-types + +Creating new elements -- See this for information on how to add +elements to the XML element tree: +http://lxml.de/objectify.html#creating-objectify-trees + +You can also copy existing elements or sub-trees of elements, for +example:: + + >>> import copy + >>> new_element = copy.deepcopy(old_element) + >>> parent_element.append(new_element) + + +Useful tips and hints +======================= + +A mini-library of helpful functions +------------------------------------- + +Some of the helper functions mentioned below are available here: +`objectify_helpers.py <Objectify_files/objectify_helpers.py>`_. + + +Printing a (more) readable representation +------------------------------------------- + +In order to get a picture of the API available at various elements, +you can use the ``objectify.dump(element)``. For example:: + + In [237]: print objectify.dump(root.programmer) + programmer = None [ObjectifiedElement] + * id = '2' + * language = 'python' + * editor = 'xml' + name = 'Charles Carlson' [StringElement] + interest = 'programming' [StringElement] + category = 2233 [IntElement] + description = 'A very happy programmer' [StringElement] + email = 'charles@happyprogrammers.com' [StringElement] + elposint = 14 [IntElement] + elnonposint = 0 [IntElement] + elnegint = -12 [IntElement] + elnonnegint = 4 [IntElement] + eldate = '2005-04-26' [StringElement] + eldatetime = '2005-04-26T10:11:12' [StringElement] + eldatetime1 = '2006-05-27T10:11:12.40' [StringElement] + eltoken = 'aa bb cc\tdd\n ee' [StringElement] + elshort = 123 [IntElement] + ellong = 1324123412 [IntElement] + elparam = u'' [StringElement] + * id = 'id001' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'abc' + elparam = u'' [StringElement] + * id = 'id002' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'int' + +A similar display can be gotten by using ``str(element)``. But, +in order to do so, you may need to call +``objectify.enable_recursive_str()``, first. For +example:: + + In [238]: print str(root.programmer) + programmer = None [ObjectifiedElement] + * id = '2' + * language = 'python' + * editor = 'xml' + name = 'Charles Carlson' [StringElement] + interest = 'programming' [StringElement] + category = 2233 [IntElement] + description = 'A very happy programmer' [StringElement] + email = 'charles@happyprogrammers.com' [StringElement] + elposint = 14 [IntElement] + elnonposint = 0 [IntElement] + elnegint = -12 [IntElement] + elnonnegint = 4 [IntElement] + eldate = '2005-04-26' [StringElement] + eldatetime = '2005-04-26T10:11:12' [StringElement] + eldatetime1 = '2006-05-27T10:11:12.40' [StringElement] + eltoken = 'aa bb cc\tdd\n ee' [StringElement] + elshort = 123 [IntElement] + ellong = 1324123412 [IntElement] + elparam = u'' [StringElement] + * id = 'id001' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'abc' + elparam = u'' [StringElement] + * id = 'id002' + * name = 'Davy' + * semantic = 'a big semantic' + * type = 'int' + +This behavior of ``str(o)`` can be turned on and off with the +following:: + + In [75]: objectify.enable_recursive_str(True) + In [76]: objectify.enable_recursive_str(False) + +And, here is an implementation that mimics ``objectify.dump(o)`` but has +several additional features: + +- It enables you to limit the number of levels of nesting and + display of children and their children etc. Imagine displaying + the root node of a very large file containing many levels of + nested children. + +- It writes to a file rather than accumulating a string. For some + situations, this saves having to type ``print`` in order to format + the output. And, again thinking about very large documents, it + might save us from building up a huge string. + +:: + + def swrite(element, maxlevels=None, outfile=sys.stdout): + """Recursively write out a formatted, readable representation of element. + Possibly do shallow recursion. + Limit recursion to maxlevels (default is all levels). + Write output to file outfile (default is sys.stdout). + """ + wrt = outfile.write + swrite_(element, 0, maxlevels, wrt) + + + def swrite_(element, indent, maxlevels, wrt): + indentstr = ' ' * indent + wrt('{}{}: {}\n'.format(indentstr, element.tag, repr(element), )) + for name, value in element.attrib.iteritems(): + wrt(' {}* {}: {}\n'.format(indentstr, name, value, )) + indent += 1 + if maxlevels is not None and indent > maxlevels: + return + for child in element.iterchildren(): + swrite_(child, indent, maxlevels, wrt) + + +Exploring element-specific API +-------------------------------- + +With ``lxml.objectify``, inspecting objects to determine the API for +that specific element type is a frequent task. You may find a +function something like the following helpful:: + + Standard_attrs = set([ '__dict__', '__getattr__', 'addattr', + 'countchildren', 'descendantpaths', '__class__', '__contains__', + '__copy__', '__deepcopy__', '__delattr__', '__delitem__', + '__doc__', '__format__', '__getattribute__', '__getitem__', + '__hash__', '__init__', '__iter__', '__len__', '__new__', + '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', + '__reversed__', '__setattr__', '__setitem__', '__sizeof__', + '__str__', '__subclasshook__', '_init', 'addnext', + 'addprevious', 'append', 'attrib', 'base', 'clear', 'extend', + 'find', 'findall', 'findtext', 'get', 'getchildren', + 'getiterator', 'getnext', 'getparent', 'getprevious', + 'getroottree', 'index', 'insert', 'items', 'iter', + 'iterancestors', 'iterchildren', 'iterdescendants', 'iterfind', + 'itersiblings', 'itertext', 'keys', 'makeelement', 'nsmap', + 'prefix', 'remove', 'replace', 'set', 'sourceline', 'tag', + 'tail', 'text', 'values', 'xpath', ]) + + def members(element): + names = [attr for attr in dir(element) if attr not in Standard_attrs] + return names + +I obtained that list of ``Standard_attrs`` by doing ``print +dir(element)`` on a standard element (and then modifying it a bit). + +However, instead of calling that ``members(o)`` function (above), +the following snippet is likely just as useful:: + + In [96]: [child.tag for child in element.iterchildren()] + Out[96]: ['example1', 'name', 'interest', 'interest', 'category', 'hot.agent'] + In [97]: + In [97]: sorted([child.tag for child in element.iterchildren()]) + Out[97]: ['category', 'example1', 'hot.agent', 'interest', 'interest', 'name'] + +And, to save typing, the following functions might be helpful:: + + def children(element, tag=None): + """Return a list of children of an element. + Optional argument tag can be a single string or list of strings + to select only children with that tag name. + """ + child_list = [child for child in element.iterchildren(tag=tag)] + return child_list + + def child_tags(element, tag=None): + """Return a list of the tag names of the children of an element. + Optional argument tag can be a single string or list of strings + to select only children with that tag name. + """ + tags = [child.tag for child in element.iterchildren(tag=tag)] + return tags + +Or, you may find this shallow dump function useful. It uses +``objectify.dump(o)``, but attempts to *only* return the description +of the top level object:: + + def sdump(element): + content = objectify.dump(element) + content = content.splitlines() + prefix = ' ' + content = [line for line in content if not line.startswith(prefix)] + content = '\n'.join(content) + return content + + +Searching an XML document +--------------------------- + +``lxml.objectify`` has its own XPath-like search capability with a +(possibly) simpler form of the XPath/XQuery language. See this for +information about ObjectPath: http://lxml.de/objectify.html#objectpath + +And, you can also use that lxml xpath on ``lxml.objectify`` +elements. Example:: + + In [68]: root.xpath('.//@Name') + Out[68]: + ['dataset1-1', + 'dataset1-2', + 'subgroup01', + 'dataset2-1', + 'dataset2-2', + 'subgroup02', + 'dataset3-1', + 'dataset3-2', + 'subgroup03', + 'dataset3-3'] + +See this for information about the ``lxml`` support for +``xpath``: http://lxml.de/xpathxslt.html. And, see this for +information about the XPath path language: + +- http://www.w3.org/TR/2014/REC-xpath-30-20140408/#unabbrev +- http://www.w3.org/TR/2014/REC-xpath-30-20140408/#abbrev + + +Sample applications with lxml.objectify +========================================== + +1. Here is a sample application that parses and displays weather + information from an XML document: `weather_test.py + <Objectify_files/weather_test.py>`_. + +2. This sample application picks data out of an XML document that + was generated with ``h5dump``. For example:: + + $ h5dump -x my_data.hdf5 > my_data.hdf5.xml + + This sample application attempts to create a new hdf5 data file from that XML + document. The code is here: + `obj_hdf_xml.py <Objectify_files/obj_hdf_xml.py>`_ + + Here is more information about HDF5: + + - http://www.hdfgroup.org/ + - http://docs.h5py.org/en/latest/index.html -- HDF5 for Python + +3. Here are several small applications that pick data out of files + related to Vcloud. I've included the Python code, a sample XML + file, and a dump of the XML file produced by + ``objectify.dump(root)``. The code is here: + `vcloud_samples.zip <Objectify_files/vcloud_samples.zip>`_ And, you can learn + more about Vcloud here: + http://pubs.vmware.com/vcd-51/topic/com.vmware.vcloud.api.reference.doc_51/about.html + + +Evaluation and comparison -- lxml.objectify vs. generateDS.py +=============================================================== + +API discovery +--------------- + +``generateDS.py`` generates a class for each ``xs:complexType``. +Therefore, there is Python code that you can inspect to determine +the (generated) API, for example, getters, setters, constructor, +export function, etc. In order to do that, you will need to +identify which generated class is the implementation for the element +in which you are interested. + +``lxml.objectify`` objects can be inspected using +``objectify.dump(o)`` or one of the helper functions described in +this document in section `Useful tips and hints`_. In order to +perform this inspection, you must get access to an object of the +type that you want to inspect. Here are several ways to do that +(and you may think of others): + +- Drop into the Python debugger by placing this code in your + application where you have access to an object of the type you are + interested in:: + + import pdb + pdb.set_trace() + + Or, if you have installed ``ipython`` and ``ipdb``, use:: + + import ipdb + ipdb.set_trace() + + ``ipdb`` gives you tab completion for names available in the + current scope. + +- Parse and dump an XML instance document (using + ``objectify.dump(el)``), capture it in a file, then look for the + element of interest with your text editor. Here is a simple + utility script to help do that:: + + #!/usr/bin/env python + + import sys + from lxml import objectify + + def dump(infilename): + doc = objectify.parse(infilename) + root = doc.getroot() + print objectify.dump(root) + + def main(): + args = sys.argv[1:] + infilename = args[0] + dump(infilename) + + if __name__ == '__main__': + main() + +- Insert the the following code in your application at some point + where it will have access to the element whose API you wish to + discover:: + + print objectify.dump(element) + + Or, if stdout (standard output) is not available and visible to + you, something like the following:: + + import tempfile + + with tempfile.NamedTemporaryFile('w', delete=False) as outfile: + outfile.write(objectify.dump(element)) + outfilename = outfile.name + +- Or, use one of the helpers above, for example:: + + print objectify_helpers.child_tags(element) + + +Namespaces +------------ + +``lxml.objectify`` handles namespaces correctly; ``generateDS.py``, +especially when there are multiple namespaces in the same XML +document, does not. + +Mostly, ``lxml.objectify`` handles namespaces for you without +additional effort on your part. If you are working with an element +that contains items from different namespaces, then see this: +http://lxml.de/objectify.html#namespace-handling. Sometimes, when +you use ``getattr(el, 'xxx')`` or el.iterchildren(tag='xxx'), you +will need to include the namespace. Examples:: + + In [15]: rootgroup = root.RootGroup + In [16]: rootgroup.Group.tag + Out[16]: '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group' + In [17]: [el.tag for el in rootgroup.iterchildren(tag="{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group")] + Out[17]: + ['{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group', + '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group', + '{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Group'] + +and:: + + In [24]: rootgroup.Dataset + Out[24]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68> + In [25]: getattr(rootgroup, "{http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset") + Out[25]: <Element {http://hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd}Dataset at 0x7f0293b65c68> + + +Summary +--------- + +Although their approaches are very different, ``generateDS.py`` and +``lxml.objectify`` seem to solve the same set of problems and answer +equivalent sets of needs. ``generateDS.py`` generates and gives you +an API for each element type, specifically a Python class. With +``lxml.objectify``, you can discover a (simulated) API by inspecting +a dump produced by ``lxml.objectify.dump(o)`` or by using +``lxml.objectify`` and ``lxml`` capabilities in each element to +inspect the element. + +When might you want to use one rather than the other? + +- Since ``generateDS.py`` requires an XML schema in order to + generate code, if you do *not* have an XML schema for your + document type, then ``generateDS.py`` is not an option for you. + +- If you must handle an XML document that is defined by an XML + schema that contains multiple namespaces, then, because of the + problems that ``generateDS.py`` has with namespaces, you should + choose ``lxml.objectify``. + +- If you want to produce Python code that defines and implements an + API for a specific XML document type and you have an XML schema + that defines that document type, then you may want to consider + ``generateDS.py``. If you want to be able to send that generated + API for use by other developers, then the ``generateDS.py`` + approach might be an advantage to you. However, the content + produced by ``lxml.objectify.dump(o)`` is very close to a + description of an API for accessing an manipulating each element + in an XML document. diff --git a/MANIFEST.in b/MANIFEST.in index 475b8d2..268eadd 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,7 @@ include README LICENSE MANIFEST.in include setup.py include generateDS.py +include generateds_config.py include generateDS.txt include django/gends_run_gen_django.py include django/gends_extract_simple_types.py @@ -10,6 +11,8 @@ include process_includes.py include generate_coverage.py include generateDS.html include gends_user_methods.py +include generateds_gui_notes.txt +include generateds_gui_notes.html include Demos/People/people.xsd include Demos/People/people.xml include Demos/People/run_test @@ -77,14 +80,47 @@ include tests/people_procincl_b.xsd 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_sup.py tests/simpletypes1_other_sub.py -include tests/simpletypes_other2_sup.py tests/simpletypes_other2_sub.py - +include tests/simpletypes_other1_sub.py tests/simpletypes1_other_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 include tests/attr_groups2_sup.py tests/attr_groups2_sub.py +include tests/oneper00.xsd tests/oneper01.xsd tests/oneper02.xsd +include tests/OnePer/oneperType0?_?One.py +include tests/anonymous_type.xsd +include tests/anonymous_type1_sub.py tests/anonymous_type1_sup.py +include tests/anonymous_type2_sub.py tests/anonymous_type2_sup.py +include tests/catalog.xml tests/catalogtest.xsd +include tests/catalogtest1_sub.py tests/catalogtest1_sup.py +include tests/catalogtest2_sub.py tests/catalogtest2_sup.py +include tests/to_etree.xsd tests/to_etree.xml +include tests/to_etree1.xml tests/to_etree2.xml +include tests/to_etree1_sub.py tests/to_etree1_sup.py +include tests/to_etree2_sub.py tests/to_etree2_sup.py +include tests/defaults_cases1_out.xml tests/defaults_cases.xsd +include tests/defaults_cases1_sub.py tests/defaults_coverage1_sub.py +include tests/defaults_cases1_sup.py tests/defaults_coverage1_sup.py +include tests/defaults_cases.xml tests/defaults_coverage.xsd +include tests/address.xsd +include tests/cdata1_sub.py tests/cdata1_sup.py +include tests/cdata1.xml tests/cdata.xsd +include tests/cleanupname1_sub.py tests/cleanupname1_sup.py +include tests/cleanupname.xsd +include tests/groups.xml tests/groups.xsd +include tests/mapcleanname1_sub.py tests/mapcleanname1_sup.py +include tests/mapcleanname.xsd +include tests/nested_def1_out.xml +include tests/nested_def.xml tests/nested_def.xsd +include tests/nested_def1_sub.py tests/nested_def1_sup.py +include tests/prefix_classname1_out.xml +include tests/prefix_classname1_sub.py tests/prefix_classname1_sup.py +include tests/prefix_classname.xml tests/prefix_classname.xsd +include tests/validate_simpletypes1_out.xml +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 gui/generateds_gui.py include gui/generateds_gui.glade diff --git a/README b/README index 4b90418..3c2805e 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ - ================================================ - generateDS.py -- Generate Python Data Structures - ================================================ +================================================ +generateDS.py -- Generate Python Data Structures +================================================ ---------- What is it @@ -141,7 +141,389 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- -Version 2.11b (08/19/2013) +Version 2.24b (01/02/2017) + +- Added several fixes to generateDS.py and process_includes.py that + are needed for the support for Python 3. Thank you Ian Glover for + catching this and for contributing the fixes. +- Fixed bug in generation of regular expression for validating + pattern in a restriction on a simpleType. In the pattern, we + needed to replace "|" with "$|^", unless the vertical bar was + escaped with a backslash. This was necessary so that each regular + expression separated by a vertical bar would be anchored at the + left and right. Thanks to Clint Pitzak for catching and reporting + this. +- Modified the Django support (in ./django/) so that it will run + under Python 3. Thanks to Shane Rigby for reporting this problem. +- Fixed an error in encoding unicode valueOf_ for <xs:complexType + <xs:simpleContent> <xs:extension base="xs:string">. Thanks to + Andrii Iudin for catching this. + +Version 2.24a (11/16/2016) + +- Added entry_points to setup.py so that distutils will generate + executable scripts for executable .py files (for example, + generateDS.py and process_includes.py). Thanks to Michael Jenny + for suggesting this and for showing the way to do it. +- Fixed function call signature mismatch in MixedContainer call to + export method. Thanks to Lev Israel for catching this and + providing the solution. +- Added "remove duplicate elements" fix to catch duplicate + definitions of child elements with the same name inside a single + parent element. This fix does the following: (1) removes + duplicate child; (2) makes the remaining child a Python list + (effectively maxOccurs="unbounded"); (3) prints a warning message + when it finds and removes a duplicate. Thanks to Pietro Saccardi + for catching and reporting this. +- More fixes for "remove duplicate elements". +- Removed command line option for "remove duplicate elements". This + behavior will now always be performed. +- Added unit test for "remove duplicate elements". +- Added command line option "--no-warnings" to turn off warning + messages. I needed it for the unit test for "remove duplicate + elements". + +Version 2.23b (09/26/2016) + +- Added missing unit test files to build (MANIFEST.in). +- Fixed exception that occurs when character content is empty for an + element defined as type xs:token. Thanks to Andrii Iudin for + reporting and checking this. + +Version 2.23a (09/14/2016) + +- Integrated Clayton Daley's fixes to the unit tests. Thanks much, + Clayton. +- Clayton's fixes to the unit tests uncovered several errors that + had been masked and hidden. Fixed those errors, for example: (1) + eliminated generation of erroneous call to validation method; (2) + added catalog file. + +Version 2.22c (04/26/2016) + +- Fixes to generation of validation methods for xs:date, xs:time, + and xs:dateTime simpleType. Thanks to Andrii Iudin for reporting + this and for suggesting a solution. +- Added additional unit tests for validations of xs:date, xs:time, + and xs:dateTime simpleType. + +Version 2.22b (04/20/2016) + +- Fixed endless recursion that occurred while attempting to replace + attribute group names. Thanks to Bing Wang for reporting this and + for identifying and providing the XML schema that reproduced it. +- Fixed failure to clean up names containing special characters in + function generateBuildStandard_1. This error was uncovered + when generating code from Bing Wang's schema. Thanks again Bing. + +Version 2.22a (04/11/2016) + +- Added support for additional command line options to + generateds_gui.py. Added analogous support to generateDS.py for + use of session files produced by generateds_gui.py. +- There is now a bit of documentation with a few usage notes on + generateds_gui.py. See generateds_gui_notes.txt and + generateds_gui_notes.html. + +Version 2.21a (04/01/2016) + +- The GUI (graphical) front end to generateDS.py has been + resuscitated and is now working again thanks to Aleksandr + Dragunkin. + 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: + + $ cd /path/to/generateds/gui + $ python3 generateds_gui.py --impl-gui=generateds_gui_ru.glade + + Note that the GUI interface still lacks support for a few of the + command line options that were added most recently to + generateDS.py. If you need one or more of those missing options + but would still like to use the GUI front end, you can consider + using the "Capture CL" under the Tools menu, and then copy and + paste the result into a shell script, add any needed options to + that script, and run the script from the command line. + + +Version 2.20b (03/28/2016) + +- Fixes to handling of simpleType with and without restrictions on + another defined simpleType. These were not being handled + correctly when the name of the simpleType contained a dash. + Thanks to Ryku for identifying this problem and for a very helpful + description of what was wrong and for providing schemas to + reproduce the problem. + +Version 2.20a (02/25/2016) + +- Another patch for Python 2 and 3. We needed to protect against + performing an encoding that caused an exception in generateDS.py + and process_includes.py. Thanks to Marcus Schäfer for catching + this and for providing a fix. + +Version 2.19b (02/16/2016) + +- Modified generated code so that it will run under both Python 2 + and Python 3. There is no longer any need to generate different + code for Python 2 and Python 3. If fact, the "--py3" command line + option has been removed. + +Version 2.19a (02/08/2016) + +- Added the ability to generate code that can run under Python 3. + Use the "--py3" command line option. Note that if you generate + code for Python 2 (the default), then you must run that generated + code under Python 2. And, if you generate code for Python 3, + then you must run that generated code under Python 3. There is + currently no way to generate code that will run under both Python + 2 and Python 3. +- Modifications so that generateDS.py itself can be run with either + Python 2 or Python 3. +- Fixed the template (TEMPLATE_HEADER) so that it uses the format + function and keyword arguments. +- Added info on --py3 command line option to doc (generateDS.txt). +- Added new script (fix_subclass_refs.py) that can be used to fix-up + (change) which subclass file (of two or more that were generated + with the -s command line option) is used by the superclass file + when parsing an XML instance document. This will enable you to + use the -s option to generate multiple subclass files, add + different code to each of them, and then parse documents and + create instances of classes from one then another during the same + run. But also, see next item. +- Added generation of code to lookup the subclass of a generated + class using a global variable containing the subclass module. + This provides an alternative and more convenient way to do the + above (i.e., use fix_subclass_refs.py to select from multiple + subclass files generated with the -s command line option). + However, there may be tasks that can be performed with that script + or a modified version of it that cannot be done with this approach + using a global variable. Here is a sample script that uses this + option: + + import tmp01suba + import tmp01subb + def test(): + tmp01suba.supermod.CurrentSubclassModule_ = tmp01suba + roota = tmp01suba.parse('test01.xml', silence=True) + tmp01subb.supermod.CurrentSubclassModule_ = tmp01subb + rootb = tmp01subb.parse('test01.xml', silence=True) + roota.show() + print '-' * 50 + rootb.show() + test() + +Version 2.18a (12/16/2015) + +- Fixed quoting of simpleContent so that, e.g., "&" is exported + as "&" and not as "&". Thanks to Ardan Patwardha for + reporting this and contributing a fix. +- Fix to generation of exportAttributes so that the test for already + generated is properly quoted. Thanks to Naresh Shenoy for + reporting this and for contributing a fix. +- Another fix related to the unquoted constant in exportAttributes. + A simple fix had a bad conflict. Thanks to Christian Rasmussen + for focusing my attention on this one. +- Fix for xs:simpleContent that extends type xs:float (or xs:integer + or other numeric types). When set to numeric zero (for example, + after parsing the instance doc), the value was not being exported. + Thanks to Ardan Patwardhan for diagnosing this and for + contributing the fix. + +Version 2.17a (08/17/2015) + +- Modified setup.py so that process_includes.py is installed where + it can be imported. +- Changed default settings for export -- Default is now to generate + only the normal export methods, instead of both normal and + literal. See command line option --export. +- Fix to regex pattern used to capture "<![CDATA[ ... ]]>". The old + pattern was dropping ending characters when the content contained + HTML/XML markup. Thanks to Adrian Cook for this fix. +- Merged use of replacement patterns in cleanupName. With this fix + users can specify patterns to look for and replacements strings to + be used to clean up special characters and other patterns in + names. There are some notes in the document; search for + "cleanup-name" in generateDS.html. Thanks to Fedor Tyurin for + suggesting and implementing this enhancement. +- Added unit test for enhanced cleanupName. Added documentation to + generateDS.txt. + +Version 2.16a (05/28/2015) + +- Added new command line option ("--preserve-cdata-tags") that + causes generation of code that contains a special parser to retain + CDATA tags. Thanks to Adrian Cook for reporting this, for + providing test data and test cases, and for help with testing and + feed-back. +- Added ability for user to specify the names of classes generated + from anonymous, nested xs:complexType definitions, rather than + accept the names created in process_includes.py. +- Added a unit test for the anonymous, nested definition capability. +- Fix to error caused by check (in generated code) for whether lxml + or ElementTree is being used. We no longer support use of + ElementTree. Thanks to Emil Nordling for catching and reporting + this. + +Version 2.15b (04/07/2015) + +- Fix to generation of simpleType validation code for list (unbounded) + elements. Thanks to wobanator for this fix. +- Fix to code for --one-file-per-xsd. Added check to avoid an + infinite loop schemas not suitable to --one-file-per-xsd. Thanks + Michael Vezie for catching this and for identifying relevant + location in the code. And, thanks to George David for providing a + better fix than mine. +- Enhancement so that child elements defined with a default value + will not export when the current value and the default value are + the same. Also added equivalent changes for attributes. Thanks + to Jan Biel for finding and reporting this. +- Added unit tests for the above default value enhancement. + +Version 2.15a (02/18/2015) + +- Modifications so that we generate code that can be used by Python 3. + Thanks much to Richard Gerkin for this work. +- Removed possible use of ElementTree. Lxml is now a requirement + for both running generateDS.py itself and for running the + generated code. +- Fixed exporting of text content so that, when it contains CDATA + sections, the mark-up characters inside the CDATA sections are not + escaped. Thanks to George David for reporting this and for + helping with a fix. + +Version 2.14a (11/26/2014) + +- Fixed export of simpleType lists (added "' '.join(data)". Thanks + to Per Rosengren for catching this. +- Added new style validation of simpleType data. Validation + requirements are captured from the XML schema definition of the + simpleType, e.g. 'restriction base="..."' etc. Thanks to + azer gh for implementing much of this extended capability. +- Added unit test for simpleType validation, including test for + proper detection of bad (invalid) data. +- Did some code cleanup with the help of the flake8 code checker. +- Added a fix so that attribute declarations that use ref= rather + than type= will also be generated with the specific type. Thanks + to Florian Wilmshoever for catching and reporting this and for + providing an XML schema as a test case. +- Added unit test for reference to simpleType. +- Fix to generation of names of substitutionGroup. The namespace + prefix was not being stripped in some cases. + +Version 2.13a (09/09/2014) + +- Minor fix to function generateToEtreeChildren. Must generate + call to get_valueOf only when defined (i.e. when element is + simpleContent or isMixed). +- Fix to generation of class name prefixes added with the "-p" + command line option. This fix was added by Christian Ascheberg. + Thank you Christian. +- Added unit test for class name prefixes command line option. + +Version 2.12f (08/12/2014) + +- Fix for substitutionGroup conflict with keyword name mapping. + Thanks to Leonid Minchin for finding and helping with this + problem. +- An exception occured when an element had a documentation string + that was short (possibly 1 character). Fixed. Thanks to Matthias + Zaake for finding this and for providing a patch. + +Version 2.12e (06/16/2014) + +- Fix for formatting error. Thanks to Nikolay Lavrov for catching + this and for providing a fix. +- Fix to gds_parse_datetime(). The Python datetime module's + datetime object uses microseconds, but xs:dateTime uses fractions + of a second (e.g. 0.123). Converted from decimal fraction to + microseconds. Thanks to Mikki Weesenaar for catching this. +- Modified behavior and names for generated method insert_xxx(which + are generated when, e.g., maxOccurs="unbounded"), so that now we + generate insert_xxx_at and replace_xxx_at. Thanks to Bart + Wagenaar for pointing out this deviation from Pythonic style. +- Function transitiveClosure in generateDS.py was susceptible to + infinite looping. This seemed to occur when a substitutionGroup + contains a member with the same name as the head of the + substitutionGroup (but in a different namespace?). Added a test + to stop the recursion when this occurs. Thanks to Stuart Chalk + for finding and reporting this. +- Added explanation to the documentation explaining how the source + distribution (generateDS-x.xxy.tar.gz or Bitbucket) is needed for + use of the Django model generation capability. + +Version 2.12d (04/02/2014) + +- Fix for an infinite loop caused by inconsistent use of + mapped/clean names with list AlreadyGenerated. Thanks to Jerome + Allasia for catching this and for suggesting a fix. +- Added a unit test for the use of mapped/clean names, in particular + when one xs:complexType is an xs:extension of another. +- Changed several lists to sets for faster look-up, for example + AlreadyGenerated, AlreadyGenerated_subclass, DelayedElements, etc. +- Cleaned up the use of functions mapName() and cleanupName() to + avoid duplicate transformations. + +Version 2.12c (03/28/2014) + +- Fix for "one module per XSD file" to handle an include or import + element that refers to a *remote* schema on the Net (i.e. the + location is "http:..." or "ftp:...") rather than a file on the + local file system. Added ability to access include/import file + across the Net. Thanks to Jinquan Liu for reporting this. +- Added schema to unit test for "one module per XSD file" that is + read from remote site (http://www.davekuhlman.org). +- Fix to process_includes.py -- When run directly from the command + line (as opposed to imported and called from another python + module), the fixtypenames option was not being intialized. +- Fix for error in order of generation of classes that have + superclasses. When an anonymous simpleType occured, the name of + the enclosing complexType was used, which caused generateDS.py to + believe that the superclass had already been generated. Thanks + again to Jinquan Liu for reporting this issue. +- Fix for handling of xs:substitutionGroup -- Namespace prefix was + causing gDS to fail to match on substitutionGroup name. +- Added code so that an instance of a generated class can remember + the tag from which it was built. This is needed for instances of + a class that represents an element type that is a member of a + xs:substitutionGroup. But, in fact, generated code now uses this + feature to remember and export the tag name of all complex + elements. +- Enhanced command line option --root-element so that both the root + tag and the root class can be specified (separated by a vertical + bar). +- Added support for the ability of an element definition to inherit + minOccurs and maxOccurs from the xs:sequence that contains it. +- The command line options and command line arguments used to + generate modules are now included as comments near the top of the + generated modules. Also included in these generated comments is + the command line used to generate the module. This will help + users later to determine which XML schema and what options were + used to generate each module, and to re-generate the module, if + needed. Thanks to Mikki Weesenaar for suggesting this + enhancement. + +Version 2.12b (02/10/2014) + +- Fix to the aliasing capability. You should now be able to alias + one element to another, and by doing so, only generate the + targeted alias. See notes on generateds_config.py in the + documentation for more on this. Thanks to Mikki Weesenaar for + bring up the use case that needed this. +- Additional fixes for the "one module per XSD file". Also, + creation of a unit test for this capability. See section "One + Per -- generating separate files from imported/included schemas" + in the documentation for more information. Thanks again to + George David for all his work on this. +- Fixes to process_includes.py -- Some uses of namespace prefix xs: + were hard-coded, whereas some XML schemas use xsd: instead of xs:. +- Various fixes to unit tests so that all unit tests pass when using + either the cloned Mercurial repository at Bitbucket + (https://bitbucket.org/dkuhlman/generateds) or the tar achive. + +Version 2.12a (10/29/2013) + - A name conflict issue caused by naming anonymous types. An anonymous type is a complexType that does not have a name attribute and that is nested inside an element that does not have @@ -154,8 +536,19 @@ Version 2.11b (08/19/2013) there are name conflicts in your XML schema, for example, because the schema refers to two types with the same name but in different namespaces. +- Ability added to generate one Python module for each XML Schema + (.xsd file) imported/included. Added command line options + --one-file-per-xsd, --output-directory=, and --module--suffix= in + support of this. Thanks much to George David for implementing + this new feature. +- This change provided by Logan Owen. -- Return self from build + function of generated classes, to allow easy chaining. The main + use case for this change is if you have a list of xml documents, + and you want to change them into generateDS class instances. + Thank you Logan. Version 2.11a (08/16/2013) + - Added ability to use XML catalog to find included/imported schemas. The -c command line option has been added to support this. Thanks to George David for implementing this enhancement. @@ -173,12 +566,15 @@ Version 2.11a (08/16/2013) Thanks to Rinat Yangurazov for catching this. Version 2.10b (07/22/2013) + - Changed flag for generating getters and setters. Removed flag --use-old-getter-setter. Replaced it with new flag --use-getter-setter, which can have the following values: + "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). "none" - Do not generate getter/setter methods. + The default is "new". See the help (use --help option) or see the doc (generateDS.txt/generateDS.html) for more on this. Thanks to Mike Vella for suggesting this. @@ -186,6 +582,7 @@ Version 2.10b (07/22/2013) from "xx" to "_". Version 2.10a (05/29/2013) + - Added ability to produce mapping (a dict) during call to to_etree() that maps gDS instances to their associated etree elements. Also added convenience method gds_reverse_node_mapping @@ -226,6 +623,7 @@ Version 2.10a (05/29/2013) by gDS. Version 2.9a (02/21/2013) + - Added support for exporting to an Lxml element tree. The element tree can then be serialized to XML, e.g. using Lxml etree.tostring(). This innovation is by Logan Owen, who also did @@ -257,11 +655,13 @@ Version 2.9a (02/21/2013) particular, support for xs:anyAttribute). Version 2.8c (provisional) (01/30/2013) + - Changed generated check for attributes that are already_processed to use a set object rather than a list. Since sets are hashed, I believe that lookup is faster. Version 2.8b (01/30/2013) + - Fixed missing underscore in reference to member names in generateExportLiteralFn_2. Thanks to Sergii Chernysh for reporting this. @@ -278,6 +678,7 @@ Version 2.8b (01/30/2013) https://bitbucket.org/dkuhlman/generateds Version 2.8a (01/10/2013) + * Fix to process_includes.py so as to remove the limitation on the number of unique names it can generate when raising anonymous types to the top level. Thanks to Daniel Browne for help with @@ -318,6 +719,7 @@ Version 2.8a (01/10/2013) Browne for catching this. Version 2.7c (08/06/2012) + * Added xs:hexBinary to the list of string types in generateDS.py and django/generatedssuper.py. Effectively, we are generating the same code for types xs:base64Binary and xs:hexBinary. That @@ -337,6 +739,7 @@ Version 2.7c (08/06/2012) it; see section titled "Exporting compact XML documents". Version 2.7b (12/10/2011) + * Fix for xs:any in buildChildren in an element defined with no other children so that we do not generate "else:" clause without an "if ...:". Thanks to Keith Robertson for help with this. @@ -349,6 +752,7 @@ Version 2.7b (12/10/2011) * Added xs:time to list of handled simple (date, time) types. Version 2.7a (11/04/2011) + * Fix for case where a child is defined with a reference (ref="") to a complexType (rather than a simpleType) and the complexType is abstract. @@ -357,6 +761,7 @@ Version 2.7a (11/04/2011) * Added unit test for xs:any. Version 2.6b (10/13/2011) + * Fix for case where a child element is declared with a type that is a simpleType whose restriction base is another simpleType that is referred to with a namespace prefix. With this fix we @@ -393,6 +798,7 @@ Version 2.6b (10/13/2011) xs:anyURI and xs:duration. Version 2.6a (07/28/2011) + * Fix to capture xs:/xsd:/etc namespace prefix from schema. Was not setting global variable XsdNameSpace. Thanks to Frank Liauw for focusing my attention on this one. @@ -450,6 +856,7 @@ Version 2.6a (07/28/2011) * Added xs:byte to the list of integer types. Version 2.5a (06/06/2011) + * Fix for generation of default value in parameters for the constructors. * Fix for lookup of attribute value in generated buildAttributes @@ -474,6 +881,7 @@ Version 2.5a (06/06/2011) different directories. Version 2.4c (03/21/2011) + * Added minimal support for unsignedLong, unsignedInt, and unsignedByte. * Made the retrieval of the parent (superclass) name and parent @@ -497,12 +905,14 @@ Version 2.4c (03/21/2011) http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/#DerivByRestrict Version 2.4b (02/21/2011) + * Fix to generation the superclass in the class statement header line. Formerly we did not correctly pick-up the superclass name (from extension base=""). Thanks to Timo Sugliani for finding this bug. Version 2.4a (02/16/2011) + * A few fixes to format of some error messages. * Clean-up names in the exportableClassList (__all__). * Modify reading session object/doc to use lxml instead of @@ -530,6 +940,7 @@ Version 2.4a (02/16/2011) out this fix. Version 2.3b (12/28/2010) + * Fix for simpleTypes defined as a restriction whose (ultimate) base type is a pre-defined simple type which were not generating correct (type-specific) code in build method. Thanks to @@ -538,12 +949,12 @@ Version 2.3b (12/28/2010) attribute where the type was not being recognized. * Fix so that we recognize some other simple types as xs:string type (e.g. xs:NMTOKEN, xs:ID, xs:Name). - * To do: - - If a simpleType is a restriction on another simpleType and - the base simpleType definition is declared as a list, we are - not recognizing that it is a list. + * To do -- If a simpleType is a restriction on another simpleType and + the base simpleType definition is declared as a list, we are + not recognizing that it is a list. Version 2.3a (12/02/2010) + * Added generatation of code to handle attributes inherited by a restriction from its base type and the types that the base extends (i.e. from a restriction base class and its @@ -552,13 +963,16 @@ Version 2.3a (12/02/2010) a type that is an extension: special characters (e.g. dash) were not being cleaned/mapped. Reported by Koen Smets; thanks. * To do: + - In a restriction, inherited attributes can be "prohibited". It would be nice if gDS would do something to block their use. - When: + AbstractElement mixed=false and Element1 mixed=true base=AbstractElement and Element2 mixed=FALSE base=AbstractElement + Incorrect parse code is generated for Element2. Reported by Jaime Cepas. - It might be desirable if the getter functions could be asked @@ -572,9 +986,10 @@ Version 2.3a (12/02/2010) excoding of Python code and of string literals (unicode, utf-8). Version 2.2b (11/10/2010) + * Added generation of __all__ global variable containing a list of generated class names. This enables you to do a reasonably - safe "from mymodule import *. It's sorted, so it also gives + safe "from mymodule import \*". It's sorted, so it also gives you something in the way of an alphabetical table of contents of the generated classes. Thanks to Jaime Cepas for this. * Added another fix so that the generated code for mixed content @@ -600,6 +1015,7 @@ Version 2.2b (11/10/2010) manually until I can figure out a fix. Version 2.2a (9/14/2010) + * Changes for coding consistency -- Used wrt() pervasively instead of outfile.write(). * Re-write of process_includes.py -- It now handles @@ -617,9 +1033,11 @@ Version 2.2a (9/14/2010) maps the name "range" to "rangeType" so that if the schema defines a complexType "range", generateDS.py will generate a class named "rangeType": + NameTable = { 'range': 'rangeType', } + See the doc for more on this. * Instead of using the lower() function from the string module, added a function to the GeneratedsSuper class and used the string @@ -633,6 +1051,7 @@ Version 2.2a (9/14/2010) values. Version 2.1d (8/23/2010) + * Fix to indentation of generated code in the build method for type checking of NonNegativeIntegerType. * Fix to generation parameters in call to superclass constructor. @@ -646,6 +1065,7 @@ Version 2.1d (8/23/2010) available during export. Version 2.1c (8/8/2010) + * Fix to functions parse, parseString, and parseLiteral so that they start the build with the correct root class. I believe that there yet is another case that this does not handle, @@ -660,9 +1080,11 @@ Version 2.1c (8/8/2010) duplicate arguments. * Added a comment to the generated superclass module at the top that specifies the utf-8 source code encoding: + # -*- coding: utf-8 -*- Version 2.1b (8/2/2010) + * Fix to generation of export functions. If no children, must generate "pass" statement. * Changed generated get_all_text function so that it uses an "if" @@ -671,15 +1093,18 @@ Version 2.1b (8/2/2010) Python. Version 2.1a (7/8/2010) + * Added ability to capture annotation/documentation element text as doc-strings in the generated classes. Thanks to Roy Williams for suggesting this and for guidance. Version 2.0b (6/24/2010) + * Fix to generation of export method so that valueOf_ is exported when childCount == 0 and not isMixed. Version 2.0a (6/21/2010) + * Switched to use of lxml/ElementTree in generated files. Thanks to Biswanath Patel and Jaime Huerta Cepas for encouraging me to implement the switch to lxml/ElementTree. @@ -687,7 +1112,7 @@ Version 2.0a (6/21/2010) and parseLiteral() so that they automatically recognize the root element of an instance XML document and call the build method of the appropriate class. - * Fix to hasContent_ method so that so that in elements defined + * Fix to hasContent_ method so that in elements defined with extension-base, the superclass is checked also. * For classes that must call an overridden method m in the superclass, switched to use "super(superclassname, self).m(...)" @@ -699,10 +1124,12 @@ Version 2.0a (6/21/2010) imports (for example collada_schema_1_5.xsd). Version 1.20g (5/21/2010) + * Update to documentation -- Added a section on suggested ways to handle/recognize different top level (root) elements. Version 1.20f (5/3/2010) + * Fix to generation of export so that anyAttribute does not cause duplicate attributes to be exported. * Fix so that we do a better job of determining whether a @@ -711,11 +1138,12 @@ Version 1.20f (5/3/2010) * Fix to generation of constructors so that (1) valueOf_ is intialized in subclass modules and (2) valueOf_ is initialized to None (rather than ''). - To do: Extend the --root-element flag so that we can specify both + * To do: Extend the --root-element flag so that we can specify both the tag name and the element/type name. Sometimes they are different. Version 1.20e (2/8/2010) + * Fixed error that caused incorrect tag name to be exported when the tag name contains special characters and the tag name is different from the type name. @@ -723,6 +1151,7 @@ Version 1.20e (2/8/2010) distribution file. Version 1.20d (2/3/2010) + * Updated version number/info in genereateds_gui.py. * Fix to process_includes.py -- Handle include elements and import elements in the same way. In particular, allow both to @@ -736,6 +1165,7 @@ Version 1.20d (2/3/2010) * Added missing files in the tests/ directory to the distribution. Version 1.20c (1/1/2010) + * Replaced symbolic links in the distribution with hard links. Symbolic links do not work on MS Windows. * Fix to the use of the subprocess module in generateds_gui.py, @@ -749,6 +1179,7 @@ Version 1.20c (1/1/2010) patch. Also added a unit test for this case. Version 1.20b (12/14/2009) + * Fix to process_includes.py so that it handles relative paths in include/import elements in the schema. * Various fixes and additions to the GUI front-end, e.g. added @@ -765,6 +1196,7 @@ Version 1.20b (12/14/2009) See http://gensc.org). Thank you, Erica. * generateDS.py can now generate bindings for the following (rather large) schemas: + - gcdml -- Genomic Contextual Data Markup Language -- See http://gensc.org - Collada -- 3D Asset Exchange Schema 1.5 -- See @@ -775,10 +1207,12 @@ Version 1.20b (12/14/2009) http://www.fpml.org/ Version 1.20a (12/01/2009) + * Added first version of the GUI front-end. See the generateDS doc (generateDS.html). Version 1.19a (10/21/2009) + * Enhancement to the table of information generated in each class when the --member-specs=list|dict command line option is used. For a complexType defined as a simpleType, we now generate a @@ -786,9 +1220,12 @@ Version 1.19a (10/21/2009) name "valueOf_". Thanks to Ryan Leslie for much help and guidance with these changes. Example: + 'valueOf_': MemberSpec_('valueOf_', [u'RelationType', u'RelationType2', u'xs:string'], 0), + Note the following incompatible changes: + - _MemberSpec changed to MemberSpec_ -- We want avoid posible name conflicts, not make it "weakly hidden". See the Python style guide for more on this @@ -798,6 +1235,7 @@ Version 1.19a (10/21/2009) if the types is a list and the single type if not a list. - Method MemberSpec_.get_data_type_chain() is a new method that returns the entire list of data types. + The new tutorial (see tutorial/tutorial.html in the distribution) has an example of the use of the MemberSpec feature. @@ -810,6 +1248,7 @@ Version 1.19a (10/21/2009) * There is now a preliminary version of a tutorial. Version 1.18f (9/14/2009) + * Fixes to process_includes.py from Mihai Ibanescu. These fixes address namespace and namespace prefix problems for XML tree that is copied into a document. Thanks Mihai. @@ -829,6 +1268,7 @@ Version 1.18f (9/14/2009) Ryan Leslie. Version 1.18e (9/1/2009) + * Added patch from Mihai Ibanescu which handles and expands groups. Also added Mihai's unit test for groups. Thank you, Mihai. @@ -841,6 +1281,7 @@ Version 1.18e (9/1/2009) differences. Thanks again to Mihai. Version 1.18d (8/26/2009) + * Automatic detection of the namespace prefix used in the schema document. Thanks to Mihai Ibanescu for this enhancement. * Fix to deal conflicts with generateDS's internal function @@ -857,6 +1298,7 @@ Version 1.18d (8/26/2009) one element. Thanks to Chris Allan for this fix. Version 1.18c (8/11/2009) + * Small changes related to check for mixed content. * Enhancement to generation of hasContent_() method to check for items with maxOccurs > 1. @@ -865,6 +1307,7 @@ Version 1.18c (8/11/2009) skipped when the element is mixed. Version 1.18b (7/29/2009) + * Fix for exception with simpleType that is an extension of another simpleType. * Change to mixed extension chain -- Will now generate class. @@ -879,6 +1322,7 @@ Version 1.18b (7/29/2009) to stdout. Version 1.18a (7/14/2009) + * Added command line flag --member-specs to generate the member specifications as described in "User Methods" section of the doc. The member specs can be a list or a dictionary. @@ -888,6 +1332,7 @@ Version 1.18a (7/14/2009) generated by generateDS.py. Version 1.17d (7/2/2009) + * Fix for generation of recursively defined simpleTypes, e.g. a simpleType defined as a restriction of another simpleType. (see fix_simpletype comment in generateDS.py) @@ -896,6 +1341,7 @@ Version 1.17d (7/2/2009) correctly and fixed failure to initialize a local variable. Version 1.17c (6/24/2009) + * Fix for error generating code for exporting related to simpleType. * Fix for syntax error in export of boolean types. @@ -905,10 +1351,12 @@ Version 1.17c (6/24/2009) command line option is used. Version 1.17b (6/10/2009) + * Fix so that generateDS.py will still work with Python 2.4. Thanks to Dave Sugar for that. Version 1.17a (5/20/2009) + * Modified export of children of type xs:string so that (1) if None, not exported and (2) if not None but an empty string, exported (example "<aa></aa>"). @@ -926,6 +1374,7 @@ Version 1.17a (5/20/2009) xs:string, xs:integer, etc. Version 1.16e (4/28/2009) + * Eliminated generation of SAX parser. I'm sure it no longer worked, anyway. * Fix to export of CDATA characters, provided by Kerim Mansour. @@ -943,22 +1392,27 @@ Version 1.16e (4/28/2009) any more anyway. Version 1.16d (3/25/2009) + * Fixes to generation of the exportLiteral functions. We can now do exportLiteral, then import the resulting file in Python. See generated parseLiteral() for an example. * Added an additional parameter to the export() methods. Now, you can call export() as follows: + rootObj.export(outfile, 0, namespacedef_='xmlns:abc="http://www.abc.com/namespacelo"') + which will insert the namespace prefix definition in the exported root element. * Added new command line option --namespacedef= to specify the namespacedef_ to be passed in by the generated parse() and parseString() functions. Example use: + generateDS.py --namespacedef='xmlns:abc="http://www.abc.com/"' -o out.py myschema.xsd Version 1.16c (3/13/2009) + * One more fix for abstract types -- When the implementation element/class for an abstract class exports itself, it adds the xsi:type="class_name" attribute. @@ -970,10 +1424,12 @@ Version 1.16c (3/13/2009) attribute values. Thanks to Kerim Mansour for help with this. Version 1.16b (3/9/2009) + * Added support for restriction/list, i.e. a list of words separated by whitespace. Version 1.16a (2/16/2009) + * Generated export methods now check for empty content and write out <xx ... /> rather than <xx ...></xx> if empty. * All generated constructors (__init__()) now initialize @@ -985,6 +1441,7 @@ Version 1.16a (2/16/2009) use of self.xxx rather than self.get_xxx(). Version 1.15d (1/22/2009) + * Fix to setup.py so that it also installs process_includes.py. * Enhancements to process_includes.py so that it can also retrieve included files via ftp and http. @@ -992,19 +1449,23 @@ Version 1.15d (1/22/2009) * The above changes are all from Arne Grimstrup. Thank you Arne. Version 1.15c (11/26/2008) + * Added switch (--silence) to cause generateDS.py to generate parsing functions that do not write output to stdout. This fix contributed by Al Niessner. Version 1.15b (11/24/2008) + * Added Amnon Janiv's fixes for attribute groups and for logging. Version 1.15a (11/20/2008) + * Added support for abstract elements/types. See: http://www.w3.org/TR/xmlschema-0/#abstract Thanks to Luigi Paioro for help with this. Version 1.14g (10/17/2008) + * Fix in generation of exportChildren (omitted "_" in "namespace". Version 1.14f (10/06/2008) @@ -1224,9 +1685,10 @@ Version 1.7b (11/15/04) the root. Version 1.7a (10/28/04) - Thanks very much to Lloyd Kvam for help with these fixes and - improvements. His ideas, suggestions, and work have been - extremely valuable. + + * Thanks very much to Lloyd Kvam for help with these fixes and + improvements. His ideas, suggestions, and work have been + extremely valuable. * Implementd partial support for <xsd:extension base="">. Limitation: extension elements cannot override members defined in a base. @@ -1241,6 +1703,7 @@ Version 1.7a (10/28/04) maxOccurs given a value other than "1" or "unbounded". Version 1.6d (10/1/04) + * Several bug fixes. * Added command-line flag --subclass-suffix="X". Changes the suffix appended to the class name in subclass files. Default @@ -1260,6 +1723,7 @@ Version 1.6d (10/1/04) nested. Version 1.6c (9/15/04) + * generateDS.py was not walking lower levels of the tree data structure collected by the SAX parser that describes the classes to be generated. Now, function generate() calls @@ -1274,6 +1738,7 @@ Version 1.6c (9/15/04) build(), etc. Version 1.6b (9/10/04, yet again) + * Still fixing bug related to generating all the sub-class stubs. All sub-classes were not being generated when no superclasses were generated (-o flag omitted), because there @@ -1283,10 +1748,12 @@ Version 1.6b (9/10/04, yet again) temp file if they are not requested. Version 1.6b (8/26/04, again) + * Fixed bug -- complexTypes defined in-line were omitted from the sub-class file. Now these sub-classes are being generated. Version 1.6b (8/18/04) + * Added ability to access the text content of elements that are defined but have *no* nested elements. The member variable is "valueOf_" (note underscore which will hopefully avoid name @@ -1385,6 +1852,7 @@ Version 1.2a (again, 5/16/03) * Fixed error in code generation for float values. * Added very simple unit tests in tests directory. Can be run with: + cd tests python test.py @@ -1423,6 +1891,5 @@ The following enhancements and fixes remain to be done: Dave Kuhlman -dkuhlman@pacbell.net +dkuhlman@davekuhlman.org http://www.davekuhlman.org - diff --git a/build_dist b/build_dist new file mode 100755 index 0000000..a78242e --- /dev/null +++ b/build_dist @@ -0,0 +1,15 @@ +#!/bin/sh -v +#cp ../Xslt/xsltvsgenerateds/xsltvsgenerateds.css . +#cp ../Xslt/xsltvsgenerateds/xsltvsgenerateds.html . +#rst2html.py --source-url=generateDS.txt --generator \ +# --stylesheet-path=/home/dkuhlman/bin/dave_docutils.css \ +# generateDS.txt generateDS.html +generate generateDS.txt +generate librarytemplate_howto.txt +generate generateds_gui_notes.txt +cd tutorial +generate generateds_tutorial.txt +zip -f generateds_tutorial.zip +cd .. +#python setup.py sdist --formats=gztar,zip +python setup.py sdist --formats=gztar diff --git a/django/gends_extract_simple_types.py b/django/gends_extract_simple_types.py index 8e152cd..07865cb 100755 --- a/django/gends_extract_simple_types.py +++ b/django/gends_extract_simple_types.py @@ -4,10 +4,14 @@ # # Imports +from __future__ import print_function import sys import os import argparse -import StringIO +if sys.version_info.major == 2: + from StringIO import StringIO as stringio +else: + from io import StringIO as stringio from lxml import etree import process_includes @@ -18,8 +22,7 @@ import process_includes SchemaNS = 'http://www.w3.org/2001/XMLSchema' Nsmap = { 'xs': SchemaNS, - } - +} # @@ -34,41 +37,55 @@ class TypeDescriptor(object): self.name_ = name self.type_name_ = type_name self.type_obj_ = None + def __str__(self): - return '<%s -- name: %s type: %s>' % (self.__class__.__name__, + return '<%s -- name: %s type: %s>' % ( + self.__class__.__name__, self.name, self.type_name,) + def get_name_(self): return self.name_ + def set_name_(self, name): self.name_ = name name = property(get_name_, set_name_) + def get_type_name_(self): return self.type_name_ + def set_type_name_(self, type_name): self.type_name_ = type_name type_name = property(get_type_name_, set_type_name_) + def get_type_obj_(self): return self.type_obj_ + def set_type_obj_(self, type_obj): self.type_obj_ = type_obj type_obj = property(get_type_obj_, set_type_obj_) + class ComplexTypeDescriptor(TypeDescriptor): def __init__(self, name): super(ComplexTypeDescriptor, self).__init__(name) self.elements_ = [] self.attributes_ = {} + def get_elements_(self): return self.elements_ + def set_elements_(self, elements): self.elements_ = elements elements = property(get_elements_, set_elements_) + def get_attributes_(self): return self.attributes_ + def set_attributes_(self, attributes): self.attributes_ = attributes attributes = property(get_attributes_, set_attributes_) + class SimpleTypeDescriptor(TypeDescriptor): def __init__(self, name, type_name): super(SimpleTypeDescriptor, self).__init__(name, type_name) @@ -175,7 +192,6 @@ for name in Simple_type_names: Builtin_descriptors[name] = SimpleTypeDescriptor(name, name) - # # Functions for internal use and testing @@ -183,15 +199,16 @@ def extract_descriptors(args): if os.path.exists(args.outfilename) and not args.force: sys.stderr.write( '\nFile %s exists. Use -f/--force to overwrite.\n\n' % ( - args.outfilename,)) + args.outfilename,)) sys.exit(1) outfile = open(args.outfilename, 'w') schema_file_name = os.path.join( os.path.abspath(os.path.curdir), args.infilename) - infile = StringIO.StringIO() - process_includes.process_include_files(args.infilename, infile, + infile = stringio() + process_includes.process_include_files( + args.infilename, infile, inpath=schema_file_name) infile.seek(0) @@ -199,7 +216,7 @@ def extract_descriptors(args): root = doc.getroot() descriptors = {} extract(root, descriptors, outfile) - for descriptor in descriptors.itervalues(): + for descriptor in list(descriptors.values()): descriptor.export(outfile) outfile.close() @@ -210,7 +227,6 @@ def get_descriptor_name(d): def extract(root, descriptors, outfile): unresolved = {} - complex_descriptors = {} # Process top level simpleTypes. Resolve the base types. nodes = root.xpath('xs:simpleType', namespaces=Nsmap) for node in nodes: @@ -227,7 +243,7 @@ def export_defined_simple_types(outfile, resolved): wrt = outfile.write wrt(Header_template) wrt('Defined_simple_type_table = {\n') - for descriptor in resolved.itervalues(): + for descriptor in list(resolved.values()): name = descriptor.name prefix, type_name = get_prefix_name(descriptor.type_name) wrt(" '%s': SimpleTypeDescriptor('%s', '%s'),\n" % ( @@ -238,7 +254,7 @@ def export_defined_simple_types(outfile, resolved): def resolve_simple_types(unresolved): resolved = {} #import pdb; pdb.set_trace() - sorted_descriptors = unresolved.values() + sorted_descriptors = list(unresolved.values()) sorted_descriptors.sort(key=get_descriptor_name) for descriptor in sorted_descriptors: resolve_1_simple_type(descriptor, resolved, unresolved) @@ -259,7 +275,8 @@ def resolve_1_simple_type(descriptor, resolved, unresolved): return type_obj else: #import pdb; pdb.set_trace() - type_obj = resolve_1_simple_type(unresolved[descriptor.type_name], + type_obj = resolve_1_simple_type( + unresolved[descriptor.type_name], resolved, unresolved) descriptor.type_obj = type_obj resolved[descriptor.name] = descriptor @@ -312,22 +329,28 @@ def etxpath(node, pat): USAGE_TEXT = __doc__ + def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) USAGE_TEXT = """synopsis: capture XML Schema simpleType descriptors """ + def main(): parser = argparse.ArgumentParser(description=USAGE_TEXT) - parser.add_argument('-v', '--verbose', action='store_true', + parser.add_argument( + '-v', '--verbose', action='store_true', help='show additional info') - parser.add_argument('-f', '--force', action='store_true', + parser.add_argument( + '-f', '--force', action='store_true', help='force overwrite of output file without asking') - parser.add_argument('infilename', type=str, + parser.add_argument( + 'infilename', type=str, help='input XML Schema file') - parser.add_argument('-o', '--outfile', type=str, dest='outfilename', + parser.add_argument( + '-o', '--outfile', type=str, dest='outfilename', default='generateds_definedsimpletypes.py', help='output (.py) file name') args = parser.parse_args() @@ -337,5 +360,3 @@ def main(): if __name__ == '__main__': #import pdb; pdb.set_trace() main() - - diff --git a/django/gends_generate_django.py b/django/gends_generate_django.py index 9f7801e..2b00087 100755 --- a/django/gends_generate_django.py +++ b/django/gends_generate_django.py @@ -13,6 +13,7 @@ Options: """ +from __future__ import print_function import sys import os import getopt @@ -21,7 +22,6 @@ import importlib #import nexmllib as supermod - # # Globals # @@ -32,9 +32,11 @@ supermod = None # Classes # + class ProgramOptions(object): def get_force_(self): return self.force_ + def set_force_(self, force): self.force_ = force force = property(get_force_, set_force_) @@ -46,14 +48,17 @@ class Writer(object): self.outfile = open(outfilename, 'w') self.stdout_also = stdout_also self.line_count = 0 + def get_count(self): return self.line_count + def write(self, content): self.outfile.write(content) if self.stdout_also: sys.stdout.write(content) count = content.count('\n') self.line_count += count + def close(self): self.outfile.close() @@ -68,14 +73,17 @@ def generate_model(options, module_name): models_file_name = 'models.py' forms_file_name = 'forms.py' admin_file_name = 'admin.py' - if ( (os.path.exists(models_file_name) or - os.path.exists(forms_file_name) or - os.path.exists(admin_file_name) - ) - and not options.force): - sys.stderr.write('\nmodels.py or forms.py or admin.py exists. Use -f/--force to overwrite.\n\n') + if ( + ( + os.path.exists(models_file_name) or + os.path.exists(forms_file_name) or + os.path.exists(admin_file_name) + ) and + not options.force): + sys.stderr.write( + '\nmodels.py or forms.py or admin.py exists. ' + 'Use -f/--force to overwrite.\n\n') sys.exit(1) - globals_dict = globals() models_writer = Writer(models_file_name) forms_writer = Writer(forms_file_name) admin_writer = Writer(admin_file_name) @@ -106,24 +114,26 @@ def generate_model(options, module_name): models_writer.close() forms_writer.close() admin_writer.close() - print 'Wrote %d lines to models.py' % (models_writer.get_count(), ) - print 'Wrote %d lines to forms.py' % (forms_writer.get_count(), ) - print 'Wrote %d lines to admin.py' % (admin_writer.get_count(), ) - + print('Wrote %d lines to models.py' % (models_writer.get_count(), )) + print('Wrote %d lines to forms.py' % (forms_writer.get_count(), )) + print('Wrote %d lines to admin.py' % (admin_writer.get_count(), )) USAGE_TEXT = __doc__ + def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) def main(): args = sys.argv[1:] try: - opts, args = getopt.getopt(args, 'hfs:', ['help', 'force', - 'suffix=', ]) + opts, args = getopt.getopt( + args, 'hfs:', [ + 'help', 'force', + 'suffix=', ]) except: usage() options = ProgramOptions() @@ -142,5 +152,3 @@ def main(): if __name__ == '__main__': #import pdb; pdb.set_trace() main() - - diff --git a/django/gends_run_gen_django.py b/django/gends_run_gen_django.py index 16f57c0..7eb8742 100755 --- a/django/gends_run_gen_django.py +++ b/django/gends_run_gen_django.py @@ -13,9 +13,12 @@ Options: generateds_definedsimpletypes.py models.py forms.py + -p, --path-to-generateDS-script=/path/to/generateDS.py + Path to the generateDS.py script. -v, --verbose Display additional information while running. -Example: +Examples: python gends_run_gen_django.py my_schema.xsd + python gends_run_gen_django.py -f -p ../generateDS.py my_other_schema.xsd """ @@ -63,21 +66,25 @@ def generate(options, schema_file_name): flag4 = exists(admin_file_name) if (flag1 or flag2 or flag3 or flag4): return - args = ('generateDS.py', '-f', + args = ( + options['path'], + '-f', '-o', '%s' % (bindings_file_name, ), '--member-specs=list', schema_file_name, - ) + ) if not run_cmd(options, args): return - args = ('./gends_extract_simple_types.py', '-f', + args = ( + './gends_extract_simple_types.py', '-f', schema_file_name, - ) + ) if not run_cmd(options, args): return - args = ('./gends_generate_django.py', '-f', + args = ( + './gends_generate_django.py', '-f', bindings_file_stem, - ) + ) if not run_cmd(options, args): return @@ -113,23 +120,23 @@ def dbg_msg(options, msg): sys.stdout.write(msg) -USAGE_TEXT = __doc__ - def usage(): - sys.stderr.write(USAGE_TEXT) - sys.exit(1) + sys.exit(__doc__) def main(): args = sys.argv[1:] try: - opts, args = getopt.getopt(args, 'hvf', ['help', 'verbose', - 'force', ]) + opts, args = getopt.getopt(args, 'hvfp:', [ + 'help', 'verbose', + 'force', 'path-to-generateDS-script=', + ]) except: usage() options = {} options['force'] = False options['verbose'] = False + options['path'] = './generateDS.py' for opt, val in opts: if opt in ('-h', '--help'): usage() @@ -137,6 +144,12 @@ def main(): options['force'] = True elif opt in ('-v', '--verbose'): options['verbose'] = True + elif opt in ('-p', '--path-to-generateDS-script'): + options['path'] = val + if not os.path.exists(options['path']): + sys.exit( + '\n*** error: Cannot find generateDS.py. ' + 'Use "-p path" command line option.\n') if len(args) != 1: usage() schema_name = args[0] @@ -146,5 +159,3 @@ def main(): if __name__ == '__main__': #import pdb; pdb.set_trace() main() - - diff --git a/django/generatedssuper.py b/django/generatedssuper.py index cbd9922..e808cd6 100644 --- a/django/generatedssuper.py +++ b/django/generatedssuper.py @@ -96,10 +96,18 @@ String_type_table = { } Date_type_table = { 'date': None, + 'gYear': None, + 'gYearMonth': None, + 'gMonth': None, + 'gMonthDay': None, + 'gDay': None, } DateTime_type_table = { 'dateTime': None, } +Time_type_table = { + 'time': None, +} Boolean_type_table = { 'boolean': None, } @@ -111,14 +119,19 @@ Boolean_type_table = { class GeneratedsSuper(object): def gds_format_string(self, input_data, input_name=''): return input_data + def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data + def gds_format_float(self, input_data, input_name=''): return '%f' % input_data + def gds_format_double(self, input_data, input_name=''): return '%e' % input_data + def gds_format_boolean(self, input_data, input_name=''): return '%s' % input_data + def gds_str_lower(self, instring): return instring.lower() @@ -178,6 +191,11 @@ class GeneratedsSuper(object): name, options, )) wrtforms(' %s = forms.DateTimeField(%s)\n' % ( name, options, )) + elif data_type in Time_type_table: + wrtmodels(' %s = models.TimeField(%s)\n' % ( + name, options, )) + wrtforms(' %s = forms.TimeField(%s)\n' % ( + name, options, )) elif data_type in Boolean_type_table: wrtmodels(' %s = models.BooleanField(%s)\n' % ( name, options, )) @@ -186,20 +204,21 @@ class GeneratedsSuper(object): elif data_type in String_type_table: wrtmodels( ' %s = models.CharField(max_length=1000, %s)\n' % ( - name, options, )) + name, options, )) wrtforms( ' %s = forms.CharField(max_length=1000, %s)\n' % ( - name, options, )) + name, options, )) else: sys.stderr.write('Unhandled simple type: %s %s\n' % ( name, data_type, )) else: wrtmodels( ' %s = models.ForeignKey("%s_model")\n' % ( - name, data_type, )) + name, data_type, )) wrtforms( - ' %s = forms.MultipleChoiceField(%s_model.objects.all())\n' % ( - name, data_type, )) + ' %s = forms.MultipleChoiceField(%s_model.objects' + '.all())\n' % ( + name, data_type, )) wrtmodels(' def __unicode__(self):\n') wrtmodels(' return "id: %s" % (self.id, )\n') @@ -212,5 +231,3 @@ def cleanupName(oldName): newName = newName.replace('-', '_') newName = newName.replace('.', '_') return newName - - diff --git a/fix_subclass_refs.py b/fix_subclass_refs.py new file mode 100755 index 0000000..b08d111 --- /dev/null +++ b/fix_subclass_refs.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +""" +synopsis: + Fix up subclass references so that the classes in the superclass + module refer to classes in a specified submodule. + The superclass module was generated with the generateDS.py "-o" + command line option; the subclass module was generated with "-s". + The intended use is to be able to switch between different versions + of submodules generated from the same XML schema. +usage: + python fix_subclass_refs.py <supermodname> <submodname1> <submodname2> +examples: + From the command line for testing purposes: + python fix_subclass_refs.py datalib datasub1 datasub2 + From within an application -- Suppose we want to switch between the use + of submodule_1 and submodule_2 while our application is running: + import fix_subclass_refs + import supermodule + import submodule_1 + import submodule_2 + ... + fix_subclass_refs.fix_up_refs(supermodule, submodule_1) + submodule_1.parse('data.xml') + ... + fix_subclass_refs.fix_up_refs(supermodule, submodule_2) + submodule_2.parse('data.xml') +""" + + +from __future__ import print_function +import sys +import importlib + + +def fix_up_refs(supermod, submod): + """Change the value of class variable "subclass" so that it refers + to the subclass in "submod". + """ + count = 0 + for superclassname in supermod.__all__: + superclass = getattr(supermod, superclassname) + if superclass.subclass is None: + # never happens? + print('*** {} missing subclass'.format(superclassname)) + pass + else: + subclassname = superclass.subclass.__name__ + subclass = getattr(submod, subclassname) + superclass.subclass = subclass + count += 1 + return count + + +def show(supermod): + count = 0 + for superclassname in supermod.__all__: + superclass = getattr(supermod, superclassname) + print('subclass: {}'.format(superclass.subclass)) + count += 1 + return count + + +def test(supermodname, submodname1, submodname2): + supermod = importlib.import_module(supermodname) + submod1 = importlib.import_module(submodname1) + importlib.import_module(submodname2) + count = show(supermod) + print('count: {}'.format(count)) + count = fix_up_refs(supermod, submod1) + print('fix-up count: {}'.format(count)) + raw_input('Press Enter to continue ') + print('-' * 50) + count = show(supermod) + print('count: {}'.format(count)) + + +def main(): + args = sys.argv[1:] + if len(args) != 3: + sys.exit(__doc__) + supermodname = args[0] + submodname1 = args[1] + submodname2 = args[2] + test(supermodname, submodname1, submodname2) + + +if __name__ == '__main__': + main() diff --git a/generateDS.html b/generateDS.html index f41c344..257e460 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.12: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> <title>generateDS -- Generate Data Structures from XML Schema</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -187,9 +187,12 @@ div.warning p.admonition-title { font-family: sans-serif } tt.docutils { - background-color: #eeeeee; + background-color: #dddddd; } +ul.auto-toc { + list-style-type: none } + </style> </head> <body> @@ -202,7 +205,7 @@ tt.docutils { <tr><th class="docinfo-name">Author:</th> <td>Dave Kuhlman</td></tr> <tr><th class="docinfo-name">Contact:</th> -<td><a class="first last reference external" href="mailto:dkuhlman@pacbell.net">dkuhlman@pacbell.net</a></td></tr> +<td>dkuhlman (at) davekuhlman (dot) org</td></tr> <tr><th class="docinfo-name">Address:</th> <td><pre class="address"> <a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a> @@ -217,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.11b</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -226,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">August 21, 2013</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td> </tr> </tbody> </table> @@ -258,116 +261,131 @@ to process the contents of an XML document.</td> <li><a class="reference internal" href="#support-and-more-information" id="id10">2.2 Support and more information</a></li> </ul> </li> -<li><a class="reference internal" href="#how-to-build-and-install-it" id="id11">3 How to build and install it</a></li> -<li><a class="reference internal" href="#packaging-your-code" id="id12">4 Packaging your code</a></li> -<li><a class="reference internal" href="#the-command-line-interface-how-to-use-it" id="id13">5 The command line interface -- How to use it</a><ul class="auto-toc"> -<li><a class="reference internal" href="#running-generateds-py" id="id14">5.1 Running <tt class="docutils literal">generateDS.py</tt></a></li> -<li><a class="reference internal" href="#name-conflicts" id="id15">5.2 Name conflicts</a><ul class="auto-toc"> -<li><a class="reference internal" href="#conflicts-with-python-keywords" id="id16">5.2.1 Conflicts with Python keywords</a></li> -<li><a class="reference internal" href="#conflicts-between-child-elements-and-attributes" id="id17">5.2.2 Conflicts between child elements and attributes</a></li> +<li><a class="reference internal" href="#how-to-build-and-install-it" id="id11">3 How to build and install it</a><ul class="auto-toc"> +<li><a class="reference internal" href="#requirements" id="id12">3.1 Requirements</a></li> +<li><a class="reference internal" href="#installation" id="id13">3.2 Installation</a></li> +</ul> +</li> +<li><a class="reference internal" href="#packaging-your-code" id="id14">4 Packaging your code</a></li> +<li><a class="reference internal" href="#the-command-line-interface-how-to-use-it" id="id15">5 The command line interface -- How to use it</a><ul class="auto-toc"> +<li><a class="reference internal" href="#running-generateds-py" id="id16">5.1 Running <tt class="docutils literal">generateDS.py</tt></a></li> +<li><a class="reference internal" href="#command-line-options" id="id17">5.2 Command line options</a></li> +<li><a class="reference internal" href="#name-conflicts-etc" id="id18">5.3 Name conflicts etc.</a><ul class="auto-toc"> +<li><a class="reference internal" href="#conflicts-with-python-keywords" id="id19">5.3.1 Conflicts with Python keywords</a></li> +<li><a class="reference internal" href="#conflicts-between-child-elements-and-attributes" id="id20">5.3.2 Conflicts between child elements and attributes</a></li> +<li><a class="reference internal" href="#cleaning-up-names-with-special-characters-etc" id="id21">5.3.3 Cleaning up names with special characters etc.</a></li> +</ul> +</li> </ul> </li> +<li><a class="reference internal" href="#the-graphical-user-interface-how-to-use-it" id="id22">6 The graphical user interface -- How to use it</a></li> +<li><a class="reference internal" href="#common-problems" id="id23">7 Common problems</a><ul class="auto-toc"> +<li><a class="reference internal" href="#namespace-prefix-mis-match" id="id24">7.1 Namespace prefix mis-match</a></li> +<li><a class="reference internal" href="#using-multiple-subclass-modules-with-the-same-superclass-module" id="id25">7.2 Using multiple subclass modules with the same superclass module</a></li> </ul> </li> -<li><a class="reference internal" href="#the-graphical-user-interface-how-to-use-it" id="id18">6 The graphical user interface -- How to use it</a></li> -<li><a class="reference internal" href="#common-problems" id="id19">7 Common problems</a><ul class="auto-toc"> -<li><a class="reference internal" href="#namespace-prefix-mis-match" id="id20">7.1 Namespace prefix mis-match</a></li> +<li><a class="reference internal" href="#supported-features-of-xml-schema" id="id26">8 Supported features of XML Schema</a><ul class="auto-toc"> +<li><a class="reference internal" href="#attributes-no-nested-children" id="id27">8.1 Attributes + no nested children</a></li> +<li><a class="reference internal" href="#mixed-content" id="id28">8.2 Mixed content</a></li> +<li><a class="reference internal" href="#anyattribute" id="id29">8.3 anyAttribute</a></li> +<li><a class="reference internal" href="#element-extensions" id="id30">8.4 Element extensions</a></li> +<li><a class="reference internal" href="#attribute-groups" id="id31">8.5 Attribute groups</a></li> +<li><a class="reference internal" href="#substitution-groups" id="id32">8.6 Substitution groups</a></li> +<li><a class="reference internal" href="#primitive-types" id="id33">8.7 Primitive types</a></li> +<li><a class="reference internal" href="#simpletype" id="id34">8.8 simpleType</a></li> +<li><a class="reference internal" href="#list-values-optional-values-maxoccurs-etc" id="id35">8.9 List values, optional values, maxOccurs, etc.</a></li> +<li><a class="reference internal" href="#simpletype-and-validators" id="id36">8.10 simpleType and validators</a><ul class="auto-toc"> +<li><a class="reference internal" href="#generating-validator-bodies-from-xml-schema" id="id37">8.10.1 Generating validator bodies from XML schema</a></li> +<li><a class="reference internal" href="#user-written-validator-bodies" id="id38">8.10.2 User written validator bodies</a></li> +<li><a class="reference internal" href="#turning-off-validation-of-simpletype-data" id="id39">8.10.3 Turning off validation of <tt class="docutils literal">simpleType</tt> data</a></li> +<li><a class="reference internal" href="#additional-notes-on-simpletype-validation" id="id40">8.10.4 Additional notes on <tt class="docutils literal">simpleType</tt> validation</a></li> </ul> </li> -<li><a class="reference internal" href="#supported-features-of-xml-schema" id="id21">8 Supported features of XML Schema</a><ul class="auto-toc"> -<li><a class="reference internal" href="#attributes-no-nested-children" id="id22">8.1 Attributes + no nested children</a></li> -<li><a class="reference internal" href="#mixed-content" id="id23">8.2 Mixed content</a></li> -<li><a class="reference internal" href="#anyattribute" id="id24">8.3 anyAttribute</a></li> -<li><a class="reference internal" href="#element-extensions" id="id25">8.4 Element extensions</a></li> -<li><a class="reference internal" href="#attribute-groups" id="id26">8.5 Attribute groups</a></li> -<li><a class="reference internal" href="#substitution-groups" id="id27">8.6 Substitution groups</a></li> -<li><a class="reference internal" href="#primitive-types" id="id28">8.7 Primitive types</a></li> -<li><a class="reference internal" href="#simpletype" id="id29">8.8 simpleType</a></li> -<li><a class="reference internal" href="#list-values-optional-values-maxoccurs-etc" id="id30">8.9 List values, optional values, maxOccurs, etc.</a></li> -<li><a class="reference internal" href="#simpletype-and-validators" id="id31">8.10 simpleType and validators</a></li> -<li><a class="reference internal" href="#include-file-processing" id="id32">8.11 Include file processing</a></li> -<li><a class="reference internal" href="#abstract-types" id="id33">8.12 Abstract types</a></li> +<li><a class="reference internal" href="#include-file-processing" id="id41">8.11 Include file processing</a></li> +<li><a class="reference internal" href="#abstract-types" id="id42">8.12 Abstract types</a></li> </ul> </li> -<li><a class="reference internal" href="#the-xml-schema-input-to-generateds" id="id34">9 The XML schema input to generateDS</a><ul class="auto-toc"> -<li><a class="reference internal" href="#additional-constructions" id="id35">9.1 Additional constructions</a><ul class="auto-toc"> -<li><a class="reference internal" href="#complextype-at-top-level" id="id36">9.1.1 <complexType> at top-level</a></li> -<li><a class="reference internal" href="#use-of-ref-instead-of-name-and-type-attributes" id="id37">9.1.2 Use of "ref" instead of "name" and "type" attributes</a></li> -<li><a class="reference internal" href="#extension-types" id="id38">9.1.3 Extension types</a></li> -<li><a class="reference internal" href="#elements-containing-mixed-content" id="id39">9.1.4 Elements containing mixed content</a></li> +<li><a class="reference internal" href="#the-xml-schema-input-to-generateds" id="id43">9 The XML schema input to generateDS</a><ul class="auto-toc"> +<li><a class="reference internal" href="#additional-constructions" id="id44">9.1 Additional constructions</a><ul class="auto-toc"> +<li><a class="reference internal" href="#complextype-at-top-level" id="id45">9.1.1 <complexType> at top-level</a></li> +<li><a class="reference internal" href="#use-of-ref-instead-of-name-and-type-attributes" id="id46">9.1.2 Use of "ref" instead of "name" and "type" attributes</a></li> +<li><a class="reference internal" href="#extension-types" id="id47">9.1.3 Extension types</a></li> +<li><a class="reference internal" href="#elements-containing-mixed-content" id="id48">9.1.4 Elements containing mixed content</a></li> </ul> </li> </ul> </li> -<li><a class="reference internal" href="#id2" id="id40">10 XMLBehaviors</a><ul class="auto-toc"> -<li><a class="reference internal" href="#the-xmlbehaviors-input-file" id="id41">10.1 The XMLBehaviors input file</a></li> -<li><a class="reference internal" href="#implementing-other-sources-for-implementation-bodies" id="id42">10.2 Implementing other sources for implementation bodies</a></li> +<li><a class="reference internal" href="#id2" id="id49">10 XMLBehaviors</a><ul class="auto-toc"> +<li><a class="reference internal" href="#the-xmlbehaviors-input-file" id="id50">10.1 The XMLBehaviors input file</a></li> +<li><a class="reference internal" href="#implementing-other-sources-for-implementation-bodies" id="id51">10.2 Implementing other sources for implementation bodies</a></li> </ul> </li> -<li><a class="reference internal" href="#additional-features" id="id43">11 Additional features</a><ul class="auto-toc"> -<li><a class="reference internal" href="#xsd-list-element-support" id="id44">11.1 xsd:list element support</a></li> -<li><a class="reference internal" href="#xsd-enumeration-support" id="id45">11.2 xsd:enumeration support</a></li> -<li><a class="reference internal" href="#xsd-union-support" id="id46">11.3 xsd:union support</a></li> -<li><a class="reference internal" href="#extended-xsd-choice-support" id="id47">11.4 Extended xsd:choice support</a></li> -<li><a class="reference internal" href="#arity-minoccurs-maxoccurs-etc" id="id48">11.5 Arity, minOccurs, maxOccurs, etc</a></li> -<li><a class="reference internal" href="#more-thorough-content-type-and-base-type-resolution" id="id49">11.6 More thorough content type and base type resolution</a></li> -<li><a class="reference internal" href="#making-top-level-simpletypes-available-from-xschemahandler" id="id50">11.7 Making top level simpleTypes available from XschemaHandler</a></li> -<li><a class="reference internal" href="#namespaces-inserting-namespace-definition-in-exported-documents" id="id51">11.8 Namespaces -- inserting namespace definition in exported documents</a></li> -<li><a class="reference internal" href="#support-for-xs-any" id="id52">11.9 Support for xs:any</a></li> -<li><a class="reference internal" href="#generating-lxml-element-tree" id="id53">11.10 Generating Lxml Element tree</a><ul class="auto-toc"> -<li><a class="reference internal" href="#mapping-generateds-objects-to-lxml-elements-and-back" id="id54">11.10.1 Mapping generateDS objects to Lxml Elements and back</a></li> +<li><a class="reference internal" href="#additional-features" id="id52">11 Additional features</a><ul class="auto-toc"> +<li><a class="reference internal" href="#xsd-list-element-support" id="id53">11.1 xsd:list element support</a></li> +<li><a class="reference internal" href="#xsd-enumeration-support" id="id54">11.2 xsd:enumeration support</a></li> +<li><a class="reference internal" href="#xsd-union-support" id="id55">11.3 xsd:union support</a></li> +<li><a class="reference internal" href="#extended-xsd-choice-support" id="id56">11.4 Extended xsd:choice support</a></li> +<li><a class="reference internal" href="#arity-minoccurs-maxoccurs-etc" id="id57">11.5 Arity, minOccurs, maxOccurs, etc</a></li> +<li><a class="reference internal" href="#more-thorough-content-type-and-base-type-resolution" id="id58">11.6 More thorough content type and base type resolution</a></li> +<li><a class="reference internal" href="#making-top-level-simpletypes-available-from-xschemahandler" id="id59">11.7 Making top level simpleTypes available from XschemaHandler</a></li> +<li><a class="reference internal" href="#namespaces-inserting-namespace-definition-in-exported-documents" id="id60">11.8 Namespaces -- inserting namespace definition in exported documents</a></li> +<li><a class="reference internal" href="#support-for-xs-any" id="id61">11.9 Support for xs:any</a></li> +<li><a class="reference internal" href="#generating-lxml-element-tree" id="id62">11.10 Generating Lxml Element tree</a><ul class="auto-toc"> +<li><a class="reference internal" href="#mapping-generateds-objects-to-lxml-elements-and-back" id="id63">11.10.1 Mapping generateDS objects to Lxml Elements and back</a></li> </ul> </li> +<li><a class="reference internal" href="#specifying-names-for-anonymous-nested-type-definitions" id="id64">11.11 Specifying names for anonymous nested type definitions</a></li> </ul> </li> -<li><a class="reference internal" href="#how-to-use-the-generated-source-code" id="id55">12 How-to Use the generated source code</a><ul class="auto-toc"> -<li><a class="reference internal" href="#the-parsing-functions" id="id56">12.1 The parsing functions</a></li> -<li><a class="reference internal" href="#recognizing-the-top-level-element" id="id57">12.2 Recognizing the top level element</a></li> -<li><a class="reference internal" href="#the-export-methods" id="id58">12.3 The export methods</a><ul class="auto-toc"> -<li><a class="reference internal" href="#method-export" id="id59">12.3.1 Method export</a></li> -<li><a class="reference internal" href="#method-exportliteral" id="id60">12.3.2 Method <tt class="docutils literal">exportLiteral</tt></a><ul class="auto-toc"> -<li><a class="reference internal" href="#what-it-does" id="id61">12.3.2.1 What It Does</a></li> -<li><a class="reference internal" href="#why-you-might-care" id="id62">12.3.2.2 Why You Might Care</a></li> -<li><a class="reference internal" href="#how-to-use-it" id="id63">12.3.2.3 How to use it</a></li> +<li><a class="reference internal" href="#how-to-use-the-generated-source-code" id="id65">12 How to use the generated source code</a><ul class="auto-toc"> +<li><a class="reference internal" href="#the-parsing-functions" id="id66">12.1 The parsing functions</a></li> +<li><a class="reference internal" href="#recognizing-the-top-level-element" id="id67">12.2 Recognizing the top level element</a></li> +<li><a class="reference internal" href="#the-export-methods" id="id68">12.3 The export methods</a><ul class="auto-toc"> +<li><a class="reference internal" href="#method-export" id="id69">12.3.1 Method export</a></li> +<li><a class="reference internal" href="#method-exportliteral" id="id70">12.3.2 Method <tt class="docutils literal">exportLiteral</tt></a><ul class="auto-toc"> +<li><a class="reference internal" href="#what-it-does" id="id71">12.3.2.1 What It Does</a></li> +<li><a class="reference internal" href="#why-you-might-care" id="id72">12.3.2.2 Why You Might Care</a></li> +<li><a class="reference internal" href="#how-to-use-it" id="id73">12.3.2.3 How to use it</a></li> </ul> </li> -<li><a class="reference internal" href="#exporting-compact-xml-documents" id="id64">12.3.3 Exporting compact XML documents</a></li> +<li><a class="reference internal" href="#exporting-compact-xml-documents" id="id74">12.3.3 Exporting compact XML documents</a></li> </ul> </li> -<li><a class="reference internal" href="#building-instances" id="id65">12.4 Building instances</a></li> -<li><a class="reference internal" href="#using-the-subclass-module" id="id66">12.5 Using the subclass module</a></li> -<li><a class="reference internal" href="#elements-with-attributes-but-no-nested-children" id="id67">12.6 Elements with attributes but no nested children</a></li> -<li><a class="reference internal" href="#id4" id="id68">12.7 Mixed content</a></li> -<li><a class="reference internal" href="#id6" id="id69">12.8 anyAttribute</a></li> -<li><a class="reference internal" href="#user-methods" id="id70">12.9 User Methods</a></li> -<li><a class="reference internal" href="#overridable-methods" id="id71">12.10 Overridable methods</a></li> -<li><a class="reference internal" href="#the-element-name-to-class-name-dictionary" id="id72">12.11 The element name to class name dictionary</a></li> +<li><a class="reference internal" href="#building-instances" id="id75">12.4 Building instances</a></li> +<li><a class="reference internal" href="#using-the-subclass-module" id="id76">12.5 Using the subclass module</a></li> +<li><a class="reference internal" href="#elements-with-attributes-but-no-nested-children" id="id77">12.6 Elements with attributes but no nested children</a></li> +<li><a class="reference internal" href="#id4" id="id78">12.7 Mixed content</a></li> +<li><a class="reference internal" href="#id6" id="id79">12.8 anyAttribute</a></li> +<li><a class="reference internal" href="#user-methods" id="id80">12.9 User Methods</a></li> +<li><a class="reference internal" href="#overridable-methods" id="id81">12.10 Overridable methods</a></li> +<li><a class="reference internal" href="#the-element-name-to-class-name-dictionary" id="id82">12.11 The element name to class name dictionary</a></li> </ul> </li> -<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id73">13 How to modify the generated code</a><ul class="auto-toc"> -<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id74">13.1 Adding features to class definitions</a></li> +<li><a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas" id="id83">13 "One Per" -- generating separate files from imported/included schemas</a></li> +<li><a class="reference internal" href="#how-to-modify-the-generated-code" id="id84">14 How to modify the generated code</a><ul class="auto-toc"> +<li><a class="reference internal" href="#adding-features-to-class-definitions" id="id85">14.1 Adding features to class definitions</a></li> </ul> </li> -<li><a class="reference internal" href="#examples-and-demonstrations" id="id75">14 Examples and demonstrations</a><ul class="auto-toc"> -<li><a class="reference internal" href="#django-generating-models-and-forms" id="id76">14.1 Django -- Generating Models and Forms</a><ul class="auto-toc"> -<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id77">14.1.1 How to generate Django models and forms</a></li> -<li><a class="reference internal" href="#how-it-works" id="id78">14.1.2 How it works</a></li> +<li><a class="reference internal" href="#examples-and-demonstrations" id="id86">15 Examples and demonstrations</a><ul class="auto-toc"> +<li><a class="reference internal" href="#django-generating-models-and-forms" id="id87">15.1 Django -- Generating Models and Forms</a><ul class="auto-toc"> +<li><a class="reference internal" href="#how-to-generate-django-models-and-forms" id="id88">15.1.1 How to generate Django models and forms</a></li> +<li><a class="reference internal" href="#how-it-works" id="id89">15.1.2 How it works</a></li> </ul> </li> </ul> </li> -<li><a class="reference internal" href="#sample-code-and-extensions" id="id79">15 Sample code and extensions</a><ul class="auto-toc"> -<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id80">15.1 Capturing xs:date elements as dates</a></li> +<li><a class="reference internal" href="#sample-code-and-extensions" id="id90">16 Sample code and extensions</a><ul class="auto-toc"> +<li><a class="reference internal" href="#capturing-xs-date-elements-as-dates" id="id91">16.1 Capturing xs:date elements as dates</a></li> </ul> </li> -<li><a class="reference internal" href="#limitations-of-generateds" id="id81">16 Limitations of generateDS</a><ul class="auto-toc"> -<li><a class="reference internal" href="#xml-schema-limitations" id="id82">16.1 XML Schema limitations</a></li> -<li><a class="reference internal" href="#large-documents" id="id83">16.2 Large documents</a></li> +<li><a class="reference internal" href="#limitations-of-generateds" id="id92">17 Limitations of generateDS</a><ul class="auto-toc"> +<li><a class="reference internal" href="#xml-schema-limitations" id="id93">17.1 XML Schema limitations</a></li> +<li><a class="reference internal" href="#large-documents" id="id94">17.2 Large documents</a></li> </ul> </li> -<li><a class="reference internal" href="#includes-the-xml-schema-include-element" id="id84">17 Includes -- The XML schema include element</a></li> -<li><a class="reference internal" href="#acknowledgments" id="id85">18 Acknowledgments</a></li> -<li><a class="reference internal" href="#see-also" id="id86">19 See also</a></li> +<li><a class="reference internal" href="#includes-the-xml-schema-include-element" id="id95">18 Includes -- The XML schema include element</a></li> +<li><a class="reference internal" href="#acknowledgments" id="id96">19 Acknowledgments</a></li> +<li><a class="reference internal" href="#see-also" id="id97">20 See also</a></li> </ul> </div> <div class="section" id="introduction"> @@ -419,6 +437,9 @@ process the contents of the XML file. The user can also generate and extend multiple subclass files which use a single, common superclass file, thus implementing a number of different processes on the same XML document type.</p> +<p><tt class="docutils literal">generateDS.py</tt> can be run under either Python 2 or Python 3. The +generated Python code (both superclass and subclass modules) can be +run under either Python 2 or Python 3.</p> <p>This document explains (1) how to use <tt class="docutils literal">generateDS.py</tt>; (2) how to use the Python code and data structures that it generates; and (3) how to modify the generated code for special purposes.</p> @@ -446,15 +467,24 @@ https://bitbucket.org/dkuhlman/generateds</a></li> https://lists.sourceforge.net/lists/listinfo/generateds-users</a>.</p> <p>There is a tutorial in the distribution: <tt class="docutils literal">tutorial/tutorial.html</tt> and at -<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateds_tutorial.html">generateDS -- Introduction and Tutorial -- -http://www.rexx.com/~dkuhlman/generateds_tutorial.html</a>.</p> +<a class="reference external" href="http://www.davekuhlman.org/generateds_tutorial.html">generateDS -- Introduction and Tutorial -- +http://www.davekuhlman.org/generateds_tutorial.html</a>.</p> </div> </div> <div class="section" id="how-to-build-and-install-it"> <h1><a class="toc-backref" href="#id11">3 How to build and install it</a></h1> -<p>Newer versions of Python have XML support in the Python standard -library. For older versions of Python, install PyXML. You can find -it at: <a class="reference external" href="http://pyxml.sourceforge.net/">http://pyxml.sourceforge.net/</a></p> +<div class="section" id="requirements"> +<h2><a class="toc-backref" href="#id12">3.1 Requirements</a></h2> +<p><tt class="docutils literal">Lxml</tt> is used both by <tt class="docutils literal">generateDS.py</tt> and by the code it +generates. <tt class="docutils literal">Lxml</tt> is available at the Python Package Index +<a class="reference external" href="https://pypi.python.org/pypi/lxml/">https://pypi.python.org/pypi/lxml/</a> and at the <tt class="docutils literal">Lxml</tt> project home +site <a class="reference external" href="http://lxml.de/">http://lxml.de/</a>.</p> +<p>Older versions of Python XML support can sometimes cause problems. +If you receive a traceback that includes "_xmlplus", then you will +need to remove that <tt class="docutils literal">_xmlplus</tt> package.</p> +</div> +<div class="section" id="installation"> +<h2><a class="toc-backref" href="#id13">3.2 Installation</a></h2> <p>De-compress the <tt class="docutils literal">generateDS</tt> distribution file. Use something like the following:</p> <pre class="literal-block"> @@ -467,8 +497,9 @@ $ python setup.py build $ python setup.py install # probably as root </pre> </div> +</div> <div class="section" id="packaging-your-code"> -<h1><a class="toc-backref" href="#id12">4 Packaging your code</a></h1> +<h1><a class="toc-backref" href="#id14">4 Packaging your code</a></h1> <p>There is some support for packaging the code you generate with <tt class="docutils literal">generateDS.py</tt>. This support helps you to produce a directory structure with places to put sample code, sample XML instance @@ -481,14 +512,14 @@ especially useful when the schema used to generate code contains <a class="reference external" href="librarytemplate_howto.html">How to package a generateDS.py generated library -- librarytemplate_howto.html</a></p> <p>And the package building support itself is here: -<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip">LibraryTemplate -- -http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip</a>. +<a class="reference external" href="http://www.davekuhlman.org/librarytemplate-1.0a.zip">LibraryTemplate -- +http://www.davekuhlman.org/librarytemplate-1.0a.zip</a>. It is also included in the generateDS distribution package.</p> </div> <div class="section" id="the-command-line-interface-how-to-use-it"> -<h1><a class="toc-backref" href="#id13">5 The command line interface -- How to use it</a></h1> +<h1><a class="toc-backref" href="#id15">5 The command line interface -- How to use it</a></h1> <div class="section" id="running-generateds-py"> -<h2><a class="toc-backref" href="#id14">5.1 Running <tt class="docutils literal">generateDS.py</tt></a></h2> +<h2><a class="toc-backref" href="#id16">5.1 Running <tt class="docutils literal">generateDS.py</tt></a></h2> <p>Run <tt class="docutils literal">generateDS.py</tt> with a single argument, the XML Schema file that defines the data structures. For example, the following will generate Python source code for data structures described in @@ -500,7 +531,7 @@ python generateDS.py -o people.py -s peoplesubs.py people.xsd <p>Here is the usage message displayed by <tt class="docutils literal">generateDS.py</tt>:</p> <pre class="literal-block"> Synopsis: - Generate Python classes from XML Schema definition. + Generate Python classes from XML schema definition. Input is read from in_xsd_file or, if "-" (dash) arg, from stdin. Output is written to files named in "-o" and "-s" options. Usage: @@ -517,16 +548,28 @@ Options: -b <behaviorfilename> Input file name for behaviors added to subclasses -m Generate properties for member variables -c <xmlcatalogfilename> Input file name to load an XML catalog + --one-file-per-xsd Create a python module for each XSD processed. + --output-directory="XXX" Used in conjunction with --one-file-per-xsd. + The directory where the modules will be created. + --module-suffix="XXX" To be used in conjunction with --one-file-per-xsd. + Append XXX to the end of each file created. --subclass-suffix="XXX" Append XXX to the generated subclass names. Default="Sub". - --root-element="XXX" Assume XXX is root element of instance docs. - Default is first element defined in schema. - Also see section "Recognizing the top level + --root-element="XX" When parsing, assume XX is root element of + --root-element="XX|YY" instance docs. Default is first element defined + in schema. If YY is added, then YY is used as the + top level class; if YY omitted XX is the default. + class. Also see section "Recognizing the top level element" in the documentation. - --super="XXX" Super module name in generated in subclass + --super="XXX" Super module name in generated subclass module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -543,10 +586,10 @@ Options: generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code. - --no-process-includes Do not process included XML Schema files. By + --no-process-includes Do not process included XML schema files. By default, generateDS.py will insert content from files referenced by <include ... /> - elements into the XML Schema to be processed. + elements into the XML schema to be processed. --silence Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, use the --silence switch. @@ -578,13 +621,23 @@ Options: to XML) Example: "write etree" Default: "write" + --preserve-cdata-tags Preserve CDATA tags. Default: False + --cleanup-name-list=<replacement-map> + Specifies list of 2-tuples used for cleaning + names. First element is a regular expression + search pattern and second is a replacement. + Example: "[('[-:.]', '_'), ('^__', 'Special')]" + Default: "[('[-:.]', '_')]" -q, --no-questions Do not ask questions, for example, force overwrite. + --no-warnings Do not print warning messages. --session=mysession.session Load and use options from session file. You can create session file in generateds_gui.py. Or, copy and edit sample.session from the distribution. + --fix-type-names="oldname1:newname1;oldname2:newname2;..." + Fix up (replace) complex type names. --version Print version and exit. Usage example: @@ -599,7 +652,10 @@ creates (with force over-write) sample_lib.py from sample_api.xsd. creates sample_lib.py superclass and sample_app1.py subclass modules; also generates member specifications in each class (in a dictionary). </pre> -<p>The following command line flags are recognized by <tt class="docutils literal">generateDS.py</tt>:</p> +</div> +<div class="section" id="command-line-options"> +<h2><a class="toc-backref" href="#id17">5.2 Command line options</a></h2> +<p>The following command line options are recognized by <tt class="docutils literal">generateDS.py</tt>:</p> <dl class="docutils"> <dt>o <filename></dt> <dd>Write the data representation classes to file filename.</dd> @@ -645,9 +701,20 @@ getters and setters. This is experimental.</dd> <dt>c <xmlcatalogfilename></dt> <dd>Specify the file to be used as an XML catalog. This file will be used by process_includes.py if needed to resolve references -in <import> and <include> elements in the XML Schema. For more -information on XML catalogs, see: -<a class="reference external" href="http://en.wikipedia.org/wiki/XML_Catalog">http://en.wikipedia.org/wiki/XML_Catalog</a></dd> +in <xs:import> and <xs:include> elements in the XML Schema. For +more information on XML catalogs, see: +http://en.wikipedia.org/wiki/XML_Catalog</dd> +<dt>one-file-per-xsd</dt> +<dd>Create a separate Python module for each XML Schema document +processed (for example, using <xs:include> or <xs:import>). For +help with using this option, see <a class="reference internal" href="#one-per-generating-separate-files-from-imported-included-schemas">"One Per" -- generating +separate files from imported/included schemas</a>.</dd> +<dt>output-directory <directory></dt> +<dd>When used with <tt class="docutils literal"><span class="pre">one-file-per-xsd</span></tt>, create generated output +files in path <tt class="docutils literal"><directory></tt>.</dd> +<dt>module-suffix <suffix></dt> +<dd>When used with <tt class="docutils literal"><span class="pre">one-file-per-xsd</span></tt>, append <tt class="docutils literal"><suffix></tt> to the +end of each module name.</dd> <dt>subclass-suffix=<suffix></dt> <dd><p class="first">Append suffix to the name of classes generated in the subclass file. The default, if omitted, is "Sub". For example, the @@ -662,11 +729,16 @@ and subclass names the same:</p> generateDS.py --subclass-suffix="" -s actions.py mydef.xsd </pre> </dd> -<dt>root-element=<element_name></dt> -<dd>Make element_name the assumed root of instance documents. The -default is the name of the element whose definition is first -in the XML Schema document. This flag effects the parsing -functions (for example, parse(), parseString()).</dd> +<dt>root-element=<element_name> -OR- <element_name>|<class_name></dt> +<dd>Make <tt class="docutils literal">element_name</tt> the assumed root of instance documents. +The default is the name of the element whose definition is first +in the XML Schema document. If <tt class="docutils literal">class_name</tt> is also present +(after a vertical bar), then <tt class="docutils literal">class_name</tt> is assumed to be the +name of the class to be created from the root (top level) +element when parsing an XML instance document. If +<tt class="docutils literal">class_name</tt> is omitted, the default class name is the same as +<tt class="docutils literal">element_name</tt>. This flag effects the parsing functions (for +example, parse(), parseString(), etc).</dd> <dt>super=<module_name></dt> <dd><p class="first">Make module_name the name of the superclass module imported by the subclass module. If this flag is omitted, the @@ -686,6 +758,21 @@ an optional ".py" extension. If a file is not provided for a given type, an empty body (<tt class="docutils literal">pass</tt>) is generated. In these files, lines with "##" in the first two columns are ignored and are not inserted.</dd> +<dt>use-old-simpletype-validators</dt> +<dd><p class="first"><tt class="docutils literal">generateDS.py</tt> is capable of generating validator bodies -- +the code that validates data content in an XML instance +docuement and writes out warning messages if that data does not +satisfy the facets in the <tt class="docutils literal">xs:restriction</tt> in the +<tt class="docutils literal">xs:simpleType</tt> defintion in the XML schema. Use this option +if you want to use your own validation bodies/code defined in a +specified directory . See option <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> for +information on that. <em>Without</em> this option +(<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>), the validator code will +be generated directly from the XML schema, which is the default.</p> +<p class="last">This option can also be used to generate code that does <em>no</em> +validation. See <a class="reference internal" href="#simpletype-and-validators">simpleType and validators</a> and <a class="reference internal" href="#turning-off-validation-of-simpletype-data">Turning off +validation of simpleType data</a> for more information.</p> +</dd> <dt>use-getter-setter</dt> <dd><p class="first"><tt class="docutils literal">generateDS.py</tt> now generates getter and setter methods (for variable "abc", for example) with the names get_abc() and @@ -718,7 +805,12 @@ changes to the generated python code.</dd> <dd>Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by <tt class="docutils literal"><include ... /></tt> elements into the XML Schema to be processed. -See section <a class="reference internal" href="#include-file-processing">Include file processing</a>.</dd> +See section <a class="reference internal" href="#include-file-processing">Include file processing</a>. Note that include +processing, which is performed in <tt class="docutils literal">process_includes.py</tt> is +required for generating validator bodies from the XML schema, +because the Lxml ElementTree produced in <tt class="docutils literal">process_includes.py</tt> +is needed to generate the validator code. So, using this option +also turns off automatic generation of validator code.</dd> <dt>silence</dt> <dd>Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, @@ -773,27 +865,71 @@ 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> literal"</tt>.</p> </dd> +<dt>preserve-cdata-tags</dt> +<dd>Preserve CDATA tags. Normally, CDATA tags ("<![CDATA[ ... ]]>") +are dropped while parsing an XML instance document. If this +option is included, the generated code will preserve those tags +and will write them out during export. The default is False.</dd> +<dt>cleanup-name-list=<replacement-map></dt> +<dd><p class="first">Specifies replacement pairs to be used when cleaning up names. +Must be a string representation of a Python list of 2-tuples. +The values of each pair (2-tuple) must be strings. The first +item of each pair is a pattern and must be a valid Python +regular expression (see +<a class="reference external" href="https://docs.python.org/2/library/re.html#module-re">https://docs.python.org/2/library/re.html#module-re</a>) The second +item of each pair is a string that will replace anything matched +by the pattern. Also see <a class="reference internal" href="#cleaning-up-names-with-special-characters-etc">Cleaning up names with special characters etc.</a></p> +<p>The intension is to enable us to replace +special characters in names that would cause the generation of +invalid Python names, for example the names of generated +classes. However, since a string replacement is +performed, you can replace any single character or sequence of +characters by any other single character or sequence of +characters. Example: +<tt class="docutils literal"><span class="pre">[(':',</span> <span class="pre">'colon'),</span> <span class="pre">('-',</span> <span class="pre">'dash'),</span> <span class="pre">('.',</span> <span class="pre">'dot')]</span></tt>.</p> +<p class="last">The default when omitted is <tt class="docutils literal"><span class="pre">[('[-:.]',</span> <span class="pre">'_')]</span></tt>.</p> +</dd> <dt>q, no-questions</dt> <dd>Do not ask questions. For example, if the "-f" command line option is omitted and the ouput file exists, then generateDS.py will not ask whether the file should be overwritten. (In this case, when "-q" is used, the "-f" must be used to force the output file to be written.</dd> +<dt>no-warnings</dt> +<dd>While running generateDS.py, do not print warning messages that +would be written to stderr.</dd> <dt>session=mysession.session</dt> <dd>Load and use options from session file. You can create a session file in generateds_gui.py, the graphical front-end for generateDS.py. Additional options on the command line can be used to override options in the session file. A session file is an XML document, so you can modify it with a text editor.</dd> +<dt>fix-type-names="oldname1:newname1;oldname2:newname2;..." Fix up</dt> +<dd><p class="first">(replace) complex type names. Using this option will replace +the following: (1) the 'name' attribute of a complexType; (2) +the 'type' attribute of each element that refers to the type; +and (3) the 'base' attribute of each extension that refers to +the type. These fixups happen before information is collected +from the schema for code generation. Therefore, using this +option is effectively equivalent to copying your schema, then +editing it with your text editor, then generating code from the +modified schema. If a new name is not specified, the default is +to replace the old name with the old name plus an added "xx" +suffix. Examples:</p> +<pre class="last literal-block"> +$ generateDS.py --fix-type-names="type1:type1Aux" +$ generateDS.py --fix-type-names="type1;type2:type2Repl" +</pre> +</dd> <dt>version</dt> -<dd>Print out the current version of generateDS.py and immediately -exit.</dd> +<dd>Print out the current version of <tt class="docutils literal">generateDS.py</tt> and +immediately exit.</dd> </dl> </div> -<div class="section" id="name-conflicts"> -<h2><a class="toc-backref" href="#id15">5.2 Name conflicts</a></h2> +<div class="section" id="name-conflicts-etc"> +<h2><a class="toc-backref" href="#id18">5.3 Name conflicts etc.</a></h2> <div class="section" id="conflicts-with-python-keywords"> -<h3><a class="toc-backref" href="#id16">5.2.1 Conflicts with Python keywords</a></h3> +<h3><a class="toc-backref" href="#id19">5.3.1 Conflicts with Python keywords</a></h3> <p>In some cases the element and attribute names in an XML document will conflict with Python keywords. There are two solutions to fixing and avoiding name conflicts:</p> @@ -833,7 +969,7 @@ itself.</p> </ul> </div> <div class="section" id="conflicts-between-child-elements-and-attributes"> -<h3><a class="toc-backref" href="#id17">5.2.2 Conflicts between child elements and attributes</a></h3> +<h3><a class="toc-backref" href="#id20">5.3.2 Conflicts between child elements and attributes</a></h3> <p>In some cases the name of a child element and the name of an attribute will be the same. (I believe, but am not sure, that this is allowed by XML Schema.) Since generateDS.py treats both @@ -842,10 +978,48 @@ this is a name conflict. Therefore, where such conflicts exist, generateDS.py modifies the name of the attribute by adding "_attr" to its name.</p> </div> +<div class="section" id="cleaning-up-names-with-special-characters-etc"> +<h3><a class="toc-backref" href="#id21">5.3.3 Cleaning up names with special characters etc.</a></h3> +<p><tt class="docutils literal">generateDS.py</tt> attempts to clean up names that contain special +characters. For example, a complexType whose name contains a dash +would generate a Python class with an invalid name. But, you can +use this facility to make other changes to names as well.</p> +<p>The command line option <tt class="docutils literal"><span class="pre">--cleanup-name-list</span></tt> specifies +replacement pairs to be used when cleaning up (and modifying) names. +The value of this option must be a string representation of a Python +list of 2-tuples. The values of each pair (2-tuple) must be +strings. The first item of each pair is a pattern and must be a +valid Python regular expression (see +<a class="reference external" href="https://docs.python.org/2/library/re.html#module-re">https://docs.python.org/2/library/re.html#module-re</a>) The second item +of each pair is a string that will replace anything matched by the +pattern. The intension is to enable us to replace special +characters in names that would cause the generation of invalid +Python names, for example the names of generated classes. However, +since a string replacement is performed, you can replace any single +character or sequence of characters by any other single character or +sequence of characters.</p> +<p>For example, the following option, in addition to performing the +default replacements of "-", ":", and "." by an underscore, would +also replace the string "Type" when it occurs at the end of a name, +by "Class":</p> +<pre class="literal-block"> +--cleanup-name-list="[('[-:.]', '_'), ('Type$', 'Class')]" +</pre> +<p>This would cause the name "big-data-Type" to become "big_data_Class".</p> +<p>The default when this option is omitted is <tt class="docutils literal"><span class="pre">[('[-:.]',</span> <span class="pre">'_')]</span></tt>.</p> +<p>The order of replacements performed is the same as the order of the +tuples in the list. So, replacements performed by pattern +replacement pairs (2-tuples) later in the list (to the right) will +be performed after those earlier (to the left), and may overwrite +earlier replacements.</p> +<p>See the notes on the command line option <tt class="docutils literal"><span class="pre">--cleanup-name-list</span></tt> for +more on this. Or, run <tt class="docutils literal">$ generateDS.py <span class="pre">--help</span></tt>.</p> +</div> </div> </div> <div class="section" id="the-graphical-user-interface-how-to-use-it"> -<h1><a class="toc-backref" href="#id18">6 The graphical user interface -- How to use it</a></h1> +<h1><a class="toc-backref" href="#id22">6 The graphical user interface -- How to use it</a></h1> +<p><strong>Note:</strong> The graphical user interface is no longer supported.</p> <p>Here are a few notes on how to use the GUI front-end.</p> <ul> <li><p class="first"><tt class="docutils literal">generateds_gui.py</tt> is installed when you do the standard @@ -914,9 +1088,9 @@ files.</p> </ul> </div> <div class="section" id="common-problems"> -<h1><a class="toc-backref" href="#id19">7 Common problems</a></h1> +<h1><a class="toc-backref" href="#id23">7 Common problems</a></h1> <div class="section" id="namespace-prefix-mis-match"> -<h2><a class="toc-backref" href="#id20">7.1 Namespace prefix mis-match</a></h2> +<h2><a class="toc-backref" href="#id24">7.1 Namespace prefix mis-match</a></h2> <p><tt class="docutils literal">generateDS.py</tt> is not very intelligent about detecting what prefix is used in the schema file for the XML Schema namespace. When this problem occurs, you may see the following when running @@ -933,9 +1107,64 @@ you will need to use the "-a" command line option when you run generateDS.py -a "xsd:" --super=mylib -o mylib.py -s myapp.py someschema.xsd </pre> </div> +<div class="section" id="using-multiple-subclass-modules-with-the-same-superclass-module"> +<h2><a class="toc-backref" href="#id25">7.2 Using multiple subclass modules with the same superclass module</a></h2> +<p>Suppose that from a single XML schema, you have generated a +superclass module and a subclass module (using the "-o" and "-s" +command line options). Now you make a copy of the subclass module. +Next you add special and different code to each of the subclass +modules. You can run these two subclass modules separately and +(after a bit of debugging) each works fine. And, you can import +each subclass module in separate applications, and things are still +good. However, if you import both subclass modules into a single +application, you find that one of them is "ignored" by the +superclass module when it parses XML instance documents and builds +classes. Effectively, each subclass module, when it is imported, +sets a class variable (<tt class="docutils literal">subclass</tt>) in each superclass to the +subclass to be used by the superclass, and the last subclass +imported module wins.</p> +<p>There are two alternative solutions to this problem:</p> +<ol class="arabic"> +<li><p class="first">Use the script/function provided by the distribution in file +<tt class="docutils literal">fix_subclass_refs.py</tt>. The doc string in that module explains +how to use it and gives an example of its use.</p> +</li> +<li><p class="first">Each generated superclass module (starting with <tt class="docutils literal">generateDS.py</tt> +version 2-19a) contains a global variable +<tt class="docutils literal">CurrentSubclassModule_</tt>. The value of this variable, if it is +not None, overrides the value of the class variable <tt class="docutils literal">subclass</tt> +in each generated superclass. You can change the value of this +variable before parsing an XML document and building instances of +the generated classes to determine which subclass module is to be +used during the "build" phase.</p> +<p>Here is an example of the use of this feature:</p> +<pre class="literal-block"> +#!/usr/bin/env python + +import lib01suba +import lib01subb + +def test(): + lib01suba.supermod.CurrentSubclassModule_ = lib01suba + roota = lib01suba.parse('test01.xml', silence=True) + lib01subb.supermod.CurrentSubclassModule_ = lib01subb + rootb = lib01subb.parse('test01.xml', silence=True) + roota.show() + print '-' * 50 + rootb.show() + +test() +</pre> +</li> +</ol> +<p>The second alternative (above) is likely to be a more convenient +solution in most cases. But, there are possibly use cases where the +use of <tt class="docutils literal">fix_subclass_refs.py</tt> or a modified version of it will be +helpful.</p> +</div> </div> <div class="section" id="supported-features-of-xml-schema"> -<h1><a class="toc-backref" href="#id21">8 Supported features of XML Schema</a></h1> +<h1><a class="toc-backref" href="#id26">8 Supported features of XML Schema</a></h1> <p>The following constructs, among others, in XML Schema are supported:</p> <ul class="simple"> @@ -950,14 +1179,14 @@ Schema document.</li> and structures. Also see the section on <a class="reference internal" href="#the-xml-schema-input-to-generateds">The XML Schema Input to generateDS</a>.</p> <div class="section" id="attributes-no-nested-children"> -<h2><a class="toc-backref" href="#id22">8.1 Attributes + no nested children</a></h2> +<h2><a class="toc-backref" href="#id27">8.1 Attributes + no nested children</a></h2> <p>Element definitions that contain attributes but <em>no</em> nested child elements provide access to their data content through getter and setter methods <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt> and member variable <tt class="docutils literal">valueOf_</tt>.</p> </div> <div class="section" id="mixed-content"> -<h2><a class="toc-backref" href="#id23">8.2 Mixed content</a></h2> +<h2><a class="toc-backref" href="#id28">8.2 Mixed content</a></h2> <p>Elements that are defined to contain both text and nested child elements have "mixed content". <tt class="docutils literal">generateDS.py</tt> provides access to mixed content, but the generated data structures (classes) are @@ -970,7 +1199,7 @@ elements, character data is captured in a member variable <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt>.</p> </div> <div class="section" id="anyattribute"> -<h2><a class="toc-backref" href="#id24">8.3 anyAttribute</a></h2> +<h2><a class="toc-backref" href="#id29">8.3 anyAttribute</a></h2> <p><tt class="docutils literal">generateDS.py</tt> supports <tt class="docutils literal">anyAttribute</tt>. For example, if an element is defined as follows:</p> <pre class="literal-block"> @@ -990,7 +1219,7 @@ as well as code for parsing and export. <tt class="docutils literal">generateDS. <tt class="docutils literal">processContents</tt>. See section <a class="reference internal" href="#id5">anyAttribute</a> for more details.</p> </div> <div class="section" id="element-extensions"> -<h2><a class="toc-backref" href="#id25">8.4 Element extensions</a></h2> +<h2><a class="toc-backref" href="#id30">8.4 Element extensions</a></h2> <p><tt class="docutils literal">generateDS.py</tt> now generates subclasses for extensions, that is when an element definition contains something like this:</p> <pre class="literal-block"> @@ -1009,7 +1238,7 @@ its superclass has been generated. Therefore, the order in which classes are generated may be different from what you expect.</p> </div> <div class="section" id="attribute-groups"> -<h2><a class="toc-backref" href="#id26">8.5 Attribute groups</a></h2> +<h2><a class="toc-backref" href="#id31">8.5 Attribute groups</a></h2> <p><tt class="docutils literal">generateDS.py</tt> now handles definition and use of attribute groups. For example: the use of something like the following:</p> <pre class="literal-block"> @@ -1033,7 +1262,7 @@ groups. For example: the use of something like the following:</p> groups themselves can contain references to other attribute groups.</p> </div> <div class="section" id="substitution-groups"> -<h2><a class="toc-backref" href="#id27">8.6 Substitution groups</a></h2> +<h2><a class="toc-backref" href="#id32">8.6 Substitution groups</a></h2> <p><tt class="docutils literal">generateDS.py</tt> now handles a limited range of substitution groups, but, there is an important <strong>limitation</strong>, in particular <tt class="docutils literal">generateDS.py</tt> handles substitution groups that involve complex @@ -1044,7 +1273,7 @@ does not provide the needed information to handle substitution groups.</p> </div> <div class="section" id="primitive-types"> -<h2><a class="toc-backref" href="#id28">8.7 Primitive types</a></h2> +<h2><a class="toc-backref" href="#id33">8.7 Primitive types</a></h2> <p><tt class="docutils literal">generateDS.py</tt> supports some, but not all, simple types defined in "XML Schema Part 0: Primer Second Edition" ( <a class="reference external" href="http://www.w3.org/TR/xmlschema-0/">http://www.w3.org/TR/xmlschema-0/</a>. See section "Simple Types" and @@ -1071,7 +1300,7 @@ validation.</li> </ul> </div> <div class="section" id="simpletype"> -<h2><a class="toc-backref" href="#id29">8.8 simpleType</a></h2> +<h2><a class="toc-backref" href="#id34">8.8 simpleType</a></h2> <p><tt class="docutils literal">generateDS.py</tt> generates minimal support for members defined as <tt class="docutils literal">simpleType</tt>. However, the code generated by <tt class="docutils literal">generateDS.py</tt> does <strong>not</strong> enforce restrictions. For notes on how to enforce @@ -1110,7 +1339,7 @@ generate valid code:</p> </pre> </div> <div class="section" id="list-values-optional-values-maxoccurs-etc"> -<h2><a class="toc-backref" href="#id30">8.9 List values, optional values, maxOccurs, etc.</a></h2> +<h2><a class="toc-backref" href="#id35">8.9 List values, optional values, maxOccurs, etc.</a></h2> <p>For elements defined with <tt class="docutils literal"><span class="pre">maxOccurs="unbounded"</span></tt>, <tt class="docutils literal">generateDS.py</tt> generates code that processes a list of elements.</p> <p>For elements defined with <tt class="docutils literal"><span class="pre">minOccurs="0"</span></tt> and <tt class="docutils literal"><span class="pre">maxOccurs="1"</span></tt>, @@ -1118,9 +1347,55 @@ generate valid code:</p> that element has a (non-None) value.</p> </div> <div class="section" id="simpletype-and-validators"> -<h2><a class="toc-backref" href="#id31">8.10 simpleType and validators</a></h2> -<p>Here are a few notes that should help you use validator methods to -enforce restrictions.</p> +<h2><a class="toc-backref" href="#id36">8.10 simpleType and validators</a></h2> +<div class="section" id="generating-validator-bodies-from-xml-schema"> +<h3><a class="toc-backref" href="#id37">8.10.1 Generating validator bodies from XML schema</a></h3> +<p>If you do <em>not</em> use the <tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt> command line +option, then <tt class="docutils literal">generateDS.py</tt> will generate validation code +directly from the restrictions specified inside the <tt class="docutils literal">simpleType</tt> +definitions in your XML schema.</p> +<p>Here is a bit of explanation of what that generated code will do.</p> +<ul class="simple"> +<li>The generated validation code checks the global variable +<tt class="docutils literal">Validate_simpletypes_</tt>. Set that variable to <tt class="docutils literal">False</tt> to turn +off validation.</li> +<li>In the case of some XML schema built-in simple types, the +generated validation code calls <tt class="docutils literal">gds_validate_xxx</tt>, where "xxx" +is a base, simple type. In some cases, you will be able to add +additional code to that method to perform custom checking. See +section <a class="reference internal" href="#overridable-methods">Overridable methods</a> for information on how to use and +override that class.</li> +<li>When validation finds data that fails to validate, it generates a +warning (using the <tt class="docutils literal">warnings</tt> module from the Python standard +library), not an exception, so that processing continues.</li> +<li>The validation code is generated in a separate method named +<tt class="docutils literal">validate_xxx</tt>, where "xxx" is the name of the data element. +This method is called in the <tt class="docutils literal">build</tt> method as the input data is +parsed and instances of the generated classes are created to hold +it. Your own code can also call this method whenever you'd like +to perform on the data in that element/field.</li> +<li>There are rules for how checking should be performed when (1) +there are multiple restrictions in a single <tt class="docutils literal">simpleType</tt> and +when there are restrictions in a <tt class="docutils literal">simpleType</tt> and it base simple +types. <tt class="docutils literal">generateds.py</tt> attempts to follow those rules in +generating validation code. For information about that, see: +<a class="reference external" href="http://www.w3.org/TR/xmlschema-2/#rf-facets">http://www.w3.org/TR/xmlschema-2/#rf-facets</a>. Pattern facets are +especially tricky, because pattern restrictions at the same level +are OR-ed together, while pattern restrictions at different levels +are AND-ed together. See: +<a class="reference external" href="http://www.w3.org/TR/xmlschema-2/#rf-pattern">http://www.w3.org/TR/xmlschema-2/#rf-pattern</a>.</li> +<li>The validation method also performs type conversion for some +simple types, for example, string to int for integers, string to +float for floats, etc.</li> +</ul> +</div> +<div class="section" id="user-written-validator-bodies"> +<h3><a class="toc-backref" href="#id38">8.10.2 User written validator bodies</a></h3> +<p>This is the older, more manual method. In order to generate code +that uses this method, use command line option +<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt>.</p> +<p>Here are a few notes that should help you <em>write your own</em> validator +methods to enforce restrictions.</p> <ul> <li><p class="first">Default behavior -- The generated code, by default, treats the value of a member whose type is a <tt class="docutils literal">simpleType</tt> as if it were @@ -1231,8 +1506,33 @@ So, for example, the following works:</p> </li> </ul> </div> +<div class="section" id="turning-off-validation-of-simpletype-data"> +<h3><a class="toc-backref" href="#id39">8.10.3 Turning off validation of <tt class="docutils literal">simpleType</tt> data</a></h3> +<p>If you do not want validation performed on <tt class="docutils literal">simpleType</tt> data, you +have these options:</p> +<ol class="arabic simple"> +<li>When generating your code, use the +<tt class="docutils literal"><span class="pre">--use-old-simpletype-validators</span></tt> command line option but do +<em>not</em> use the <tt class="docutils literal"><span class="pre">--validator-bodies</span></tt> command line option. This +will result in validator methods that have empty bodies (only a +<tt class="docutils literal">pass</tt> statement).</li> +<li>Or, when you run your generated code, set the variable +<tt class="docutils literal">Validate_simpletypes_</tt> to <tt class="docutils literal">False</tt>. This global variable is +near the top of your generated module. It can be set to <tt class="docutils literal">True</tt> +or <tt class="docutils literal">False</tt> before and during processing to turn validation on +and off.</li> +</ol> +</div> +<div class="section" id="additional-notes-on-simpletype-validation"> +<h3><a class="toc-backref" href="#id40">8.10.4 Additional notes on <tt class="docutils literal">simpleType</tt> validation</a></h3> +<p>Don't forget that <tt class="docutils literal">xmllint</tt> can also be used to perform +validation against the XML scheme. This validation includes +checking against <tt class="docutils literal">simpleType</tt> restrictions. See +<a class="reference external" href="http://xmlsoft.org/">http://xmlsoft.org/</a> for more information on <tt class="docutils literal">xmllint</tt>.</p> +</div> +</div> <div class="section" id="include-file-processing"> -<h2><a class="toc-backref" href="#id32">8.11 Include file processing</a></h2> +<h2><a class="toc-backref" href="#id41">8.11 Include file processing</a></h2> <p>By default, generateDS.py will insert content from files referenced by <tt class="docutils literal">include</tt> elements into the XML Schema to be processed. This behavior can be turned off by using the "--no-process-includes" @@ -1241,18 +1541,12 @@ command line option.</p> inserted in the XML Schema by importing and using <tt class="docutils literal">process_includes.py</tt>, which is included in the <tt class="docutils literal">generateDS.py</tt> distribution.</p> -<p><tt class="docutils literal">process_includes.py</tt> will use either <tt class="docutils literal">lxml</tt> or <tt class="docutils literal">ElementTree</tt>, -but its preference is <tt class="docutils literal">lxml</tt> because <tt class="docutils literal">lxml</tt> attempts to preserve -namespace prefixes. So if your XML Schemas have <tt class="docutils literal"><include ... /></tt> -elements in them, you might want to consider installing <tt class="docutils literal">lxml</tt>, even -though <tt class="docutils literal">ElementTree</tt> is in the Python standard library for Python -versions >= 2.5.</p> <p>The include file processing is capable of retrieve included files via FTP and HTTP internet protocols as well as from the local file system.</p> </div> <div class="section" id="abstract-types"> -<h2><a class="toc-backref" href="#id33">8.12 Abstract types</a></h2> +<h2><a class="toc-backref" href="#id42">8.12 Abstract types</a></h2> <p><tt class="docutils literal">generateDS.py</tt> has support for abstract types. For more on this, see: <a class="reference external" href="http://www.w3.org/TR/xmlschema-0/#abstract">XML Schema Part 0: Primer Second Edition: Abstract Elements and Types -- @@ -1260,7 +1554,7 @@ http://www.w3.org/TR/xmlschema-0/#abstract</a>.</p> </div> </div> <div class="section" id="the-xml-schema-input-to-generateds"> -<h1><a class="toc-backref" href="#id34">9 The XML schema input to generateDS</a></h1> +<h1><a class="toc-backref" href="#id43">9 The XML schema input to generateDS</a></h1> <p><strong>Note:</strong> Quite a bit of work has been done on <tt class="docutils literal">generateDS.py</tt> since this section was written. So, it accepts and processes more of features in XML Schema than earlier. The best advice is to @@ -1380,11 +1674,11 @@ order to define a member data item that takes an instance or list of instances of a Python class.</li> </ul> <div class="section" id="additional-constructions"> -<h2><a class="toc-backref" href="#id35">9.1 Additional constructions</a></h2> +<h2><a class="toc-backref" href="#id44">9.1 Additional constructions</a></h2> <p>Here are a few additional constructions that <tt class="docutils literal">generateDS.py</tt> understands.</p> <div class="section" id="complextype-at-top-level"> -<h3><a class="toc-backref" href="#id36">9.1.1 <complexType> at top-level</a></h3> +<h3><a class="toc-backref" href="#id45">9.1.1 <complexType> at top-level</a></h3> <p>You can use the <complexType> element at top level (instead of <element>) to define an element. So, for example, instead of:</p> <pre class="literal-block"> @@ -1408,7 +1702,7 @@ understands.</p> </pre> </div> <div class="section" id="use-of-ref-instead-of-name-and-type-attributes"> -<h3><a class="toc-backref" href="#id37">9.1.2 Use of "ref" instead of "name" and "type" attributes</a></h3> +<h3><a class="toc-backref" href="#id46">9.1.2 Use of "ref" instead of "name" and "type" attributes</a></h3> <p>You can use the "ref" attribute to refer to another element definition, instead of using the "name" and "type" attributes. So, for example, you can use the following:</p> @@ -1433,7 +1727,7 @@ for example, you can use the following:</p> </pre> </div> <div class="section" id="extension-types"> -<h3><a class="toc-backref" href="#id38">9.1.3 Extension types</a></h3> +<h3><a class="toc-backref" href="#id47">9.1.3 Extension types</a></h3> <p><tt class="docutils literal">generateDS.py</tt> generates a subclass for each element that that is defined as the extension of a base element. So, for the following:</p> @@ -1455,7 +1749,7 @@ class BType(AType): </pre> </div> <div class="section" id="elements-containing-mixed-content"> -<h3><a class="toc-backref" href="#id39">9.1.4 Elements containing mixed content</a></h3> +<h3><a class="toc-backref" href="#id48">9.1.4 Elements containing mixed content</a></h3> <p><tt class="docutils literal">generateDS.py</tt> generates special code to handle elements defined as containing mixed content, that is elements defined with attribute <tt class="docutils literal"><span class="pre">mixed="true"</span></tt>. See section <a class="reference internal" href="#id3">Mixed content</a> for more @@ -1464,7 +1758,7 @@ details.</p> </div> </div> <div class="section" id="id2"> -<span id="xmlbehaviors"></span><h1><a class="toc-backref" href="#id40">10 XMLBehaviors</a></h1> +<span id="xmlbehaviors"></span><h1><a class="toc-backref" href="#id49">10 XMLBehaviors</a></h1> <p>With the use of the "-b" command line option, <tt class="docutils literal">generateDS.py</tt> will also accept as input an XML document instance that describes behaviors to be added to subclasses when the subclass file is @@ -1476,7 +1770,7 @@ for the most part, designed by gian paolo ciceri (<a class="reference external" href="mailto:gp.ciceri@suddenthinks.com">gp.ciceri@suddenthinks.com</a>). This work is part of our work on our application development project for Quixote.</p> <div class="section" id="the-xmlbehaviors-input-file"> -<h2><a class="toc-backref" href="#id41">10.1 The XMLBehaviors input file</a></h2> +<h2><a class="toc-backref" href="#id50">10.1 The XMLBehaviors input file</a></h2> <p>This section describes the XMLBehavior XML document that is used as input to <tt class="docutils literal">generateDS.py</tt>. The XMLBehavior XML document is an XML instance document (given as an argument to the "-b" command @@ -1549,7 +1843,7 @@ of the base-impl-url.</li> </ul> </div> <div class="section" id="implementing-other-sources-for-implementation-bodies"> -<h2><a class="toc-backref" href="#id42">10.2 Implementing other sources for implementation bodies</a></h2> +<h2><a class="toc-backref" href="#id51">10.2 Implementing other sources for implementation bodies</a></h2> <p><tt class="docutils literal">generateDS.py</tt> contains a function <tt class="docutils literal">get_impl_body()</tt> that implements the ability to retrieve implementation bodies. The current implementation retrieves implementation bodies from an @@ -1590,11 +1884,11 @@ def get_impl_body(classBehavior, baseImplUrl, implUrl): </div> </div> <div class="section" id="additional-features"> -<h1><a class="toc-backref" href="#id43">11 Additional features</a></h1> +<h1><a class="toc-backref" href="#id52">11 Additional features</a></h1> <p>Here are additional features, contributed by users such as Chris Allan. Many thanks.</p> <div class="section" id="xsd-list-element-support"> -<h2><a class="toc-backref" href="#id44">11.1 xsd:list element support</a></h2> +<h2><a class="toc-backref" href="#id53">11.1 xsd:list element support</a></h2> <p>xsd:list elements can be used with a child xsd:simpleType which confuses the XschemaHandler stack unrolling. xsd:list element support should allow the following XML Schema definition to be @@ -1612,18 +1906,18 @@ supported in <tt class="docutils literal">generateDS.py</tt>:</p> </pre> </div> <div class="section" id="xsd-enumeration-support"> -<h2><a class="toc-backref" href="#id45">11.2 xsd:enumeration support</a></h2> +<h2><a class="toc-backref" href="#id54">11.2 xsd:enumeration support</a></h2> <p>The enumerated values for the parent element are resolved and made available through the instance attribute <tt class="docutils literal">values</tt>.</p> </div> <div class="section" id="xsd-union-support"> -<h2><a class="toc-backref" href="#id46">11.3 xsd:union support</a></h2> +<h2><a class="toc-backref" href="#id55">11.3 xsd:union support</a></h2> <p>In order to properly resolve and query types which are unions in an XML Schema, an element's membership in an xsd:union is available through the instance attribute <tt class="docutils literal">unionOf</tt>.</p> </div> <div class="section" id="extended-xsd-choice-support"> -<h2><a class="toc-backref" href="#id47">11.4 Extended xsd:choice support</a></h2> +<h2><a class="toc-backref" href="#id56">11.4 Extended xsd:choice support</a></h2> <p>When a parent xsd:choice is exists, an element's "maxOccurs" and "minOccurs" values can be inherited from the xsd:choice rather than the element itself. xsd:choice elements have been added to @@ -1643,7 +1937,7 @@ supported in <tt class="docutils literal">generateDS.py</tt>:</p> </pre> </div> <div class="section" id="arity-minoccurs-maxoccurs-etc"> -<h2><a class="toc-backref" href="#id48">11.5 Arity, minOccurs, maxOccurs, etc</a></h2> +<h2><a class="toc-backref" href="#id57">11.5 Arity, minOccurs, maxOccurs, etc</a></h2> <p>Some applications require information about the "minOccurs" and "maxOccurs" attributes in the XML Schema. Some of that information can be obtained by using the --member-specs= (list|dict) command line @@ -1652,7 +1946,7 @@ that it generates in each data representation class. In particular, look at the <tt class="docutils literal">get_container</tt> method (from class <tt class="docutils literal">MemberSpec_</tt>).</p> </div> <div class="section" id="more-thorough-content-type-and-base-type-resolution"> -<h2><a class="toc-backref" href="#id49">11.6 More thorough content type and base type resolution</a></h2> +<h2><a class="toc-backref" href="#id58">11.6 More thorough content type and base type resolution</a></h2> <p>The previous content type and base type resolution is insufficient for some needs. Basically it was unable to handle more complex and shared element and simpleType definitions. This support has @@ -1665,7 +1959,7 @@ achieved is available as comments in the source code of class <tt class="docutils literal">XschemaElement</tt>.</p> </div> <div class="section" id="making-top-level-simpletypes-available-from-xschemahandler"> -<h2><a class="toc-backref" href="#id50">11.7 Making top level simpleTypes available from XschemaHandler</a></h2> +<h2><a class="toc-backref" href="#id59">11.7 Making top level simpleTypes available from XschemaHandler</a></h2> <p>Some developers working to extend the analysis and code generation in <tt class="docutils literal">generateDS.py</tt> may be helped by additional information collected during the parsing of the XML Schema file.</p> @@ -1676,7 +1970,7 @@ available as an instance attribute <tt class="docutils literal">topLevelSimpleTy <tt class="docutils literal">XschemaHandler</tt>.</p> </div> <div class="section" id="namespaces-inserting-namespace-definition-in-exported-documents"> -<h2><a class="toc-backref" href="#id51">11.8 Namespaces -- inserting namespace definition in exported documents</a></h2> +<h2><a class="toc-backref" href="#id60">11.8 Namespaces -- inserting namespace definition in exported documents</a></h2> <p>In some cases, the document produced by a call to an export method will contain elements that have namespace prefixes. For example, the following snippet contains namespace prefix "abc":</p> @@ -1722,7 +2016,7 @@ generateDS.py --namespacedef='xmlns:abc="http://www.abc.com/namespace.xsd&q <tt class="docutils literal">namespacedef_</tt> argument to the call to export.</p> </div> <div class="section" id="support-for-xs-any"> -<h2><a class="toc-backref" href="#id52">11.9 Support for xs:any</a></h2> +<h2><a class="toc-backref" href="#id61">11.9 Support for xs:any</a></h2> <p>There is minimal support for the <tt class="docutils literal">xs:any</tt> wild card declaration. Effectively, an element defined by an <tt class="docutils literal">xs:complexType</tt> containing <tt class="docutils literal">xs:any</tt> can contain any element type as a child element. Because @@ -1749,7 +2043,7 @@ with <tt class="docutils literal">xs:any</tt> should help you understand what is copy, paste, and edit code from there.</p> </div> <div class="section" id="generating-lxml-element-tree"> -<h2><a class="toc-backref" href="#id53">11.10 Generating Lxml Element tree</a></h2> +<h2><a class="toc-backref" href="#id62">11.10 Generating Lxml Element tree</a></h2> <p>Once you have build the tree of objects that are instances of the classes generated by <tt class="docutils literal">generateDS.py</tt>, you can use this to produce a tree of instances of the Lxml Element instances. See @@ -1779,7 +2073,7 @@ def parseEtree(inFileName): return rootObj, rootElement, mapping, reverse_mapping </pre> <div class="section" id="mapping-generateds-objects-to-lxml-elements-and-back"> -<h3><a class="toc-backref" href="#id54">11.10.1 Mapping generateDS objects to Lxml Elements and back</a></h3> +<h3><a class="toc-backref" href="#id63">11.10.1 Mapping generateDS objects to Lxml Elements and back</a></h3> <p>Now suppose that you have produced the tree of instances of the generated classes, and suppose that you have used that to produce a tree of instances of the Element class from Lxml. It may be useful @@ -1792,11 +2086,71 @@ convenience method <tt class="docutils literal">gds_reverse_node_mapping</tt> fr <tt class="docutils literal">GeneratedsSuper</tt>. Again, see the code above for an example.</p> </div> </div> +<div class="section" id="specifying-names-for-anonymous-nested-type-definitions"> +<h2><a class="toc-backref" href="#id64">11.11 Specifying names for anonymous nested type definitions</a></h2> +<p><tt class="docutils literal">generateDS.py</tt> automatically assigns names for types (and the +classes generated from them), when that type definition (for +example, <tt class="docutils literal">xs:complexType</tt>) does not have a name and it is nested +inside another type definition. However, these assigned names, in +part because of the need to make them unique, can be difficult to +predict.</p> +<p>Therefore, <tt class="docutils literal">generateDS.py</tt> provides a way to specify the names of +the Python classes generated from these anonymous, nested types. To +do so, follow these steps:</p> +<ol class="arabic"> +<li><p class="first">Create a module named <tt class="docutils literal">gds_inner_name_map</tt> +(<tt class="docutils literal">gds_inner_name_map.py</tt>).</p> +</li> +<li><p class="first">Place that module where Python can import it when you run +<tt class="docutils literal">generateDS.py</tt>. You can do this either by adding an +additional directory to the environment variable <tt class="docutils literal">PYTHONPATH</tt> +or by placing <tt class="docutils literal">gds_inner_name_map.py</tt> in a directory that is +already on Python's search path for modules. You can check this +by running the following Python code snippet:</p> +<pre class="literal-block"> +import sys +print sys.path +</pre> +<p>Also see: <a class="reference external" href="https://docs.python.org/2/library/sys.html#sys.path">https://docs.python.org/2/library/sys.html#sys.path</a></p> +</li> +<li><p class="first">In module <tt class="docutils literal">gds_inner_name_map</tt>, define a global variable +<tt class="docutils literal">Inner_name_map</tt>. The value of this variable should be a +dictionary that maps 2-tuples containing (a) the name of the +grandparent type and (b) the name of the parent type onto the new +name.</p> +</li> +</ol> +<p>If <tt class="docutils literal">generateDS.py</tt> cannot import <tt class="docutils literal">Inner_name_map</tt> from +<tt class="docutils literal">gds_inner_name_map</tt>, then it will, by default, generate unique +names. In particular, it automatically generates names for +anonymous, nested types when the following Python statement fails:</p> +<pre class="literal-block"> +from gds_inner_name_map import Inner_name_map +</pre> +<p>Here is an example of module <tt class="docutils literal">gds_inner_name_map.py</tt>:</p> +<pre class="literal-block"> +Inner_name_map = { + ("classAType", "inner"): "inner_001", + ("classBType", "inner"): "inner_002", +} +</pre> +<p>Usage hints:</p> +<ul class="simple"> +<li>When <tt class="docutils literal">generateDS.py</tt> succeeds in importing <tt class="docutils literal">Inner_name_map</tt> +from <tt class="docutils literal">gds_inner_name_map</tt>, but <em>cannot</em> find one of the required +mappings in that dictionary, it will throw an exception and print +out the missing mapping. You can copy this line; paste it into +your <tt class="docutils literal">gds_inner_name_map.py</tt>; and edit it so as to specify the +class name of your choice.</li> +<li>Make sure that the names you specify are unique within your XML +schema.</li> +</ul> +</div> </div> <div class="section" id="how-to-use-the-generated-source-code"> -<h1><a class="toc-backref" href="#id55">12 How-to Use the generated source code</a></h1> +<h1><a class="toc-backref" href="#id65">12 How to use the generated source code</a></h1> <div class="section" id="the-parsing-functions"> -<h2><a class="toc-backref" href="#id56">12.1 The parsing functions</a></h2> +<h2><a class="toc-backref" href="#id66">12.1 The parsing functions</a></h2> <p>The simplest use is to call one of the parsing functions in the generated source file. You may be able to use one of these functions without change, or can modify one to fit your needs. @@ -1822,7 +2176,7 @@ rootObject = people.parse('people.xml') </pre> </div> <div class="section" id="recognizing-the-top-level-element"> -<h2><a class="toc-backref" href="#id57">12.2 Recognizing the top level element</a></h2> +<h2><a class="toc-backref" href="#id67">12.2 Recognizing the top level element</a></h2> <p>It might be that the generated module, when parsing an XML instance document, does not, by default, recognize the top level (root) element in an instance document. This might happen because @@ -1943,14 +2297,14 @@ function can parse and export it.</p> </ol> </div> <div class="section" id="the-export-methods"> -<h2><a class="toc-backref" href="#id58">12.3 The export methods</a></h2> +<h2><a class="toc-backref" href="#id68">12.3 The export methods</a></h2> <p>The generated classes contain methods <tt class="docutils literal">export</tt> and <tt class="docutils literal">exportLiteral</tt> which can be called to export classes to several text formats, in particular to an XML instance document and a Python module containing Python literals. See the generated parse functions for examples showing how to call the export methods.</p> <div class="section" id="method-export"> -<h3><a class="toc-backref" href="#id59">12.3.1 Method export</a></h3> +<h3><a class="toc-backref" href="#id69">12.3.1 Method export</a></h3> <p>The export method in generated classes writes out an XML document that represents the instance that contains it and its child elements. So, for example, if your instance tree was created by @@ -1959,14 +2313,14 @@ one of the parsing functions described above, then calling document, differing only with respect to ignorable white space.</p> </div> <div class="section" id="method-exportliteral"> -<h3><a class="toc-backref" href="#id60">12.3.2 Method <tt class="docutils literal">exportLiteral</tt></a></h3> +<h3><a class="toc-backref" href="#id70">12.3.2 Method <tt class="docutils literal">exportLiteral</tt></a></h3> <p><tt class="docutils literal">generateDS.py</tt> generates Python classes that represent the elements in an XML document, given an Xschema definition of the XML document type. The <tt class="docutils literal">exportLiteral</tt> method will export a Python literal representation of the Python instances of the classes that represent an XML document.</p> <div class="section" id="what-it-does"> -<h4><a class="toc-backref" href="#id61">12.3.2.1 What It Does</a></h4> +<h4><a class="toc-backref" href="#id71">12.3.2.1 What It Does</a></h4> <p>When <tt class="docutils literal">generateDS.py</tt> generates the Python source code for your classes, this new feature also generates an <tt class="docutils literal">exportLiteral</tt> method in each class. If you call this method on the root @@ -1980,7 +2334,7 @@ that you can import to (re-)create instances of the classes that represent your XML document.</p> </div> <div class="section" id="why-you-might-care"> -<h4><a class="toc-backref" href="#id62">12.3.2.2 Why You Might Care</a></h4> +<h4><a class="toc-backref" href="#id72">12.3.2.2 Why You Might Care</a></h4> <p><tt class="docutils literal">generateDS.py</tt> was designed and built with the assumption that we are <em>not</em> interested in marking up text content at all. What we really want is a way to represent structured and nested date in @@ -2023,13 +2377,13 @@ import.</li> </ul> </div> <div class="section" id="how-to-use-it"> -<h4><a class="toc-backref" href="#id63">12.3.2.3 How to use it</a></h4> +<h4><a class="toc-backref" href="#id73">12.3.2.3 How to use it</a></h4> <p>See the generated function <tt class="docutils literal">parseLiteral</tt> for an example of how to use <tt class="docutils literal">exportLiteral</tt>.</p> </div> </div> <div class="section" id="exporting-compact-xml-documents"> -<h3><a class="toc-backref" href="#id64">12.3.3 Exporting compact XML documents</a></h3> +<h3><a class="toc-backref" href="#id74">12.3.3 Exporting compact XML documents</a></h3> <p>You can also export "compact" XML documents. A compact document is one that is exported <em>without</em> the ignorable whitespace that is used to produce pretty printed documents. In contrast, a pretty printed @@ -2043,7 +2397,7 @@ default.</p> </div> </div> <div class="section" id="building-instances"> -<h2><a class="toc-backref" href="#id65">12.4 Building instances</a></h2> +<h2><a class="toc-backref" href="#id75">12.4 Building instances</a></h2> <p>If you have an instance of a minidom node that represents an element in an XML document, you can also use the 'build' member function to populate an instance of the corresponding class. Here @@ -2063,7 +2417,7 @@ for child in rootNode.childNodes: </pre> </div> <div class="section" id="using-the-subclass-module"> -<h2><a class="toc-backref" href="#id66">12.5 Using the subclass module</a></h2> +<h2><a class="toc-backref" href="#id76">12.5 Using the subclass module</a></h2> <p>If you choose to use the generated subclass module, and I encourage you to do so, you may need to edit and modify that file. Here are some of the things that you must do (look for @@ -2090,14 +2444,14 @@ accessed through getter and setter methods in the class in which they are referenced.</p> </div> <div class="section" id="elements-with-attributes-but-no-nested-children"> -<h2><a class="toc-backref" href="#id67">12.6 Elements with attributes but no nested children</a></h2> +<h2><a class="toc-backref" href="#id77">12.6 Elements with attributes but no nested children</a></h2> <p>Element definitions that contain attributes but <em>no</em> nested child elements provide access to their data content through getter and setter methods <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt> and member variable <tt class="docutils literal">valueOf_</tt>.</p> </div> <div class="section" id="id4"> -<span id="id3"></span><h2><a class="toc-backref" href="#id68">12.7 Mixed content</a></h2> +<span id="id3"></span><h2><a class="toc-backref" href="#id78">12.7 Mixed content</a></h2> <p>The goal of <tt class="docutils literal">generateDS.py</tt> is to support data structures represented in XML as opposed to text mark-up. However, it does provides some support for mixed content. But, for mixed content, @@ -2165,7 +2519,7 @@ elements, character data is captured in a member variable <tt class="docutils literal">getValueOf_</tt> and <tt class="docutils literal">setValueOf_</tt>.</p> </div> <div class="section" id="id6"> -<span id="id5"></span><h2><a class="toc-backref" href="#id69">12.8 anyAttribute</a></h2> +<span id="id5"></span><h2><a class="toc-backref" href="#id79">12.8 anyAttribute</a></h2> <p>For elements that specify <tt class="docutils literal">anyAttributes</tt>, <tt class="docutils literal">generateDS.py</tt> produces a class containing the following:</p> <ul class="simple"> @@ -2186,7 +2540,7 @@ are <em>not</em> stored in the dictionary <tt class="docutils literal">anyAttrib <tt class="docutils literal">anyAttribute</tt> element in the XML Schema</p> </div> <div class="section" id="user-methods"> -<h2><a class="toc-backref" href="#id70">12.9 User Methods</a></h2> +<h2><a class="toc-backref" href="#id80">12.9 User Methods</a></h2> <p><tt class="docutils literal">generateDS.py</tt> provides a mechanism that enables you to attach user defined methods to specific generated classes. In order to do so, create a Python module containing specifications of those @@ -2308,7 +2662,7 @@ source code and the class_name pattern in each specification.</li> </ol> </div> <div class="section" id="overridable-methods"> -<h2><a class="toc-backref" href="#id71">12.10 Overridable methods</a></h2> +<h2><a class="toc-backref" href="#id81">12.10 Overridable methods</a></h2> <p><tt class="docutils literal">generateDS.py</tt> generates calls to several methods that each have a default implementation in a superclass. The default superclass with default implementations is included in the generated code. @@ -2353,9 +2707,10 @@ default methods in the following places:</p> <li><p class="first">In a class named <tt class="docutils literal">GeneratedsSuper</tt> in a separate module named <tt class="docutils literal">generatedssuper</tt>. Since this class would replace the default implementations, you should provide implementations of -all the default methods listed above in that class. The -distribution contains a <tt class="docutils literal">generatedssuper.py</tt> which you can -modify for your specific needs.</p> +all the default methods listed above in that class. To create +your own version, copy and paste the default implementation of +class <tt class="docutils literal">GeneratedsSuper</tt> from your generated module into a file +named <tt class="docutils literal">generatedssuper.py</tt>, then modify that.</p> </li> <li><p class="first">In individual generated (super) classes (the ones generated with the "-o" command line option) using the <a class="reference internal" href="#user-methods">User Methods</a> feature.</p> @@ -2426,7 +2781,7 @@ option for <tt class="docutils literal">generateDS.py</tt>.</p> </ul> </div> <div class="section" id="the-element-name-to-class-name-dictionary"> -<h2><a class="toc-backref" href="#id72">12.11 The element name to class name dictionary</a></h2> +<h2><a class="toc-backref" href="#id82">12.11 The element name to class name dictionary</a></h2> <p><tt class="docutils literal">generateDS.py</tt> automatically generates a dictionary that maps element/complexType names to the names of the class generated for that complexType definition. This dictionary is named @@ -2434,12 +2789,65 @@ that complexType definition. This dictionary is named with the "-o" option.</p> </div> </div> +<div class="section" id="one-per-generating-separate-files-from-imported-included-schemas"> +<h1><a class="toc-backref" href="#id83">13 "One Per" -- generating separate files from imported/included schemas</a></h1> +<p>The <tt class="docutils literal"><span class="pre">--one-file-per-xsd</span></tt> command line option enables you to +generate a separate Python module for each XML schema that is +imported or included (using <tt class="docutils literal"><xs:import></tt> or <tt class="docutils literal"><xs:include></tt>) by +a "master" schema. Then, in your Python application, these modules +can then be imported separately. Alternatively, these modules can +be placed in a Python package (a directory containing a file named +"__init__.py"). See +<a class="reference external" href="http://docs.python.org/2/tutorial/modules.html#packages">http://docs.python.org/2/tutorial/modules.html#packages</a> for more on +Python packages.</p> +<p>Here is a sample use:</p> +<pre class="literal-block"> +$ ../generateDS.py --one-file-per-xsd --output-directory="OnePer" --module-suffix="One" one_per.xsd +</pre> +<p>The above command does the following:</p> +<ul class="simple"> +<li>It generates one Python module for each XML schema that is +included/imported by <tt class="docutils literal">one_per.xsd</tt>.</li> +<li>It places the generated output files in the directory <tt class="docutils literal">OnePer</tt>.</li> +<li>It adds "One" as a suffix to the name of each generated module.</li> +</ul> +<p>Here are a few hints, guidelines, and suggestions:</p> +<ul> +<li><p class="first">At least one element definition in an included/imported module +must be a root element definition in order to cause a +module to be generated for that schema. In other words, the +module must contain an element definition of the form:</p> +<pre class="literal-block"> +<xs:element name="Sample" type="sampleType" /> +</pre> +</li> +<li><p class="first">You may want to write a separate "master" schema that includes +each of the schemas for which you want to generate a separate +Python module.</p> +</li> +<li><p class="first">Use the <tt class="docutils literal"><span class="pre">--output-directory=<directory></span></tt> command line option to +tell <tt class="docutils literal">generateDS.py</tt> to generate the Python modules in a +specific directory. The directory must already exist.</p> +</li> +<li><p class="first">Use the <tt class="docutils literal"><span class="pre">--module-suffix=<suffix></span></tt> command line option to add a +specifc suffix to each module name (the part immediately before +the extension). For example, the option <tt class="docutils literal"><span class="pre">--module-suffix=Abc</span></tt> +causes <tt class="docutils literal">generateDS.py</tt> to generate a file named "schema1Abc.py" +instead of "schema1.py".</p> +</li> +<li><p class="first">If you want to import files from the output directory and it is +not in <tt class="docutils literal">sys.path</tt>, add a file named "__init__.py" to that +directory. The existence of the file <tt class="docutils literal">__init__.py</tt> turns the +directory into a Python package.</p> +</li> +</ul> +</div> <div class="section" id="how-to-modify-the-generated-code"> -<h1><a class="toc-backref" href="#id73">13 How to modify the generated code</a></h1> +<h1><a class="toc-backref" href="#id84">14 How to modify the generated code</a></h1> <p>This section attempts to explain how to modify and add features to the generated code.</p> <div class="section" id="adding-features-to-class-definitions"> -<h2><a class="toc-backref" href="#id74">13.1 Adding features to class definitions</a></h2> +<h2><a class="toc-backref" href="#id85">14.1 Adding features to class definitions</a></h2> <p>You can add new member definitions to a generated class. Look at the 'export' and 'exportLiteral' member functions for examples of how to access member variables and how to walk nested @@ -2484,7 +2892,7 @@ parser, for example, since generating the file.</li> </div> </div> <div class="section" id="examples-and-demonstrations"> -<h1><a class="toc-backref" href="#id75">14 Examples and demonstrations</a></h1> +<h1><a class="toc-backref" href="#id86">15 Examples and demonstrations</a></h1> <p>Under the directory Demos are several examples:</p> <ul class="simple"> <li>Demos/People provides a simple demonstration of generating @@ -2501,20 +2909,33 @@ outline tree and writes out a outline.</li> structure.</li> <li>The implementation of filters and transformations on XML documents. The following paper discusses and compares this -technique with the use of XSLT: <a class="reference external" href="http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html">XSLT and generateDS -- +technique with the use of XSLT: <a class="reference external" href="http://www.davekuhlman.org/xsltvsgenerateds.html">XSLT and generateDS -- Analysis, Comparison, and Evaluation -- -http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html</a>.</li> +http://www.davekuhlman.org/xsltvsgenerateds.html</a>.</li> <li>Anything that requires a <em>customized</em> tree walk of the XML document. Because you can add methods to the generated classes containing explicit control logic, the order in which nodes of the parsed XML document are visited is under your control.</li> </ul> <div class="section" id="django-generating-models-and-forms"> -<h2><a class="toc-backref" href="#id76">14.1 Django -- Generating Models and Forms</a></h2> +<h2><a class="toc-backref" href="#id87">15.1 Django -- Generating Models and Forms</a></h2> <p><tt class="docutils literal">generateDS.py</tt> can be used to generate Django models and Django forms that represent the data structures defined in an XML Schema.</p> +<p><strong>Note:</strong> In order to use this capability, you must obtain the +"source" distribution of <tt class="docutils literal">generateDS.py</tt>. You can do this either +(1) by downloading <tt class="docutils literal"><span class="pre">generateDS-x.xxy.tar.gz</span></tt> from the Python +Package Index or (2) by downloading the distribution from Bitbucket +at <a class="reference external" href="https://bitbucket.org/dkuhlman/generateds">https://bitbucket.org/dkuhlman/generateds</a>. In particular, +installing <tt class="docutils literal">generateDS.py</tt> using <tt class="docutils literal">pip</tt> does not give you all the +files you need in order to use this capability.</p> +<p><em>Note:</em> You only need to obtain the source distribution (so that you +can copy the files in the <tt class="docutils literal">django/</tt> directory, for example); you +do not necessarily need to install from it. If you have already +installed <tt class="docutils literal">generateDS.py</tt> using <tt class="docutils literal">pip</tt> or <tt class="docutils literal">easy_install</tt>, you +do not need to re-install from the source tree.</p> <p>There are support files in the <tt class="docutils literal">django</tt> directory in the -distribution.</p> +source distribution (but <em>not</em> in the version install using <tt class="docutils literal">pip</tt> +or <tt class="docutils literal">easy_install</tt>).</p> <p>Here is an overview of the process:</p> <ul class="simple"> <li>Step 1. Generate bindings -- Run <tt class="docutils literal">generateDS.py</tt>.</li> @@ -2524,8 +2945,14 @@ distribution.</p> <tt class="docutils literal">gends_generate_django.py</tt>.</li> </ul> <p>The script <tt class="docutils literal">gends_run_gen_django.py</tt> performs these three steps.</p> +<p>In order to use the script <tt class="docutils literal">gends_run_gen_django.py</tt>, you may need +to tell it where the <tt class="docutils literal">generateDS.py</tt> script is located. If so, +use the "-p" command line option. For more information, do:</p> +<pre class="literal-block"> +python gends_run_gen_django.py --help +</pre> <div class="section" id="how-to-generate-django-models-and-forms"> -<h3><a class="toc-backref" href="#id77">14.1.1 How to generate Django models and forms</a></h3> +<h3><a class="toc-backref" href="#id88">15.1.1 How to generate Django models and forms</a></h3> <p><strong>Warning:</strong> Running this script attempts to over-write the following files in the current directory:</p> <ul class="simple"> @@ -2546,8 +2973,9 @@ $ mkdir WorkDir $ cd WorkDir </pre> </li> -<li><p class="first">Copy the files in from the sub directory <tt class="docutils literal">django/</tt> in the -distribution to the current directory:</p> +<li><p class="first">Copy the files in from the sub directory <tt class="docutils literal">django/</tt> in the of +the source distribution of <tt class="docutils literal">generateDS.py</tt> to the current +directory:</p> <pre class="literal-block"> $ cp /my_sources/generateDS-n.nn/django/* . </pre> @@ -2562,6 +2990,9 @@ $ cp /my_sources/generateDS-n.nn/process_includes.py . <pre class="literal-block"> $ ./gends_run_gen_django.py myschema.xsd </pre> +<p>There are additional command line options for +<tt class="docutils literal">gends_run_gen_django.py</tt>. For help, run +<tt class="docutils literal">$ python gends_run_gen_django.py <span class="pre">--help</span></tt>.</p> </li> <li><p class="first">Copy the generated files <tt class="docutils literal">models.py</tt> and <tt class="docutils literal">forms.py</tt> to your Django application.</p> @@ -2569,7 +3000,7 @@ Django application.</p> </ol> </div> <div class="section" id="how-it-works"> -<h3><a class="toc-backref" href="#id78">14.1.2 How it works</a></h3> +<h3><a class="toc-backref" href="#id89">15.1.2 How it works</a></h3> <p>Here are a few notes that might be helpful if and when you need to do some debugging or extend the current capabilities or write a new "meta-app" that uses the same approach but does something new and @@ -2596,9 +3027,9 @@ root super class of all generated data representation classes.</p> </div> </div> <div class="section" id="sample-code-and-extensions"> -<h1><a class="toc-backref" href="#id79">15 Sample code and extensions</a></h1> +<h1><a class="toc-backref" href="#id90">16 Sample code and extensions</a></h1> <div class="section" id="capturing-xs-date-elements-as-dates"> -<h2><a class="toc-backref" href="#id80">15.1 Capturing xs:date elements as dates</a></h2> +<h2><a class="toc-backref" href="#id91">16.1 Capturing xs:date elements as dates</a></h2> <p>The following extension employs a user method (see <a class="reference internal" href="#user-methods">User Methods</a>) in order to capture elements defined as xs:date as date objects.</p> @@ -2667,9 +3098,9 @@ import types </div> </div> <div class="section" id="limitations-of-generateds"> -<h1><a class="toc-backref" href="#id81">16 Limitations of generateDS</a></h1> +<h1><a class="toc-backref" href="#id92">17 Limitations of generateDS</a></h1> <div class="section" id="xml-schema-limitations"> -<h2><a class="toc-backref" href="#id82">16.1 XML Schema limitations</a></h2> +<h2><a class="toc-backref" href="#id93">17.1 XML Schema limitations</a></h2> <p>There are things in Xschema that are not supported. You will have to use a restricted sub-set of Xschema to define your data structures. See above for supported features. See people.xsd and @@ -2678,7 +3109,7 @@ people.xml for examples.</p> does not work.</p> </div> <div class="section" id="large-documents"> -<h2><a class="toc-backref" href="#id83">16.2 Large documents</a></h2> +<h2><a class="toc-backref" href="#id94">17.2 Large documents</a></h2> <p><strong>Warning</strong> -- This section describes an optional generated SAX parser which, I believe, is currently broken for all but the simplest schemas. Generation of a SAX parser has not been updated @@ -2705,20 +3136,13 @@ memory problem to some extent when the minidom parser is used.</p> </div> </div> <div class="section" id="includes-the-xml-schema-include-element"> -<h1><a class="toc-backref" href="#id84">17 Includes -- The XML schema include element</a></h1> +<h1><a class="toc-backref" href="#id95">18 Includes -- The XML schema include element</a></h1> <p>While <tt class="docutils literal">generateDS.py</tt> itself does not process XML Schema <tt class="docutils literal">include</tt> elements, the distribution provides a script <tt class="docutils literal">process_includes.py</tt> that can be used as a preprocessor. This script scans your XML Schema document and, recursively, documents that are included looking for <tt class="docutils literal">include</tt> elements; it inserts all content into a single document, which it writes out.</p> -<p>Since <tt class="docutils literal">process_includes.py</tt> uses the ElementTree API, in order -to use <tt class="docutils literal">process_includes.py</tt> you will need one of the following:</p> -<ul class="simple"> -<li>Python 2.5 or newer -- ElementTree is in the Python-2.5 distribution. Or,</li> -<li><a class="reference external" href="http://effbot.org/zone/element-index.htm">ElementTree</a>. Or,</li> -<li><a class="reference external" href="http://codespeak.net/lxml/">lxml</a> -- another implementation of the ElementTree API.</li> -</ul> <p>Here are samples of how you might use <tt class="docutils literal">process_includes.py</tt>, if your schema contains <tt class="docutils literal">include</tt> elements.</p> <p>Example 1:</p> @@ -2737,7 +3161,7 @@ $ python process_includes.py --help </pre> </div> <div class="section" id="acknowledgments"> -<h1><a class="toc-backref" href="#id85">18 Acknowledgments</a></h1> +<h1><a class="toc-backref" href="#id96">19 Acknowledgments</a></h1> <p>Many thanks to those who have used <tt class="docutils literal">generateDS.py</tt> and have contributed their comments and suggestions. These comments have been valuable both in teaching me about things I needed to know in @@ -2751,14 +3175,16 @@ following among others:</p> </ul> </div> <div class="section" id="see-also"> -<h1><a class="toc-backref" href="#id86">19 See also</a></h1> +<h1><a class="toc-backref" href="#id97">20 See also</a></h1> <p><a class="reference external" href="http://www.python.org">Python</a>: The Python home page.</p> -<p><a class="reference external" href="http://www.rexx.com/~dkuhlman">Dave's Page</a>: My home page, which contains more Python stuff.</p> +<p><a class="reference external" href="http://www.davekuhlman.org">Dave's Page</a>: My home page, which contains more Python stuff.</p> +<!-- vim:ft=rst: --> </div> </div> <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateDS.txt">View document source</a>. +Generated on: 2017-01-17 00:01 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 94b0acd..6164e26 100755 --- a/generateDS.py +++ b/generateDS.py @@ -1,7 +1,7 @@ #!/usr/bin/env python """ Synopsis: - Generate Python classes from XML Schema definition. + Generate Python classes from XML schema definition. Input is read from in_xsd_file or, if "-" (dash) arg, from stdin. Output is written to files named in "-o" and "-s" options. Usage: @@ -18,16 +18,28 @@ Options: -b <behaviorfilename> Input file name for behaviors added to subclasses -m Generate properties for member variables -c <xmlcatalogfilename> Input file name to load an XML catalog + --one-file-per-xsd Create a python module for each XSD processed. + --output-directory="XXX" Used in conjunction with --one-file-per-xsd. + The directory where the modules will be created. + --module-suffix="XXX" To be used in conjunction with --one-file-per-xsd. + Append XXX to the end of each file created. --subclass-suffix="XXX" Append XXX to the generated subclass names. Default="Sub". - --root-element="XXX" Assume XXX is root element of instance docs. - Default is first element defined in schema. - Also see section "Recognizing the top level + --root-element="XX" When parsing, assume XX is root element of + --root-element="XX|YY" instance docs. Default is first element defined + in schema. If YY is added, then YY is used as the + top level class; if YY omitted XX is the default. + class. Also see section "Recognizing the top level element" in the documentation. - --super="XXX" Super module name in generated in subclass + --super="XXX" Super module name in generated subclass module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -44,10 +56,10 @@ Options: generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code. - --no-process-includes Do not process included XML Schema files. By + --no-process-includes Do not process included XML schema files. By default, generateDS.py will insert content from files referenced by <include ... /> - elements into the XML Schema to be processed. + elements into the XML schema to be processed. --silence Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, use the --silence switch. @@ -79,8 +91,18 @@ Options: to XML) Example: "write etree" Default: "write" + --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 + names. First element is a regular expression + search pattern and second is a replacement. + Example: "[('[-:.]', '_'), ('^__', 'Special')]" + Default: "[('[-:.]', '_')]" -q, --no-questions Do not ask questions, for example, force overwrite. + --no-warnings Do not print warning messages. --session=mysession.session Load and use options from session file. You can create session file in generateds_gui.py. Or, @@ -129,17 +151,29 @@ also generates member specifications in each class (in a dictionary). ## SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +from __future__ import print_function import sys import os.path import time import getopt -import urllib2 + +if sys.version_info.major == 2: + import urllib2 + import StringIO +else: + import urllib.request + import urllib.error + import urllib.parse + import io + from functools import reduce import imp from xml.sax import handler, make_parser import logging import keyword -import StringIO import textwrap +import hashlib +import operator +import re # Default logger configuration logging.basicConfig( @@ -172,19 +206,31 @@ logging.disable(logging.INFO) # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.11b' +VERSION = '2.24b' ##VERSION## +if sys.version_info.major == 2: + BaseStrType = basestring +else: + BaseStrType = str + GenerateProperties = 0 UseGetterSetter = 'new' +UseOldSimpleTypeValidators = False +UseGeneratedssuperLookup = True +SchemaLxmlTree = None +XsdFileName = [] MemberSpecs = None -DelayedElements = [] -DelayedElements_subclass = [] -AlreadyGenerated = [] -AlreadyGenerated_subclass = [] +DelayedElements = set() +DelayedElements_subclass = set() +AlreadyGenerated = set() +AlreadyGenerated_subclass = set() PostponedExtensions = [] +LoopcheckOneperChecksums = set() ElementsForSubclasses = [] ElementDict = {} +fqnToElementDict = {} +fqnToModuleNameMap = {} Force = False NoQuestions = False NoDates = False @@ -192,8 +238,10 @@ NoVersion = False Dirpath = [] ExternalEncoding = sys.getdefaultencoding() Namespacedef = '' +CleanupNameList = [(re.compile('[-:.]'), '_')] NamespacesDict = {} +prefixToNamespaceMap = {} MappingTypes = {} Targetnamespace = "" @@ -225,8 +273,14 @@ CurrentNamespacePrefix = 'xs:' AnyTypeIdentifier = '__ANY__' ExportWrite = True ExportEtree = False -ExportLiteral = True +ExportLiteral = False +XmlDisabled = False FixTypeNames = None +SingleFileOutput = True +OutputDirectory = None +ModuleSuffix = "" +PreserveCdataTags = False +NoWarnings = False SchemaToPythonTypeMap = {} @@ -243,6 +297,7 @@ NonNegativeIntegerType = None BooleanType = None FloatType = None DoubleType = None +NumericTypes = None ElementType = None ComplexTypeType = None GroupType = None @@ -292,6 +347,7 @@ def set_type_constants(nameSpace): PositiveIntegerType, NegativeIntegerType, \ NonPositiveIntegerType, NonNegativeIntegerType, \ BooleanType, FloatType, DoubleType, \ + NumericTypes, \ ElementType, ComplexTypeType, GroupType, SequenceType, ChoiceType, \ AttributeGroupType, AttributeType, SchemaType, \ DateTimeType, DateType, TimeType, \ @@ -367,6 +423,17 @@ def set_type_constants(nameSpace): nameSpace + 'Name', nameSpace + 'language', ) + NumericTypes = set([ + IntegerType, + DecimalType, + PositiveIntegerType, + NegativeIntegerType, + NonPositiveIntegerType, + NonNegativeIntegerType, + FloatType, + DoubleType, + ]) + NumericTypes.update(set(IntegerType)) Base64Type = nameSpace + 'base64Binary' TokenType = nameSpace + 'token' NameType = nameSpace + 'Name' @@ -451,12 +518,12 @@ DEBUG = 0 def dbgprint(level, msg): if DEBUG and level > 0: - print msg + print(msg) def pplist(lst): for count, item in enumerate(lst): - print '%d. %s' % (count, item) + print('%d. %s' % (count, item)) # @@ -530,11 +597,7 @@ class SimpleTypeElement(XschemaElementBase): s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \ (self.getName(), id(self)) return s1 - - def __repr__(self): - s1 = '<"%s" SimpleTypeElement instance at 0x%x>' % \ - (self.getName(), id(self)) - return s1 + __repr__ = __str__ def resolve_list_type(self): if self.isListType(): @@ -547,23 +610,48 @@ class SimpleTypeElement(XschemaElementBase): class XschemaElement(XschemaElementBase): - def __init__(self, attrs): + def __init__(self, attrs, targetNamespace=None): XschemaElementBase.__init__(self) self.cleanName = '' self.attrs = dict(attrs) name_val = '' type_val = '' ref_val = '' + self.prefix = None + self.namespace = None + self.is_root_element = False + self.targetNamespace = targetNamespace + self.fullyQualifiedName = None + self.fullyQualifiedType = None + self.type = 'NoneType' + if 'name' in self.attrs: - name_val = strip_namespace(self.attrs['name']) + self.prefix, name_val = get_prefix_and_value(self.attrs['name']) + self.fullyQualifiedName = "%s:%s" % (targetNamespace, name_val) + if 'type' in self.attrs: if (len(XsdNameSpace) > 0 and self.attrs['type'].startswith(XsdNameSpace)): type_val = self.attrs['type'] else: - type_val = strip_namespace(self.attrs['type']) + self.prefix, type_val = get_prefix_and_value( + self.attrs['type']) + self.type = type_val if 'ref' in self.attrs: - ref_val = strip_namespace(self.attrs['ref']) + self.prefix, ref_val = get_prefix_and_value(self.attrs['ref']) + if self.prefix in prefixToNamespaceMap: + xmlns = prefixToNamespaceMap[self.prefix] + fqn = "%s:%s" % (xmlns, ref_val) + if fqn in fqnToElementDict: + referencedElement = fqnToElementDict[fqn] + type_val = referencedElement.getType() + if type_val == "NoneType": + # anonymous types + type_val = referencedElement.getName() + name_val = ref_val + if not type_val: + type_val = ref_val + if type_val and not name_val: name_val = type_val if ref_val and not name_val: @@ -587,13 +675,14 @@ class XschemaElement(XschemaElementBase): self.maxOccurs = 1 self.complex = 0 self.complexType = 0 - self.type = 'NoneType' self.mixed = 0 self.base = None self.mixedExtensionError = 0 self.collapseWhiteSpace = 0 # Attribute definitions for the currect element. self.attributeDefs = {} + # Use this to maintain predictable order of attributes. + self.attributeDefsList = [] # Attribute definitions for the current attributeGroup, if # there is one. self.attributeGroup = None @@ -628,6 +717,23 @@ class XschemaElement(XschemaElementBase): def getName(self): return self.name + def getFullyQualifiedName(self): + return self.fullyQualifiedName + + def getFullyQualifiedType(self): + typeName = self.type + if not typeName or typeName == "NoneType": + typeName = self.name + if typeName and not self.fullyQualifiedType: + namespace = self.targetNamespace + if self.prefix and self.prefix in prefixToNamespaceMap: + xmlns = prefixToNamespaceMap[self.prefix] + if xmlns: + namespace = xmlns + self.fullyQualifiedType = "%s:%s" % (namespace, typeName) + + return self.fullyQualifiedType + def getCleanName(self): return self.cleanName @@ -682,12 +788,21 @@ class XschemaElement(XschemaElementBase): def isComplex(self): return self.complex + def setIsRootElement(self, is_root_elem): + self.is_root_element = is_root_elem + + def isRootElement(self): + return self.is_root_element + def addAttributeDefs(self, attrs): self.attributeDefs.append(attrs) def getAttributeDefs(self): return self.attributeDefs + def getAttributeDefsList(self): + return self.attributeDefsList + def isMixed(self): return self.mixed @@ -808,7 +923,11 @@ class XschemaElement(XschemaElementBase): self.expandGroupReferences_tree(visited) self.collect_element_dict() self.annotate_find_type() - self.annotate_tree() + element_dict = None + to_be_removed = None + self.annotate_tree( + element_dict=element_dict, + to_be_removed=to_be_removed) self.fix_dup_names() self.coerce_attr_types() self.checkMixedBases() @@ -865,7 +984,10 @@ class XschemaElement(XschemaElementBase): def collectSimpleBases(self): if self.base: - self.addSimpleBase(self.base.encode('utf-8')) + if sys.version_info.major == 2: + self.addSimpleBase(self.base.encode('utf-8')) + else: + self.addSimpleBase(self.base) if self.simpleBase: base1 = SimpleTypeDict.get(self.simpleBase[0]) if base1: @@ -873,7 +995,10 @@ class XschemaElement(XschemaElementBase): else: base2 = None while base2: - self.addSimpleBase(base2.encode('utf-8')) + if sys.version_info.major == 2: + self.addSimpleBase(base2.encode('utf-8')) + else: + self.addSimpleBase(base2) base2 = SimpleTypeDict.get(base2) if base2: base2 = base2.getBase() @@ -921,7 +1046,10 @@ class XschemaElement(XschemaElementBase): if type_val == AnyType: return AnyType if type_val in SimpleTypeDict: - self.addSimpleBase(type_val.encode('utf-8')) + if sys.version_info.major == 2: + self.addSimpleBase(type_val.encode('utf-8')) + else: + self.addSimpleBase(type_val) simple_type = SimpleTypeDict[type_val] list_type = simple_type.resolve_list_type() self.setListType(list_type) @@ -1028,12 +1156,32 @@ class XschemaElement(XschemaElementBase): type_val = self.resolve_type() self.attrs['type'] = type_val self.type = type_val + self.fullyQualifiedType = None if not self.complex: SimpleElementDict[self.name] = self for child in self.children: child.annotate_find_type() - def annotate_tree(self): + def annotate_tree(self, element_dict, to_be_removed): + name = self.getName() + if element_dict is not None: + dup_element = element_dict.get(name) + if (dup_element is not None and + # The element_dict keys are the element name. + # So, we do not need to compare names. + #dup_element.getName() == name and + not self.complexType and + not dup_element.complexType): + # If we've already seen this element (name), and + # these are both xsd:complexType, then + # make it a list and throw the previous one away. + self.maxOccurs = 2 + to_be_removed.append(element_dict[name]) + err_msg( + '*** warning. Removing child with duplicate ' + 'name: "{}"\n'.format(name)) + else: + element_dict[name] = self # If there is a namespace, replace it with an underscore. if self.base: self.base = strip_namespace(self.base) @@ -1073,7 +1221,6 @@ class XschemaElement(XschemaElementBase): sys.exit(1) self.minOccurs = minOccurs self.maxOccurs = maxOccurs - # If it does not have a type, then make the type the same as the name. if self.type == 'NoneType' and self.name: self.type = self.name @@ -1092,8 +1239,21 @@ class XschemaElement(XschemaElementBase): parent.collapseWhiteSpace): self.collapseWhiteSpace = 1 # Do it recursively for all descendents. + element_dict = {} + to_be_removed = [] for child in self.children: - child.annotate_tree() + child.annotate_tree( + element_dict=element_dict, + to_be_removed=to_be_removed) + self.remove_children(to_be_removed) + + def remove_children(self, to_be_removed): + for element in to_be_removed: + if element in self.children: + self.children.remove(element) + else: + err_msg("*** warning. child {} already removed\n".format( + element.getName())) # # For each name in the attributeGroupNameList for this element, @@ -1117,15 +1277,22 @@ class XschemaElement(XschemaElementBase): if key is not None: attrGroup = AttributeGroups[key] for name in attrGroup.getKeys(): - if (name in AttributeGroups or - strip_namespace(name) in AttributeGroups): + group = attrGroup.get(name) + # If group is none, then it's an attributeGroup, + # not an attribute. + # Therefore, we might need to follow it recursively. + if (group is None and + (name in AttributeGroups or + strip_namespace(name) in AttributeGroups)): self.replace_attributeGroup_names_1(name) else: attr = attrGroup.get(name) self.attributeDefs[name] = attr + self.attributeDefsList.append(name) else: - err_msg('*** Error. attributeGroup %s not defined.\n' % ( - groupName, )) + err_msg('*** Error. Element %s attributeGroup %s ' + 'not defined.\n' % ( + self.getName(), groupName, )) def __str__(self): s1 = '<XschemaElement name: "%s" type: "%s">' % \ @@ -1138,6 +1305,7 @@ class XschemaElement(XschemaElementBase): # an attribute. # attrDefs = self.getAttributeDefs() + attrDefsList = self.getAttributeDefsList() # Collect a list of child element names. # Must do this for base (extension) elements also. elementNames = set() @@ -1153,17 +1321,21 @@ class XschemaElement(XschemaElementBase): newName = mappedName + '_attr' newAttr = XschemaAttribute(newName) newAttr.setOrig_name(name) - attrDefs[newName] = newAttr - replaced.append(name) + replaced.append((name, newName, newAttr)) # Remove the old (replaced) attributes. - for name in replaced: + for name, newName, newAttr in replaced: del attrDefs[name] + attrDefs[newName] = newAttr + try: + attrDefsList[attrDefsList.index(name)] = newName + except ValueError: + pass for child in self.children: child.fix_dup_names() def collectElementNames(self, elementNames, count): for child in self.children: - elementNames.add(mapName(cleanupName(child.cleanName))) + elementNames.add(child.getCleanName()) base = self.getBase() if base and base in ElementDict: parent = ElementDict[base] @@ -1191,12 +1363,16 @@ class XschemaElement(XschemaElementBase): class XschemaAttributeGroup: - def __init__(self, name='', group=None): + def __init__(self, name='', group=None, keyList=None): self.name = name if group: self.group = group else: self.group = {} + if keyList is not None: + self.keyList = keyList + else: + self.keyList = [] def setName(self, name): self.name = name @@ -1217,14 +1393,16 @@ class XschemaAttributeGroup: return default def getKeys(self): - return self.group.keys() + return self.keyList def add(self, name, attr): self.group[name] = attr + self.keyList.append(name) def delete(self, name): if name in self.group: del self.group[name] + self.keyList.remove(name) return 1 else: return 0 @@ -1271,6 +1449,45 @@ class XschemaAttribute: if self.data_type in SimpleElementDict: typeObj = SimpleElementDict[self.data_type] typeObjType = typeObj.getRawType() + +## if self.data_type in SimpleElementDict: +## typeObj = SimpleElementDict[self.data_type] +## typeObjType = typeObj.getRawType() + +## if strip_namespace(self.data_type) in SimpleTypeDict: +## typeObj = SimpleTypeDict[strip_namespace(self.data_type)] +## typeObjType = typeObj.getBase() + + if (typeObjType in StringType or + typeObjType == TokenType or + typeObjType in DateTimeGroupType or + typeObjType == Base64Type or + typeObjType in IntegerType or + typeObjType == DecimalType or + typeObjType == PositiveIntegerType or + typeObjType == NegativeIntegerType or + typeObjType == NonPositiveIntegerType or + typeObjType == NonNegativeIntegerType or + typeObjType == BooleanType or + typeObjType == FloatType or + typeObjType == DoubleType): + returnType = typeObjType + return returnType + + def getBaseType(self): + returnType = self.data_type +## if self.data_type in SimpleElementDict: +## typeObj = SimpleElementDict[self.data_type] +## typeObjType = typeObj.getRawType() + +## if self.data_type in SimpleElementDict: +## typeObj = SimpleElementDict[self.data_type] +## typeObjType = typeObj.getRawType() + + if strip_namespace(self.data_type) in SimpleTypeDict: + typeObj = SimpleTypeDict[strip_namespace(self.data_type)] + typeObjType = typeObj.getBase() + if (typeObjType in StringType or typeObjType == TokenType or typeObjType in DateTimeGroupType or @@ -1319,6 +1536,7 @@ class XschemaHandler(handler.ContentHandler): self.inComplexType = 0 self.inNonanonymousComplexType = 0 self.inSequence = 0 + self.sequenceStack = [] self.inChoice = 1 self.inAttribute = 0 self.attributeGroupLevel = 0 @@ -1350,7 +1568,7 @@ class XschemaHandler(handler.ContentHandler): return keys[0] def startElement(self, name, attrs): - global Targetnamespace, NamespacesDict, XsdNameSpace + global Targetnamespace, NamespacesDict, XsdNameSpace, fqnToElementDict logging.debug("Start element: %s %s" % (name, repr(attrs.items()))) if len(self.stack) == 0 and self.firstElement: self.firstElement = False @@ -1373,22 +1591,37 @@ class XschemaHandler(handler.ContentHandler): # use that namespace prefix. for name, value in attrs.items(): if name[:6] == 'xmlns:': - nameSpace = name[6:] + ':' + prefix = name[6:] + nameSpace = prefix + ':' NamespacesDict[value] = nameSpace + prefixToNamespaceMap[prefix] = value elif name == 'targetNamespace': Targetnamespace = value + element.targetNamespace = value elif (name == ElementType or ((name == ComplexTypeType) and (len(self.stack) == 1))): self.inElement = 1 self.inNonanonymousComplexType = 1 - element = XschemaElement(attrs) - if not 'type' in attrs.keys() and not 'ref' in attrs.keys(): + element = XschemaElement(attrs, Targetnamespace) + fqn = element.getFullyQualifiedName() + if fqn: + fqnToElementDict[fqn] = element + if element.prefix in prefixToNamespaceMap: + element.namespace = prefixToNamespaceMap[element.prefix] + if self.sequenceStack: + minOccurs, maxOccurs = self.sequenceStack[-1] + if 'minOccurs' not in attrs and minOccurs is not None: + element.attrs['minOccurs'] = minOccurs + if 'maxOccurs' not in attrs and maxOccurs is not None: + element.attrs['maxOccurs'] = maxOccurs + if 'type' not in attrs and 'ref' not in attrs: element.setExplicitDefine(1) if len(self.stack) == 1: element.setTopLevel(1) - if 'substitutionGroup' in attrs.keys() and 'name' in attrs.keys(): + if 'substitutionGroup' in attrs and 'name' in attrs: substituteName = attrs['name'] headName = attrs['substitutionGroup'] + _, headName = get_prefix_and_value(headName) if headName not in SubstitutionGroups: SubstitutionGroups[headName] = [] SubstitutionGroups[headName].append(substituteName) @@ -1416,26 +1649,36 @@ class XschemaHandler(handler.ContentHandler): self.stack.append(element) elif name == SequenceType: self.inSequence = 1 + self.sequenceStack.append( + [attrs.get('minOccurs'), attrs.get('maxOccurs')]) elif name == ChoiceType: self.currentChoice = XschemaElement(attrs) self.inChoice = 1 elif name == AttributeType: self.inAttribute = 1 - if 'name' in attrs.keys(): + if 'name' in attrs: name = attrs['name'] - elif 'ref' in attrs.keys(): + elif 'ref' in attrs: name = strip_namespace(attrs['ref']) else: name = 'no_attribute_name' - if 'type' in attrs.keys(): + data_type = StringType[0] + if 'type' in attrs: data_type = attrs['type'] - else: - data_type = StringType[0] - if 'use' in attrs.keys(): + elif 'ref' in attrs and SchemaLxmlTree is not None: + nsmap = {'xs': 'http://www.w3.org/2001/XMLSchema'} + attr_types = SchemaLxmlTree.xpath( + "./xs:attribute[@name=$attrname]", + namespaces=nsmap, attrname=name) + if attr_types: + data_type1 = attr_types[0].get('type') + if data_type1 is not None: + data_type = data_type1 + if 'use' in attrs: use = attrs['use'] else: use = 'optional' - if 'default' in attrs.keys(): + if 'default' in attrs: default = attrs['default'] else: default = None @@ -1447,18 +1690,19 @@ class XschemaHandler(handler.ContentHandler): # Add this attribute to the element/complexType. attribute = XschemaAttribute(name, data_type, use, default) self.stack[-1].attributeDefs[name] = attribute + self.stack[-1].attributeDefsList.append(name) self.lastAttribute = attribute elif name == AttributeGroupType: if self.attributeGroupLevel >= 1: # We are in an attribute group and are declaring a reference # to another attribute group. - if 'ref' in attrs.keys(): + if 'ref' in attrs: self.stack[-1].attributeGroup.add(attrs['ref'], None) else: # If it has attribute 'name', then we are defining a new # attribute group. # Prepare to save it as an attributeGroup. - if 'name' in attrs.keys(): + if 'name' in attrs: name = strip_namespace(attrs['name']) attributeGroup = XschemaAttributeGroup(name) element = XschemaElement(attrs) @@ -1468,7 +1712,7 @@ class XschemaHandler(handler.ContentHandler): self.stack.append(element) # If it has attribute 'ref', add it to the list of # attributeGroups for this element/complexType. - if 'ref' in attrs.keys(): + if 'ref' in attrs: self.stack[-1].attributeGroupNameList.append(attrs['ref']) self.attributeGroupLevel += 1 elif name == SimpleContentType: @@ -1478,7 +1722,7 @@ class XschemaHandler(handler.ContentHandler): elif name == ComplexContentType: pass elif name == ExtensionType: - if 'base' in attrs.keys() and len(self.stack) > 0: + if 'base' in attrs and len(self.stack) > 0: extensionBase = attrs['base'] if (extensionBase in StringType or extensionBase in IDTypes or @@ -1498,8 +1742,11 @@ class XschemaHandler(handler.ContentHandler): extensionBase in OtherSimpleTypes): if (len(self.stack) > 0 and isinstance(self.stack[-1], XschemaElement)): - self.stack[-1].addSimpleBase( - extensionBase.encode('utf-8')) + if sys.version_info.major == 2: + self.stack[-1].addSimpleBase( + extensionBase.encode('utf-8')) + else: + self.stack[-1].addSimpleBase(extensionBase) else: self.stack[-1].setBase(extensionBase) elif name == AnyAttributeType: @@ -1512,10 +1759,10 @@ class XschemaHandler(handler.ContentHandler): elif self.inSimpleType <= 0: # Save the name of the simpleType, but ignore everything # else about it (for now). - if 'name' in attrs.keys(): - stName = cleanupName(attrs['name']) + if 'name' in attrs: + stName = attrs['name'] elif len(self.stack) > 0: - stName = cleanupName(self.stack[-1].getName()) + stName = self.stack[-1].getName() else: stName = None # If the parent is an element, mark it as a simpleType. @@ -1523,6 +1770,7 @@ class XschemaHandler(handler.ContentHandler): self.stack[-1].setSimpleType(1) element = SimpleTypeElement(stName) SimpleTypeDict[stName] = element + SimpleTypeDict[Targetnamespace+":"+stName] = element self.stack.append(element) self.inSimpleType += 1 elif name == RestrictionType: @@ -1533,7 +1781,7 @@ class XschemaHandler(handler.ContentHandler): # If we are in a simpleType, capture the name of # the restriction base. if ((self.inSimpleType >= 1 or self.inSimpleContent) and - 'base' in attrs.keys()): + 'base' in attrs): self.stack[-1].setBase(attrs['base']) else: if 'base' in attrs: @@ -1615,6 +1863,8 @@ class XschemaHandler(handler.ContentHandler): if len(self.stack) >= 2: element = self.stack.pop() self.stack[-1].addChild(element) + if name == ElementType and len(self.stack) == 1: + element.setIsRootElement(True) elif name == AnyType: if len(self.stack) >= 2: element = self.stack.pop() @@ -1623,6 +1873,7 @@ class XschemaHandler(handler.ContentHandler): self.inComplexType = 0 elif name == SequenceType: self.inSequence = 0 + self.sequenceStack.pop() elif name == ChoiceType: self.currentChoice = None self.inChoice = 0 @@ -1717,7 +1968,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): mappedName = mapName(cleanName) child_type = child.getType() if child_type == DateTimeType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_datetime(self.%s, " \ @@ -1725,7 +1981,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == DateType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_date(self.%s, " \ @@ -1733,7 +1994,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == TimeType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_time(self.%s, " \ @@ -1743,29 +2009,45 @@ def generateExportFn_1(wrt, child, name, namespace, fill): elif (child_type in StringType or child_type == TokenType or child_type in DateTimeGroupType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) # fixlist if (child.getSimpleType() in SimpleTypeDict and SimpleTypeDict[child.getSimpleType()].isListType()): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ - "(namespace_, self.gds_format_string(quote_xml" \ - "(' '.join(self.%s)).encode(ExternalEncoding), " \ - "input_name='%s'), namespace_, eol_))\n" % \ + "(namespace_, self.gds_encode(self.gds_format_string(" \ + "quote_xml" \ + "(' '.join(self.%s)), " \ + "input_name='%s')), namespace_, eol_))\n" % \ (fill, name, name, mappedName, name, ) else: + namespace = 'namespace_' + if child.prefix and 'ref' in child.attrs: + namespace = "'%s:'" % child.prefix s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ - "(namespace_, self.gds_format_string(quote_xml(self.%s)." \ - "encode(ExternalEncoding), input_name='%s'), " \ - "namespace_, eol_))\n" % \ - (fill, name, name, mappedName, name, ) + "(%s, self.gds_encode(self.gds_format_string(" \ + "quote_xml(self.%s), " \ + "input_name='%s')), " \ + "%s, eol_))\n" % \ + (fill, name, name, namespace, mappedName, + name, namespace, ) wrt(s1) elif (child_type in IntegerType or child_type == PositiveIntegerType or child_type == NonPositiveIntegerType or child_type == NegativeIntegerType or child_type == NonNegativeIntegerType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -1779,7 +2061,17 @@ def generateExportFn_1(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == BooleanType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + if default == 'true': + wrt('%s if not self.%s:\n' % (fill, mappedName, )) + elif default == 'false': + wrt('%s if self.%s:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s is not None:\n' % ( + fill, mappedName, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -1795,7 +2087,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): wrt(s1) elif (child_type == FloatType or child_type == DecimalType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -1809,7 +2106,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == DoubleType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -1838,9 +2140,12 @@ def generateExportFn_1(wrt, child, name, namespace, fill): "namespace_, pretty_print=pretty_print)\n" % \ (fill, mappedName) else: - s1 = "%s self.%s.export(outfile, level, " \ - "namespace_, name_='%s', pretty_print=pretty_print)\n" % \ - (fill, mappedName, name) + namespace = 'namespace_' + if child.prefix and 'ref' in child.attrs: + namespace += "='%s:'" % child.prefix + s1 = "%s self.%s.export(outfile, level, %s, " \ + "name_='%s', pretty_print=pretty_print)\n" % \ + (fill, mappedName, namespace, name) wrt(s1) # end generateExportFn_1 @@ -1877,8 +2182,9 @@ def generateExportFn_2(wrt, child, name, namespace, fill): child_type in DateTimeGroupType): wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) wrt("%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " - "(namespace_, self.gds_format_string(quote_xml(%s_).encode(" - "ExternalEncoding), input_name='%s'), namespace_, eol_))\n" % + "(namespace_, self.gds_encode(self.gds_format_string(" + "quote_xml(%s_), " + "input_name='%s')), namespace_, eol_))\n" % (fill, name, name, cleanName, name,)) elif (child_type in IntegerType or child_type == PositiveIntegerType or @@ -1952,9 +2258,12 @@ def generateExportFn_2(wrt, child, name, namespace, fill): s1 = "%s %s_.export(outfile, level, namespace_, " \ "pretty_print=pretty_print)\n" % (fill, cleanName) else: - s1 = "%s %s_.export(outfile, level, namespace_, " \ + namespace = 'namespace_' + if child.prefix and 'ref' in child.attrs: + namespace += "='%s:'" % child.prefix + s1 = "%s %s_.export(outfile, level, %s, " \ "name_='%s', pretty_print=pretty_print)\n" % \ - (fill, cleanName, name) + (fill, cleanName, namespace, name) wrt(s1) # end generateExportFn_2 @@ -1965,7 +2274,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): child_type = child.getType() # fix_simpletype if child_type == DateTimeType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_datetime(" \ @@ -1973,7 +2287,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == DateType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_date(" \ @@ -1981,7 +2300,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == TimeType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ "(namespace_, self.gds_format_time(" \ @@ -1991,21 +2315,26 @@ def generateExportFn_3(wrt, child, name, namespace, fill): elif (child_type in StringType or child_type == TokenType or child_type in DateTimeGroupType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != "%s":\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) # fixlist if (child.getSimpleType() in SimpleTypeDict and SimpleTypeDict[child.getSimpleType()].isListType()): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ - "(namespace_, self.gds_format_string(" \ - "quote_xml(' '.join(self.%s)).encode(ExternalEncoding), " \ - "input_name='%s'), namespace_, eol_))\n" % \ + "(namespace_, self.gds_encode(self.gds_format_string(" \ + "quote_xml(' '.join(self.%s)), " \ + "input_name='%s')), namespace_, eol_))\n" % \ (fill, name, name, mappedName, name, ) else: s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ - "(namespace_, self.gds_format_string(" \ - "quote_xml(self.%s).encode(ExternalEncoding), " \ - "input_name='%s'), namespace_, eol_))\n" % \ + "(namespace_, self.gds_encode(self.gds_format_string(" \ + "quote_xml(self.%s), " \ + "input_name='%s')), namespace_, eol_))\n" % \ (fill, name, name, mappedName, name, ) wrt(s1) elif (child_type in IntegerType or @@ -2013,7 +2342,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): child_type == NonPositiveIntegerType or child_type == NegativeIntegerType or child_type == NonNegativeIntegerType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -2027,7 +2361,17 @@ def generateExportFn_3(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == BooleanType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + if default == 'true': + wrt('%s if not self.%s:\n' % (fill, mappedName, )) + elif default == 'false': + wrt('%s if self.%s:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s is not None:\n' % ( + fill, mappedName, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -2043,7 +2387,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): wrt(s1) elif (child_type == FloatType or child_type == DecimalType): - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -2057,7 +2406,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): (fill, name, name, mappedName, name, ) wrt(s1) elif child_type == DoubleType: - wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + default = child.getDefault() + if default is None: + wrt('%s if self.%s is not None:\n' % (fill, mappedName, )) + else: + wrt('%s if self.%s != %s:\n' % ( + fill, mappedName, default, )) wrt('%s showIndent(outfile, level, pretty_print)\n' % fill) if child.isListType(): s1 = "%s outfile.write('<%%s%s>%%s</%%s%s>%%s' %% " \ @@ -2086,9 +2440,12 @@ def generateExportFn_3(wrt, child, name, namespace, fill): "outfile, level, namespace_, pretty_print=pretty_print)\n" % \ (fill, mappedName) else: - s1 = "%s self.%s.export(outfile, level, namespace_, " \ + namespace = 'namespace_' + if child.prefix and 'ref' in child.attrs: + namespace += "='%s:'" % child.prefix + s1 = "%s self.%s.export(outfile, level, %s, " \ "name_='%s', pretty_print=pretty_print)\n" % \ - (fill, mappedName, name) + (fill, mappedName, namespace, name) wrt(s1) # end generateExportFn_3 @@ -2131,7 +2488,7 @@ def generateToEtreeChildren(wrt, element, Targetnamespace): else: for child in element.getChildren(): unmappedName = child.getName() - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() child_type = child.getType() if child_type == AnyTypeIdentifier: if child.getMaxOccurs() > 1: @@ -2178,61 +2535,66 @@ def generateToEtreeChildren(wrt, element, Targetnamespace): wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_integer_list" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) else: wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_integer" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) elif child_type == BooleanType: if child.isListType(): wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_boolean_list" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) else: wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_boolean" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) elif child_type == FloatType or \ child_type == DecimalType: if child.isListType(): wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_float_list" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) else: wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_float" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) elif child_type == DoubleType: if child.isListType(): wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_double_list" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) else: wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_double" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) elif child_type == Base64Type: wrt(" etree_.SubElement(element, " "'{%s}%s').text = self.gds_format_base64" "(%s_)\n" % ( - Targetnamespace, unmappedName, name)) + Targetnamespace, unmappedName, name)) else: wrt(" %s_.to_etree(element, name_='%s', " "mapping_=mapping_)\n" % ( - name, unmappedName,)) + name, unmappedName,)) + else: + if element.getSimpleContent() or element.isMixed(): + wrt(" if self.hasContent_():\n") + wrt(" element.text = self.gds_format_string" + "(self.get_valueOf_())\n") #end generateToEtreeChildren def generateToEtreeAttributes(wrt, element): attrDefs = element.getAttributeDefs() - for key in attrDefs.keys(): + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] name = attrDef.getName() cleanName = mapName(cleanupName(name)) @@ -2282,7 +2644,7 @@ def generateExportAttributes(wrt, element, hasAttributes): if len(element.getAttributeDefs()) > 0: hasAttributes += 1 attrDefs = element.getAttributeDefs() - for key in attrDefs.keys(): + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] name = attrDef.getName() orig_name = attrDef.getOrig_name() @@ -2290,9 +2652,32 @@ def generateExportAttributes(wrt, element, hasAttributes): orig_name = name cleanName = mapName(cleanupName(name)) if True: # attrDef.getUse() == 'optional': - wrt(" if self.%s is not None and '%s' not in " - "already_processed:\n" % ( - cleanName, cleanName, )) + default = attrDef.getDefault() + if default is None: + s1 = ' if self.%s is not None and ' % (cleanName, ) + else: + attr_type = attrDef.getBaseType() + if (attr_type in StringType or + attr_type == TokenType or + attr_type in DateTimeGroupType): + s1 = ' if self.%s != "%s" and ' % ( + cleanName, default, ) + elif attr_type == BooleanType: + if default == 'true': + s1 = ' if not self.%s and ' % (cleanName, ) + elif default == 'false': + s1 = ' if self.%s and ' % (cleanName, ) + else: + s1 = ' if self.%s is not None and ' % ( + cleanName, ) + elif attr_type in NumericTypes: + s1 = ' if self.%s != %s and ' % ( + cleanName, default, ) + else: + s1 = ' if self.%s != "%s" and ' % ( + cleanName, default, ) + s1 += "'%s' not in already_processed:\n" % (cleanName, ) + wrt(s1) wrt(" already_processed.add('%s')\n" % ( cleanName, )) indent = " " @@ -2303,23 +2688,23 @@ def generateExportAttributes(wrt, element, hasAttributes): s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_datetime(self.%s, ''' \ '''input_name='%s'))\n''' % ( - indent, orig_name, cleanName, name) + indent, orig_name, cleanName, name) elif attrDef.getType() == DateType: s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_date(self.%s, input_name='%s'))\n''' % ( - indent, orig_name, cleanName, name) + indent, orig_name, cleanName, name) elif attrDef.getType() == TimeType: s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_time(self.%s, input_name='%s'))\n''' % ( - indent, orig_name, cleanName, name) + indent, orig_name, cleanName, name) elif (attrDefType in StringType or attrDefType in IDTypes or attrDefType == TokenType or attrDefType in DateTimeGroupType): s1 = '''%s outfile.write(' %s=%%s' %% ''' \ - '''(self.gds_format_string(quote_attrib(''' \ - '''self.%s).encode(''' \ - '''ExternalEncoding), input_name='%s'), ))\n''' % \ + '''(self.gds_encode(self.gds_format_string(''' \ + '''quote_attrib(self.%s), ''' \ + '''input_name='%s')), ))\n''' % \ (indent, orig_name, cleanName, name, ) elif (attrDefType in IntegerType or attrDefType == PositiveIntegerType or @@ -2329,7 +2714,7 @@ def generateExportAttributes(wrt, element, hasAttributes): s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_integer(self.%s, ''' \ '''input_name='%s'))\n''' % ( - indent, orig_name, cleanName, name, ) + indent, orig_name, cleanName, name, ) elif attrDefType == BooleanType: s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_boolean(''' \ @@ -2343,11 +2728,11 @@ def generateExportAttributes(wrt, element, hasAttributes): s1 = '''%s outfile.write(' %s="%%s"' %% ''' \ '''self.gds_format_double(self.%s, ''' \ '''input_name='%s'))\n''' % ( - indent, orig_name, cleanName, name) + indent, orig_name, cleanName, name) else: s1 = '''%s outfile.write(' %s=%%s' %% ''' \ '''(quote_attrib(self.%s), ))\n''' % ( - indent, orig_name, cleanName, ) + indent, orig_name, cleanName, ) wrt(s1) if element.getExtended(): wrt(" if self.extensiontype_ is not None and 'xsi:type' " @@ -2378,7 +2763,7 @@ def generateExportChildren(wrt, element, hasChildren, namespace): any_type_child = None for child in element.getChildren(): unmappedName = child.getName() - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() # fix_abstract type_element = None abstract_child = False @@ -2395,13 +2780,13 @@ def generateExportChildren(wrt, element, hasChildren, namespace): fill, name, name,)) wrt("%s %s_.export(outfile, level, namespace_, " "name_='%s', pretty_print=pretty_print)\n" % ( - fill, name, name, )) + fill, name, unmappedName, )) elif abstract_child: wrt("%sif self.%s is not None:\n" % (fill, name, )) wrt("%s self.%s.export(outfile, level, " "namespace_, name_='%s', " "pretty_print=pretty_print)\n" % ( - fill, name, name, )) + fill, name, unmappedName, )) elif child.getMaxOccurs() > 1: generateExportFn_2( wrt, child, unmappedName, namespace, ' ') @@ -2441,25 +2826,28 @@ def getParentName(element): parentObj = None if base and base in ElementDict: parentObj = ElementDict[base] - parentName = cleanupName(parentObj.getName()) + parentName = parentObj.getCleanName() elif rBase: base = element.getRestrictionBase() parentObj = ElementDict[base] - parentName = cleanupName(parentObj.getName()) + parentName = parentObj.getCleanName() return parentName, parentObj -def generateExportFn(wrt, prefix, element, namespace): +def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef): childCount = countChildren(element, 0) name = element.getName() base = element.getBase() wrt(" def export(self, outfile, level, namespace_='%s', " - "name_='%s', namespacedef_='', pretty_print=True):\n" % - (namespace, name, )) + "name_='%s', namespacedef_='%s', pretty_print=True):\n" % + (namespace, name, nameSpacesDef)) wrt(' if pretty_print:\n') wrt(" eol_ = '\\n'\n") wrt(' else:\n') wrt(" eol_ = ''\n") + # We need to be able to export the original tag name. + wrt(" if self.original_tagname_ is not None:\n") + wrt(" name_ = self.original_tagname_\n") wrt(' showIndent(outfile, level, pretty_print)\n') wrt(" outfile.write('<%s%s%s' % (namespace_, name_, " "namespacedef_ and ' ' + namespacedef_ or '', ))\n") @@ -2484,12 +2872,13 @@ def generateExportFn(wrt, prefix, element, namespace): if element.getSimpleContent(): wrt(" outfile.write('>')\n") if not element.isMixed(): - wrt(" outfile.write(str(self.valueOf_).encode(" - "ExternalEncoding))\n") + wrt(" outfile.write(self.convert_unicode(" + "self.valueOf_))\n") else: wrt(" outfile.write('>%s' % (eol_, ))\n") wrt(" self.exportChildren(outfile, level + 1, " - "namespace_, name_, pretty_print=pretty_print)\n") + "namespace_='%s', name_='%s', pretty_print=pretty_print)\n" % + (namespace, name)) # Put a condition on the indent to require children. if childCount != 0: wrt(' showIndent(outfile, level, pretty_print)\n') @@ -2525,9 +2914,9 @@ def generateExportFn(wrt, prefix, element, namespace): name, quote_attrib(value), )) else: unique_counter += 1 - outfile.write(' xmlns:yyy%d=\"%s\"' % ( + outfile.write(' xmlns:%d=\"%s\"' % ( unique_counter, namespace, )) - outfile.write(' yyy%d:%s=%s' % ( + outfile.write(' %d:%s=%s' % ( unique_counter, name, quote_attrib(value), )) else: if name not in already_processed: @@ -2538,9 +2927,9 @@ def generateExportFn(wrt, prefix, element, namespace): if parentName: hasAttributes += 1 elName = element.getCleanName() - wrt(" super(%s, self).exportAttributes(" + wrt(" super(%s%s, self).exportAttributes(" "outfile, level, already_processed, namespace_, name_='%s')\n" % - (elName, name, )) + (prefix, elName, name, )) hasAttributes += generateExportAttributes(wrt, element, hasAttributes) if hasAttributes == 0: wrt(" pass\n") @@ -2554,9 +2943,9 @@ def generateExportFn(wrt, prefix, element, namespace): if parentName and not element.getRestrictionBaseObj(): hasChildren += 1 elName = element.getCleanName() - wrt(" super(%s, self).exportChildren(outfile, level, " + wrt(" super(%s%s, self).exportChildren(outfile, level, " "namespace_, name_, True, pretty_print=pretty_print)\n" % - (elName, )) + (prefix, elName, )) hasChildren += generateExportChildren(wrt, element, hasChildren, namespace) if childCount == 0: # and not element.isMixed(): wrt(" pass\n") @@ -2609,15 +2998,15 @@ def generateExportLiteralFn_1(wrt, child, name, fill): SimpleTypeDict[child.getSimpleType()].isListType()): wrt("%s if self.%s:\n" % (fill, mappedName, )) wrt("%s outfile.write('%s=%%s,\\n' %% " - "quote_python(' '.join(self.%s)).encode(" - "ExternalEncoding)) \n" % + "self.gds_encode(quote_python(' '.join(self.%s)))" + ") \n" % (fill, mappedName, mappedName, )) wrt("%s else:\n" % (fill, )) wrt("%s outfile.write('%s=None,\\n')\n" % (fill, mappedName, )) else: wrt("%s outfile.write('%s=%%s,\\n' %% " - "quote_python(self.%s).encode(ExternalEncoding))\n" % + "self.gds_encode(quote_python(self.%s)))\n" % (fill, mappedName, mappedName, )) elif (childType in IntegerType or childType == PositiveIntegerType or @@ -2680,8 +3069,8 @@ def generateExportLiteralFn_2(wrt, child, name, fill): childType == TokenType or childType in DateTimeGroupType): wrt('%s showIndent(outfile, level)\n' % fill) - wrt("%s outfile.write('%%s,\\n' %% quote_python(%s_).encode(" - "ExternalEncoding))\n" % (fill, name)) + wrt("%s outfile.write('%%s,\\n' %% self.gds_encode(" + "quote_python(%s_)))\n" % (fill, name, )) elif (childType in IntegerType or childType == PositiveIntegerType or childType == NonPositiveIntegerType or @@ -2733,7 +3122,7 @@ def generateExportLiteralFn(wrt, prefix, element): "already_processed, name_):\n") count = 0 attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] count += 1 name = attrDef.getName() @@ -2746,7 +3135,7 @@ def generateExportLiteralFn(wrt, prefix, element): attrType = SimpleTypeDict[attrType].getBase() wrt(" if self.%s is not None and '%s' not in " "already_processed:\n" % ( - mappedName, mappedName, )) + mappedName, mappedName, )) wrt(" already_processed.add('%s')\n" % ( mappedName, )) if attrType == DateTimeType: @@ -2809,18 +3198,18 @@ def generateExportLiteralFn(wrt, prefix, element): if parentName: count += 1 elName = element.getCleanName() - wrt(" super(%s, self).exportLiteralAttributes(" + wrt(" super(%s%s, self).exportLiteralAttributes(" "outfile, level, already_processed, name_)\n" % - (elName, )) + (prefix, elName, )) if count == 0: wrt(" pass\n") wrt(" def exportLiteralChildren(self, outfile, level, name_):\n") parentName, parent = getParentName(element) if parentName: elName = element.getCleanName() - wrt(" super(%s, self).exportLiteralChildren(" + wrt(" super(%s%s, self).exportLiteralChildren(" "outfile, level, name_)\n" % - (elName, )) + (prefix, elName, )) for child in element.getChildren(): name = child.getName() name = cleanupName(name) @@ -2878,7 +3267,7 @@ def generateExportLiteralFn(wrt, prefix, element): def generateBuildAttributes(wrt, element, hasAttributes): attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] hasAttributes += 1 name = attrDef.getName() @@ -2900,7 +3289,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): wrt(' try:\n') wrt(" self.%s = self.gds_parse_datetime(" "value)\n" % (mappedName, )) - wrt(' except ValueError, exp:\n') + wrt(' except ValueError as exp:\n') wrt(" raise ValueError(" "'Bad date-time attribute (%s): %%s' %% exp)\n" % (name, )) @@ -2914,7 +3303,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): wrt(' try:\n') wrt(" self.%s = self.gds_parse_date(" "value)\n" % (mappedName, )) - wrt(' except ValueError, exp:\n') + wrt(' except ValueError as exp:\n') wrt(" raise ValueError(" "'Bad date attribute (%s): %%s' %% exp)\n" % (name, )) @@ -2928,7 +3317,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): wrt(' try:\n') wrt(" self.%s = self.gds_parse_time(" "value)\n" % (mappedName, )) - wrt(' except ValueError, exp:\n') + wrt(' except ValueError as exp:\n') wrt(" raise ValueError(" "'Bad time attribute (%s): %%s' %% exp)\n" % (name, )) @@ -2945,7 +3334,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): wrt(" already_processed.add('%s')\n" % (name, )) wrt(' try:\n') wrt(" self.%s = int(value)\n" % (mappedName, )) - wrt(' except ValueError, exp:\n') + wrt(' except ValueError as exp:\n') wrt(" raise_parse_error(" "node, 'Bad integer attribute: %s' % exp)\n") if atype == PositiveIntegerType: @@ -2988,7 +3377,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): wrt(' try:\n') wrt(" self.%s = float(value)\n" % (mappedName, )) - wrt(' except ValueError, exp:\n') + wrt(' except ValueError as exp:\n') wrt(" raise ValueError('Bad float/double " "attribute (%s): %%s' %% exp)\n" % (name, )) @@ -3015,7 +3404,7 @@ def generateBuildAttributes(wrt, element, hasAttributes): if typeName and typeName in SimpleTypeDict: wrt(" self.validate_%s(self.%s) " "# validate type %s\n" % - (typeName, mappedName, typeName, )) + (cleanupName(typeName), mappedName, typeName, )) if element.getAnyAttribute(): hasAttributes += 1 wrt(' self.anyAttributes_ = {}\n') @@ -3062,7 +3451,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): wrt(" sval_ = child_.text\n") wrt(" try:\n") wrt(" ival_ = int(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(child_, " "'requires integer: %s' % exp)\n") if childType == PositiveIntegerType: @@ -3108,7 +3497,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): wrt(" sval_ = child_.text\n") wrt(" try:\n") wrt(" fval_ = float(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(child_, " "'requires float or double: %s' % exp)\n") wrt(" obj_ = self.mixedclass_(" @@ -3122,7 +3511,7 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): wrt(" sval_ = child_.text\n") wrt(" try:\n") wrt(" bval_ = base64.b64decode(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(child_, " "'requires base64 encoded string: %s' % exp)\n") wrt(" obj_ = self.mixedclass_(" @@ -3140,9 +3529,9 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): type_element = ElementDict.get(type_name) if type_element and type_element.isAbstract(): abstract_child = True - if not delayed and not child in DelayedElements: - DelayedElements.append(child) - DelayedElements_subclass.append(child) + if not delayed and child not in DelayedElements: + DelayedElements.add(child) + DelayedElements_subclass.add(child) wrt(" %s nodeName_ == '%s':\n" % (keyword, origName, )) if abstract_child: wrt(TEMPLATE_ABSTRACT_CHILD % (mappedName, )) @@ -3151,8 +3540,9 @@ def generateBuildMixed_1(wrt, prefix, child, headChild, keyword, delayed): if type_obj is not None and type_obj.getExtended(): wrt(" class_obj_ = self.get_class_obj_(" "child_, %s%s)\n" % ( + prefix, cleanupName(mapName(childType)), )) + wrt(" class_obj_ = %s%s.factory()\n" % ( prefix, cleanupName(mapName(childType)), )) - wrt(" class_obj_ = %s%s.factory()\n") else: wrt(" obj_ = %s%s.factory()\n" % ( prefix, cleanupName(mapName(childType)))) @@ -3232,10 +3622,18 @@ def generateBuildStandard_1( childType in DateTimeGroupType or child.isListType())): wrt(" %s nodeName_ == '%s':\n" % (keyword, origName, )) - wrt(" %s_ = child_.text\n" % name) + if PreserveCdataTags: + wrt(" mo_ = PRESERVE_CDATA_TAGS_PAT.search(" + "etree_.tostring(child_).strip())\n") + wrt(" %s_ = mo_.group(1)\n" % name) + else: + wrt(" %s_ = child_.text\n" % name) if childType == TokenType: - wrt(' %s_ = re_.sub(' + wrt(' if %s_:\n' % (name, )) + wrt(' %s_ = re_.sub(' 'String_cleanup_pat_, " ", %s_).strip()\n' % (name, name)) + wrt(' else:\n') + wrt(' %s_ = ""\n' % (name, )) if child.isListType(): if (childType in IntegerType or childType == PositiveIntegerType or @@ -3275,7 +3673,7 @@ def generateBuildStandard_1( wrt(" sval_ = child_.text\n") wrt(" try:\n") wrt(" ival_ = int(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(child_, " "'requires integer: %s' % exp)\n") if childType == PositiveIntegerType: @@ -3324,7 +3722,7 @@ def generateBuildStandard_1( wrt(" sval_ = child_.text\n") wrt(" try:\n") wrt(" fval_ = float(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(" "child_, 'requires float or double: %s' % exp)\n") wrt(" fval_ = self.gds_validate_float(" @@ -3340,7 +3738,7 @@ def generateBuildStandard_1( wrt(" if sval_ is not None:\n") wrt(" try:\n") wrt(" bval_ = base64.b64decode(sval_)\n") - wrt(" except (TypeError, ValueError), exp:\n") + wrt(" except (TypeError, ValueError) as exp:\n") wrt(" raise_parse_error(child_, " "'requires base64 encoded string: %s' % exp)\n") wrt(" bval_ = self.gds_validate_base64(" @@ -3363,9 +3761,9 @@ def generateBuildStandard_1( type_element = ElementDict.get(type_name) if type_element and type_element.isAbstract(): abstract_child = True - if not delayed and not child in DelayedElements: - DelayedElements.append(child) - DelayedElements_subclass.append(child) + if not delayed and child not in DelayedElements: + DelayedElements.add(child) + DelayedElements_subclass.add(child) wrt(" %s nodeName_ == '%s':\n" % (keyword, origName, )) # Is this a simple type? if child.getSimpleType(): @@ -3396,18 +3794,23 @@ def generateBuildStandard_1( if headChild.getMaxOccurs() > 1: substitutionGroup = child.getAttrs().get('substitutionGroup') if substitutionGroup is not None: - name = substitutionGroup + _, name = get_prefix_and_value(substitutionGroup) + name = mapName(name) else: name = mappedName + name = cleanupName(name) s1 = " self.%s.append(obj_)\n" % (name, ) else: substitutionGroup = child.getAttrs().get('substitutionGroup') if substitutionGroup is not None: - name = substitutionGroup + _, name = get_prefix_and_value(substitutionGroup) + name = mapName(name) else: - name = headName - s1 = " self.%s = obj_\n" % (mappedName, ) + name = mapName(headName) + name = cleanupName(name) + s1 = " self.%s = obj_\n" % (name, ) wrt(s1) + wrt(" obj_.original_tagname_ = '%s'\n" % (origName, )) # # If this child is defined in a simpleType, then generate # a validator method. @@ -3419,23 +3822,33 @@ def generateBuildStandard_1( ElementDict[childType].getSimpleType()): typeName = ElementDict[childType].getType() # fixlist - if (child.getSimpleType() in SimpleTypeDict and - SimpleTypeDict[child.getSimpleType()].isListType()): - wrt(" self.%s = self.%s.split()\n" % ( - mappedName, mappedName, )) + # splitting the list is now done in gds_validate_xxx_list. +## if (child.getSimpleType() in SimpleTypeDict and +## SimpleTypeDict[child.getSimpleType()].isListType()): +## wrt(" self.%s = self.%s.split()\n" % ( +## mappedName, mappedName, )) typeName = child.getSimpleType() if typeName and typeName in SimpleTypeDict: - wrt(" self.validate_%s(self.%s) # validate type %s\n" % ( - typeName, mappedName, typeName, )) + if child.getMaxOccurs() > 1: + wrt(" # validate type %s\n" % (typeName, )) + wrt(" self.validate_%s(self.%s[-1])\n" % ( + cleanupName(typeName), mappedName, )) + else: + wrt(" # validate type %s\n" % (typeName, )) + wrt(" self.validate_%s(self.%s)\n" % ( + cleanupName(typeName), mappedName, )) # end generateBuildStandard_1 -def transitiveClosure(m, e): +def transitiveClosure(m, e, seen): t = [] + if e in seen: + return t if e in m: t += m[e] + seen.add(e) for f in m[e]: - t += transitiveClosure(m, f) + t += transitiveClosure(m, f, seen) return t @@ -3455,8 +3868,9 @@ def generateBuildStandard(wrt, prefix, element, keyword, delayed, hasChildren): # substitutionGroup. childName = child.getName() if childName in SubstitutionGroups: + seen = set() for memberName in transitiveClosure( - SubstitutionGroups, childName): + SubstitutionGroups, childName, seen): memberName = cleanupName(memberName) if memberName in ElementDict: member = ElementDict[memberName] @@ -3514,9 +3928,9 @@ def generateBuildFn(wrt, prefix, element, delayed): if parentName: hasAttributes += 1 elName = element.getCleanName() - wrt(' super(%s, self).buildAttributes(' + wrt(' super(%s%s, self).buildAttributes(' 'node, attrs, already_processed)\n' % - (elName, )) + (prefix, elName, )) if hasAttributes == 0: wrt(' pass\n') wrt(' def buildChildren(self, child_, node, nodeName_, ' @@ -3534,8 +3948,8 @@ def generateBuildFn(wrt, prefix, element, delayed): base = element.getBase() if base and not element.getSimpleContent(): elName = element.getCleanName() - wrt(" super(%s, self).buildChildren(" - "child_, node, nodeName_, True)\n" % (elName, )) + wrt(" super(%s%s, self).buildChildren(" + "child_, node, nodeName_, True)\n" % (prefix, elName, )) if hasChildren == 0: wrt(" pass\n") # end generateBuildFn @@ -3579,12 +3993,14 @@ def buildCtorArgs_multilevel_aux(addedArgs, add, element): def buildCtorArgs_aux(addedArgs, add, element): attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] name = attrDef.getName() default = attrDef.getDefault() mappedName = name.replace(':', '_') mappedName = cleanupName(mapName(mappedName)) + if mappedName == element.getCleanName(): + mappedName += '_member' if mappedName in addedArgs: continue addedArgs[mappedName] = 1 @@ -3645,6 +4061,8 @@ def buildCtorArgs_aux(addedArgs, add, element): add(", %s='%s'" % (mappedName, default, )) for child in element.getChildren(): cleanName = child.getCleanName() + if cleanName == element.getCleanName(): + cleanName += '_member' if cleanName in addedArgs: continue addedArgs[cleanName] = 1 @@ -3706,11 +4124,16 @@ MixedCtorInitializers = '''\ ''' -def generateCtor(wrt, element): +def generateCtor(wrt, prefix, element): elName = element.getCleanName() childCount = countChildren(element, 0) s2 = buildCtorArgs_multilevel(element, childCount) wrt(' def __init__(self%s):\n' % s2) + # Save the original tag name. This is needed when there is a + # xs:substitutionGroup and we later (e.g. during export) do not know + # which member of the xs:substitutionGroup this specific element + # came from. + wrt(' self.original_tagname_ = None\n') parentName, parent = getParentName(element) if parentName: if parentName in AlreadyGenerated: @@ -3718,46 +4141,53 @@ def generateCtor(wrt, element): s2 = ''.join(args) if len(args) > 254: wrt(' arglist_ = (%s)\n' % (s2, )) - wrt(' super(%s, self).__init__(*arglist_)\n' % - (elName, )) + wrt(' super(%s%s, self).__init__(*arglist_)\n' % + (prefix, elName, )) else: - wrt(' super(%s, self).__init__(%s)\n' % (elName, s2, )) + wrt(' super(%s%s, self).__init__(%s)\n' % ( + prefix, elName, s2, )) attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] mappedName = cleanupName(attrDef.getName()) name = mapName(mappedName) + if name == element.getCleanName(): + mbrname = name + '_member' + else: + mbrname = name attrType = attrDef.getType() if attrType == DateTimeType: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (name, )) + "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) wrt(" self.%s = initvalue_\n" % (name, )) elif attrType == DateType: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%Y-%%m-%%d').date()\n" % (name, )) + "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) wrt(" self.%s = initvalue_\n" % (name, )) elif attrType == TimeType: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%H:%%M:%%S').time()\n" % (name, )) + "%s, '%%H:%%M:%%S').time()\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) wrt(" self.%s = initvalue_\n" % (name, )) else: pythonType = SchemaToPythonTypeMap.get(attrDef.getType()) - attrVal = "_cast(%s, %s)" % (pythonType, name, ) + attrVal = "_cast(%s, %s)" % (pythonType, mbrname, ) wrt(' self.%s = %s\n' % (name, attrVal, )) - member = 1 # Generate member initializers in ctor. - member = 0 for child in element.getChildren(): name = cleanupName(child.getCleanName()) + if name == element.getCleanName(): + mbrname = name + '_member' + else: + mbrname = name logging.debug("Constructor child: %s" % name) logging.debug("Dump: %s" % child.__dict__) childType = child.getType() @@ -3770,103 +4200,403 @@ def generateCtor(wrt, element): else: wrt(' self.anytypeobjs_ = anytypeobjs_\n') elif childType == DateTimeType and child.getMaxOccurs() <= 1: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (name, )) + "%s, '%%Y-%%m-%%dT%%H:%%M:%%S')\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) if child.getMaxOccurs() > 1: wrt(" self.%s.append(initvalue_)\n" % (name, )) else: wrt(" self.%s = initvalue_\n" % (name, )) elif childType == DateType and child.getMaxOccurs() <= 1: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%Y-%%m-%%d').date()\n" % (name, )) + "%s, '%%Y-%%m-%%d').date()\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) if child.getMaxOccurs() > 1: wrt(" self.%s.append(initvalue_)\n" % (name, )) else: wrt(" self.%s = initvalue_\n" % (name, )) elif childType == TimeType and child.getMaxOccurs() <= 1: - wrt(" if isinstance(%s, basestring):\n" % (name, )) + wrt(" if isinstance(%s, BaseStrType_):\n" % (mbrname, )) wrt(" initvalue_ = datetime_.datetime.strptime(" - "%s, '%%H:%%M:%%S').time()\n" % (name, )) + "%s, '%%H:%%M:%%S').time()\n" % (mbrname, )) wrt(" else:\n") - wrt(" initvalue_ = %s\n" % (name, )) + wrt(" initvalue_ = %s\n" % (mbrname, )) if child.getMaxOccurs() > 1: wrt(" self.%s.append(initvalue_)\n" % (name, )) else: wrt(" self.%s = initvalue_\n" % (name, )) else: if child.getMaxOccurs() > 1: - wrt(' if %s is None:\n' % (name, )) + wrt(' if %s is None:\n' % (mbrname, )) wrt(' self.%s = []\n' % (name, )) wrt(' else:\n') - wrt(' self.%s = %s\n' % (name, name)) + wrt(' self.%s = %s\n' % (name, mbrname)) else: typeObj = ElementDict.get(child.getType()) if (child.getDefault() and typeObj is not None and typeObj.getSimpleContent()): - wrt(' if %s is None:\n' % (name, )) + wrt(' if %s is None:\n' % (mbrname, )) wrt(" self.%s = globals()['%s']('%s')\n" % (name, child.getType(), child.getDefault(), )) wrt(' else:\n') - wrt(' self.%s = %s\n' % (name, name)) + wrt(' self.%s = %s\n' % (name, mbrname)) else: - wrt(' self.%s = %s\n' % (name, name)) - member = 1 + wrt(' self.%s = %s\n' % (name, mbrname)) + # validate if it is a simple type. Validation shows + # a warning so no fear that an error would rise. + typeName = child.getSimpleType() + if typeName and typeName in SimpleTypeDict: + wrt(' self.validate_%s(self.%s)\n' % ( + cleanupName(typeName), mapName(name))) eltype = element.getType() if (element.getSimpleContent() or element.isMixed() or eltype in SimpleTypeDict or CurrentNamespacePrefix + eltype in OtherSimpleTypes): wrt(' self.valueOf_ = valueOf_\n') - member = 1 if element.getAnyAttribute(): wrt(' self.anyAttributes_ = {}\n') - member = 1 if element.getExtended(): wrt(' self.extensiontype_ = extensiontype_\n') - member = 1 - if not member: - wrt(' pass\n') if element.isMixed(): wrt(MixedCtorInitializers) # end generateCtor -# -# Attempt to retrieve the body (implementation) of a validator -# from a directory containing one file for each simpleType. -# The name of the file should be the same as the name of the -# simpleType with and optional ".py" extension. -def getValidatorBody(stName): - retrieved = 0 - if ValidatorBodiesBasePath: - found = 0 - path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, ) - if os.path.exists(path): - found = 1 - else: - path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, ) +# find the simple type, either a named simpleType or an anonymous one. +def find_simple_type_def(tree, stName, element, child, ns, base): + st = None + path1 = ("//xs:complexType[@name=$typeName]" + "//xs:element[@name=$childName]/xs:simpleType") + path2 = ("//xs:element[@name=$typeName]/xs:complexType//xs:element" + "[@name=$childName]/xs:simpleType") + if stName: + st_defs = tree.xpath( + "//xs:simpleType[@name=$n]", + namespaces=ns, n=stName) + if st_defs: + st = st_defs[0] + elif element is not None and child is not None: + typeName = element.getType() + childName = child.getName() + # search for an anonymous simpleType. + el_defs = tree.xpath( + path1, + namespaces=ns, typeName=typeName, childName=childName) + if el_defs: + st = el_defs[0] + else: + # search for an anonymous simpleType inside an anonymous + # complexType. + el_defs = tree.xpath( + path2, + namespaces=ns, typeName=typeName, childName=childName) + return st + + +def get_target_value(default, stName): + stObj = SimpleTypeDict.get(stName) + targetValue = default + if stObj is not None: + if stObj.getBase() == DateType: + targetValue = "self.gds_parse_date('{}')".format(default) + elif stObj.getBase() == TimeType: + targetValue = "self.gds_parse_time('{}')".format(default) + elif stObj.getBase() == DateTimeType: + targetValue = "self.gds_parse_datetime('{}')".format(default) + return targetValue + + +Vbar_repl_pat = re.compile('([^\\\])\|') + + +# Replace vertical bars with "$|^", unless escaped with backslash. +def replaceVbars(instr): + outstr, count = re.subn(Vbar_repl_pat, '\\1$|^', instr) + return outstr + + +# Generate validation code for each restriction. +# Recursivly call to process possible chain of base types. +def processValidatorBodyRestrictions( + tree, s1, restrictions, st, ns, stName, base, + patterns1): + for restriction in restrictions: + # + # pattern + pats1 = restriction.xpath( + "./xs:pattern/@value", namespaces=ns) + if pats1: + pats2 = ['^{}$'.format(replaceVbars(p1)) for p1 in pats1] + patterns1.append(pats2) + # + # Check for and generate code for each possible type of restriction. + # + # enumerations + enumerations = restriction.xpath( + "./xs:enumeration/@value", namespaces=ns) + if enumerations: + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " value = str(value)\n" + s1 += " enumerations = %(enumerations)s\n" % { + 'enumerations': enumerations} + s1 += " enumeration_respectee = False\n" + s1 += " for enum in enumerations:\n" + s1 += " if value == enum:\n" + s1 += " enumeration_respectee = True\n" + s1 += " break\n" + s1 += " if not enumeration_respectee:\n" + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd enumeration restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # maxLength + maxLength = restriction.xpath( + "./xs:maxLength/@value", namespaces=ns) + if maxLength: + maxLength = maxLength[0] + toencode = '% {"value" : value}' + valuestring = '(str(value))' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " if len%(valuestr)s > %(maxLen)s:\n" % { + 'maxLen': maxLength, "valuestr": valuestring} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd maxLength restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # minLength + minLength = restriction.xpath( + "./xs:minLength/@value", namespaces=ns) + if minLength: + minLength = minLength[0] + toencode = '% {"value" : value}' + valuestring = '(str(value))' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " if len%(valuestr)s < %(minLen)s:\n" % { + 'minLen': minLength, "valuestr": valuestring} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd minLength restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # length + length = restriction.xpath( + "./xs:length/@value", namespaces=ns) + if length: + length = length[0] + toencode = '% {"value" : value}' + valuestring = '(str(value))' + if 'string' in base: + valuestring = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " if len%(valuestring)s != %(length)s:\n" % { + 'length': length, "valuestring": valuestring} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd length restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # minInclusive + minInclusive = restriction.xpath( + "./xs:minInclusive/@value", namespaces=ns) + if minInclusive: + minIncl = minInclusive[0] + toencode = '% {"value" : value}' + valuestring = 'value' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + targetValue = get_target_value(minIncl, stName) + s1 += " if %(valuestring)s < %(minIncl)s:\n" % { + 'minIncl': targetValue, "valuestring": valuestring} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd minInclusive restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # maxInclusive + maxInclusive = restriction.xpath( + "./xs:maxInclusive/@value", namespaces=ns) + if maxInclusive: + maxIncl = maxInclusive[0] + toencode = '% {"value" : value}' + valuestring = 'value' + if 'string' in base: + valuestring = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + targetValue = get_target_value(maxIncl, stName) + s1 += " if %(valuestring)s > %(maxIncl)s:\n" % { + 'maxIncl': targetValue, "valuestring": valuestring} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd maxInclusive restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # minExclusive + minExclusive = restriction.xpath( + "./xs:minExclusive/@value", namespaces=ns) + if minExclusive: + minExclusive = minExclusive[0] + toencode = '% {"value" : value}' + valstr = 'value' + if 'string' in base: + valstr = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + targetValue = get_target_value(minExclusive, stName) + s1 += " if %(valstr)s <= %(minExclusive)s:\n" % { + 'minExclusive': targetValue, "valstr": valstr} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd minExclusive restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # maxExclusive + maxExclusive = restriction.xpath( + "./xs:maxExclusive/@value", namespaces=ns) + if maxExclusive: + maxExclusive = maxExclusive[0] + toencode = '% {"value" : value}' + valstr = 'value' + if 'string' in base: + valstr = 'len(str(value))' + toencode = '% {"value" : value.encode("utf-8")}' + targetValue = get_target_value(maxExclusive, stName) + s1 += " if %(valstr)s >= %(maxExclusive)s:\n" % { + 'maxExclusive': targetValue, "valstr": valstr} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd maxExclusive restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # totalDigits + totalDigits = restriction.xpath( + "./xs:totalDigits/@value", namespaces=ns) + if totalDigits: + totalDigits = totalDigits[0] + toencode = '% {"value" : value}' + valstr = '(str(value))' + if 'string' in base: + valstr = '(value)' + toencode = '% {"value" : value.encode("utf-8")}' + s1 += " if len%(valstr)s >= %(totalDigits)s:\n" % { + 'totalDigits': totalDigits, "valstr": valstr} + s1 += (" warnings_.warn('Value \"%(val)s\" " + "does not match xsd maxInclusive restriction on " + "%(typename)s' %(express)s )\n" % { + "val": '%(value)s', + "typename": stName, + "express": toencode} + ) + # + # Recurse into base simpleType, if it exists. + base1 = restriction.get('base') + if base1 is not None: + if ":" in base1: + base1 = base1.split(":")[1] + st1 = find_simple_type_def(tree, base1, None, None, ns, base) + if st1 is not None: + restrictions1 = st1.xpath( + "./xs:restriction", + namespaces=ns, n=stName, b=base) + if restrictions1: + s2 = processValidatorBodyRestrictions( + tree, '', restrictions1, st1, ns, stName, + base1, patterns1) + s1 += s2 + return s1 +# end processValidatorBodyRestrictions + + +# Generate validator method bodies. +def getValidatorBody(stName, base, element, child): + s1 = None + patterns1 = '' + if not UseOldSimpleTypeValidators and SchemaLxmlTree is not None: + # generate validator bodies directly from the XML schema. + ns = {'xs': 'http://www.w3.org/2001/XMLSchema'} + tree = SchemaLxmlTree + # on determine l elemnt ou le type est definit + st = find_simple_type_def(tree, stName, element, child, ns, base) + if st is not None: + restrictions = st.xpath( + "./xs:restriction", + namespaces=ns, n=stName, b=base) + # une liste qui contient les restrictions deja traitees + if restrictions: + s1 = (' if value is not None and ' + 'Validate_simpletypes_:\n') + initial_len = len(s1) + patterns1 = [] + s1 = processValidatorBodyRestrictions( + tree, s1, restrictions, st, ns, stName, base, + patterns1) + if len(s1) == initial_len and not patterns1: + s1 += ' pass\n' + if s1 is None: + s1 = ' pass\n' + return s1, patterns1 + # + # if UseOldSimpleTypeValidators + else: + # Generate validator bodies from user code. + retrieved = 0 + if ValidatorBodiesBasePath: + found = 0 + path = '%s%s%s.py' % (ValidatorBodiesBasePath, os.sep, stName, ) if os.path.exists(path): found = 1 - if found: - infile = open(path, 'r') - lines = infile.readlines() - infile.close() - lines1 = [] - for line in lines: - if not line.startswith('##'): - lines1.append(line) - s1 = ''.join(lines1) - retrieved = 1 - if not retrieved: - s1 = ' pass\n' - return s1 + else: + path = '%s%s%s' % (ValidatorBodiesBasePath, os.sep, stName, ) + if os.path.exists(path): + found = 1 + if found: + infile = open(path, 'r') + lines = infile.readlines() + infile.close() + lines1 = [] + for line in lines: + if not line.startswith('##'): + lines1.append(line) + s1 = ''.join(lines1) + retrieved = 1 + if not retrieved: + s1 = ' pass\n' + return s1, None # end getValidatorBody @@ -3892,14 +4622,18 @@ def generateGettersAndSetters(wrt, element): if child.getMaxOccurs() > 1: wrt(' def add%s(self, value): self.%s.append(value)\n' % (capName, name)) - wrt(' def insert%s(self, index, value): ' + suffix = make_gs_name('at') + wrt(' def insert%s%s(self, index, value): ' + 'self.%s.insert(index, value)\n' % + (capName, suffix, name)) + wrt(' def replace%s%s(self, index, value): ' 'self.%s[index] = value\n' % - (capName, name)) + (capName, suffix, name)) if GenerateProperties: wrt(' %sProp = property(get%s, set%s)\n' % (unmappedName, capName, capName)) attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] name = cleanupName(attrDef.getName().replace(':', '_')) mappedName = mapName(name) @@ -3942,8 +4676,10 @@ def generateValidatorDefs(wrt, element): if (typeName and typeName in SimpleTypeDict and typeName not in generatedSimpleTypes): + cleanTypeName = cleanupName(typeName) generatedSimpleTypes.append(typeName) - wrt(' def validate_%s(self, value):\n' % (typeName, )) + wrt(' def validate_%s(self, value):\n' % ( + cleanupName(typeName), )) if typeName in SimpleTypeDict: stObj = SimpleTypeDict[typeName] wrt(' # Validate type %s, a restriction ' @@ -3951,23 +4687,53 @@ def generateValidatorDefs(wrt, element): (typeName, stObj.getBase(), )) else: wrt(' # validate type %s\n' % (typeName, )) - wrt(getValidatorBody(typeName)) + body, patterns = getValidatorBody( + typeName, stObj.getBase(), element, child) + wrt(body) + if patterns: + wrt(' if not self.gds_validate_simple_patterns(\n') + wrt(' self.validate_%s_patterns_, ' + 'value):\n' % (cleanTypeName, )) + s1 = (" warnings_.warn('Value \"%%s\" " + "does not match xsd pattern restrictions: %%s' " + "%% (value.encode('utf-8'), " + "self.validate_%s_patterns_, ))\n" % (cleanTypeName, ) + ) + wrt(s1) + wrt(' validate_%s_patterns_ = %s\n' % ( + cleanTypeName, patterns, )) attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] typeName = attrDef.getType() if (typeName and typeName in SimpleTypeDict and typeName not in generatedSimpleTypes): + cleanTypeName = cleanupName(typeName) generatedSimpleTypes.append(typeName) - wrt(' def validate_%s(self, value):\n' % (typeName, )) + wrt(' def validate_%s(self, value):\n' % ( + cleanupName(typeName), )) if typeName in SimpleTypeDict: stObj = SimpleTypeDict[typeName] wrt(' # Validate type %s, a restriction on %s.\n' % ( typeName, stObj.getBase(), )) else: wrt(' # validate type %s\n' % (typeName, )) - wrt(getValidatorBody(typeName)) + body, patterns = getValidatorBody( + typeName, stObj.getBase(), None, None) + wrt(body) + if patterns: + wrt(' if not self.gds_validate_simple_patterns(\n') + wrt(' self.validate_%s_patterns_, ' + 'value):\n' % (cleanTypeName, )) + s1 = (" warnings_.warn('Value \"%%s\" " + "does not match xsd pattern restrictions: %%s' " + "%% (value.encode('utf-8'), " + "self.validate_%s_patterns_, ))\n" % (cleanTypeName, ) + ) + wrt(s1) + wrt(' validate_%s_patterns_ = %s\n' % ( + cleanTypeName, patterns, )) # end generateValidatorDefs @@ -3983,16 +4749,18 @@ def generateMemberSpec(wrt, element): else: content = [' member_data_items_ = ['] add = content.append - for attrName, attrDef in element.getAttributeDefs().items(): - item1 = attrName + attrDefs = element.getAttributeDefs() + for attrName in element.getAttributeDefsList(): + attrDef = attrDefs[attrName] + item1 = mapName(attrName) item2 = attrDef.getType() item3 = 0 if generateDict: - item = " '%s': MemberSpec_('%s', '%s', %d)," % ( - item1, item1, item2, item3, ) + item = " '%s': MemberSpec_('%s', '%s', %d, %s)," % ( + item1, item1, item2, item3, str({'use':attrDef.getUse()})) else: - item = " MemberSpec_('%s', '%s', %d)," % ( - item1, item2, item3, ) + item = " MemberSpec_('%s', '%s', %d, %s)," % ( + item1, item2, item3, str({'use':attrDef.getUse()})) add(item) for child in element.getChildren(): name = cleanupName(child.getCleanName()) @@ -4014,12 +4782,14 @@ def generateMemberSpec(wrt, element): else: item3 = 0 if generateDict: - item = " '%s': MemberSpec_('%s', %s, %d)," % ( - item1, item1, item2, item3, ) + item = " '%s': MemberSpec_('%s', %s, %d, %s, %s)," % ( + item1, item1, item2, item3, str(child.getAttrs()), + id(child.choice) if child.choice else None) else: #item = " ('%s', '%s', %d)," % (item1, item2, item3, ) - item = " MemberSpec_('%s', %s, %d)," % ( - item1, item2, item3, ) + item = " MemberSpec_('%s', %s, %d, %s, %s)," % ( + item1, item2, item3, str(child.getAttrs()), + id(child.choice) if child.choice else None) add(item) simplebase = element.getSimpleBase() if element.getSimpleContent() or element.isMixed(): @@ -4061,7 +4831,7 @@ def generateUserMethods(wrt, element): wrt(source) -def generateHascontentMethod(wrt, element): +def generateHascontentMethod(wrt, prefix, element): wrt(' def hasContent_(self):\n') wrt(' if (\n') firstTime = True @@ -4069,34 +4839,67 @@ def generateHascontentMethod(wrt, element): if child.getType() == AnyTypeIdentifier: name = 'anytypeobjs_' else: - name = mapName(cleanupName(child.getName())) + name = child.getCleanName() if not firstTime: wrt(' or\n') firstTime = False if child.getMaxOccurs() > 1: wrt(' self.%s' % (name, )) else: - wrt(' self.%s is not None' % (name, )) + default = child.getDefault() + if default is None: + wrt(' self.%s is not None' % (name, )) + else: + child_type = child.getType() + if (child_type in StringType or + child_type == TokenType or + child_type in DateTimeGroupType): + wrt(' self.%s != "%s"' % (name, default, )) + elif child_type == BooleanType: + if default == 'true': + wrt(' not self.%s' % (name, )) + elif default == 'false': + wrt(' self.%s' % (name, )) + else: + wrt(' self.%s is not None' % (name, )) + else: + wrt(' self.%s != %s' % (name, default, )) if element.getSimpleContent() or element.isMixed(): if not firstTime: wrt(' or\n') firstTime = False - wrt(' self.valueOf_') + wrt(' 1 if type(self.valueOf_) ' + 'in [int,float] else self.valueOf_') parentName, parent = getParentName(element) if parentName: elName = element.getCleanName() if not firstTime: wrt(' or\n') firstTime = False - wrt(' super(%s, self).hasContent_()' % (elName, )) + wrt(' super(%s%s, self).hasContent_()' % (prefix, elName, )) wrt('\n ):\n') wrt(' return True\n') wrt(' else:\n') wrt(' return False\n') -def generateClasses(wrt, prefix, element, delayed): +FactoryMethodTemplate = """\ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, {prefix}{name}) + if subclass is not None: + return subclass(*args_, **kwargs_) + if {prefix}{name}.subclass: + return {prefix}{name}.subclass(*args_, **kwargs_) + else: + return {prefix}{name}(*args_, **kwargs_) +""" + + +def generateClasses(wrt, prefix, element, delayed, nameSpacesDef=''): logging.debug("Generating class for: %s" % element) + mappedName = element.getCleanName() parentName, base = getParentName(element) logging.debug("Element base: %s" % base) if not element.isExplicitDefine(): @@ -4107,13 +4910,12 @@ def generateClasses(wrt, prefix, element, delayed): # If this element is an extension (has a base) and the base has # not been generated, then postpone it. if parentName: - if (parentName not in AlreadyGenerated and - parentName not in SimpleTypeDict): + if parentName not in AlreadyGenerated: PostponedExtensions.append(element) return - if element.getName() in AlreadyGenerated: + if mappedName in AlreadyGenerated: return - AlreadyGenerated.append(element.getName()) + AlreadyGenerated.add(mappedName) if element.getMixedExtensionError(): err_msg('*** Element %s extension chain contains mixed and ' 'non-mixed content. Not generated.\n' % @@ -4122,125 +4924,108 @@ def generateClasses(wrt, prefix, element, delayed): ElementsForSubclasses.append(element) name = element.getCleanName() if parentName: - s1 = 'class %s%s(%s):\n' % (prefix, name, parentName,) + s1 = 'class %s%s(%s%s):\n' % (prefix, name, prefix, parentName,) else: s1 = 'class %s%s(GeneratedsSuper):\n' % (prefix, name) wrt(s1) # If this element has documentation, generate a doc-string. if element.documentation: s2 = ' '.join(element.documentation.strip().split()) - s2 = s2.encode('utf-8') s2 = textwrap.fill(s2, width=68, subsequent_indent=' ') - if s2[0] == '"' or s2[-1] == '"': - s2 = ' """ %s """\n' % (s2, ) - else: - s2 = ' """%s"""\n' % (s2, ) - wrt(s2) + if sys.version_info.major == 2: + s2 = s2.encode('utf-8') + if len(s2) > 1: + if s2[0] == '"' or s2[-1] == '"': + s2 = ' """ %s """\n' % (s2, ) + else: + s2 = ' """%s"""\n' % (s2, ) + wrt(s2) if UserMethodsModule or MemberSpecs: generateMemberSpec(wrt, element) wrt(' subclass = None\n') parentName, parent = getParentName(element) superclass_name = 'None' if parentName and parentName in AlreadyGenerated: - superclass_name = mapName(cleanupName(parentName)) + superclass_name = prefix + parentName wrt(' superclass = %s\n' % (superclass_name, )) - generateCtor(wrt, element) - wrt(' def factory(*args_, **kwargs_):\n') - wrt(' if %s%s.subclass:\n' % (prefix, name)) - wrt(' return %s%s.subclass(*args_, **kwargs_)\n' % ( - prefix, name)) - wrt(' else:\n') - wrt(' return %s%s(*args_, **kwargs_)\n' % (prefix, name)) + generateCtor(wrt, prefix, element) + wrt(FactoryMethodTemplate.format(prefix=prefix, name=name)) wrt(' factory = staticmethod(factory)\n') if UseGetterSetter != 'none': generateGettersAndSetters(wrt, element) generateValidatorDefs(wrt, element) - if Targetnamespace in NamespacesDict: + if element.namespace: + namespace = element.namespace + elif element.targetNamespace in NamespacesDict: + namespace = NamespacesDict[element.targetNamespace] + elif Targetnamespace in NamespacesDict: namespace = NamespacesDict[Targetnamespace] else: namespace = '' - generateHascontentMethod(wrt, element) - if ExportWrite: - generateExportFn(wrt, prefix, element, namespace) - if ExportEtree: - generateToEtree(wrt, element, Targetnamespace) - if ExportLiteral: - generateExportLiteralFn(wrt, prefix, element) - generateBuildFn(wrt, prefix, element, delayed) + generateHascontentMethod(wrt, prefix, element) + if not XmlDisabled: + if ExportWrite: + generateExportFn(wrt, prefix, element, namespace, nameSpacesDef) + if ExportEtree: + generateToEtree(wrt, element, Targetnamespace) + if ExportLiteral: + generateExportLiteralFn(wrt, prefix, element) + generateBuildFn(wrt, prefix, element, delayed) generateUserMethods(wrt, element) - wrt('# end class %s\n' % name) + wrt('# end class %s%s\n' % (prefix, name, )) wrt('\n\n') # end generateClasses TEMPLATE_HEADER = """\ -#!/usr/bin/env python +#xmldisable##!/usr/bin/env python # -*- coding: utf-8 -*- # -# Generated %s by generateDS.py%s. +# Generated {tstamp} by generateDS.py{version}. +# +# Command line options: +{options1} +# +# Command line arguments: +# {args1} +# +# Command line: +# {command_line} +# +# Current working directory (os.getcwd()): +# {current_working_directory} # import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc +import warnings as warnings_ +#xmldisable#try: +#xmldisable# from lxml import etree as etree_ +#xmldisable#except ImportError: +#xmldisable# from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +#xmldisable#def parsexml_(infile, parser=None, **kwargs): +#xmldisable# if parser is None: +#xmldisable# # Use the lxml ElementTree compatible parser so that, e.g., +#xmldisable# # we ignore comments. +#xmldisable# try: +#xmldisable# parser = etree_.ETCompatXMLParser() +#xmldisable# except AttributeError: +#xmldisable# # fallback to xml.etree +#xmldisable# parser = etree_.XMLParser() +#xmldisable# doc = etree_.parse(infile, parser=parser, **kwargs) +#xmldisable# return doc # # User methods @@ -4249,283 +5034,7 @@ def parsexml_(*args, **kwargs): # You can replace these methods by re-implementing the following class # in a module named generatedssuper.py. -try: - from generatedssuper import GeneratedsSuper -except ImportError, exp: - - class GeneratedsSuper(object): - tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') - class _FixedOffsetTZ(datetime_.tzinfo): - def __init__(self, offset, name): - self.__offset = datetime_.timedelta(minutes=offset) - self.__name = name - def utcoffset(self, dt): - return self.__offset - def tzname(self, dt): - return self.__name - def dst(self, dt): - return None - def gds_format_string(self, input_data, input_name=''): - return input_data - def gds_validate_string(self, input_data, node, input_name=''): - return input_data - def gds_format_base64(self, input_data, input_name=''): - return base64.b64encode(input_data) - def gds_validate_base64(self, input_data, node, input_name=''): - return input_data - def gds_format_integer(self, input_data, input_name=''): - return '%%d' %% input_data - def gds_validate_integer(self, input_data, node, input_name=''): - return input_data - def gds_format_integer_list(self, input_data, input_name=''): - return '%%s' %% input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of integers') - return input_data - def gds_format_float(self, input_data, input_name=''): - return ('%%.15f' %% input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): - return input_data - def gds_format_float_list(self, input_data, input_name=''): - return '%%s' %% input_data - def gds_validate_float_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of floats') - return input_data - def gds_format_double(self, input_data, input_name=''): - return '%%e' %% input_data - def gds_validate_double(self, input_data, node, input_name=''): - return input_data - def gds_format_double_list(self, input_data, input_name=''): - return '%%s' %% input_data - def gds_validate_double_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of doubles') - return input_data - def gds_format_boolean(self, input_data, input_name=''): - return ('%%s' %% input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): - return input_data - def gds_format_boolean_list(self, input_data, input_name=''): - return '%%s' %% input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - if value not in ('true', '1', 'false', '0', ): - raise_parse_error( - node, - 'Requires sequence of booleans ' - '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): - return input_data - def gds_format_datetime(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%%04d-%%02d-%%02dT%%02d:%%02d:%%02d' %% ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%%04d-%%02d-%%02dT%%02d:%%02d:%%02d.%%s' %% ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ('%%f' %% (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_datetime(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime( - input_data, '%%Y-%%m-%%dT%%H:%%M:%%S.%%f') - else: - dt = datetime_.datetime.strptime( - input_data, '%%Y-%%m-%%dT%%H:%%M:%%S') - dt = dt.replace(tzinfo=tz) - return dt - def gds_validate_date(self, input_data, node, input_name=''): - return input_data - def gds_format_date(self, input_data, input_name=''): - _svalue = '%%04d-%%02d-%%02d' %% ( - input_data.year, - input_data.month, - input_data.day, - ) - try: - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - except AttributeError: - pass - return _svalue - @classmethod - def gds_parse_date(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - dt = datetime_.datetime.strptime(input_data, '%%Y-%%m-%%d') - dt = dt.replace(tzinfo=tz) - return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): - return input_data - def gds_format_time(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%%02d:%%02d:%%02d' %% ( - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%%02d:%%02d:%%02d.%%s' %% ( - input_data.hour, - input_data.minute, - input_data.second, - ('%%f' %% (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_time(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime(input_data, '%%H:%%M:%%S.%%f') - else: - dt = datetime_.datetime.strptime(input_data, '%%H:%%M:%%S') - dt = dt.replace(tzinfo=tz) - return dt.time() - def gds_str_lower(self, instring): - return instring.lower() - def get_path_(self, node): - path_list = [] - self.get_path_list_(node, path_list) - path_list.reverse() - path = '/'.join(path_list) - return path - Tag_strip_pattern_ = re_.compile(r'\{.*\}') - def get_path_list_(self, node, path_list): - if node is None: - return - tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) - if tag: - path_list.append(tag) - self.get_path_list_(node.getparent(), path_list) - def get_class_obj_(self, node, default_class=None): - class_obj1 = default_class - if 'xsi' in node.nsmap: - classname = node.get('{%%s}type' %% node.nsmap['xsi']) - if classname is not None: - names = classname.split(':') - if len(names) == 2: - classname = names[1] - class_obj2 = globals().get(classname) - if class_obj2 is not None: - class_obj1 = class_obj2 - return class_obj1 - def gds_build_any(self, node, type_name=None): - return None - @classmethod - def gds_reverse_node_mapping(cls, mapping): - return dict(((v, k) for k, v in mapping.iteritems())) - +{generatedssuper_import} # # If you have installed IPython you can uncomment and use the following. @@ -4546,11 +5055,16 @@ except ImportError, exp: # Globals # -ExternalEncoding = '%s' -Tag_pattern_ = re_.compile(r'({.*})?(.*)') +ExternalEncoding = '{ExternalEncoding}' +Tag_pattern_ = re_.compile(r'({{.*}})?(.*)') String_cleanup_pat_ = re_.compile(r"[\\n\\r\\s]+") -Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +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 +{preserve_cdata_tags_pat} # # Support/utility functions. # @@ -4563,29 +5077,42 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%%s' %% inStr) - s1 = s1.replace('&', '&') + {quote_xml_text} + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%%s' %% inStr) + {quote_attrib_text} s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') if '"' in s1: if "'" in s1: - s1 = '"%%s"' %% s1.replace('"', """) + s1 = '"%s"' % s1.replace('"', """) else: - s1 = "'%%s'" %% s1 + s1 = "'%s'" % s1 else: - s1 = '"%%s"' %% s1 + s1 = '"%s"' % s1 return s1 @@ -4593,28 +5120,19 @@ def quote_python(inStr): s1 = inStr if s1.find("'") == -1: if s1.find('\\n') == -1: - return "'%%s'" %% s1 + return "'%s'" % s1 else: - return "'''%%s'''" %% s1 + return "'''%s'''" % s1 else: if s1.find('"') != -1: s1 = s1.replace('"', '\\\\"') if s1.find('\\n') == -1: - return '"%%s"' %% s1 + return '"%s"' % s1 else: - return '\"\"\"%%s\"\"\"' %% s1 + 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 - +{preserve_cdata_get_text} def find_attr_value_(attr_name, node): attrs = node.attrib @@ -4626,7 +5144,7 @@ def find_attr_value_(attr_name, node): prefix, name = attr_parts namespace = node.nsmap.get(prefix) if namespace is not None: - value = attrs.get('{%%s}%%s' %% (namespace, name, )) + value = attrs.get('{{%s}}%s' % (namespace, name, )) return value @@ -4635,11 +5153,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%%s (element %%s/line %%d)' %% ( - msg, node.tag, node.sourceline, ) - else: - msg = '%%s (element %%s)' %% (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -4672,92 +5186,95 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - outfile.write(self.value) - elif self.category == MixedContainer.CategorySimple: - self.exportSimple(outfile, level, name) - else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) - def exportSimple(self, outfile, level, name): - if self.content_type == MixedContainer.TypeString: - outfile.write('<%%s>%%s</%%s>' %% ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeInteger or \\ - self.content_type == MixedContainer.TypeBoolean: - outfile.write('<%%s>%%d</%%s>' %% ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeFloat or \\ - self.content_type == MixedContainer.TypeDecimal: - outfile.write('<%%s>%%f</%%s>' %% ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeDouble: - outfile.write('<%%s>%%g</%%s>' %% ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeBase64: - outfile.write('<%%s>%%s</%%s>' %% ( - self.name, base64.b64encode(self.value), self.name)) - def to_etree(self, element): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - if len(element) > 0: - if element[-1].tail is None: - element[-1].tail = self.value - else: - element[-1].tail += self.value - else: - if element.text is None: - element.text = self.value - else: - element.text += self.value - elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%%s' %% self.name) - subelement.text = self.to_etree_simple() - else: # category == MixedContainer.CategoryComplex - self.value.to_etree(element) - def to_etree_simple(self): - if self.content_type == MixedContainer.TypeString: - text = self.value - elif (self.content_type == MixedContainer.TypeInteger or - self.content_type == MixedContainer.TypeBoolean): - text = '%%d' %% self.value - elif (self.content_type == MixedContainer.TypeFloat or - self.content_type == MixedContainer.TypeDecimal): - text = '%%f' %% self.value - elif self.content_type == MixedContainer.TypeDouble: - text = '%%g' %% self.value - elif self.content_type == MixedContainer.TypeBase64: - text = '%%s' %% base64.b64encode(self.value) - return text - def exportLiteral(self, outfile, level, name): - if self.category == MixedContainer.CategoryText: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%%d, %%d, "%%s", "%%s"),\\n' %% ( - self.category, self.content_type, self.name, self.value)) - elif self.category == MixedContainer.CategorySimple: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%%d, %%d, "%%s", "%%s"),\\n' %% ( - self.category, self.content_type, self.name, self.value)) - else: # category == MixedContainer.CategoryComplex - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%%d, %%d, "%%s",\\n' %% ( - self.category, self.content_type, self.name,)) - self.value.exportLiteral(outfile, level + 1) - showIndent(outfile, level) - outfile.write(')\\n') +#xmldisable# def export(self, outfile, level, name, namespace, pretty_print=True): +#xmldisable# if self.category == MixedContainer.CategoryText: +#xmldisable# # Prevent exporting empty content as empty lines. +#xmldisable# if self.value.strip(): +#xmldisable# outfile.write(self.value) +#xmldisable# elif self.category == MixedContainer.CategorySimple: +#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# def exportSimple(self, outfile, level, name): +#xmldisable# if self.content_type == MixedContainer.TypeString: +#xmldisable# outfile.write('<%s>%s</%s>' % ( +#xmldisable# self.name, self.value, self.name)) +#xmldisable# elif self.content_type == MixedContainer.TypeInteger or \\ +#xmldisable# self.content_type == MixedContainer.TypeBoolean: +#xmldisable# outfile.write('<%s>%d</%s>' % ( +#xmldisable# self.name, self.value, self.name)) +#xmldisable# elif self.content_type == MixedContainer.TypeFloat or \\ +#xmldisable# self.content_type == MixedContainer.TypeDecimal: +#xmldisable# outfile.write('<%s>%f</%s>' % ( +#xmldisable# self.name, self.value, self.name)) +#xmldisable# elif self.content_type == MixedContainer.TypeDouble: +#xmldisable# outfile.write('<%s>%g</%s>' % ( +#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# def to_etree(self, element): +#xmldisable# if self.category == MixedContainer.CategoryText: +#xmldisable# # Prevent exporting empty content as empty lines. +#xmldisable# if self.value.strip(): +#xmldisable# if len(element) > 0: +#xmldisable# if element[-1].tail is None: +#xmldisable# element[-1].tail = self.value +#xmldisable# else: +#xmldisable# element[-1].tail += self.value +#xmldisable# else: +#xmldisable# if element.text is None: +#xmldisable# element.text = self.value +#xmldisable# else: +#xmldisable# element.text += self.value +#xmldisable# elif self.category == MixedContainer.CategorySimple: +#xmldisable# subelement = etree_.SubElement(element, '%s' % self.name) +#xmldisable# subelement.text = self.to_etree_simple() +#xmldisable# else: # category == MixedContainer.CategoryComplex +#xmldisable# self.value.to_etree(element) +#xmldisable# def to_etree_simple(self): +#xmldisable# if self.content_type == MixedContainer.TypeString: +#xmldisable# text = self.value +#xmldisable# elif (self.content_type == MixedContainer.TypeInteger or +#xmldisable# self.content_type == MixedContainer.TypeBoolean): +#xmldisable# text = '%d' % self.value +#xmldisable# elif (self.content_type == MixedContainer.TypeFloat or +#xmldisable# self.content_type == MixedContainer.TypeDecimal): +#xmldisable# text = '%f' % self.value +#xmldisable# elif self.content_type == MixedContainer.TypeDouble: +#xmldisable# text = '%g' % self.value +#xmldisable# elif self.content_type == MixedContainer.TypeBase64: +#xmldisable# text = '%s' % base64.b64encode(self.value) +#xmldisable# return text +#xmldisable# def exportLiteral(self, outfile, level, name): +#xmldisable# if self.category == MixedContainer.CategoryText: +#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# 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# else: # category == MixedContainer.CategoryComplex +#xmldisable# showIndent(outfile, level) +#xmldisable# outfile.write( +#xmldisable# 'model_.MixedContainer(%d, %d, "%s",\\n' % ( +#xmldisable# self.category, self.content_type, self.name,)) +#xmldisable# self.value.exportLiteral(outfile, level + 1) +#xmldisable# showIndent(outfile, level) +#xmldisable# outfile.write(')\\n') class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0): + def __init__(self, name='', data_type='', container=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 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 @@ -4772,6 +5289,10 @@ class MemberSpec_(object): 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 _cast(typ, value): @@ -4783,21 +5304,453 @@ def _cast(typ, value): # Data representation classes. # +""" + +TEMPLATE_GENERATEDS_SUPER = """ +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): + {gds_reverse_node_mapping_text} + @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 + for key, val in self.__dict__.items(): + if other.__dict__[key] != val: + return False + return True + def __ne__(self, other): + return not self.__eq__(other) + return instring + +def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None """ # Fool (and straighten out) the syntax highlighting. # DUMMY = """ -def generateHeader(wrt, prefix): +def format_options_args(options, args): + options1 = '\n'.join(['# %s' % (item, ) for item in options]) + args1 = '\n'.join(['# %s' % (item, ) for item in args]) + program = sys.argv[0] + options2 = '' + for name, value in options: + if value: + if name.startswith('--'): + options2 += ' %s="%s"' % (name, value, ) + else: + options2 += ' %s "%s"' % (name, value, ) + else: + options2 += ' %s' % name + args1 = ' '.join(args) + command_line = '%s%s %s' % (program, options2, args1, ) + return options1, args1, command_line + + +Preserve_cdata_get_all_text1 = """\ +PRESERVE_CDATA_TAGS_PAT1 = re_.compile( + r'^<.+?>(.*?)</?[a-zA-Z0-9\-]+>(?!.*</?[a-zA-Z0-9\-]+>)') +PRESERVE_CDATA_TAGS_PAT2 = re_.compile(r'^<.+?>.*?</.+?>(.*)$') + + +def get_all_text_(node): + if node.text is not None: + mo_ = PRESERVE_CDATA_TAGS_PAT1.search(etree_.tostring(node).strip()) + if mo_ is not None: + text = mo_.group(1) + else: + text = '' + for child in node: + if child.tail is not None: + mo_ = PRESERVE_CDATA_TAGS_PAT2.search( + etree_.tostring(child).strip()) + if mo_ is not None: + text += mo_.group(1) + return text +""" + +Preserve_cdata_get_all_text2 = """\ +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 generateHeader(wrt, prefix, options, args, externalImports): + global TEMPLATE_HEADER tstamp = (not NoDates and time.ctime()) or '' if NoVersion: version = '' else: version = ' version %s' % VERSION - s1 = TEMPLATE_HEADER % (tstamp, version, ExternalEncoding, ) + options1, args1, command_line = format_options_args(options, args) + current_working_directory = os.path.split(os.getcwd())[1] + if PreserveCdataTags and not XmlDisabled: + preserve_cdata_tags_pat = \ + "PRESERVE_CDATA_TAGS_PAT = re_.compile(r'^<.+?>(.*)<.+>$')\n\n" + preserve_cdata_get_text = Preserve_cdata_get_all_text1 + else: + preserve_cdata_tags_pat = "" + preserve_cdata_get_text = Preserve_cdata_get_all_text2 + gds_reverse_node_mapping_text = \ + "return dict(((v, k) for k, v in mapping.iteritems()))" + quote_xml_text = \ + "s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)" + quote_attrib_text = \ + "s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr)" + + import_string = TEMPLATE_GENERATEDS_SUPER.format( + gds_reverse_node_mapping_text=gds_reverse_node_mapping_text) + if UseGeneratedssuperLookup: + s0 = """try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: +""" + for line in StringIO.StringIO(import_string).readlines(): + s0 += " "+line + import_string = s0 + + s1 = TEMPLATE_HEADER.format( + tstamp=tstamp, + version=version, + options1=options1, + args1=args1, + command_line=command_line, + current_working_directory=current_working_directory, + ExternalEncoding=ExternalEncoding, + preserve_cdata_tags_pat=preserve_cdata_tags_pat, + preserve_cdata_get_text=preserve_cdata_get_text, + generatedssuper_import=import_string, + quote_xml_text=quote_xml_text, + quote_attrib_text=quote_attrib_text, + ) wrt(s1) + for externalImport in externalImports: + wrt(externalImport + "\n") + + wrt("\n") TEMPLATE_MAIN = """\ @@ -4807,7 +5760,7 @@ Usage: python <%(prefix)sParser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -4820,12 +5773,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) +%(preserve_cdata_tags)s doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = %(prefix)s%(root)s + rootTag = '%(rootElement)s' + rootClass = %(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -4840,12 +5793,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) +%(preserve_cdata_tags)s doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = %(prefix)s%(root)s + rootTag = '%(rootElement)s' + rootClass = %(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -4863,13 +5816,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer +%(preserve_cdata_tags)s doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = %(prefix)s%(root)s + rootTag = '%(rootElement)s' + rootClass = %(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -4877,18 +5833,18 @@ def parseString(inString, silence=False): #silence# if not silence: #silence# sys.stdout.write('<?xml version="1.0" ?>\\n') #silence# rootObj.export( -#silence# sys.stdout, 0, name_="%(name)s", +#silence# sys.stdout, 0, name_=rootTag, #silence# namespacedef_='%(namespacedef)s') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) +%(preserve_cdata_tags)s doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = %(prefix)s%(root)s + rootTag = '%(rootElement)s' + rootClass = %(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -4896,7 +5852,7 @@ def parseLiteral(inFileName, silence=False): #silence# if not silence: #silence# sys.stdout.write('#from %(module_name)s import *\\n\\n') #silence# sys.stdout.write('import %(module_name)s as model_\\n\\n') -#silence# sys.stdout.write('rootObj = model_.rootTag(\\n') +#silence# sys.stdout.write('rootObj = model_.rootClass(\\n') #silence# rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) #silence# sys.stdout.write(')\\n') return rootObj @@ -4922,28 +5878,45 @@ if __name__ == '__main__': def generateMain(outfile, prefix, root): - exportDictLine = "GDSClassesMapping = {\n" + lines = [] for classType in MappingTypes: - if MappingTypes[classType] in AlreadyGenerated: - exportDictLine += " '%s': %s,\n" % ( - classType, - cleanupName(mapName(MappingTypes[classType]))) - exportDictLine += "}\n\n\n" + mappedName = mapName(cleanupName(MappingTypes[classType])) + if mappedName in AlreadyGenerated: + lines.append(" '%s': %s%s,\n" % ( + classType, prefix, mappedName, )) + lines.sort() + exportDictLine = "GDSClassesMapping = {{\n{}}}\n\n\n".format( + ''.join(lines)) outfile.write(exportDictLine) + if XmlDisabled: + return children = root.getChildren() + rootClass = None if children: name = RootElement or children[0].getName() elType = cleanupName(children[0].getType()) if RootElement: - rootElement = RootElement + roots = RootElement.split('|') + if len(roots) > 1: + rootElement = roots[0] + rootClass = roots[1] + else: + rootElement = roots[0] else: rootElement = elType else: name = '' if RootElement: - rootElement = RootElement + roots = RootElement.split('|') + if len(roots) > 1: + rootElement = roots[0] + rootClass = roots[1] + else: + rootElement = roots[0] else: rootElement = '' + if rootClass is None: + rootClass = rootElement if Namespacedef: namespace = Namespacedef elif Targetnamespace: @@ -4960,9 +5933,16 @@ def generateMain(outfile, prefix, root): 'name': name, 'cleanname': cleanupName(name), 'module_name': os.path.splitext(os.path.basename(outfile.name))[0], - 'root': rootElement, + 'rootElement': rootElement, + 'rootClass': rootClass, 'namespacedef': namespace, } + if PreserveCdataTags: + params['preserve_cdata_tags'] = \ + " parser = etree_.ETCompatXMLParser(strip_cdata=False)\n" + else: + params['preserve_cdata_tags'] = " parser = None\n" + params['preserve_cdata_tags_pat'] = "" s1 = TEMPLATE_MAIN % params outfile.write(s1) @@ -4971,8 +5951,6 @@ def buildCtorParams(element, parent, childCount): content = [] addedArgs = {} add = content.append -## if not element.isMixed(): -## buildCtorParams_aux(addedArgs, add, parent) buildCtorParams_aux(addedArgs, add, parent) if element.getSimpleContent() or element.isMixed(): add("valueOf_, ") @@ -4989,10 +5967,12 @@ def buildCtorParams_aux(addedArgs, add, element): if parentName: buildCtorParams_aux(addedArgs, add, parentObj) attrDefs = element.getAttributeDefs() - for key in attrDefs: + for key in element.getAttributeDefsList(): attrDef = attrDefs[key] name = attrDef.getName() name = cleanupName(mapName(name)) + if name == element.getCleanName(): + name += '_member' if name not in addedArgs: addedArgs[name] = 1 add('%s, ' % name) @@ -5001,6 +5981,8 @@ def buildCtorParams_aux(addedArgs, add, element): add('anytypeobjs_, ') else: name = child.getCleanName() + if name == element.getCleanName(): + name += '_member' if name not in addedArgs: addedArgs[name] = 1 add('%s, ' % name) @@ -5028,13 +6010,21 @@ def get_impl_body(classBehavior, baseImplUrl, implUrl): if implUrl: if baseImplUrl: implUrl = '%s%s' % (baseImplUrl, implUrl) + if sys.version_info.major == 2: + urllib_urlopen = urllib2.urlopen + urllib_httperror = urllib2.HTTPError + urllib_urlerror = urllib2.URLError + else: + urllib_urlopen = urllib.request.urlopen + urllib_httperror = urllib.error.HTTPError + urllib_urlerror = urllib.error.URLError try: - implFile = urllib2.urlopen(implUrl) + implFile = urllib_urlopen(implUrl) impl = implFile.read() implFile.close() - except urllib2.HTTPError: + except urllib_httperror: err_msg('*** Implementation at %s not found.\n' % implUrl) - except urllib2.URLError: + except urllib_urlerror: err_msg('*** Connection refused for URL: %s\n' % implUrl) return impl @@ -5129,14 +6119,16 @@ def generateClassBehaviors(wrt, classBehaviors, baseImplUrl): wrt('\n') -def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl): +def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl): if not element.isComplex(): return - if element.getName() in AlreadyGenerated_subclass: + mappedName = element.getCleanName() + if mappedName in AlreadyGenerated_subclass: return - AlreadyGenerated_subclass.append(element.getName()) + AlreadyGenerated_subclass.add(mappedName) name = element.getCleanName() - wrt('class %s%s%s(supermod.%s):\n' % (prefix, name, SubclassSuffix, name)) + wrt('class %s%s%s(supermod.%s%s):\n' % ( + prefix, name, SubclassSuffix, prefix, name)) childCount = countChildren(element, 0) s1 = buildCtorArgs_multilevel(element, childCount) wrt(' def __init__(self%s):\n' % s1) @@ -5163,7 +6155,8 @@ def generateSubclass(wrt, element, prefix, xmlbehavior, behaviors, baseUrl): classBehaviors = None if classBehaviors: generateClassBehaviors(wrt, classBehaviors, baseUrl) - wrt('supermod.%s.subclass = %s%s\n' % (name, name, SubclassSuffix)) + wrt('supermod.%s%s.subclass = %s%s%s\n' % ( + prefix, name, prefix, name, SubclassSuffix)) wrt('# end class %s%s%s\n' % (prefix, name, SubclassSuffix)) wrt('\n\n') @@ -5174,65 +6167,31 @@ TEMPLATE_SUBCLASS_HEADER = """\ # # Generated %s by generateDS.py%s. # +# Command line options: +%s +# +# Command line arguments: +# %s +# +# Command line: +# %s +# +# Current working directory (os.getcwd()): +# %s +# import sys +#xmldisable#from lxml import etree as etree_ import %s as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc +#xmldisable#def parsexml_(infile, parser=None, **kwargs): +#xmldisable# if parser is None: +#xmldisable# # Use the lxml ElementTree compatible parser so that, e.g., +#xmldisable# # we ignore comments. +#xmldisable# parser = etree_.ETCompatXMLParser() +#xmldisable# doc = etree_.parse(infile, parser=parser, **kwargs) +#xmldisable# return doc # # Globals @@ -5258,12 +6217,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) +%(preserve_cdata_tags)s doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = supermod.%(root)s + rootTag = '%(rootElement)s' + rootClass = supermod.%(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -5278,12 +6237,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) +%(preserve_cdata_tags)s doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = supermod.%(root)s + rootTag = '%(rootElement)s' + rootClass = supermod.%(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -5302,12 +6261,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) +%(preserve_cdata_tags)s doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = '%(name)s' - rootClass = supermod.%(root)s + rootTag = '%(rootElement)s' + rootClass = supermod.%(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -5321,12 +6280,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) +%(preserve_cdata_tags)s doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = supermod.%(root)s + rootTag = '%(rootElement)s' + rootClass = supermod.%(prefix)s%(rootClass)s rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -5334,8 +6293,8 @@ def parseLiteral(inFilename, silence=False): #silence# if not silence: #silence# sys.stdout.write('#from %(super)s import *\\n\\n') #silence# sys.stdout.write('import %(super)s as model_\\n\\n') -#silence# sys.stdout.write('rootObj = model_.%(cleanname)s(\\n') -#silence# rootObj.exportLiteral(sys.stdout, 0, name_="%(cleanname)s") +#silence# sys.stdout.write('rootObj = model_.rootClass(\\n') +#silence# rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) #silence# sys.stdout.write(')\\n') return rootObj @@ -5346,7 +6305,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -5413,8 +6372,23 @@ TEMPLATE_ABSTRACT_CHILD = """\ """ +def getNamespace(element): + namespace = '' + if element.targetNamespace in NamespacesDict: + namespace = 'xmlns:%s="%s"' % ( + NamespacesDict[element.targetNamespace].rstrip(':'), + element.targetNamespace, ) + elif Namespacedef: + namespace = Namespacedef + elif Targetnamespace in NamespacesDict: + namespace = 'xmlns:%s="%s"' % ( + NamespacesDict[Targetnamespace].rstrip(':'), + Targetnamespace, ) + return namespace + + def generateSubclasses(root, subclassFilename, behaviorFilename, - prefix, superModule='xxx'): + prefix, options, args, superModule='xxx'): subclassFile = makeFile(subclassFilename) wrt = subclassFile.write if subclassFile: @@ -5444,25 +6418,44 @@ def generateSubclasses(root, subclassFilename, behaviorFilename, version = '' else: version = ' version %s' % VERSION + options1, args1, command_line = format_options_args(options, args) + current_working_directory = os.path.split(os.getcwd())[1] wrt(TEMPLATE_SUBCLASS_HEADER % (tstamp, version, + options1, args1, + command_line, current_working_directory, superModule, ExternalEncoding, )) for element in ElementsForSubclasses: generateSubclass( wrt, element, prefix, xmlbehavior, behaviors, baseUrl) + if XmlDisabled: + return children = root.getChildren() + rootClass = None if children: name = children[0].getName() elType = cleanupName(children[0].getType()) if RootElement: - rootElement = RootElement + roots = RootElement.split('|') + if len(roots) > 1: + rootElement = roots[0] + rootClass = roots[1] + else: + rootElement = roots[0] else: rootElement = elType else: name = '' if RootElement: - rootElement = RootElement + roots = RootElement.split('|') + if len(roots) > 1: + rootElement = roots[0] + rootClass = roots[1] + else: + rootElement = roots[0] else: rootElement = '' + if rootClass is None: + rootClass = rootElement if Namespacedef: namespace = Namespacedef elif Targetnamespace: @@ -5477,23 +6470,47 @@ def generateSubclasses(root, subclassFilename, behaviorFilename, params = { 'cap_name': make_gs_name(cleanupName(name)), 'name': name, + 'prefix': prefix, 'cleanname': cleanupName(name), 'module_name': os.path.splitext( os.path.basename(subclassFilename))[0], - 'root': rootElement, + 'root': root, + 'rootElement': rootElement, + 'rootClass': rootClass, 'namespacedef': namespace, 'super': superModule, } + if PreserveCdataTags: + params['preserve_cdata_tags'] = \ + " parser = etree_.ETCompatXMLParser(strip_cdata=False)\n" + else: + params['preserve_cdata_tags'] = \ + " parser = None\n" wrt(TEMPLATE_SUBCLASS_FOOTER % params) subclassFile.close() +def getUsedNamespacesDefs(element): + processedPrefixes = [] + nameSpacesDef = getNamespace(element) + for child in element.getChildren(): + if child.prefix not in processedPrefixes and \ + child.prefix in prefixToNamespaceMap: + spaceDef = 'xmlns:%s="%s" ' % ( + child.prefix, prefixToNamespaceMap[child.prefix]) + if spaceDef.strip() not in nameSpacesDef: + nameSpacesDef += ' ' + spaceDef + processedPrefixes.append(child.prefix) + return nameSpacesDef + + def generateFromTree(wrt, prefix, elements, processed): for element in elements: + nameSpacesDef = getUsedNamespacesDefs(element) name = element.getCleanName() if 1: # if name not in processed: processed.append(name) - generateClasses(wrt, prefix, element, 0) + generateClasses(wrt, prefix, element, 0, nameSpacesDef) children = element.getChildren() if children: generateFromTree(wrt, prefix, element.getChildren(), processed) @@ -5506,14 +6523,56 @@ def generateSimpleTypes(wrt, prefix, simpleTypeDict): wrt('\n\n') +def getImportsForExternalXsds(root): + ''' + If we are creating a file per xsd, then + we need to import any external classes we use + ''' + externalImports = set() + if not SingleFileOutput: + childStack = list(root.getChildren()) + while len(childStack) > 0: + child = childStack.pop() + if child.namespace and child.namespace != root.targetNamespace: + fqn = child.getFullyQualifiedType() + if fqn in fqnToModuleNameMap and fqn in fqnToElementDict: + schemaElement = fqnToElementDict[fqn] + moduleName = fqnToModuleNameMap[fqn] + type = schemaElement.getType() + if type == "xs:string": + type = schemaElement.getName() + externalImports.add("from %s%s import %s" % + (moduleName, ModuleSuffix, + type)) + for subChild in child.getChildren(): + childStack.append(subChild) + return externalImports + + +def isNewState(): + state = reduce( + operator.concat, + (str(id(item)) for item in PostponedExtensions)) + if sys.version_info.major == 2: + sum = hashlib.sha1(str(state)).hexdigest() + else: + sum = hashlib.sha1(str(state).encode()).hexdigest() + if sum in LoopcheckOneperChecksums: + return False + LoopcheckOneperChecksums.add(sum) + return True + + def generate(outfileName, subclassFilename, behaviorFilename, - prefix, root, superModule): - global DelayedElements, DelayedElements_subclass + prefix, root, options, args, superModule): + global DelayedElements, DelayedElements_subclass, AlreadyGenerated # Create an output file. # Note that even if the user does not request an output file, # we still need to go through the process of generating classes # because it produces data structures needed during generation of # subclasses. + MappingTypes.clear() + #AlreadyGenerated = set() outfile = None if outfileName: outfile = makeFile(outfileName) @@ -5521,10 +6580,11 @@ def generate(outfileName, subclassFilename, behaviorFilename, outfile = os.tmpfile() wrt = outfile.write processed = [] - generateHeader(wrt, prefix) + externalImports = getImportsForExternalXsds(root) + generateHeader(wrt, prefix, options, args, externalImports) #generateSimpleTypes(outfile, prefix, SimpleTypeDict) - DelayedElements = [] - DelayedElements_subclass = [] + DelayedElements = set() + DelayedElements_subclass = set() elements = root.getChildren() generateFromTree(wrt, prefix, elements, processed) while 1: @@ -5538,9 +6598,11 @@ def generate(outfileName, subclassFilename, behaviorFilename, # # Generate the elements that were postponed because we had not # yet generated their base class. - while 1: - if len(PostponedExtensions) <= 0: - break + while len(PostponedExtensions) > 0: + if not isNewState(): + sys.stderr.write('\n*** maxLoops exceeded. Something is ' + 'wrong with --one-file-per-xsd.\n\n') + sys.exit(1) element = PostponedExtensions.pop() parentName, parent = getParentName(element) if parentName: @@ -5549,6 +6611,7 @@ def generate(outfileName, subclassFilename, behaviorFilename, generateClasses(wrt, prefix, element, 1) else: PostponedExtensions.insert(0, element) + # # Disable the generation of SAX handler/parser. # It failed when we stopped putting simple types into ElementDict. @@ -5559,7 +6622,8 @@ def generate(outfileName, subclassFilename, behaviorFilename, if subclassFilename: generateSubclasses( root, subclassFilename, behaviorFilename, - prefix, superModule) + prefix, options, args, superModule) +# end generate def makeFile(outFileName): @@ -5571,12 +6635,16 @@ def makeFile(outFileName): outFileName) sys.exit(1) else: - reply = raw_input( - 'File %s exists. Overwrite? (y/n): ' % outFileName) + if sys.version_info.major == 2: + reply = raw_input( + 'File %s exists. Overwrite? (y/n): ' % outFileName) + else: + reply = input( + 'File %s exists. Overwrite? (y/n): ' % outFileName) if reply == 'y': - outFile = file(outFileName, 'w') + outFile = open(outFileName, 'w') else: - outFile = file(outFileName, 'w') + outFile = open(outFileName, 'w') return outFile @@ -5588,9 +6656,9 @@ def mapName(oldName): def cleanupName(oldName): - newName = oldName.replace(':', '_') - newName = newName.replace('-', '_') - newName = newName.replace('.', '_') + newName = oldName + for pattern, repl in CleanupNameList: + newName = re.sub(pattern, repl, newName) return newName @@ -5608,6 +6676,12 @@ def strip_namespace(val): return val.split(':')[-1] +def get_prefix_and_value(val): + if ':' in val: + return val.split(':') + return None, val + + def escape_string(instring): s1 = instring s1 = s1.replace('\\', '\\\\') @@ -5634,62 +6708,18 @@ def is_builtin_simple_type(type_val): return False -##def process_include(inpath, outpath): -## from xml.etree import ElementTree as etree -## if inpath: -## doc = etree.parse(inpath) -## root = doc.getroot() -## process_include_tree(root) -## else: -## s1 = sys.stdin.read() -## root = etree.fromstring(s1) -## process_include_tree(root) -## doc = etree.ElementTree(root) -## if outpath: -## outfile = make_file(outpath) -## if outfile: -## doc.write(outfile) -## outfile.close() -## else: -## doc.write(sys.stdout) -## -##def process_include_tree(root): -## idx = 0 -## children = root.getchildren() -## while idx < len(children): -## child = children[idx] -## tag = child.tag -## if type(tag) == type(""): -## tag = NAMESPACE_PAT.sub("", tag) -## else: -## tag = None -## if tag == 'include' and 'schemaLocation' in child.attrib: -## root.remove(child) -## path = child.attrib['schemaLocation'] -## if os.path.exists(path): -## doc = etree.parse(path) -## node = doc.getroot() -## process_include_tree(node) -## children1 = node.getchildren() -## for child1 in children1: -## root.insert(idx, child1) -## idx += 1 -## else: -## process_include_tree(child) -## idx += 1 -## children = root.getchildren() - def parseAndGenerate( outfileName, subclassFilename, prefix, xschemaFileName, behaviorFilename, catalogFilename, - processIncludes, superModule='???'): + processIncludes, options, args, superModule='???'): global DelayedElements, DelayedElements_subclass, \ AlreadyGenerated, SaxDelayedElements, \ - AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule - DelayedElements = [] - DelayedElements_subclass = [] - AlreadyGenerated = [] - AlreadyGenerated_subclass = [] + AlreadyGenerated_subclass, UserMethodsPath, UserMethodsModule, \ + SchemaLxmlTree, ModuleSuffix + DelayedElements = set() + DelayedElements_subclass = set() + AlreadyGenerated = set() + AlreadyGenerated_subclass = set() if UserMethodsPath: # UserMethodsModule = __import__(UserMethodsPath) path_list = UserMethodsPath.split('.') @@ -5698,47 +6728,128 @@ def parseAndGenerate( module_spec = imp.find_module(mod_name, [mod_path, ]) UserMethodsModule = imp.load_module(mod_name, *module_spec) ## parser = saxexts.make_parser("xml.sax.drivers2.drv_pyexpat") - parser = make_parser() - dh = XschemaHandler() -## parser.setDocumentHandler(dh) - parser.setContentHandler(dh) if xschemaFileName == '-': infile = sys.stdin else: infile = open(xschemaFileName, 'r') - if processIncludes: + if SingleFileOutput: + parser = make_parser() + dh = XschemaHandler() + parser.setContentHandler(dh) + if processIncludes: + import process_includes + if sys.version_info.major == 2: + outfile = StringIO.StringIO() + else: + outfile = io.StringIO() + doc = process_includes.process_include_files( + infile, outfile, + inpath=xschemaFileName, + catalogpath=catalogFilename, + fixtypenames=FixTypeNames) + outfile.seek(0) + infile = outfile + SchemaLxmlTree = doc.getroot() + parser.parse(infile) + root = dh.getRoot() + root.annotate() + generate( + outfileName, subclassFilename, behaviorFilename, + prefix, root, options, args, superModule) + # Generate __all__. When using the parser as a module it is useful + # to isolate important classes from internal ones. This way one + # can do a reasonably safe "from parser import *" + if outfileName: + exportableClassList = [ + '"%s%s"' % (prefix, name, ) + for name in AlreadyGenerated] + exportableClassList.sort() + exportableClassNames = ',\n '.join(exportableClassList) + exportLine = "\n__all__ = [\n %s\n]\n" % exportableClassNames + outfile = open(outfileName, "a") + outfile.write(exportLine) + outfile.close() + else: # not SingleFileOutput import process_includes - outfile = StringIO.StringIO() - process_includes.process_include_files( - infile, outfile, - inpath=xschemaFileName, - catalogpath=catalogFilename, - fixtypenames=FixTypeNames) - outfile.seek(0) - infile = outfile - parser.parse(infile) - root = dh.getRoot() - root.annotate() -## print '-' * 60 -## root.show(sys.stdout, 0) -## print '-' * 60 - #debug_show_elements(root) - generate( - outfileName, subclassFilename, behaviorFilename, - prefix, root, superModule) - # Generate __all__. When using the parser as a module it is useful - # to isolate important classes from internal ones. This way one - # can do a reasonably safe "from parser import *" - if outfileName: - exportableClassList = [ - '"%s"' % mapName(cleanupName(name)) - for name in AlreadyGenerated] - exportableClassList.sort() - exportableClassNames = ',\n '.join(exportableClassList) - exportLine = "\n__all__ = [\n %s\n]\n" % exportableClassNames - outfile = open(outfileName, "a") - outfile.write(exportLine) - outfile.close() + if 1: + if sys.version_info.major == 2: + outfile = StringIO.StringIO() + else: + outfile = io.StringIO() + doc = process_includes.process_include_files( + infile, outfile, + inpath=xschemaFileName, + catalogpath=catalogFilename, + fixtypenames=FixTypeNames) + outfile.close() + outfile = None + SchemaLxmlTree = doc.getroot() + infile.seek(0) + rootPaths = process_includes.get_all_root_file_paths( + infile, inpath=xschemaFileName, + catalogpath=catalogFilename) + roots = [] + rootInfos = [] + for path in rootPaths: + if path.startswith('http:') or path.startswith('ftp:'): + try: + urlfile = urllib2.urlopen(path) + content = urlfile.read() + urlfile.close() + if sys.version_info.major == 2: + rootFile = StringIO.StringIO() + else: + rootFile = io.StringIO() + rootFile.write(content) + rootFile.seek(0) + except urllib2.HTTPError: + msg = "Can't find file %s." % (path, ) + raise IOError(msg) + else: + rootFile = open(path, 'r') + parser = make_parser() + dh = XschemaHandler() + parser.setContentHandler(dh) + parser.parse(rootFile) + root = dh.getRoot() + roots.append(root) + rootFile.close() + for root, rootPath in zip(roots, rootPaths): + root.annotate() + moduleName = os.path.splitext(os.path.basename(rootPath))[0] + modulePath = None + # use the first root element to set + # up the module name and path + for child in root.getChildren(): + fqnToModuleNameMap[child.getFullyQualifiedType()] = \ + moduleName + fqnToModuleNameMap[child.getFullyQualifiedName()] = \ + moduleName + # use the root file name as module name + modulePath = os.path.join( + OutputDirectory, + moduleName + ModuleSuffix + ".py") + rootInfos.append((root, modulePath)) + for root, modulePath in rootInfos: + if modulePath: + generate( + modulePath, subclassFilename, behaviorFilename, + prefix, root, options, args, superModule) + # Generate __all__. When using the parser as a module + # it is useful + # to isolate important classes from internal ones. This way one + # can do a reasonably safe "from parser import *" + exportableClassList = [ + '"%s%s"' % (prefix, name, ) + for name in AlreadyGenerated] + exportableClassList.sort() + exportableClassNames = ',\n '.join(exportableClassList) + exportLine = "\n__all__ = [\n %s\n]\n" % ( + exportableClassNames, ) + outfile = open(modulePath, "a") + outfile.write(exportLine) + outfile.close() +# end parseAndGenerate # Function that gets called recursively in order to expand nested references @@ -5778,21 +6889,6 @@ def expandGroupReferences(grp): _expandGR(grp, visited) -def debug_show_elements(root): - #print 'ElementDict:', ElementDict - print '=' * 50 - for name, obj in ElementDict.iteritems(): - print 'element:', name, obj.getName(), obj.type - print '=' * 50 - #ipshell('debug') -## root.show(sys.stdout, 0) -## print '=' * 50 -## response = raw_input('Press Enter') -## root.show(sys.stdout, 0) -## print '=' * 50 -## print ']]] root: ', root, '[[[' - - def load_config(): try: #print '1. updating NameTable' @@ -5812,15 +6908,65 @@ def fixSilence(txt, silent): return txt +def fixXmlDisable(txt, disabled): + if disabled: + txt = txt.replace('#xmldisable#', '## ') + else: + txt = txt.replace('#xmldisable#', '') + return txt + +def capture_cleanup_name_list(option): + cleanupNameList = [] + if not option: + return cleanupNameList + cleanup_str = option + from ast import literal_eval + try: + cleanup_list = literal_eval(cleanup_str) + except ValueError: + raise RuntimeError( + 'Unable to parse option --cleanup-name-list.') + if type(cleanup_list) not in (list, tuple): + raise RuntimeError( + 'Option --cleanup-name-list must be a list or a tuple.') + for cleanup_pair in cleanup_list: + if sys.version_info.major == 2: + if (type(cleanup_pair) not in (list, tuple) or + len(cleanup_pair) != 2 or + not isinstance(cleanup_pair[0], BaseStrType) or + not isinstance(cleanup_pair[1], BaseStrType)): + raise RuntimeError( + 'Option --cleanup-name-list contains ' + 'invalid element.') + else: + if (type(cleanup_pair) not in (list, tuple) or + len(cleanup_pair) != 2 or + not isinstance(cleanup_pair[0], str) or + not isinstance(cleanup_pair[1], str)): + raise RuntimeError( + 'Option --cleanup-name-list contains ' + 'invalid element.') + try: + cleanupNameList.append( + (re.compile(cleanup_pair[0]), cleanup_pair[1])) + except Exception: + raise RuntimeError( + 'Option --cleanup-name-list contains invalid ' + 'pattern "%s".' + % cleanup_pair[0]) + return cleanupNameList + + def err_msg(msg): - sys.stderr.write(msg) + if not NoWarnings: + sys.stderr.write(msg) USAGE_TEXT = __doc__ def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -5828,11 +6974,15 @@ def main(): global Force, GenerateProperties, SubclassSuffix, RootElement, \ ValidatorBodiesBasePath, UseGetterSetter, \ UserMethodsPath, XsdNameSpace, \ - Namespacedef, NoDates, NoVersion, \ - TEMPLATE_MAIN, TEMPLATE_SUBCLASS_FOOTER, Dirpath, \ - ExternalEncoding, MemberSpecs, NoQuestions, \ - ExportWrite, ExportEtree, ExportLiteral, \ - FixTypeNames + Namespacedef, NoDates, NoVersion, TEMPLATE_HEADER, \ + TEMPLATE_MAIN, TEMPLATE_SUBCLASS_FOOTER, TEMPLATE_SUBCLASS_HEADER,\ + Dirpath, ExternalEncoding, MemberSpecs, NoQuestions, \ + ExportWrite, ExportEtree, ExportLiteral, XmlDisabled, \ + FixTypeNames, SingleFileOutput, OutputDirectory, \ + ModuleSuffix, UseOldSimpleTypeValidators, \ + UseGeneratedssuperLookup, \ + PreserveCdataTags, CleanupNameList, \ + NoWarnings outputText = True args = sys.argv[1:] try: @@ -5846,7 +6996,12 @@ def main(): 'namespacedef=', 'external-encoding=', 'member-specs=', 'no-dates', 'no-versions', 'no-questions', 'session=', 'fix-type-names=', - 'version', 'export=', + 'version', 'export=', 'disable-xml', + 'one-file-per-xsd', 'output-directory=', + 'module-suffix=', 'use-old-simpletype-validators', + 'preserve-cdata-tags', 'cleanup-name-list=', + 'disable-generatedssuper-lookup', + 'no-warnings', ]) except getopt.GetoptError: usage() @@ -5869,7 +7024,7 @@ def main(): if option[0] == '--session': sessionFilename = option[1] from libgenerateDS.gui import generateds_gui_session - from xml.etree import ElementTree as etree + from lxml import etree doc = etree.parse(sessionFilename) rootNode = doc.getroot() sessionObj = generateds_gui_session.sessionType() @@ -5922,6 +7077,28 @@ def main(): ExternalEncoding = sessionObj.get_external_encoding() if sessionObj.get_member_specs() in ('list', 'dict'): MemberSpecs = sessionObj.get_member_specs() + exports = sessionObj.get_export_spec() + if exports: + ExportWrite = False + ExportEtree = False + ExportLiteral = False + exports = exports.split() + if 'write' in exports: + ExportWrite = True + if 'etree' in exports: + ExportEtree = True + if 'literal' in exports: + ExportLiteral = True + if sessionObj.get_one_file_per_xsd(): + SingleFileOutput = False + if sessionObj.get_output_directory(): + OutputDirectory = sessionObj.get_output_directory() + if sessionObj.get_module_suffix(): + ModuleSuffix = sessionObj.get_module_suffix() + if sessionObj.get_preserve_cdata_tags(): + PreserveCdataTags = True + CleanupNameList = capture_cleanup_name_list( + sessionObj.get_cleanup_name_list()) break for option in options: if option[0] == '-h' or option[0] == '--help': @@ -5965,6 +7142,8 @@ def main(): err_msg('*** Option use-getter-setter must ' '"old" or "new" or "none".\n') sys.exit(1) + elif option[0] == '--use-old-simpletype-validators': + UseOldSimpleTypeValidators = True elif option[0] in ('-u', '--user-methods'): UserMethodsPath = option[1] elif option[0] == '--no-process-includes': @@ -5997,8 +7176,24 @@ def main(): ExportEtree = True if 'literal' in tmpoptions: ExportLiteral = True + elif option[0] == '--disable-xml': + XmlDisabled = True + elif option[0] == '--disable-generatedssuper-lookup': + UseGeneratedssuperLookup = False + elif option[0] == '--one-file-per-xsd': + SingleFileOutput = False + elif option[0] == "--output-directory": + OutputDirectory = option[1] + elif option[0] == "--module-suffix": + ModuleSuffix = option[1] + elif option[0] == "--preserve-cdata-tags": + PreserveCdataTags = True + elif option[0] == '--cleanup-name-list': + CleanupNameList = capture_cleanup_name_list(option[1]) + elif option[0] == '--no-warnings': + NoWarnings = True if showVersion: - print 'generateDS.py version %s' % VERSION + print('generateDS.py version %s' % VERSION) sys.exit(0) XsdNameSpace = nameSpace Namespacedef = namespacedef @@ -6011,14 +7206,19 @@ def main(): usage() else: xschemaFileName = args[0] + XsdFileName.append(xschemaFileName) silent = not outputText + TEMPLATE_HEADER = fixXmlDisable(TEMPLATE_HEADER, XmlDisabled) TEMPLATE_MAIN = fixSilence(TEMPLATE_MAIN, silent) + TEMPLATE_SUBCLASS_HEADER = fixXmlDisable( + TEMPLATE_SUBCLASS_HEADER, XmlDisabled) TEMPLATE_SUBCLASS_FOOTER = fixSilence(TEMPLATE_SUBCLASS_FOOTER, silent) + load_config() parseAndGenerate( outFilename, subclassFilename, prefix, xschemaFileName, behaviorFilename, catalogFilename, - processIncludes, superModule=superModule) + processIncludes, options, args, superModule=superModule) if __name__ == '__main__': diff --git a/generateDS.txt b/generateDS.txt index ab8558c..eebc634 100644 --- a/generateDS.txt +++ b/generateDS.txt @@ -3,7 +3,7 @@ generateDS -- Generate Data Structures from XML Schema ====================================================== :author: Dave Kuhlman -:contact: dkuhlman@pacbell.net +:contact: dkuhlman (at) davekuhlman (dot) org :address: http://www.davekuhlman.org @@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema .. version -:revision: 2.11b +:revision: 2.24b .. version @@ -100,6 +100,10 @@ and extend multiple subclass files which use a single, common superclass file, thus implementing a number of different processes on the same XML document type. +``generateDS.py`` can be run under either Python 2 or Python 3. The +generated Python code (both superclass and subclass modules) can be +run under either Python 2 or Python 3. + This document explains (1) how to use ``generateDS.py``; (2) how to use the Python code and data structures that it generates; and (3) how to modify the generated code for special purposes. @@ -149,9 +153,21 @@ http://www.davekuhlman.org/generateds_tutorial.html How to build and install it =========================== -Newer versions of Python have XML support in the Python standard -library. For older versions of Python, install PyXML. You can find -it at: http://pyxml.sourceforge.net/ +Requirements +-------------- + +``Lxml`` is used both by ``generateDS.py`` and by the code it +generates. ``Lxml`` is available at the Python Package Index +https://pypi.python.org/pypi/lxml/ and at the ``Lxml`` project home +site http://lxml.de/. + +Older versions of Python XML support can sometimes cause problems. +If you receive a traceback that includes "_xmlplus", then you will +need to remove that ``_xmlplus`` package. + + +Installation +-------------- De-compress the ``generateDS`` distribution file. Use something like the following:: @@ -184,8 +200,8 @@ librarytemplate_howto.html And the package building support itself is here: `LibraryTemplate -- -http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip -<http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip>`_. +http://www.davekuhlman.org/librarytemplate-1.0a.zip +<http://www.davekuhlman.org/librarytemplate-1.0a.zip>`_. It is also included in the generateDS distribution package. @@ -205,8 +221,9 @@ it will write subclass stubs to the file peoplesubs.py:: Here is the usage message displayed by ``generateDS.py``:: + Synopsis: - Generate Python classes from XML Schema definition. + Generate Python classes from XML schema definition. Input is read from in_xsd_file or, if "-" (dash) arg, from stdin. Output is written to files named in "-o" and "-s" options. Usage: @@ -223,16 +240,28 @@ Here is the usage message displayed by ``generateDS.py``:: -b <behaviorfilename> Input file name for behaviors added to subclasses -m Generate properties for member variables -c <xmlcatalogfilename> Input file name to load an XML catalog + --one-file-per-xsd Create a python module for each XSD processed. + --output-directory="XXX" Used in conjunction with --one-file-per-xsd. + The directory where the modules will be created. + --module-suffix="XXX" To be used in conjunction with --one-file-per-xsd. + Append XXX to the end of each file created. --subclass-suffix="XXX" Append XXX to the generated subclass names. Default="Sub". - --root-element="XXX" Assume XXX is root element of instance docs. - Default is first element defined in schema. - Also see section "Recognizing the top level + --root-element="XX" When parsing, assume XX is root element of + --root-element="XX|YY" instance docs. Default is first element defined + in schema. If YY is added, then YY is used as the + top level class; if YY omitted XX is the default. + class. Also see section "Recognizing the top level element" in the documentation. - --super="XXX" Super module name in generated in subclass + --super="XXX" Super module name in generated subclass module. Default="???" --validator-bodies=path Path to a directory containing files that provide bodies (implementations) of validator methods. + --use-old-simpletype-validators + Use the old style simpleType validator functions + stored in a specified directory, instead of the + new style validators generated directly from the + XML schema. See option --validator-bodies. --use-getter-setter Generate getter and setter methods. Values: "old" - Name getters/setters getVar()/setVar(). "new" - Name getters/setters get_var()/set_var(). @@ -249,10 +278,10 @@ Here is the usage message displayed by ``generateDS.py``:: generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code. - --no-process-includes Do not process included XML Schema files. By + --no-process-includes Do not process included XML schema files. By default, generateDS.py will insert content from files referenced by <include ... /> - elements into the XML Schema to be processed. + elements into the XML schema to be processed. --silence Normally, the code generated with generateDS echoes the information being parsed. To prevent the echo from occurring, use the --silence switch. @@ -284,8 +313,16 @@ Here is the usage message displayed by ``generateDS.py``:: to XML) Example: "write etree" Default: "write" + --preserve-cdata-tags Preserve CDATA tags. Default: False + --cleanup-name-list=<replacement-map> + Specifies list of 2-tuples used for cleaning + names. First element is a regular expression + search pattern and second is a replacement. + Example: "[('[-:.]', '_'), ('^__', 'Special')]" + Default: "[('[-:.]', '_')]" -q, --no-questions Do not ask questions, for example, force overwrite. + --no-warnings Do not print warning messages. --session=mysession.session Load and use options from session file. You can create session file in generateds_gui.py. Or, @@ -308,7 +345,11 @@ Here is the usage message displayed by ``generateDS.py``:: also generates member specifications in each class (in a dictionary). -The following command line flags are recognized by ``generateDS.py``: + +Command line options +---------------------- + +The following command line options are recognized by ``generateDS.py``: o <filename> Write the data representation classes to file filename. @@ -360,10 +401,24 @@ m c <xmlcatalogfilename> Specify the file to be used as an XML catalog. This file will be used by process_includes.py if needed to resolve references - in <import> and <include> elements in the XML Schema. For more - information on XML catalogs, see: + in <xs:import> and <xs:include> elements in the XML Schema. For + more information on XML catalogs, see: http://en.wikipedia.org/wiki/XML_Catalog +one-file-per-xsd + Create a separate Python module for each XML Schema document + processed (for example, using <xs:include> or <xs:import>). For + help with using this option, see `"One Per" -- generating + separate files from imported/included schemas`_. + +output-directory <directory> + When used with ``one-file-per-xsd``, create generated output + files in path ``<directory>``. + +module-suffix <suffix> + When used with ``one-file-per-xsd``, append ``<suffix>`` to the + end of each module name. + subclass-suffix=<suffix> Append suffix to the name of classes generated in the subclass file. The default, if omitted, is "Sub". For example, the @@ -377,11 +432,16 @@ subclass-suffix=<suffix> generateDS.py --subclass-suffix="" -s actions.py mydef.xsd -root-element=<element_name> - Make element_name the assumed root of instance documents. The - default is the name of the element whose definition is first - in the XML Schema document. This flag effects the parsing - functions (for example, parse(), parseString()). +root-element=<element_name> -OR- <element_name>|<class_name> + Make ``element_name`` the assumed root of instance documents. + The default is the name of the element whose definition is first + in the XML Schema document. If ``class_name`` is also present + (after a vertical bar), then ``class_name`` is assumed to be the + name of the class to be created from the root (top level) + element when parsing an XML instance document. If + ``class_name`` is omitted, the default class name is the same as + ``element_name``. This flag effects the parsing functions (for + example, parse(), parseString(), etc). super=<module_name> Make module_name the name of the superclass module imported @@ -403,6 +463,22 @@ validator-bodies=<path> files, lines with "##" in the first two columns are ignored and are not inserted. +use-old-simpletype-validators + ``generateDS.py`` is capable of generating validator bodies -- + the code that validates data content in an XML instance + docuement and writes out warning messages if that data does not + satisfy the facets in the ``xs:restriction`` in the + ``xs:simpleType`` defintion in the XML schema. Use this option + if you want to use your own validation bodies/code defined in a + specified directory . See option ``--validator-bodies`` for + information on that. *Without* this option + (``--use-old-simpletype-validators``), the validator code will + be generated directly from the XML schema, which is the default. + + This option can also be used to generate code that does *no* + validation. See `simpleType and validators`_ and `Turning off + validation of simpleType data`_ for more information. + use-getter-setter ``generateDS.py`` now generates getter and setter methods (for variable "abc", for example) with the names get_abc() and @@ -438,7 +514,12 @@ no-process-includes Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by ``<include ... />`` elements into the XML Schema to be processed. - See section `Include file processing`_. + See section `Include file processing`_. Note that include + processing, which is performed in ``process_includes.py`` is + required for generating validator bodies from the XML schema, + because the Lxml ElementTree produced in ``process_includes.py`` + is needed to generate the validator code. So, using this option + also turns off automatic generation of validator code. silence Normally, the code generated with generateDS echoes the @@ -500,6 +581,33 @@ export For example: ``--export="write etree"`` and ``--export="write"``. The default is: ``--export="write literal"``. +preserve-cdata-tags + Preserve CDATA tags. Normally, CDATA tags ("<![CDATA[ ... ]]>") + are dropped while parsing an XML instance document. If this + option is included, the generated code will preserve those tags + and will write them out during export. The default is False. + +cleanup-name-list=<replacement-map> + Specifies replacement pairs to be used when cleaning up names. + Must be a string representation of a Python list of 2-tuples. + The values of each pair (2-tuple) must be strings. The first + item of each pair is a pattern and must be a valid Python + regular expression (see + https://docs.python.org/2/library/re.html#module-re) The second + item of each pair is a string that will replace anything matched + by the pattern. Also see `Cleaning up names with special characters etc.`_ + + The intension is to enable us to replace + special characters in names that would cause the generation of + invalid Python names, for example the names of generated + classes. However, since a string replacement is + performed, you can replace any single character or sequence of + characters by any other single character or sequence of + characters. Example: + ``[(':', 'colon'), ('-', 'dash'), ('.', 'dot')]``. + + The default when omitted is ``[('[-:.]', '_')]``. + q, no-questions Do not ask questions. For example, if the "-f" command line option is omitted and the ouput file exists, then generateDS.py @@ -507,6 +615,10 @@ q, no-questions case, when "-q" is used, the "-f" must be used to force the output file to be written. +no-warnings + While running generateDS.py, do not print warning messages that + would be written to stderr. + session=mysession.session Load and use options from session file. You can create a session file in generateds_gui.py, the graphical front-end for @@ -514,24 +626,29 @@ session=mysession.session used to override options in the session file. A session file is an XML document, so you can modify it with a text editor. -fix-type-names="oldname1:newname1;oldname2:newname2;..." - Fix up (replace) complex type names. Using this option will - replace the following: (1) the 'name' attribute of a - complexType; (2) the 'type' attribute of each element that - refers to the type; and (3) the 'base' attribute of each - extension that refers to the type. These fixups happen before - information is collected from the schema for code generation. - Therefore, using this option is effectively equivalent to - copying your schema, then editing it with your text editor, then - generating code from the modified schema. +fix-type-names="oldname1:newname1;oldname2:newname2;..." Fix up + (replace) complex type names. Using this option will replace + the following: (1) the 'name' attribute of a complexType; (2) + the 'type' attribute of each element that refers to the type; + and (3) the 'base' attribute of each extension that refers to + the type. These fixups happen before information is collected + from the schema for code generation. Therefore, using this + option is effectively equivalent to copying your schema, then + editing it with your text editor, then generating code from the + modified schema. If a new name is not specified, the default is + to replace the old name with the old name plus an added "xx" + suffix. Examples:: + + $ generateDS.py --fix-type-names="type1:type1Aux" + $ generateDS.py --fix-type-names="type1;type2:type2Repl" version - Print out the current version of generateDS.py and immediately - exit. + Print out the current version of ``generateDS.py`` and + immediately exit. -Name conflicts --------------- +Name conflicts etc. +--------------------- Conflicts with Python keywords .............................. @@ -582,9 +699,55 @@ generateDS.py modifies the name of the attribute by adding "_attr" to its name. +Cleaning up names with special characters etc. +................................................ + +``generateDS.py`` attempts to clean up names that contain special +characters. For example, a complexType whose name contains a dash +would generate a Python class with an invalid name. But, you can +use this facility to make other changes to names as well. + +The command line option ``--cleanup-name-list`` specifies +replacement pairs to be used when cleaning up (and modifying) names. +The value of this option must be a string representation of a Python +list of 2-tuples. The values of each pair (2-tuple) must be +strings. The first item of each pair is a pattern and must be a +valid Python regular expression (see +https://docs.python.org/2/library/re.html#module-re) The second item +of each pair is a string that will replace anything matched by the +pattern. The intension is to enable us to replace special +characters in names that would cause the generation of invalid +Python names, for example the names of generated classes. However, +since a string replacement is performed, you can replace any single +character or sequence of characters by any other single character or +sequence of characters. + +For example, the following option, in addition to performing the +default replacements of "-", ":", and "." by an underscore, would +also replace the string "Type" when it occurs at the end of a name, +by "Class":: + + --cleanup-name-list="[('[-:.]', '_'), ('Type$', 'Class')]" + +This would cause the name "big-data-Type" to become "big_data_Class". + +The default when this option is omitted is ``[('[-:.]', '_')]``. + +The order of replacements performed is the same as the order of the +tuples in the list. So, replacements performed by pattern +replacement pairs (2-tuples) later in the list (to the right) will +be performed after those earlier (to the left), and may overwrite +earlier replacements. + +See the notes on the command line option ``--cleanup-name-list`` for +more on this. Or, run ``$ generateDS.py --help``. + + The graphical user interface -- How to use it ============================================================== +**Note:** The graphical user interface is no longer supported. + Here are a few notes on how to use the GUI front-end. - ``generateds_gui.py`` is installed when you do the standard @@ -672,6 +835,63 @@ you will need to use the "-a" command line option when you run generateDS.py -a "xsd:" --super=mylib -o mylib.py -s myapp.py someschema.xsd +Using multiple subclass modules with the same superclass module +----------------------------------------------------------------- + +Suppose that from a single XML schema, you have generated a +superclass module and a subclass module (using the "-o" and "-s" +command line options). Now you make a copy of the subclass module. +Next you add special and different code to each of the subclass +modules. You can run these two subclass modules separately and +(after a bit of debugging) each works fine. And, you can import +each subclass module in separate applications, and things are still +good. However, if you import both subclass modules into a single +application, you find that one of them is "ignored" by the +superclass module when it parses XML instance documents and builds +classes. Effectively, each subclass module, when it is imported, +sets a class variable (``subclass``) in each superclass to the +subclass to be used by the superclass, and the last subclass +imported module wins. + +There are two alternative solutions to this problem: + +1. Use the script/function provided by the distribution in file + ``fix_subclass_refs.py``. The doc string in that module explains + how to use it and gives an example of its use. + +2. Each generated superclass module (starting with ``generateDS.py`` + version 2-19a) contains a global variable + ``CurrentSubclassModule_``. The value of this variable, if it is + not None, overrides the value of the class variable ``subclass`` + in each generated superclass. You can change the value of this + variable before parsing an XML document and building instances of + the generated classes to determine which subclass module is to be + used during the "build" phase. + + Here is an example of the use of this feature:: + + #!/usr/bin/env python + + import lib01suba + import lib01subb + + def test(): + lib01suba.supermod.CurrentSubclassModule_ = lib01suba + roota = lib01suba.parse('test01.xml', silence=True) + lib01subb.supermod.CurrentSubclassModule_ = lib01subb + rootb = lib01subb.parse('test01.xml', silence=True) + roota.show() + print '-' * 50 + rootb.show() + + test() + +The second alternative (above) is likely to be a more convenient +solution in most cases. But, there are possibly use cases where the +use of ``fix_subclass_refs.py`` or a modified version of it will be +helpful. + + Supported features of XML Schema ================================ @@ -896,8 +1116,63 @@ that element has a (non-None) value. simpleType and validators ------------------------- -Here are a few notes that should help you use validator methods to -enforce restrictions. +Generating validator bodies from XML schema +............................................. + +If you do *not* use the ``--use-old-simpletype-validators`` command line +option, then ``generateDS.py`` will generate validation code +directly from the restrictions specified inside the ``simpleType`` +definitions in your XML schema. + +Here is a bit of explanation of what that generated code will do. + +- The generated validation code checks the global variable + ``Validate_simpletypes_``. Set that variable to ``False`` to turn + off validation. + +- In the case of some XML schema built-in simple types, the + generated validation code calls ``gds_validate_xxx``, where "xxx" + is a base, simple type. In some cases, you will be able to add + additional code to that method to perform custom checking. See + section `Overridable methods`_ for information on how to use and + override that class. + +- When validation finds data that fails to validate, it generates a + warning (using the ``warnings`` module from the Python standard + library), not an exception, so that processing continues. + +- The validation code is generated in a separate method named + ``validate_xxx``, where "xxx" is the name of the data element. + This method is called in the ``build`` method as the input data is + parsed and instances of the generated classes are created to hold + it. Your own code can also call this method whenever you'd like + to perform on the data in that element/field. + +- There are rules for how checking should be performed when (1) + there are multiple restrictions in a single ``simpleType`` and + when there are restrictions in a ``simpleType`` and it base simple + types. ``generateds.py`` attempts to follow those rules in + generating validation code. For information about that, see: + http://www.w3.org/TR/xmlschema-2/#rf-facets. Pattern facets are + especially tricky, because pattern restrictions at the same level + are OR-ed together, while pattern restrictions at different levels + are AND-ed together. See: + http://www.w3.org/TR/xmlschema-2/#rf-pattern. + +- The validation method also performs type conversion for some + simple types, for example, string to int for integers, string to + float for floats, etc. + + +User written validator bodies +............................... + +This is the older, more manual method. In order to generate code +that uses this method, use command line option +``--use-old-simpletype-validators``. + +Here are a few notes that should help you *write your own* validator +methods to enforce restrictions. - Default behavior -- The generated code, by default, treats the value of a member whose type is a ``simpleType`` as if it were @@ -1007,6 +1282,34 @@ following limitations (among others, I'm sure): - Attributes defined as a simple type are not supported. +Turning off validation of ``simpleType`` data +............................................... + +If you do not want validation performed on ``simpleType`` data, you +have these options: + +1. When generating your code, use the + ``--use-old-simpletype-validators`` command line option but do + *not* use the ``--validator-bodies`` command line option. This + will result in validator methods that have empty bodies (only a + ``pass`` statement). + +2. Or, when you run your generated code, set the variable + ``Validate_simpletypes_`` to ``False``. This global variable is + near the top of your generated module. It can be set to ``True`` + or ``False`` before and during processing to turn validation on + and off. + + +Additional notes on ``simpleType`` validation +............................................... + +Don't forget that ``xmllint`` can also be used to perform +validation against the XML scheme. This validation includes +checking against ``simpleType`` restrictions. See +http://xmlsoft.org/ for more information on ``xmllint``. + + Include file processing ----------------------- @@ -1020,13 +1323,6 @@ inserted in the XML Schema by importing and using ``process_includes.py``, which is included in the ``generateDS.py`` distribution. -``process_includes.py`` will use either ``lxml`` or ``ElementTree``, -but its preference is ``lxml`` because ``lxml`` attempts to preserve -namespace prefixes. So if your XML Schemas have ``<include ... />`` -elements in them, you might want to consider installing ``lxml``, even -though ``ElementTree`` is in the Python standard library for Python -versions >= 2.5. - The include file processing is capable of retrieve included files via FTP and HTTP internet protocols as well as from the local file system. @@ -1622,7 +1918,69 @@ convenience method ``gds_reverse_node_mapping`` from superclass ``GeneratedsSuper``. Again, see the code above for an example. -How-to Use the generated source code +Specifying names for anonymous nested type definitions +-------------------------------------------------------- + +``generateDS.py`` automatically assigns names for types (and the +classes generated from them), when that type definition (for +example, ``xs:complexType``) does not have a name and it is nested +inside another type definition. However, these assigned names, in +part because of the need to make them unique, can be difficult to +predict. + +Therefore, ``generateDS.py`` provides a way to specify the names of +the Python classes generated from these anonymous, nested types. To +do so, follow these steps: + +1. Create a module named ``gds_inner_name_map`` + (``gds_inner_name_map.py``). + +2. Place that module where Python can import it when you run + ``generateDS.py``. You can do this either by adding an + additional directory to the environment variable ``PYTHONPATH`` + or by placing ``gds_inner_name_map.py`` in a directory that is + already on Python's search path for modules. You can check this + by running the following Python code snippet:: + + import sys + print sys.path + + Also see: https://docs.python.org/2/library/sys.html#sys.path + +3. In module ``gds_inner_name_map``, define a global variable + ``Inner_name_map``. The value of this variable should be a + dictionary that maps 2-tuples containing (a) the name of the + grandparent type and (b) the name of the parent type onto the new + name. + +If ``generateDS.py`` cannot import ``Inner_name_map`` from +``gds_inner_name_map``, then it will, by default, generate unique +names. In particular, it automatically generates names for +anonymous, nested types when the following Python statement fails:: + + from gds_inner_name_map import Inner_name_map + +Here is an example of module ``gds_inner_name_map.py``:: + + Inner_name_map = { + ("classAType", "inner"): "inner_001", + ("classBType", "inner"): "inner_002", + } + +Usage hints: + +- When ``generateDS.py`` succeeds in importing ``Inner_name_map`` + from ``gds_inner_name_map``, but *cannot* find one of the required + mappings in that dictionary, it will throw an exception and print + out the missing mapping. You can copy this line; paste it into + your ``gds_inner_name_map.py``; and edit it so as to specify the + class name of your choice. + +- Make sure that the names you specify are unique within your XML + schema. + + +How to use the generated source code ======================================= The parsing functions @@ -2255,9 +2613,10 @@ default methods in the following places: - In a class named ``GeneratedsSuper`` in a separate module named ``generatedssuper``. Since this class would replace the default implementations, you should provide implementations of - all the default methods listed above in that class. The - distribution contains a ``generatedssuper.py`` which you can - modify for your specific needs. + all the default methods listed above in that class. To create + your own version, copy and paste the default implementation of + class ``GeneratedsSuper`` from your generated module into a file + named ``generatedssuper.py``, then modify that. - In individual generated (super) classes (the ones generated with the "-o" command line option) using the `User Methods`_ feature. @@ -2335,6 +2694,61 @@ that complexType definition. This dictionary is named with the "-o" option. +"One Per" -- generating separate files from imported/included schemas +======================================================================= + +The ``--one-file-per-xsd`` command line option enables you to +generate a separate Python module for each XML schema that is +imported or included (using ``<xs:import>`` or ``<xs:include>``) by +a "master" schema. Then, in your Python application, these modules +can then be imported separately. Alternatively, these modules can +be placed in a Python package (a directory containing a file named +"__init__.py"). See +http://docs.python.org/2/tutorial/modules.html#packages for more on +Python packages. + +Here is a sample use:: + + $ ../generateDS.py --one-file-per-xsd --output-directory="OnePer" --module-suffix="One" one_per.xsd + +The above command does the following: + +- It generates one Python module for each XML schema that is + included/imported by ``one_per.xsd``. + +- It places the generated output files in the directory ``OnePer``. + +- It adds "One" as a suffix to the name of each generated module. + +Here are a few hints, guidelines, and suggestions: + +- At least one element definition in an included/imported module + must be a root element definition in order to cause a + module to be generated for that schema. In other words, the + module must contain an element definition of the form:: + + <xs:element name="Sample" type="sampleType" /> + +- You may want to write a separate "master" schema that includes + each of the schemas for which you want to generate a separate + Python module. + +- Use the ``--output-directory=<directory>`` command line option to + tell ``generateDS.py`` to generate the Python modules in a + specific directory. The directory must already exist. + +- Use the ``--module-suffix=<suffix>`` command line option to add a + specifc suffix to each module name (the part immediately before + the extension). For example, the option ``--module-suffix=Abc`` + causes ``generateDS.py`` to generate a file named "schema1Abc.py" + instead of "schema1.py". + +- If you want to import files from the output directory and it is + not in ``sys.path``, add a file named "__init__.py" to that + directory. The existence of the file ``__init__.py`` turns the + directory into a Python package. + + How to modify the generated code ================================ @@ -2415,8 +2829,8 @@ Suggested uses: documents. The following paper discusses and compares this technique with the use of XSLT: `XSLT and generateDS -- Analysis, Comparison, and Evaluation -- - http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html - <http://www.rexx.com/~dkuhlman/xsltvsgenerateds.html>`_. + http://www.davekuhlman.org/xsltvsgenerateds.html + <http://www.davekuhlman.org/xsltvsgenerateds.html>`_. - Anything that requires a *customized* tree walk of the XML document. Because you can add methods to the generated classes @@ -2431,8 +2845,23 @@ Django -- Generating Models and Forms ``generateDS.py`` can be used to generate Django models and Django forms that represent the data structures defined in an XML Schema. +**Note:** In order to use this capability, you must obtain the +"source" distribution of ``generateDS.py``. You can do this either +(1) by downloading ``generateDS-x.xxy.tar.gz`` from the Python +Package Index or (2) by downloading the distribution from Bitbucket +at https://bitbucket.org/dkuhlman/generateds. In particular, +installing ``generateDS.py`` using ``pip`` does not give you all the +files you need in order to use this capability. + +*Note:* You only need to obtain the source distribution (so that you +can copy the files in the ``django/`` directory, for example); you +do not necessarily need to install from it. If you have already +installed ``generateDS.py`` using ``pip`` or ``easy_install``, you +do not need to re-install from the source tree. + There are support files in the ``django`` directory in the -distribution. +source distribution (but *not* in the version install using ``pip`` +or ``easy_install``). Here is an overview of the process: @@ -2446,6 +2875,12 @@ Here is an overview of the process: The script ``gends_run_gen_django.py`` performs these three steps. +In order to use the script ``gends_run_gen_django.py``, you may need +to tell it where the ``generateDS.py`` script is located. If so, +use the "-p" command line option. For more information, do:: + + python gends_run_gen_django.py --help + How to generate Django models and forms ......................................... @@ -2474,8 +2909,9 @@ Now, follow these steps: $ mkdir WorkDir $ cd WorkDir -2. Copy the files in from the sub directory ``django/`` in the - distribution to the current directory:: +2. Copy the files in from the sub directory ``django/`` in the of + the source distribution of ``generateDS.py`` to the current + directory:: $ cp /my_sources/generateDS-n.nn/django/* . @@ -2488,6 +2924,10 @@ Now, follow these steps: $ ./gends_run_gen_django.py myschema.xsd + There are additional command line options for + ``gends_run_gen_django.py``. For help, run + ``$ python gends_run_gen_django.py --help``. + 5. Copy the generated files ``models.py`` and ``forms.py`` to your Django application. @@ -2654,15 +3094,6 @@ script scans your XML Schema document and, recursively, documents that are included looking for ``include`` elements; it inserts all content into a single document, which it writes out. -Since ``process_includes.py`` uses the ElementTree API, in order -to use ``process_includes.py`` you will need one of the following: - -- Python 2.5 or newer -- ElementTree is in the Python-2.5 distribution. Or, - -- `ElementTree`_. Or, - -- `lxml`_ -- another implementation of the ElementTree API. - Here are samples of how you might use ``process_includes.py``, if your schema contains ``include`` elements. @@ -2708,16 +3139,10 @@ See also `Dave's Page`_: My home page, which contains more Python stuff. -.. _`Dave's Page`: http://www.rexx.com/~dkuhlman - - - +.. _`Dave's Page`: http://www.davekuhlman.org .. _`ElementTree`: http://effbot.org/zone/element-index.htm -.. _`lxml`: http://codespeak.net/lxml/ - - - - +.. _`lxml`: http://lxml.de/index.html +.. vim:ft=rst: diff --git a/generateds_config.py b/generateds_config.py new file mode 100644 index 0000000..5c2c8ab --- /dev/null +++ b/generateds_config.py @@ -0,0 +1,4 @@ + +NameTable = { + 'range': 'range_', +} diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html new file mode 100644 index 0000000..5593b50 --- /dev/null +++ b/generateds_gui_notes.html @@ -0,0 +1,409 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<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/" /> +<title>GenerateDS GUI Notes</title> +<meta name="author" content="Dave Kuhlman" /> +<style type="text/css"> + +/* css */ + +body { + font: 90% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + background: #ffffff; + color: black; + margin: 2em; + padding: 2em; +} + +a[href] { + color: #436976; + background-color: transparent; +} + +a.toc-backref { + text-decoration: none; +} + +h1 a[href] { + text-decoration: none; + color: #fcb100; + background-color: transparent; +} + +a.strong { + font-weight: bold; +} + +img { + margin: 0; + border: 0; +} + +p { + margin: 0.5em 0 1em 0; + line-height: 1.5em; +} +p a { + text-decoration: underline; +} +p a:visited { + color: purple; + background-color: transparent; +} +p a:active { + color: red; + background-color: transparent; +} +a:hover { + text-decoration: none; +} +p img { + border: 0; + margin: 0; +} + +h1, h2, h3, h4, h5, h6 { + color: #003a6b; + background-color: transparent; + font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + margin: 0; + padding-top: 0.5em; +} + +h1 { + font-size: 160%; + margin-bottom: 0.5em; + border-bottom: 1px solid #fcb100; +} +h2 { + font-size: 140%; + margin-bottom: 0.5em; + border-bottom: 1px solid #aaa; +} +h3 { + font-size: 130%; + margin-bottom: 0.5em; + text-decoration: underline; +} +h4 { + font-size: 110%; + font-weight: bold; +} +h5 { + font-size: 100%; + font-weight: bold; +} +h6 { + font-size: 80%; + font-weight: bold; +} + +ul a, ol a { + text-decoration: underline; +} + +dt { + font-weight: bold; +} +dt a { + text-decoration: none; +} + +dd { + line-height: 1.5em; + margin-bottom: 1em; +} + +legend { + background: #ffffff; + padding: 0.5em; +} + +form { + margin: 0; +} + + +dl.form { + margin: 0; + padding: 1em; +} + +dl.form dt { + width: 30%; + float: left; + margin: 0; + padding: 0 0.5em 0.5em 0; + text-align: right; +} + +input { + font: 100% 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif; + color: black; + background-color: white; + vertical-align: middle; +} + +abbr, acronym, .explain { + color: black; + background-color: transparent; +} + +q, blockquote { +} + +code, pre { + font-family: monospace; + font-size: 1.2em; + display: block; + padding: 10px; + border: 1px solid #838183; + background-color: #eee; + color: #000; + overflow: auto; + margin: 0.5em 1em; +} + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +tt.docutils { + background-color: #dddddd; +} + +ul.auto-toc { + list-style-type: none } + +</style> +</head> +<body> +<div class="document" id="generateds-gui-notes"> +<h1 class="title">GenerateDS GUI Notes</h1> +<table class="docinfo" frame="void" rules="none"> +<col class="docinfo-name" /> +<col class="docinfo-content" /> +<tbody valign="top"> +<tr><th class="docinfo-name">Author:</th> +<td>Dave Kuhlman</td></tr> +<tr><th class="docinfo-name">Contact:</th> +<td>dkuhlman (at) davekuhlman (dot) org</td></tr> +<tr><th class="docinfo-name">Address:</th> +<td><pre class="address"> +<a class="first last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a> +</pre> +</td></tr> +</tbody> +</table> +<!-- Do not modify the following version comments. +They are used by updateversion.py. --> +<!-- version --> +<table class="docutils field-list" frame="void" rules="none"> +<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.24b</td> +</tr> +</tbody> +</table> +<!-- version --> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td> +</tr> +</tbody> +</table> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">copyright:</th><td class="field-body">Copyright (c) 2016 Dave Kuhlman. This documentation +and the software it describes is covered by The MIT License: +<a class="reference external" href="http://www.opensource.org/licenses/mit-license.php">http://www.opensource.org/licenses/mit-license.php</a>.</td> +</tr> +<tr class="field"><th class="field-name">abstract:</th><td class="field-body">This document describes generateds_ui.py, the graphical +front end to generateDS.py.</td> +</tr> +</tbody> +</table> +<div class="contents topic" id="contents"> +<p class="topic-title first">Contents</p> +<ul class="auto-toc simple"> +<li><a class="reference internal" href="#introduction" id="id1">1 Introduction</a></li> +<li><a class="reference internal" href="#requirements" id="id2">2 Requirements</a></li> +<li><a class="reference internal" href="#usage-notes" id="id3">3 Usage notes</a><ul class="auto-toc"> +<li><a class="reference internal" href="#what-it-does" id="id4">3.1 What it does</a></li> +<li><a class="reference internal" href="#how-to-use-it" id="id5">3.2 How to use it</a></li> +</ul> +</li> +<li><a class="reference internal" href="#internationalization" id="id6">4 Internationalization</a><ul class="auto-toc"> +<li><a class="reference internal" href="#preparation" id="id7">4.1 Preparation</a></li> +<li><a class="reference internal" href="#installation-and-setup" id="id8">4.2 Installation and setup</a></li> +<li><a class="reference internal" href="#additional-information" id="id9">4.3 Additional information</a></li> +</ul> +</li> +</ul> +</div> +<div class="section" id="introduction"> +<h1><a class="toc-backref" href="#id1">1 Introduction</a></h1> +<p><tt class="docutils literal">generateds_gui.py</tt> provides a graphical front end for +<tt class="docutils literal">generateDS.py</tt>. Some may find it easier to configure and to +select and set options for <tt class="docutils literal">generateDS.py</tt> using this graphical +application.</p> +</div> +<div class="section" id="requirements"> +<h1><a class="toc-backref" href="#id2">2 Requirements</a></h1> +<p>You will need Gtk support for Python in order to run +<tt class="docutils literal">generateds_gui.py</tt>.</p> +<p>You must run <tt class="docutils literal">generateds_gui.py</tt> under Python 3. Python 2 is not +supported.</p> +<p>Note that you can use the "--session" command line flag supported by +<tt class="docutils literal">generateDS.py</tt> on a machine that does not have Python Gtk support +installed.</p> +</div> +<div class="section" id="usage-notes"> +<h1><a class="toc-backref" href="#id3">3 Usage notes</a></h1> +<div class="section" id="what-it-does"> +<h2><a class="toc-backref" href="#id4">3.1 What it does</a></h2> +<p>Here are some of the different ways that you can use +<tt class="docutils literal">generateds_gui.py</tt>:</p> +<ol class="arabic simple"> +<li>You can generate modules from within <tt class="docutils literal">generateds_gui.py</tt> using +the "Generate" item in the "Tools" menu.</li> +<li>You can produce and view a command line that reflects your +configuration using the "Generate CL" item in the "Tools" menu, +and then you can copy and paste the resulting command line into a +<tt class="docutils literal">bash</tt> script (for Linux) or a <tt class="docutils literal">.bat</tt> file (for MS Windows), +which you can then run from the command line.</li> +<li>You can run the session file that you've saved with the +"--session" command line flag supported by <tt class="docutils literal">generateDS.py</tt>.</li> +<li>You can load a previously saved session file into +<tt class="docutils literal">generateds_gui.py</tt> using the "--session" command line option, +and then modify that session and/or use it to generate modules, +or to generate a command line.</li> +</ol> +</div> +<div class="section" id="how-to-use-it"> +<h2><a class="toc-backref" href="#id5">3.2 How to use it</a></h2> +<p>You can get some help by running the following:</p> +<pre class="literal-block"> +$ ./generateds_gui.py --help +</pre> +<p>Command line options and arguments:</p> +<pre class="literal-block"> +Usage: +python generateds_gui.py [options] --session=<some_session_file.session> +example: + python generateds_gui.py --session=generator01.session +Options: + -h, --help show this help message and exit + --exec-path=EXEC_PATH + path to executable generated in command line. + Example: "python /path/to/generateDS.py". Default: + "./generateDS.py". Use Tools/Generate CL (Ctrl-T) to + see it. + --impl-gui=IMPL_GUI name of glade file that defines the GUI if not + embedded. + -s SESSION, --session=SESSION + name of a session file to be loaded. +</pre> +<dl class="docutils"> +<dt>exec-path</dt> +<dd>If your copy of <tt class="docutils literal">generateDS.py</tt> is in a special location, you +can specify that location using this option. The version of +<tt class="docutils literal">generateDS.py</tt> at that location will be run when you select +the "Generate" item from the "Tools" menu.</dd> +<dt>impl-gui</dt> +<dd>The file <tt class="docutils literal">generateds_gui.glade</tt> specifies and describes the +user interface. This file has been embedded into +<tt class="docutils literal">generateds_gui.py</tt>. If you modify <tt class="docutils literal">generateds_gui.glade</tt> +and want to use that modified version, specify it with this +option.</dd> +<dt>s, session</dt> +<dd>If you have created and saved a session file using +<tt class="docutils literal">generateds_gui.py</tt> and want to load that file the next time +you run <tt class="docutils literal">generateds_gui.py</tt>, use this option. Alternatively, +once <tt class="docutils literal">generateds_gui.py</tt> has been started, you can use the +"Load session" item under the "File" menu.</dd> +</dl> +</div> +</div> +<div class="section" id="internationalization"> +<h1><a class="toc-backref" href="#id6">4 Internationalization</a></h1> +<p><em>Note:</em> This work on internationalization for generateds_gui is +experimental and does not yet work.</p> +<div class="section" id="preparation"> +<h2><a class="toc-backref" href="#id7">4.1 Preparation</a></h2> +<p>Here is what I've done:</p> +<pre class="literal-block"> +$ cd generateds/gui/ +$ mkdir po +# Create the template file. +$ xgettext -k_ -kN_ -o po/generateds_gui.pot generateds_gui.glade +# Create a file for the translator. This one is for the Russian language. +$ msginit --locale=ru --input=generateds_gui.pot +</pre> +<p>And, after someone has added their translations (for example, to +<tt class="docutils literal">ru.po</tt>), we translate it to binary with the following command:</p> +<pre class="literal-block"> +$ msgfmt -o generateds_gui.mo ru.po +</pre> +<p>Finally, move the binary file to the appropriate directory under the +directory containing the executable (<tt class="docutils literal">generateds_gui.py</tt>). See +<a class="reference internal" href="#installation-and-setup">Installation and setup</a>.</p> +</div> +<div class="section" id="installation-and-setup"> +<h2><a class="toc-backref" href="#id8">4.2 Installation and setup</a></h2> +<p>Now we have to move the <tt class="docutils literal">.mo</tt> file where it will be used when we +run <tt class="docutils literal">generateds_gui.py</tt>. We place it in a sub-directory under the +location of <tt class="docutils literal">generateds_gui.py</tt> itself.</p> +<pre class="literal-block"> +$ cd /directory/containing/generateds_gui.py +$ mkdir locale +$ mkdir locale/ru +$ mkdir locale/ru/LC_MESSAGES +$ mv generateds_gui.mo locale/ru/LC_MESSAGES/ +</pre> +</div> +<div class="section" id="additional-information"> +<h2><a class="toc-backref" href="#id9">4.3 Additional information</a></h2> +<p>Here are some helpful references:</p> +<ul class="simple"> +<li><a class="reference external" href="https://en.wikipedia.org/wiki/Gettext">https://en.wikipedia.org/wiki/Gettext</a></li> +<li><a class="reference external" href="http://faq.pygtk.org/index.py?req=show&file=faq22.002.htp">http://faq.pygtk.org/index.py?req=show&file=faq22.002.htp</a></li> +<li><a class="reference external" href="http://www.servin.com/linux/GladeInternationalization.html">http://www.servin.com/linux/GladeInternationalization.html</a></li> +<li><a class="reference external" href="http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/">http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/</a></li> +</ul> +<!-- vim:ft=rst: --> +</div> +</div> +</div> +<div class="footer"> +<hr class="footer" /> +<a class="reference external" href="generateds_gui_notes.txt">View document source</a>. +Generated on: 2017-01-17 00:01 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> +</body> +</html> diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt new file mode 100644 index 0000000..25921cc --- /dev/null +++ b/generateds_gui_notes.txt @@ -0,0 +1,188 @@ +====================== +GenerateDS GUI Notes +====================== + +:author: Dave Kuhlman +:contact: dkuhlman (at) davekuhlman (dot) org +:address: + http://www.davekuhlman.org + +.. Do not modify the following version comments. + They are used by updateversion.py. + +.. version + +:revision: 2.24b + +.. version + +:date: |date| + +.. |date| date:: %B %d, %Y + + +:copyright: Copyright (c) 2016 Dave Kuhlman. This documentation + and the software it describes is covered by The MIT License: + http://www.opensource.org/licenses/mit-license.php. + +:abstract: This document describes generateds_ui.py, the graphical + front end to generateDS.py. + +.. sectnum:: :depth: 4 + +.. contents:: + :depth: 4 + + +Introduction +============== + +``generateds_gui.py`` provides a graphical front end for +``generateDS.py``. Some may find it easier to configure and to +select and set options for ``generateDS.py`` using this graphical +application. + + +Requirements +============== + +You will need Gtk support for Python in order to run +``generateds_gui.py``. + +You must run ``generateds_gui.py`` under Python 3. Python 2 is not +supported. + +Note that you can use the "--session" command line flag supported by +``generateDS.py`` on a machine that does not have Python Gtk support +installed. + + +Usage notes +============= + +What it does +-------------- + +Here are some of the different ways that you can use +``generateds_gui.py``: + +#. You can generate modules from within ``generateds_gui.py`` using + the "Generate" item in the "Tools" menu. + +#. You can produce and view a command line that reflects your + configuration using the "Generate CL" item in the "Tools" menu, + and then you can copy and paste the resulting command line into a + ``bash`` script (for Linux) or a ``.bat`` file (for MS Windows), + which you can then run from the command line. + +#. You can run the session file that you've saved with the + "--session" command line flag supported by ``generateDS.py``. + +#. You can load a previously saved session file into + ``generateds_gui.py`` using the "--session" command line option, + and then modify that session and/or use it to generate modules, + or to generate a command line. + + +How to use it +--------------- + +You can get some help by running the following:: + + $ ./generateds_gui.py --help + +Command line options and arguments:: + + Usage: + python generateds_gui.py [options] --session=<some_session_file.session> + example: + python generateds_gui.py --session=generator01.session + Options: + -h, --help show this help message and exit + --exec-path=EXEC_PATH + path to executable generated in command line. + Example: "python /path/to/generateDS.py". Default: + "./generateDS.py". Use Tools/Generate CL (Ctrl-T) to + see it. + --impl-gui=IMPL_GUI name of glade file that defines the GUI if not + embedded. + -s SESSION, --session=SESSION + name of a session file to be loaded. + +exec-path + If your copy of ``generateDS.py`` is in a special location, you + can specify that location using this option. The version of + ``generateDS.py`` at that location will be run when you select + the "Generate" item from the "Tools" menu. + +impl-gui + The file ``generateds_gui.glade`` specifies and describes the + user interface. This file has been embedded into + ``generateds_gui.py``. If you modify ``generateds_gui.glade`` + and want to use that modified version, specify it with this + option. + +s, session + If you have created and saved a session file using + ``generateds_gui.py`` and want to load that file the next time + you run ``generateds_gui.py``, use this option. Alternatively, + once ``generateds_gui.py`` has been started, you can use the + "Load session" item under the "File" menu. + + +Internationalization +====================== + +*Note:* This work on internationalization for generateds_gui is +experimental and does not yet work. + +Preparation +------------- + +Here is what I've done:: + + $ cd generateds/gui/ + $ mkdir po + # Create the template file. + $ xgettext -k_ -kN_ -o po/generateds_gui.pot generateds_gui.glade + # Create a file for the translator. This one is for the Russian language. + $ msginit --locale=ru --input=generateds_gui.pot + +And, after someone has added their translations (for example, to +``ru.po``), we translate it to binary with the following command:: + + $ msgfmt -o generateds_gui.mo ru.po + +Finally, move the binary file to the appropriate directory under the +directory containing the executable (``generateds_gui.py``). See +`Installation and setup`_. + + +Installation and setup +------------------------ + +Now we have to move the ``.mo`` file where it will be used when we +run ``generateds_gui.py``. We place it in a sub-directory under the +location of ``generateds_gui.py`` itself. + +:: + + $ cd /directory/containing/generateds_gui.py + $ mkdir locale + $ mkdir locale/ru + $ mkdir locale/ru/LC_MESSAGES + $ mv generateds_gui.mo locale/ru/LC_MESSAGES/ + + +Additional information +------------------------ + +Here are some helpful references: + +- https://en.wikipedia.org/wiki/Gettext +- http://faq.pygtk.org/index.py?req=show&file=faq22.002.htp +- http://www.servin.com/linux/GladeInternationalization.html +- http://www.learningpython.com/2006/12/03/translating-your-pythonpygtk-application/ + + +.. vim:ft=rst: diff --git a/gui/README.txt b/gui/README.txt new file mode 100644 index 0000000..1b167b3 --- /dev/null +++ b/gui/README.txt @@ -0,0 +1,74 @@ +====================================== +Internationalizing generateds_gui.py +====================================== + +Overview +========== + +This document describes the procedure for translating the strings +used in ``generateds_gui.py`` to another language. + +In summary, the procedure is the following: + +1. Run ``forgui.py`` with the "-c" command line option to create a + translation (dictionary) file. + +2. Edit the new translation (dictionary) file and add translations + of the strings in it. + +3. Run ``forgui.py`` with the "-d" command line option to create a + new glade file. + +Users can now run ``generateds_gui.py`` with the "--impl-gui" option +to reference the new glade file so as to use the new translation. + + +Details +========= + +Run "forgui.py -c" +-------------------- + +This will produce a new dictionary (translation) file that you will +use to specify your translations. + +For example, the following will the file ``fr.dictionary``:: + + $ python forgui.py generateds_gui.glade -c fr.dictionary + +Edit the new translation +-------------------------- + +In the new dictionary (translation) file, you will find lines of the +form:: + + an english language string<-|->an english language string + +Replace the characters to the right of ``<-|->`` with the equivalent +phrase in the target language. + + +Run "forgui.py -d" +-------------------- + +This will produce a new glade file containing your translations. + +For example, the following will produce the file +``generateds_gui_fr.glade``:: + + $ python forgui.py generateds_gui.py -d fr.dictionary + + +Using the new translation +--------------------------- + +Users will use the new translation by running ``generateds_gui.py`` +with the "--impl-gui" command line option. + +For example, the translation created in the above example can be run +as follows:: + + $ python generateds_gui.py --impl-gui=generateds_gui_fr.glade + + +.. vim:ft=rst: diff --git a/gui/en.dictionary b/gui/en.dictionary new file mode 100644 index 0000000..e69de29 diff --git a/gui/forGUI.xsd b/gui/forGUI.xsd new file mode 100644 index 0000000..acc8c12 --- /dev/null +++ b/gui/forGUI.xsd @@ -0,0 +1,287 @@ +<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <xs:element name="interface"> + <xs:annotation> + <xs:documentation>Generated with glade 3.18.3</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element name="requires"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="lib"/> + <xs:attribute type="xs:float" name="version"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="object" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType mixed="true"> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + <xs:attribute type="xs:string" name="translatable" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="accel-groups" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="group"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="signal" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name"/> + <xs:attribute type="xs:string" name="handler"/> + <xs:attribute type="xs:string" name="swapped"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="object"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="object" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="object"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + <xs:attribute type="xs:string" name="translatable" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="object"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element type="xs:string" name="placeholder" minOccurs="0"/> + <xs:element name="object" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + <xs:attribute type="xs:string" name="translatable" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="signal" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + <xs:attribute type="xs:string" name="handler" use="optional"/> + <xs:attribute type="xs:string" name="swapped" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="accelerator" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="key" use="optional"/> + <xs:attribute type="xs:string" name="signal" use="optional"/> + <xs:attribute type="xs:string" name="modifiers" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="child" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element type="xs:string" name="placeholder"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="packing" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:byte"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="type" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="signal" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + <xs:attribute type="xs:string" name="handler" use="optional"/> + <xs:attribute type="xs:string" name="swapped" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="packing" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="packing" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="property" maxOccurs="unbounded" minOccurs="0"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:string" name="name" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element type="xs:string" name="placeholder" minOccurs="0"/> + </xs:sequence> + <xs:attribute type="xs:string" name="internal-child" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="internal-child" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="action-widgets" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="action-widget"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute type="xs:byte" name="response"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="class" use="optional"/> + <xs:attribute type="xs:string" name="id" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> +</xs:schema> \ No newline at end of file diff --git a/gui/forgui.py b/gui/forgui.py new file mode 100644 index 0000000..e68ae19 --- /dev/null +++ b/gui/forgui.py @@ -0,0 +1,3911 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +##VERSION## +VERSION = '2.22a' +##VERSION## + +""" +FILE TRANSLATOR *.GLADE FOR GENERATEDS_GUI. + +Usage: + python forgui.py <The fully qualified name of the base file.glade> -c <The fully qualified name of the base file.dictionary> + + python forgui.py <The fully qualified name of the base file.glade> -d <The fully qualified name of the language file.dictionary> + +Example: + Step1: Create a base file dictionary interface based on generateds_gui.glade + >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary + + Step2: Open the resulting file <..\en.dictionary> and translate into Russian language. Keep under the name <..\rus.dictionary>. + + <English key> [<-|->] <Language value> + + ... User methods module:<-|->ПользовательÑкий модуль методов: + ... Validator bodies path:<-|->Путь корпуÑов контрольного уÑтройÑтва: + ... _Capture CL<-|->_Capture CL + ... _File<-|->_Файл + ... _Generate<-|->_ПроизвеÑти + ... _Help<-|->_Помощь + ... _Tools<-|->_ИнÑтрументы + ............................ + + Step3: Create a new file based on glade generateds_gui. glade using dictionary Eng. dictionary. At the output of the get file .glade generateds_gui_rus. + >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -d d:\Python33\Scripts\rus.dictionary +""" +# +# Generated Tue Apr 19 17:15:20 2016 by generateDS.py version 2.22a. +# +# Command line options: +# ('--no-questions', '') +# ('-f', '') +# ('-o', 'D:\\Python33\\Scripts\\forGUI.py') +# ('--external-encoding', 'utf-8') +# +# Command line arguments: +# D:\Python33\Scripts\forGUI.xsd +# +# Command line: +# d:\Python33\Scripts\generateDS.py --no-questions -f -o "D:\Python33\Scripts\forGUI.py" --external-encoding="utf-8" D:\Python33\Scripts\forGUI.xsd +# +# Current working directory (os.getcwd()): +# Scripts +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +from lxml import etree as etree_ + +#----------------------------------USER FUNCTION---------------------------------------------- +import os.path +LIST_HELPNAMES = {} + +def create_dictfiles(args): + s = list(LIST_HELPNAMES.keys()) + s.sort() + start_dictfile = open(str(args[2]), 'w', encoding='utf-8') + for e in s: + print('''%s<-|->%s''' % (e.replace('\n', ' '),e), file=start_dictfile) + start_dictfile.close() + +def read_dictfiles(args): + dict_file = open(args[2], 'r', encoding='utf-8') + d = {} + list_d = dict_file.readlines() + for s in list_d: + e = s.split("<-|->") + d[e[0].replace('\\n', ' ')] = d.get(e[0].replace('\\n', ' '), re_.sub(r'\n$','',e[1])) + dict_file.close() + return d + +def appLIST_HELPNAMES(inst): + re_n = re_.compile(r'(.*\n.*)') + if len(inst.valueOf_) > 0: + rs = inst.valueOf_.replace('\n', '\\n') + rkey = rs.replace('\\n', ' ') + LIST_HELPNAMES[rkey] = LIST_HELPNAMES.get(rkey, rs) + inst.valueOf_ = re_.sub(r'\n$','', LIST_HELPNAMES[rkey].replace('\\n', '\n')) + +#---------------------------------------------------------------------------------------------- + +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. + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None + + +# +# If you have installed IPython you can uncomment and use the following. +# IPython is available from http://ipython.scipy.org/. +# + +## from IPython.Shell import IPShellEmbed +## args = '' +## ipshell = IPShellEmbed(args, +## banner = 'Dropping into IPython', +## exit_msg = 'Leaving Interpreter, back to program.') + +# Then use the following line where and when you want to drop into the +# IPython shell: +# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') + +# +# Globals +# + +ExternalEncoding = 'utf-8' +Tag_pattern_ = re_.compile(r'({.*})?(.*)') +String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") +Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None + +# +# Support/utility functions. +# + + +def showIndent(outfile, level, pretty_print=True): + if pretty_print: + for idx in range(level): + outfile.write(' ') + + +def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." + if not inStr: + return '' + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + return s1 + + +def quote_attrib(inStr): + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s1 = s1.replace('&', '&') + s1 = s1.replace('<', '<') + s1 = s1.replace('>', '>') + if '"' in s1: + if "'" in s1: + s1 = '"%s"' % s1.replace('"', """) + else: + s1 = "'%s'" % s1 + else: + s1 = '"%s"' % s1 + return s1 + + +def quote_python(inStr): + s1 = inStr + if s1.find("'") == -1: + if s1.find('\n') == -1: + return "'%s'" % s1 + else: + return "'''%s'''" % s1 + else: + if s1.find('"') != -1: + s1 = s1.replace('"', '\\"') + if s1.find('\n') == -1: + return '"%s"' % s1 + else: + return '"""%s"""' % s1 + + +def get_all_text_(node): + if node.text is not None: + text = node.text + else: + text = '' + for child in node: + if child.tail is not None: + text += child.tail + return text + + +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + +class GDSParseError(Exception): + pass + + +def raise_parse_error(node, msg): + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) + raise GDSParseError(msg) + + +class MixedContainer: + # Constants for category: + CategoryNone = 0 + CategoryText = 1 + CategorySimple = 2 + CategoryComplex = 3 + # Constants for content_type: + TypeNone = 0 + TypeText = 1 + TypeString = 2 + TypeInteger = 3 + TypeFloat = 4 + TypeDecimal = 5 + TypeDouble = 6 + TypeBoolean = 7 + TypeBase64 = 8 + def __init__(self, category, content_type, name, value): + self.category = category + self.content_type = content_type + self.name = name + self.value = value + def getCategory(self): + return self.category + def getContenttype(self, content_type): + return self.content_type + def getValue(self): + return self.value + def getName(self): + return self.name + def export(self, outfile, level, name, namespace, pretty_print=True): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + outfile.write(self.value) + elif self.category == MixedContainer.CategorySimple: + self.exportSimple(outfile, level, name) + else: # category == MixedContainer.CategoryComplex + self.value.export(outfile, level, namespace, name, pretty_print) + def exportSimple(self, outfile, level, name): + if self.content_type == MixedContainer.TypeString: + outfile.write('<%s>%s</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeInteger or \ + self.content_type == MixedContainer.TypeBoolean: + outfile.write('<%s>%d</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeFloat or \ + self.content_type == MixedContainer.TypeDecimal: + outfile.write('<%s>%f</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeDouble: + outfile.write('<%s>%g</%s>' % ( + self.name, self.value, self.name)) + elif self.content_type == MixedContainer.TypeBase64: + outfile.write('<%s>%s</%s>' % ( + self.name, base64.b64encode(self.value), self.name)) + def to_etree(self, element): + if self.category == MixedContainer.CategoryText: + # Prevent exporting empty content as empty lines. + if self.value.strip(): + if len(element) > 0: + if element[-1].tail is None: + element[-1].tail = self.value + else: + element[-1].tail += self.value + else: + if element.text is None: + element.text = self.value + else: + element.text += self.value + elif self.category == MixedContainer.CategorySimple: + subelement = etree_.SubElement(element, '%s' % self.name) + subelement.text = self.to_etree_simple() + else: # category == MixedContainer.CategoryComplex + self.value.to_etree(element) + def to_etree_simple(self): + if self.content_type == MixedContainer.TypeString: + text = self.value + elif (self.content_type == MixedContainer.TypeInteger or + self.content_type == MixedContainer.TypeBoolean): + text = '%d' % self.value + elif (self.content_type == MixedContainer.TypeFloat or + self.content_type == MixedContainer.TypeDecimal): + text = '%f' % self.value + elif self.content_type == MixedContainer.TypeDouble: + text = '%g' % self.value + elif self.content_type == MixedContainer.TypeBase64: + text = '%s' % base64.b64encode(self.value) + return text + def exportLiteral(self, outfile, level, name): + if self.category == MixedContainer.CategoryText: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + elif self.category == MixedContainer.CategorySimple: + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( + self.category, self.content_type, self.name, self.value)) + else: # category == MixedContainer.CategoryComplex + showIndent(outfile, level) + outfile.write( + 'model_.MixedContainer(%d, %d, "%s",\n' % ( + self.category, self.content_type, self.name,)) + self.value.exportLiteral(outfile, level + 1) + showIndent(outfile, level) + outfile.write(')\n') + + +class MemberSpec_(object): + def __init__(self, name='', data_type='', container=0): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class interface(GeneratedsSuper): + """Generated with glade 3.18.3""" + subclass = None + superclass = None + def __init__(self, requires=None, object=None): + self.original_tagname_ = None + self.requires = requires + if object is None: + self.object = [] + else: + self.object = object + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, interface) + if subclass is not None: + return subclass(*args_, **kwargs_) + if interface.subclass: + return interface.subclass(*args_, **kwargs_) + else: + return interface(*args_, **kwargs_) + factory = staticmethod(factory) + def get_requires(self): return self.requires + def set_requires(self, requires): self.requires = requires + def get_object(self): return self.object + def set_object(self, object): self.object = object + def add_object(self, value): self.object.append(value) + def insert_object_at(self, index, value): self.object.insert(index, value) + def replace_object_at(self, index, value): self.object[index] = value + def hasContent_(self): + if ( + self.requires is not None or + self.object + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='interface', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='interface') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='interface', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='interface'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='interface', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.requires is not None: + self.requires.export(outfile, level, namespace_, name_='requires', pretty_print=pretty_print) + for object_ in self.object: + object_.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'requires': + obj_ = requiresType.factory() + obj_.build(child_) + self.requires = obj_ + obj_.original_tagname_ = 'requires' + elif nodeName_ == 'object': + obj_ = objectType.factory() + obj_.build(child_) + self.object.append(obj_) + obj_.original_tagname_ = 'object' +# end class interface + + +class requiresType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, lib=None, version=None, valueOf_=None): + self.original_tagname_ = None + self.lib = _cast(None, lib) + self.version = _cast(float, version) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, requiresType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if requiresType.subclass: + return requiresType.subclass(*args_, **kwargs_) + else: + return requiresType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_lib(self): return self.lib + def set_lib(self, lib): self.lib = lib + def get_version(self): return self.version + def set_version(self, version): self.version = version + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='requiresType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='requiresType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='requiresType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='requiresType'): + if self.lib is not None and 'lib' not in already_processed: + already_processed.add('lib') + outfile.write(' lib=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.lib), input_name='lib')), )) + if self.version is not None and 'version' not in already_processed: + already_processed.add('version') + outfile.write(' version="%s"' % self.gds_format_float(self.version, input_name='version')) + def exportChildren(self, outfile, level, namespace_='', name_='requiresType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('lib', node) + if value is not None and 'lib' not in already_processed: + already_processed.add('lib') + self.lib = value + value = find_attr_value_('version', node) + if value is not None and 'version' not in already_processed: + already_processed.add('version') + try: + self.version = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (version): %s' % exp) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class requiresType + + +class objectType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, accel_groups=None, signal=None, child=None, action_widgets=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + self.accel_groups = accel_groups + self.signal = signal + self.child = child + self.action_widgets = action_widgets + self.valueOf_ = valueOf_ + if mixedclass_ is None: + self.mixedclass_ = MixedContainer + else: + self.mixedclass_ = mixedclass_ + if content_ is None: + self.content_ = [] + else: + self.content_ = content_ + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType.subclass: + return objectType.subclass(*args_, **kwargs_) + else: + return objectType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_accel_groups(self): return self.accel_groups + def set_accel_groups(self, accel_groups): self.accel_groups = accel_groups + def get_signal(self): return self.signal + def set_signal(self, signal): self.signal = signal + def get_child(self): return self.child + def set_child(self, child): self.child = child + def get_action_widgets(self): return self.action_widgets + def set_action_widgets(self, action_widgets): self.action_widgets = action_widgets + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + self.property or + self.accel_groups is not None or + self.signal is not None or + self.child is not None or + self.action_widgets is not None or + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType', fromsubclass_=False, pretty_print=True): + if not fromsubclass_: + for item_ in self.content_: + item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + if node.text is not None: + obj_ = self.mixedclass_(MixedContainer.CategoryText, + MixedContainer.TypeNone, '', node.text) + self.content_.append(obj_) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType.factory() + obj_.build(child_) + obj_ = self.mixedclass_(MixedContainer.CategoryComplex, + MixedContainer.TypeNone, 'property', obj_) + self.content_.append(obj_) + if hasattr(self, 'add_property'): + self.add_property(obj_.value) + elif hasattr(self, 'set_property'): + self.set_property(obj_.value) + elif nodeName_ == 'accel-groups': + obj_ = accel_groupsType.factory() + obj_.build(child_) + obj_ = self.mixedclass_(MixedContainer.CategoryComplex, + MixedContainer.TypeNone, 'accel-groups', obj_) + self.content_.append(obj_) + if hasattr(self, 'add_accel-groups'): + self.add_accel-groups(obj_.value) + elif hasattr(self, 'set_accel-groups'): + self.set_accel-groups(obj_.value) + elif nodeName_ == 'signal': + obj_ = signalType.factory() + obj_.build(child_) + obj_ = self.mixedclass_(MixedContainer.CategoryComplex, + MixedContainer.TypeNone, 'signal', obj_) + self.content_.append(obj_) + if hasattr(self, 'add_signal'): + self.add_signal(obj_.value) + elif hasattr(self, 'set_signal'): + self.set_signal(obj_.value) + elif nodeName_ == 'child': + obj_ = childType.factory() + obj_.build(child_) + obj_ = self.mixedclass_(MixedContainer.CategoryComplex, + MixedContainer.TypeNone, 'child', obj_) + self.content_.append(obj_) + if hasattr(self, 'add_child'): + self.add_child(obj_.value) + elif hasattr(self, 'set_child'): + self.set_child(obj_.value) + elif nodeName_ == 'action-widgets': + obj_ = action_widgetsType.factory() + obj_.build(child_) + obj_ = self.mixedclass_(MixedContainer.CategoryComplex, + MixedContainer.TypeNone, 'action-widgets', obj_) + self.content_.append(obj_) + if hasattr(self, 'add_action-widgets'): + self.add_action-widgets(obj_.value) + elif hasattr(self, 'set_action-widgets'): + self.set_action-widgets(obj_.value) + if not fromsubclass_ and child_.tail is not None: + obj_ = self.mixedclass_(MixedContainer.CategoryText, + MixedContainer.TypeNone, '', child_.tail) + self.content_.append(obj_) +# end class objectType + + +class propertyType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, translatable=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.translatable = _cast(None, translatable) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType.subclass: + return propertyType.subclass(*args_, **kwargs_) + else: + return propertyType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_translatable(self): return self.translatable + def set_translatable(self, translatable): self.translatable = translatable + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.translatable is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + + appLIST_HELPNAMES(self) + outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('translatable', node) + if value is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + + self.translatable = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass + +def rv_isbool(namespacedef_): + if isinstance(namespacedef_, bool): + namespacedef_ = '' + return namespacedef_ + +# end class propertyType + + +class accel_groupsType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, group=None): + self.original_tagname_ = None + self.group = group + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, accel_groupsType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if accel_groupsType.subclass: + return accel_groupsType.subclass(*args_, **kwargs_) + else: + return accel_groupsType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_group(self): return self.group + def set_group(self, group): self.group = group + def hasContent_(self): + if ( + self.group is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='accel-groupsType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='accel-groupsType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='accel-groupsType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='accel-groupsType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='accel-groupsType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.group is not None: + self.group.export(outfile, level, namespace_, name_='group', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'group': + obj_ = groupType.factory() + obj_.build(child_) + self.group = obj_ + obj_.original_tagname_ = 'group' +# end class accel_groupsType + + +class groupType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, groupType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if groupType.subclass: + return groupType.subclass(*args_, **kwargs_) + else: + return groupType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='groupType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='groupType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='groupType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='groupType'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='groupType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class groupType + + +class signalType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, handler=None, swapped=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.handler = _cast(None, handler) + self.swapped = _cast(None, swapped) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, signalType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if signalType.subclass: + return signalType.subclass(*args_, **kwargs_) + else: + return signalType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_handler(self): return self.handler + def set_handler(self, handler): self.handler = handler + def get_swapped(self): return self.swapped + def set_swapped(self, swapped): self.swapped = swapped + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='signalType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='signalType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.handler is not None and 'handler' not in already_processed: + already_processed.add('handler') + outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), )) + if self.swapped is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), )) + def exportChildren(self, outfile, level, namespace_='', name_='signalType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('handler', node) + if value is not None and 'handler' not in already_processed: + already_processed.add('handler') + self.handler = value + value = find_attr_value_('swapped', node) + if value is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + self.swapped = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class signalType + + +class childType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, internal_child=None, object=None): + self.original_tagname_ = None + self.internal_child = _cast(None, internal_child) + self.object = object + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType.subclass: + return childType.subclass(*args_, **kwargs_) + else: + return childType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_object(self): return self.object + def set_object(self, object): self.object = object + def get_internal_child(self): return self.internal_child + def set_internal_child(self, internal_child): self.internal_child = internal_child + def hasContent_(self): + if ( + self.object is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType'): + if self.internal_child is not None and 'internal_child' not in already_processed: + already_processed.add('internal_child') + outfile.write(' internal-child=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.internal_child), input_name='internal-child')), )) + def exportChildren(self, outfile, level, namespace_='', name_='childType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.object is not None: + self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('internal-child', node) + if value is not None and 'internal-child' not in already_processed: + already_processed.add('internal-child') + self.internal_child = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'object': + obj_ = objectType1.factory() + obj_.build(child_) + self.object = obj_ + obj_.original_tagname_ = 'object' +# end class childType + + +class objectType1(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, child=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + if child is None: + self.child = [] + else: + self.child = child + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType1.subclass: + return objectType1.subclass(*args_, **kwargs_) + else: + return objectType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_child(self): return self.child + def set_child(self, child): self.child = child + def add_child(self, value): self.child.append(value) + def insert_child_at(self, index, value): self.child.insert(index, value) + def replace_child_at(self, index, value): self.child[index] = value + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def hasContent_(self): + if ( + self.property or + self.child + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType1', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType1'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + for child_ in self.child: + child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType2.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' + elif nodeName_ == 'child': + obj_ = childType3.factory() + obj_.build(child_) + self.child.append(obj_) + obj_.original_tagname_ = 'child' +# end class objectType1 + + +class propertyType2(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType2.subclass: + return propertyType2.subclass(*args_, **kwargs_) + else: + return propertyType2(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType2', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType2') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType2', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType2'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType2', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType2 + + +class childType3(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, internal_child=None, object=None, packing=None, placeholder=None): + self.original_tagname_ = None + self.internal_child = _cast(None, internal_child) + self.object = object + self.packing = packing + self.placeholder = placeholder + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType3) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType3.subclass: + return childType3.subclass(*args_, **kwargs_) + else: + return childType3(*args_, **kwargs_) + factory = staticmethod(factory) + def get_object(self): return self.object + def set_object(self, object): self.object = object + def get_packing(self): return self.packing + def set_packing(self, packing): self.packing = packing + def get_placeholder(self): return self.placeholder + def set_placeholder(self, placeholder): self.placeholder = placeholder + def get_internal_child(self): return self.internal_child + def set_internal_child(self, internal_child): self.internal_child = internal_child + def hasContent_(self): + if ( + self.object is not None or + self.packing is not None or + self.placeholder is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType3', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType3') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType3', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType3'): + if self.internal_child is not None and 'internal_child' not in already_processed: + already_processed.add('internal_child') + outfile.write(' internal-child=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.internal_child), input_name='internal-child')), )) + def exportChildren(self, outfile, level, namespace_='', name_='childType3', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.object is not None: + self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + if self.packing is not None: + self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print) + if self.placeholder is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('internal-child', node) + if value is not None and 'internal-child' not in already_processed: + already_processed.add('internal-child') + self.internal_child = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'object': + obj_ = objectType4.factory() + obj_.build(child_) + self.object = obj_ + obj_.original_tagname_ = 'object' + elif nodeName_ == 'packing': + obj_ = packingType21.factory() + obj_.build(child_) + self.packing = obj_ + obj_.original_tagname_ = 'packing' + elif nodeName_ == 'placeholder': + placeholder_ = child_.text + placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder') + self.placeholder = placeholder_ +# end class childType3 + + +class objectType4(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, child=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + if child is None: + self.child = [] + else: + self.child = child + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType4) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType4.subclass: + return objectType4.subclass(*args_, **kwargs_) + else: + return objectType4(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_child(self): return self.child + def set_child(self, child): self.child = child + def add_child(self, value): self.child.append(value) + def insert_child_at(self, index, value): self.child.insert(index, value) + def replace_child_at(self, index, value): self.child[index] = value + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def hasContent_(self): + if ( + self.property or + self.child + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType4', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType4') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType4', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType4'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType4', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + for child_ in self.child: + child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType5.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' + elif nodeName_ == 'child': + obj_ = childType6.factory() + obj_.build(child_) + self.child.append(obj_) + obj_.original_tagname_ = 'child' +# end class objectType4 + + +class propertyType5(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType5) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType5.subclass: + return propertyType5.subclass(*args_, **kwargs_) + else: + return propertyType5(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType5', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType5') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType5', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType5'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType5', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType5 + + +class childType6(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, object=None, packing=None): + self.original_tagname_ = None + self.object = object + self.packing = packing + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType6) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType6.subclass: + return childType6.subclass(*args_, **kwargs_) + else: + return childType6(*args_, **kwargs_) + factory = staticmethod(factory) + def get_object(self): return self.object + def set_object(self, object): self.object = object + def get_packing(self): return self.packing + def set_packing(self, packing): self.packing = packing + def hasContent_(self): + if ( + self.object is not None or + self.packing is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType6', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType6') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType6', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType6'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='childType6', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.object is not None: + self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + if self.packing is not None: + self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'object': + obj_ = objectType7.factory() + obj_.build(child_) + self.object = obj_ + obj_.original_tagname_ = 'object' + elif nodeName_ == 'packing': + obj_ = packingType19.factory() + obj_.build(child_) + self.packing = obj_ + obj_.original_tagname_ = 'packing' +# end class childType6 + + +class objectType7(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, child=None, signal=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + self.child = child + self.signal = signal + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType7) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType7.subclass: + return objectType7.subclass(*args_, **kwargs_) + else: + return objectType7(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_child(self): return self.child + def set_child(self, child): self.child = child + def get_signal(self): return self.signal + def set_signal(self, signal): self.signal = signal + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def hasContent_(self): + if ( + self.property or + self.child is not None or + self.signal is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType7', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType7') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType7', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType7'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType7', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + if self.child is not None: + self.child.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print) + if self.signal is not None: + self.signal.export(outfile, level, namespace_, name_='signal', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType8.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' + elif nodeName_ == 'child': + obj_ = childType9.factory() + obj_.build(child_) + self.child = obj_ + obj_.original_tagname_ = 'child' + elif nodeName_ == 'signal': + obj_ = signalType18.factory() + obj_.build(child_) + self.signal = obj_ + obj_.original_tagname_ = 'signal' +# end class objectType7 + + +class propertyType8(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, translatable=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.translatable = _cast(None, translatable) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType8) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType8.subclass: + return propertyType8.subclass(*args_, **kwargs_) + else: + return propertyType8(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_translatable(self): return self.translatable + def set_translatable(self, translatable): self.translatable = translatable + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType8', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType8') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType8', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType8'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.translatable is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + appLIST_HELPNAMES(self) + outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType8', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('translatable', node) + if value is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + + self.translatable = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType8 + + +class childType9(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, type_=None, object=None): + self.original_tagname_ = None + self.type_ = _cast(None, type_) + self.object = object + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType9) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType9.subclass: + return childType9.subclass(*args_, **kwargs_) + else: + return childType9(*args_, **kwargs_) + factory = staticmethod(factory) + def get_object(self): return self.object + def set_object(self, object): self.object = object + def get_type(self): return self.type_ + def set_type(self, type_): self.type_ = type_ + def hasContent_(self): + if ( + self.object is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType9', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType9') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType9', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType9'): + if self.type_ is not None and 'type_' not in already_processed: + already_processed.add('type_') + outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), )) + def exportChildren(self, outfile, level, namespace_='', name_='childType9', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.object is not None: + self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('type', node) + if value is not None and 'type' not in already_processed: + already_processed.add('type') + self.type_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'object': + obj_ = objectType10.factory() + obj_.build(child_) + self.object = obj_ + obj_.original_tagname_ = 'object' +# end class childType9 + + +class objectType10(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, child=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + if child is None: + self.child = [] + else: + self.child = child + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType10) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType10.subclass: + return objectType10.subclass(*args_, **kwargs_) + else: + return objectType10(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_child(self): return self.child + def set_child(self, child): self.child = child + def add_child(self, value): self.child.append(value) + def insert_child_at(self, index, value): self.child.insert(index, value) + def replace_child_at(self, index, value): self.child[index] = value + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def hasContent_(self): + if ( + self.property or + self.child + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType10', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType10') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType10', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType10'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType10', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + for child_ in self.child: + child_.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType11.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' + elif nodeName_ == 'child': + obj_ = childType12.factory() + obj_.build(child_) + self.child.append(obj_) + obj_.original_tagname_ = 'child' +# end class objectType10 + + +class propertyType11(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType11) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType11.subclass: + return propertyType11.subclass(*args_, **kwargs_) + else: + return propertyType11(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType11', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType11') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType11', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType11'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType11', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType11 + + +class childType12(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, placeholder=None, object=None, packing=None): + self.original_tagname_ = None + self.placeholder = placeholder + self.object = object + self.packing = packing + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType12) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType12.subclass: + return childType12.subclass(*args_, **kwargs_) + else: + return childType12(*args_, **kwargs_) + factory = staticmethod(factory) + def get_placeholder(self): return self.placeholder + def set_placeholder(self, placeholder): self.placeholder = placeholder + def get_object(self): return self.object + def set_object(self, object): self.object = object + def get_packing(self): return self.packing + def set_packing(self, packing): self.packing = packing + def hasContent_(self): + if ( + self.placeholder is not None or + self.object is not None or + self.packing is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType12', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType12') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType12', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType12'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='childType12', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.placeholder is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_)) + if self.object is not None: + self.object.export(outfile, level, namespace_, name_='object', pretty_print=pretty_print) + if self.packing is not None: + self.packing.export(outfile, level, namespace_, name_='packing', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'placeholder': + placeholder_ = child_.text + placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder') + self.placeholder = placeholder_ + elif nodeName_ == 'object': + obj_ = objectType13.factory() + obj_.build(child_) + self.object = obj_ + obj_.original_tagname_ = 'object' + elif nodeName_ == 'packing': + obj_ = packingType.factory() + obj_.build(child_) + self.packing = obj_ + obj_.original_tagname_ = 'packing' +# end class childType12 + + +class objectType13(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, class_=None, id=None, property=None, signal=None, accelerator=None, child=None): + self.original_tagname_ = None + self.class_ = _cast(None, class_) + self.id = _cast(None, id) + if property is None: + self.property = [] + else: + self.property = property + self.signal = signal + self.accelerator = accelerator + self.child = child + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, objectType13) + if subclass is not None: + return subclass(*args_, **kwargs_) + if objectType13.subclass: + return objectType13.subclass(*args_, **kwargs_) + else: + return objectType13(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def get_signal(self): return self.signal + def set_signal(self, signal): self.signal = signal + def get_accelerator(self): return self.accelerator + def set_accelerator(self, accelerator): self.accelerator = accelerator + def get_child(self): return self.child + def set_child(self, child): self.child = child + def get_class(self): return self.class_ + def set_class(self, class_): self.class_ = class_ + def get_id(self): return self.id + def set_id(self, id): self.id = id + def hasContent_(self): + if ( + self.property or + self.signal is not None or + self.accelerator is not None or + self.child is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='objectType13', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='objectType13') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='objectType13', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='objectType13'): + if self.class_ is not None and 'class_' not in already_processed: + already_processed.add('class_') + outfile.write(' class=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.class_), input_name='class')), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) + def exportChildren(self, outfile, level, namespace_='', name_='objectType13', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + if self.signal is not None: + self.signal.export(outfile, level, namespace_, name_='signal', pretty_print=pretty_print) + if self.accelerator is not None: + self.accelerator.export(outfile, level, namespace_, name_='accelerator', pretty_print=pretty_print) + if self.child is not None: + self.child.export(outfile, level, namespace_, name_='child', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('class', node) + if value is not None and 'class' not in already_processed: + already_processed.add('class') + self.class_ = value + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType14.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' + elif nodeName_ == 'signal': + obj_ = signalType15.factory() + obj_.build(child_) + self.signal = obj_ + obj_.original_tagname_ = 'signal' + elif nodeName_ == 'accelerator': + obj_ = acceleratorType.factory() + obj_.build(child_) + self.accelerator = obj_ + obj_.original_tagname_ = 'accelerator' + elif nodeName_ == 'child': + obj_ = childType16.factory() + obj_.build(child_) + self.child = obj_ + obj_.original_tagname_ = 'child' +# end class objectType13 + + +class propertyType14(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, translatable=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.translatable = _cast(None, translatable) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType14) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType14.subclass: + return propertyType14.subclass(*args_, **kwargs_) + else: + return propertyType14(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_translatable(self): return self.translatable + def set_translatable(self, translatable): self.translatable = translatable + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType14', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType14') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType14', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType14'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.translatable is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + appLIST_HELPNAMES(self) + outfile.write(' translatable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.translatable), input_name='translatable')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType14', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('translatable', node) + if value is not None and 'translatable' not in already_processed: + already_processed.add('translatable') + self.translatable = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType14 + + +class signalType15(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, handler=None, swapped=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.handler = _cast(None, handler) + self.swapped = _cast(None, swapped) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, signalType15) + if subclass is not None: + return subclass(*args_, **kwargs_) + if signalType15.subclass: + return signalType15.subclass(*args_, **kwargs_) + else: + return signalType15(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_handler(self): return self.handler + def set_handler(self, handler): self.handler = handler + def get_swapped(self): return self.swapped + def set_swapped(self, swapped): self.swapped = swapped + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='signalType15', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType15') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='signalType15', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType15'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.handler is not None and 'handler' not in already_processed: + already_processed.add('handler') + outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), )) + if self.swapped is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), )) + def exportChildren(self, outfile, level, namespace_='', name_='signalType15', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('handler', node) + if value is not None and 'handler' not in already_processed: + already_processed.add('handler') + self.handler = value + value = find_attr_value_('swapped', node) + if value is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + self.swapped = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class signalType15 + + +class acceleratorType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, key=None, signal=None, modifiers=None, valueOf_=None): + self.original_tagname_ = None + self.key = _cast(None, key) + self.signal = _cast(None, signal) + self.modifiers = _cast(None, modifiers) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, acceleratorType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if acceleratorType.subclass: + return acceleratorType.subclass(*args_, **kwargs_) + else: + return acceleratorType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_key(self): return self.key + def set_key(self, key): self.key = key + def get_signal(self): return self.signal + def set_signal(self, signal): self.signal = signal + def get_modifiers(self): return self.modifiers + def set_modifiers(self, modifiers): self.modifiers = modifiers + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='acceleratorType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='acceleratorType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='acceleratorType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='acceleratorType'): + if self.key is not None and 'key' not in already_processed: + already_processed.add('key') + outfile.write(' key=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.key), input_name='key')), )) + if self.signal is not None and 'signal' not in already_processed: + already_processed.add('signal') + outfile.write(' signal=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.signal), input_name='signal')), )) + if self.modifiers is not None and 'modifiers' not in already_processed: + already_processed.add('modifiers') + outfile.write(' modifiers=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.modifiers), input_name='modifiers')), )) + def exportChildren(self, outfile, level, namespace_='', name_='acceleratorType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('key', node) + if value is not None and 'key' not in already_processed: + already_processed.add('key') + self.key = value + value = find_attr_value_('signal', node) + if value is not None and 'signal' not in already_processed: + already_processed.add('signal') + self.signal = value + value = find_attr_value_('modifiers', node) + if value is not None and 'modifiers' not in already_processed: + already_processed.add('modifiers') + self.modifiers = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class acceleratorType + + +class childType16(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, placeholder=None): + self.original_tagname_ = None + self.placeholder = placeholder + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, childType16) + if subclass is not None: + return subclass(*args_, **kwargs_) + if childType16.subclass: + return childType16.subclass(*args_, **kwargs_) + else: + return childType16(*args_, **kwargs_) + factory = staticmethod(factory) + def get_placeholder(self): return self.placeholder + def set_placeholder(self, placeholder): self.placeholder = placeholder + def hasContent_(self): + if ( + self.placeholder is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='childType16', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='childType16') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='childType16', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='childType16'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='childType16', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.placeholder is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%splaceholder>%s</%splaceholder>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.placeholder), input_name='placeholder')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'placeholder': + placeholder_ = child_.text + placeholder_ = self.gds_validate_string(placeholder_, node, 'placeholder') + self.placeholder = placeholder_ +# end class childType16 + + +class packingType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, property=None): + self.original_tagname_ = None + if property is None: + self.property = [] + else: + self.property = property + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, packingType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if packingType.subclass: + return packingType.subclass(*args_, **kwargs_) + else: + return packingType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def hasContent_(self): + if ( + self.property + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='packingType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='packingType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='packingType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType17.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' +# end class packingType + + +class propertyType17(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType17) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType17.subclass: + return propertyType17.subclass(*args_, **kwargs_) + else: + return propertyType17(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType17', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType17') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType17', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType17'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType17', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType17 + + +class signalType18(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, handler=None, swapped=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.handler = _cast(None, handler) + self.swapped = _cast(None, swapped) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, signalType18) + if subclass is not None: + return subclass(*args_, **kwargs_) + if signalType18.subclass: + return signalType18.subclass(*args_, **kwargs_) + else: + return signalType18(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_handler(self): return self.handler + def set_handler(self, handler): self.handler = handler + def get_swapped(self): return self.swapped + def set_swapped(self, swapped): self.swapped = swapped + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='signalType18', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='signalType18') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='signalType18', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='signalType18'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + if self.handler is not None and 'handler' not in already_processed: + already_processed.add('handler') + outfile.write(' handler=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.handler), input_name='handler')), )) + if self.swapped is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + outfile.write(' swapped=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.swapped), input_name='swapped')), )) + def exportChildren(self, outfile, level, namespace_='', name_='signalType18', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + value = find_attr_value_('handler', node) + if value is not None and 'handler' not in already_processed: + already_processed.add('handler') + self.handler = value + value = find_attr_value_('swapped', node) + if value is not None and 'swapped' not in already_processed: + already_processed.add('swapped') + self.swapped = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class signalType18 + + +class packingType19(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, property=None): + self.original_tagname_ = None + if property is None: + self.property = [] + else: + self.property = property + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, packingType19) + if subclass is not None: + return subclass(*args_, **kwargs_) + if packingType19.subclass: + return packingType19.subclass(*args_, **kwargs_) + else: + return packingType19(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def hasContent_(self): + if ( + self.property + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='packingType19', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType19') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='packingType19', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType19'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='packingType19', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType20.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' +# end class packingType19 + + +class propertyType20(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType20) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType20.subclass: + return propertyType20.subclass(*args_, **kwargs_) + else: + return propertyType20(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType20', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType20') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType20', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType20'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType20', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType20 + + +class packingType21(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, property=None): + self.original_tagname_ = None + if property is None: + self.property = [] + else: + self.property = property + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, packingType21) + if subclass is not None: + return subclass(*args_, **kwargs_) + if packingType21.subclass: + return packingType21.subclass(*args_, **kwargs_) + else: + return packingType21(*args_, **kwargs_) + factory = staticmethod(factory) + def get_property(self): return self.property + def set_property(self, property): self.property = property + def add_property(self, value): self.property.append(value) + def insert_property_at(self, index, value): self.property.insert(index, value) + def replace_property_at(self, index, value): self.property[index] = value + def hasContent_(self): + if ( + self.property + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='packingType21', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='packingType21') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='packingType21', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='packingType21'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='packingType21', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for property_ in self.property: + property_.export(outfile, level, namespace_, name_='property', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'property': + obj_ = propertyType22.factory() + obj_.build(child_) + self.property.append(obj_) + obj_.original_tagname_ = 'property' +# end class packingType21 + + +class propertyType22(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, name=None, valueOf_=None): + self.original_tagname_ = None + self.name = _cast(None, name) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, propertyType22) + if subclass is not None: + return subclass(*args_, **kwargs_) + if propertyType22.subclass: + return propertyType22.subclass(*args_, **kwargs_) + else: + return propertyType22(*args_, **kwargs_) + factory = staticmethod(factory) + def get_name(self): return self.name + def set_name(self, name): self.name = name + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='propertyType22', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='propertyType22') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='propertyType22', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='propertyType22'): + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) + def exportChildren(self, outfile, level, namespace_='', name_='propertyType22', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class propertyType22 + + +class action_widgetsType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, action_widget=None): + self.original_tagname_ = None + self.action_widget = action_widget + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, action_widgetsType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if action_widgetsType.subclass: + return action_widgetsType.subclass(*args_, **kwargs_) + else: + return action_widgetsType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_action_widget(self): return self.action_widget + def set_action_widget(self, action_widget): self.action_widget = action_widget + def hasContent_(self): + if ( + self.action_widget is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='action-widgetsType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, rv_isbool(namespacedef_) and ' ' + rv_isbool(namespacedef_) or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='action-widgetsType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='action-widgetsType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='action-widgetsType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='action-widgetsType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.action_widget is not None: + self.action_widget.export(outfile, level, namespace_, name_='action-widget', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'action-widget': + obj_ = action_widgetType.factory() + obj_.build(child_) + self.action_widget = obj_ + obj_.original_tagname_ = 'action-widget' +# end class action_widgetsType + + +class action_widgetType(GeneratedsSuper): + subclass = None + superclass = None + def __init__(self, response=None, valueOf_=None): + self.original_tagname_ = None + self.response = _cast(int, response) + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, action_widgetType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if action_widgetType.subclass: + return action_widgetType.subclass(*args_, **kwargs_) + else: + return action_widgetType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_response(self): return self.response + def set_response(self, response): self.response = response + def get_valueOf_(self): return self.valueOf_ + def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ + def hasContent_(self): + if ( + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='action-widgetType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='action-widgetType') + if self.hasContent_(): + outfile.write('>') + outfile.write((quote_xml(self.valueOf_) if type(self.valueOf_) is str else self.gds_encode(str(self.valueOf_)))) + self.exportChildren(outfile, level + 1, namespace_='', name_='action-widgetType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='action-widgetType'): + if self.response is not None and 'response' not in already_processed: + already_processed.add('response') + outfile.write(' response="%s"' % self.gds_format_integer(self.response, input_name='response')) + def exportChildren(self, outfile, level, namespace_='', name_='action-widgetType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + self.valueOf_ = get_all_text_(node) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('response', node) + if value is not None and 'response' not in already_processed: + already_processed.add('response') + try: + self.response = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class action_widgetType + + +GDSClassesMapping = { + 'accel-groups': accel_groupsType, + 'accelerator': acceleratorType, + 'action-widget': action_widgetType, + 'action-widgets': action_widgetsType, + 'child': childType16, + 'group': groupType, + 'object': objectType13, + 'packing': packingType, + 'property': propertyType22, + 'requires': requiresType, + 'signal': signalType15, +} + + +USAGE_TEXT = """ +Usage: + python forgui.py <The fully qualified name of the base file.glade> -c <The fully qualified name of the base file.dictionary> + + python forgui.py <The fully qualified name of the base file.glade> -d <The fully qualified name of the language file.dictionary> + +Example: + Step1: Create a base file dictionary interface based on generateds_gui.glade + >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary + + Step2: Open the resulting file en. dictionary and translate into Russian language. Keep under the name rus. dictionary. + + <English key> [<-|->] <Language value> + + ... User methods module:<-|->ПользовательÑкий модуль методов: + ... Validator bodies path:<-|->Путь корпуÑов контрольного уÑтройÑтва: + ... _Capture CL<-|->_Capture CL + ... _File<-|->_Файл + ... _Generate<-|->_ПроизвеÑти + ... _Help<-|->_Помощь + ... _Tools<-|->_ИнÑтрументы + ............................ + + Step3: Create a new file based on glade generateds_gui. glade using dictionary Eng. dictionary. At the output of the get file .glade generateds_gui_rus. + >>>python forgui.py d:\Python33\Scripts\generateds_gui.glade -d d:\Python33\Scripts\rus.dictionary +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'interface' + rootClass = interface + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'interface' + rootClass = interface + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'interface' + rootClass = interface + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'interface' + rootClass = interface + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from forGUI import *\n\n') + sys.stdout.write('import forGUI as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) > 0: + # python forgui.py d:\Python33\Scripts\generateds_gui.glade -d d:\Python33\Scripts\rus.dictionary + if args[1] == '-d': + global LIST_HELPNAMES + LIST_HELPNAMES = read_dictfiles(args) + root = parse(args[0], silence=True) + path_glade, filename_glade = os.path.split(args[0]) + basename_glade, extension_glade = os.path.splitext(filename_glade) + path_dictionary , filename_dictionary = os.path.split(args[2]) + export_file_name = os.path.join(path_glade, basename_glade+'_'+os.path.splitext(filename_dictionary)[0]+extension_glade) + export_file = open(export_file_name, 'w', encoding='utf-8') + #export_file = sys.stdout + export_file.write('<?xml version="1.0" encoding="UTF-8"?>\n') + root.export(export_file, 0) + export_file.close() + # python forgui.py d:\Python33\Scripts\generateds_gui.glade -c d:\Python33\Scripts\en.dictionary + elif args[1] == '-c': + parse(args[0], silence=False) + create_dictfiles(args) + else: + usage() + + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "accel_groupsType", + "acceleratorType", + "action_widgetType", + "action_widgetsType", + "childType", + "childType12", + "childType16", + "childType3", + "childType6", + "childType9", + "groupType", + "interface", + "objectType", + "objectType1", + "objectType10", + "objectType13", + "objectType4", + "objectType7", + "packingType", + "packingType19", + "packingType21", + "propertyType", + "propertyType11", + "propertyType14", + "propertyType17", + "propertyType2", + "propertyType20", + "propertyType22", + "propertyType5", + "propertyType8", + "requiresType", + "signalType", + "signalType15", + "signalType18" +] diff --git a/gui/generateds_gui.glade b/gui/generateds_gui.glade index 763ed91..a64fc51 100644 --- a/gui/generateds_gui.glade +++ b/gui/generateds_gui.glade @@ -1,89 +1,186 @@ <?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> + <requires lib="gtk+" version="3.0"/> + <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkDialog" id="content_dialog"> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="title" translatable="yes">Messages and Content</property> + <property name="default_width">800</property> + <property name="default_height">600</property> + <property name="type_hint">normal</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="content_dialog_ok_button"> + <property name="label" translatable="yes">OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="activate" handler="on_ok_button_activate" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="min_content_width">250</property> + <property name="min_content_height">500</property> + <child> + <object class="GtkTextView" id="content_textview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">content_dialog_ok_button</action-widget> + </action-widgets> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save-as</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-open</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-clear</property> + </object> <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> <accel-groups> <group name="accelgroup1"/> </accel-groups> - <signal name="delete_event" handler="on_window_delete_event"/> + <signal name="delete-event" handler="on_window_delete_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="menuitem1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_File</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="clear_menuitem"> <property name="label">Clear</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="image">image4</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/> <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_clear_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="open_session_menuitem"> <property name="label">_Load session</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Load a previous saved session.</property> <property name="use_underline">True</property> <property name="image">image3</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/> <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_open_session_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="save_session_menuitem"> <property name="label">_Save session</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Save the current session.</property> <property name="use_underline">True</property> <property name="image">image1</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/> <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_save_session_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="save_session_as_menuitem"> <property name="label">Save session as ...</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Save the current session in file chosen by the user.</property> <property name="image">image2</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_save_session_as_menuitem_activate"/> + <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem" id="menuitem5"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="imagemenuitem5"> <property name="label">gtk-quit</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Exit from the application.</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_quit_menu_item_activate"/> + <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/> </object> </child> </object> @@ -93,30 +190,34 @@ file chosen by the user.</property> <child> <object class="GtkMenuItem" id="menuitem2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Tools</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu2"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="capture_cl_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Capture the command line that would be used to generate the bindings modules.</property> <property name="label" translatable="yes">_Capture CL</property> <property name="use_underline">True</property> + <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/> <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_capture_cl_menuitem_activate"/> </object> </child> <child> <object class="GtkMenuItem" id="generate_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> <property name="label" translatable="yes">_Generate</property> <property name="use_underline">True</property> + <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/> <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_generate_menuitem_activate"/> </object> </child> </object> @@ -126,19 +227,22 @@ to generate the bindings modules.</property> <child> <object class="GtkMenuItem" id="menuitem4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Help</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu3"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="imagemenuitem10"> <property name="label">gtk-about</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_about_menu_item_activate"/> + <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/> </object> </child> </object> @@ -148,1099 +252,1384 @@ to generate the bindings modules.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkTable" id="table1"> + <object class="GtkScrolledWindow" id="scrolledwindow2"> <property name="visible">True</property> - <property name="n_rows">23</property> - <property name="n_columns">4</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Input schema file:</property> - </object> - </child> - <child> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output superclass file:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output subclass file:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Overwrite without asking:</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <property name="min_content_width">1000</property> + <property name="min_content_height">600</property> <child> - <object class="GtkCheckButton" id="force_checkbutton"> - <property name="label" translatable="yes">Force</property> + <object class="GtkViewport" id="viewport1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Always overwrite output files. + <property name="can_focus">False</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">29</property> + <property name="n_columns">4</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Input schema file:</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output superclass file:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output subclass file:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Overwrite without asking:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="force_checkbutton"> + <property name="label" translatable="yes">Force</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Always overwrite output files. Do not ask for confirmation.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="input_schema_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="input_schema_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the input XML schema defining the bindings to be generated.</property> - <property name="invisible_char">â—</property> - <property name="width_chars">80</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_superclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file + <property name="invisible_char">â—</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_superclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the output file to be generated and to contain the superclasses.</property> - <property name="invisible_char">â—</property> - <signal name="changed" handler="on_output_superclass_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_subclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file + <property name="invisible_char">â—</property> + <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_subclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the output file to be generated and to contain the subclasses.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Prefix (for class names):</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Prefix for class names.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label6"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace prefix:</property> - </object> - <packing> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> - <property name="tooltip_text" translatable="yes">Override default namespace + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Prefix (for class names):</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Prefix for class names.</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Namespace prefix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="tooltip_text" translatable="yes">Override default namespace prefix in schema file. Example: -a "xsd:" Default: "xs:".</property> - <property name="invisible_char">â—</property> - <signal name="changed" handler="on_namespace_prefix_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Behavior file name:</property> - </object> - <packing> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="behavior_filename_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Input file name for behaviors + <property name="invisible_char">â—</property> + <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Behavior file name:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="behavior_filename_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Input file name for behaviors added to subclasses.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label8"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Generate Python properties:</property> - </object> - <packing> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="properties_checkbutton"> - <property name="label" translatable="yes">Properties</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Generate Python properties for member variables + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Generate Python properties:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="properties_checkbutton"> + <property name="label" translatable="yes">Properties</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Generate Python properties for member variables so that the value can be retrieved and modified without calling getter and setter functions. </property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label9"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Search these directories for additional -schema files</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Search path:</property> - </object> - <packing> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="search_path_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Search these directories for additional -schema files.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label10"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Subclass suffix:</property> - </object> - <packing> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="subclass_suffix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names. + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Subclass suffix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="subclass_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names. Default="Sub".</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label11"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Root element:</property> - </object> - <packing> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="root_element_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Assume that this value is the name + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Root element:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="root_element_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Assume that this value is the name of the root element of instance docs. Default is first element defined in schema.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the input schema file.</property> - <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property> - <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property> - <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the nput file name for + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the input schema file.</property> + <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property> + <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property> + <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the nput file name for behaviors added to subclasses.</property> - <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label12"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Superclass module:</property> - </object> - <packing> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="superclass_module_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Superclass module name in subclass module. + <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Superclass module:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="superclass_module_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Superclass module name in subclass module. Default="???".</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label13"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Use old getters and setters:</property> - </object> - <packing> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> - <property name="label" translatable="yes">Old getters and setters</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(), + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Use old getters and setters:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> + <property name="label" translatable="yes">Old getters and setters</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(), instead of get_var() and set_var().</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label14"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Validator bodies path:</property> - </object> - <packing> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">User methods module:</property> - </object> - <packing> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label16"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No dates:</property> - </object> - <packing> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label17"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No versions:</property> - </object> - <packing> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_dates_checkbutton"> - <property name="label" translatable="yes">No dates in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current date in the generated + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Validator bodies path:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">User methods module:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No dates:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No versions:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_dates_checkbutton"> + <property name="label" translatable="yes">No dates in generated output</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not include the current date in the generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="validator_bodies_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="validator_bodies_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide bodies (implementations) of validator methods.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide bodies (implementations) of validator methods.</property> - <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_versions_checkbutton"> - <property name="label" translatable="yes">No version info in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current version in the generated + <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_versions_checkbutton"> + <property name="label" translatable="yes">No version info in generated output</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not include the current version in the generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods. See -section "User Methods" in the documentation.</property> - <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="user_methods_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Optional module containing user methods. See + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods. See section "User Methods" in the documentation.</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label18"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No process includes:</property> - </object> - <packing> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label19"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Silence:</property> - </object> - <packing> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_process_includes_checkbutton"> - <property name="label" translatable="yes">Do not process includes in schema</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not process included XML Schema files. By + <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="user_methods_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Optional module containing user methods. See +section "User Methods" in the documentation.</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No process includes:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Silence:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_process_includes_checkbutton"> + <property name="label" translatable="yes">Do not process includes in schema</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by <include ... /> elements into the XML Schema to be processed.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="silence_checkbutton"> - <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="silence_checkbutton"> + <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS echoes the information being parsed. Use this option to turn off that behavior. </property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label20"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace definitions:</property> - </object> - <packing> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label21"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">External encoding:</property> - </object> - <packing> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label22"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Member specs:</property> - </object> - <packing> - <property name="top_attach">22</property> - <property name="bottom_attach">23</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_defs_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Namespace definitions:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">External encoding:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Member specs:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_defs_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the value for the namespacedef_ parameter of the export() method by the generated parse() and parseString() functions. Default=''. Example: xmlns:abc="http://www.abc.com"</property> - <property name="invisible_char">â—</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="external_encoding_entry"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Encode output written by the generated export + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="external_encoding_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Encode output written by the generated export methods using this encoding. Default, if omitted, is the value returned by sys.getdefaultencoding(). Example: utf-8.</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="member_specs_combobox_container"> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">22</property> - <property name="bottom_attach">23</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> - <property name="label" translatable="yes">Empty</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Assume an empty namespace + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="member_specs_combobox_container"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> + <property name="label" translatable="yes">Empty</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Assume an empty namespace prefix in the XML schema, not the default ("xs:").</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="auto_super_checkbutton"> - <property name="label" translatable="yes">Auto</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Use the superclass file name + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_super_checkbutton"> + <property name="label" translatable="yes">Auto</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Use the superclass file name stem as the super-class module name.</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkButton" id="search_path_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the search path entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - </packing> - </child> - <child> - <object class="GtkButton" id="subclass_suffix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkButton" id="root_element_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the root element entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="superclass_module_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_defs_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkButton" id="external_encoding_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label23"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Get encoded</property> - </object> - <packing> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="get_encoded_checkbutton"> - <property name="label" translatable="yes">Getters return encoded values by default</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true. + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkButton" id="subclass_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkButton" id="root_element_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the root element entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="superclass_module_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_defs_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkButton" id="external_encoding_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Get encoded:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="get_encoded_checkbutton"> + <property name="label" translatable="yes">Getters return encoded values by default</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true. Can be changed at run-time by either (1) changing global variable GetEncodedValue or (2) using optional parameter to getter.</property> - <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Exports:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="export_spec_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Specifies export functions to be generated. Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)). Example: "write etree". Default: "write".</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">One file per XSD:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton"> + <property name="label" translatable="yes">Create a python module for each XSD processed.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Create a python module for each XSD processed.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output directory:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_directory_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Used in conjunction with --one-file-per-xsd. The directory where the modules will be created.</property> + <property name="invisible_char">â—</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output directory for one-file-per-xsd.</property> + <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output directory entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="export_spec_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the exports entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Module suffix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Preserve CData tags:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Cleanup name list:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="module_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">To be used in conjunction with --one-file-per-xsd. Append XXX to the end of each file created.</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="cleanup_name_list_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Specifies list of 2-tuples used for cleaning names. First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]". Default: "[('[-:.]', '_')]".</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton"> + <property name="label" translatable="yes">Preserve CData tags</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Preserve CDATA tags. Default: False.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkButton" id="module_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the module suffix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cleanup_name_list_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the cleanup name list entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + </child> </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="homogeneous">True</property> <child> <object class="GtkButton" id="generate_button"> @@ -1249,9 +1638,11 @@ Can be changed at run-time by either <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> - <signal name="clicked" handler="on_generate_button_clicked"/> + <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -1262,24 +1653,30 @@ Can be changed at run-time by either <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Exit from the application.</property> - <signal name="clicked" handler="on_quit_button_clicked"/> + <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkStatusbar" id="statusbar1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">2</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -1289,84 +1686,9 @@ Can be changed at run-time by either </object> </child> </object> - <object class="GtkAccelGroup" id="accelgroup1"/> - <object class="GtkDialog" id="content_dialog"> - <property name="border_width">5</property> - <property name="title" translatable="yes">Messages and Content</property> - <property name="default_width">800</property> - <property name="default_height">600</property> - <property name="type_hint">normal</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox3"> - <property name="visible">True</property> - <property name="spacing">2</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <object class="GtkTextView" id="content_textview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area3"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="content_dialog_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="activate" handler="on_ok_button_activate"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="0">content_dialog_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-save</property> - </object> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-save-as</property> - </object> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="stock">gtk-clear</property> - </object> <object class="GtkImage" id="image5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> </interface> diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py index 272b6e7..41864be 100755 --- a/gui/generateds_gui.py +++ b/gui/generateds_gui.py @@ -1,14 +1,24 @@ #!/usr/bin/env python - import sys import os from optparse import OptionParser -from ConfigParser import ConfigParser -from xml.dom import minidom +from configparser import ConfigParser from xml.parsers import expat import subprocess import re -import gtk +import locale +import gettext + + +if sys.version_info.major == 2: + import gtk +else: + # https://sourceforge.net/projects/pygobjectwin32/files/ + # https://blogs.gnome.org/kittykat/2014/01/29/developing-gtk-3-apps-with-python-on-windows/ + import gi + gi.require_version('Gtk', '3.0') + from gi.repository import Gtk as gtk + # import pango from libgenerateDS.gui import generateds_gui_session #import generateds_gui_session @@ -20,7 +30,7 @@ from libgenerateDS.gui import generateds_gui_session ## 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') @@ -31,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.11b' +VERSION = '2.24b' ##VERSION## @@ -59,9 +69,15 @@ CmdTemplate = ( '%(namespace_defs)s' + '%(external_encoding)s' + '%(member_specs)s' + + '%(export_spec)s' + + '%(one_file_per_xsd)s' + + '%(output_directory)s' + + '%(module_suffix)s' + + '%(preserve_cdata_tags)s' + + '%(cleanup_name_list)s' + ' %(input_schema)s' + '' - ) +) CaptureCmdTemplate = ( '%(exec_path)s --no-questions' + '%(force)s' + @@ -84,14 +100,20 @@ CaptureCmdTemplate = ( '%(namespace_defs)s' + '%(external_encoding)s' + '%(member_specs)s' + + '%(export_spec)s' + + '%(one_file_per_xsd)s' + + '%(output_directory)s' + + '%(module_suffix)s' + + '%(preserve_cdata_tags)s' + + '%(cleanup_name_list)s' + ' \\\n %(input_schema)s' + '' - ) +) ErrorMessages = [ '', 'Must enter input schema name.', 'Must enter either output superclass name or output subclass file name.', - ] +] Memberspecs_tooltip_text = '''\ Generate member (type) specifications in each class: a dictionary of instances of class @@ -110,12 +132,24 @@ class UIItemSpec(object): self.name = name self.ui_type = ui_type self.access_action = access_action - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_ui_type(self): return self.ui_type - def set_ui_type(self, ui_type): self.ui_type = ui_type - def get_access_action(self): return self.access_action - def set_access_action(self, access_action): self.access_action = access_action + + def get_name(self): + return self.name + + def set_name(self, name): + self.name = name + + def get_ui_type(self): + return self.ui_type + + def set_ui_type(self, ui_type): + self.ui_type = ui_type + + def get_access_action(self): + return self.access_action + + def set_access_action(self, access_action): + self.access_action = access_action class GeneratedsGui(object): @@ -124,6 +158,7 @@ class GeneratedsGui(object): global Builder # Default values Builder = gtk.Builder() + Builder.set_translation_domain('generateds_gui') self.options = options # self.ui_spec_filename = ui_spec_filename self.filename = None @@ -132,11 +167,12 @@ class GeneratedsGui(object): self.ui_obj_dict = {} self.session_filename = None self.current_folder = None - # use GtkBuilder to build our interface from the XML file + # use GtkBuilder to build our interface from the XML file ui_spec_filename = options.impl_gui try: if ui_spec_filename is None: - Builder.add_from_string(Ui_spec, len(Ui_spec)) + Builder.add_from_string(branch_version( + 'Ui_spec, len(Ui_spec)', 'Ui_spec')) else: Builder.add_from_file(ui_spec_filename) except: @@ -153,14 +189,16 @@ class GeneratedsGui(object): setattr(self, s1, bgo(s1)) self.ui_obj_dict[s1] = bgo(s1) # Create the member-specs combobox. - member_specs_combobox = gtk.combo_box_new_text() + member_specs_combobox = branch_version( + 'gtk.combo_box_new_text()', 'gtk.ComboBoxText()') member_specs_combobox.set_name('member_specs_combobox') member_specs_combobox.set_tooltip_text(Memberspecs_tooltip_text) self.ui_obj_dict['member_specs_combobox'] = member_specs_combobox member_specs_combobox.append_text("none") member_specs_combobox.append_text("list") member_specs_combobox.append_text("dict") - member_specs_combobox_container = bgo('member_specs_combobox_container') + member_specs_combobox_container = bgo( + 'member_specs_combobox_container') member_specs_combobox_container.add(member_specs_combobox) member_specs_combobox.set_active(0) member_specs_combobox.show() @@ -169,9 +207,12 @@ class GeneratedsGui(object): Builder.connect_signals(self) Builder.connect_signals(self.content_dialog) # set the default icon to the GTK "edit" icon - gtk.window_set_default_icon_name(gtk.STOCK_EDIT) + branch_version( + 'gtk.window_set_default_icon_name(gtk.STOCK_EDIT)', + 'gtk.Window.set_default_icon_name(gtk.STOCK_EDIT)') # setup and initialize our statusbar - self.statusbar_cid = self.statusbar.get_context_id("Tutorial GTK+ Text Editor") + self.statusbar_cid = self.statusbar.get_context_id( + "Tutorial GTK+ Text Editor") self.reset_default_status() self.params = generateds_gui_session.sessionType() # Load a session if specified. @@ -187,8 +228,8 @@ class GeneratedsGui(object): self.trans_gui_2_obj() self.saved_params = self.params.copy() - # When our window is destroyed, we want to break out of the GTK main loop. - # We do this by calling gtk_main_quit(). We could have also just specified + # When our window is destroyed, we want to break out of the GTK main loop. + # We do this by calling gtk_main_quit(). We could have also just specified # gtk_main_quit as the handler in Glade! def on_window_destroy(self, widget, data=None): self.trans_gui_2_obj() @@ -196,23 +237,40 @@ class GeneratedsGui(object): ## self.dump_params('params:', self.params) if self.params != self.saved_params: message = 'Session data has changed.\n\nSave?' - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_NONE, - message) - dialog.add_buttons( - gtk.STOCK_YES, gtk.RESPONSE_YES, - '_Discard', 1, - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + if sys.version_info.major == 2: + dialog = gtk.MessageDialog( + None, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_ERROR, + gtk.BUTTONS_NONE, + message) + dialog.add_buttons( + gtk.STOCK_YES, gtk.RESPONSE_YES, + '_Discard', 1, + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + ) + else: + dialog = gtk.MessageDialog( + None, + (gtk.DialogFlags.MODAL | + gtk.DialogFlags.DESTROY_WITH_PARENT), + gtk.MessageType.ERROR, + gtk.ButtonsType.NONE, + message) + dialog.add_buttons( + gtk.STOCK_YES, gtk.ResponseType.YES, + '_Discard', 1, + gtk.STOCK_CANCEL, gtk.ResponseType.CANCEL, ) response = dialog.run() dialog.destroy() - if response == gtk.RESPONSE_YES: + if response == branch_version( + 'gtk.RESPONSE_YES', 'gtk.ResponseType.YES'): self.save_session_action() elif response == 1: pass - elif response == gtk.RESPONSE_CANCEL: + elif response == branch_version( + 'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'): return gtk.main_quit() @@ -227,7 +285,7 @@ class GeneratedsGui(object): # Get the values from the widgets in the UI. # Format the command line. - # Generate the output files. + # Generate the output files. def on_generate_menuitem_activate(self, menuitem, data=None): self.trans_gui_2_obj() params_dict = self.trans_params_2_dict() @@ -257,6 +315,8 @@ class GeneratedsGui(object): cmd = cmd.replace(' --', ' \\\n --') cmd = cmd.replace(' -o', ' \\\n -o') cmd = cmd.replace(' -s', ' \\\n -s') + cmd = cmd.replace(' -f', ' \\\n -f') + cmd = cmd.replace(' -m', ' \\\n -m') self.display_content('Command line', cmd) return True @@ -274,8 +334,9 @@ class GeneratedsGui(object): else: self.params.set_member_specs('none') else: - s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), ) - method = getattr(ui_obj, 'get_%s' % item.get_access_action()) + #s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), ) + method = getattr( + ui_obj, 'get_%s' % item.get_access_action()) value = method() setattr(self.params, item.get_name(), value) @@ -300,12 +361,13 @@ class GeneratedsGui(object): value = False elif item.get_ui_type() == 'combobox': value = 0 - method = getattr(ui_obj, + method = getattr( + ui_obj, 'set_%s' % item.get_access_action()) method(value) def dump_params(self, msg, params): - print msg + print(msg) params.export(sys.stdout, 0, name_='session') def trans_params_2_dict(self): @@ -323,35 +385,62 @@ class GeneratedsGui(object): self.transform_1_param(params, pd, 'namespace_prefix', 'a') self.transform_1_param(params, pd, 'behavior_filename', 'b') pd['properties'] = (' -m' if params.get_properties() else '') - self.transform_1_param(params, pd, 'subclass_suffix', 'subclass-suffix', True) - self.transform_1_param(params, pd, 'root_element', 'root-element', True) - self.transform_1_param(params, pd, 'superclass_module', 'super', True) - pd['old_getters_setters'] = (' --use-old-getter-setter' if params.get_old_getters_setters() else '') - self.transform_1_param(params, pd, 'user_methods', 'user-methods', True) - self.transform_1_param(params, pd, 'validator_bodies', 'validator-bodies', True) + self.transform_1_param( + params, pd, 'subclass_suffix', 'subclass-suffix', True) + self.transform_1_param( + params, pd, 'root_element', 'root-element', True) + self.transform_1_param( + params, pd, 'superclass_module', 'super', True) + pd['old_getters_setters'] = ( + ' --use-old-getter-setter' + if params.get_old_getters_setters() + else '') + self.transform_1_param( + params, pd, 'user_methods', 'user-methods', True) + self.transform_1_param( + params, pd, 'validator_bodies', 'validator-bodies', True) pd['no_dates'] = (' --no-dates' if params.get_no_dates() else '') - pd['no_versions'] = (' --no-versions' if params.get_no_versions() else '') - pd['no_process_includes'] = (' --no-process-includes' if params.get_no_process_includes() else '') + pd['no_versions'] = ( + ' --no-versions' if params.get_no_versions() else '') + pd['no_process_includes'] = ( + ' --no-process-includes' + if params.get_no_process_includes() + else '') pd['silence'] = (' --silence' if params.get_silence() else '') # Special case for namespacedefs because of quoting. - #self.transform_1_param(params, pd, 'namespace_defs', 'namespacedef', True) name = 'namespace_defs' flag = 'namespacedef' value = getattr(params, name) params_dict[name] = ( - " --%s='%s'" % (flag, value, ) - if value.strip() - else '') - self.transform_1_param(params, pd, 'external_encoding', 'external-encoding', True) + " --%s='%s'" % (flag, value, ) + if value.strip() + else '') + self.transform_1_param( + params, pd, 'external_encoding', 'external-encoding', True) if params.get_member_specs() == 'list': pd['member_specs'] = ' --member-specs=list' elif params.get_member_specs() == 'dict': pd['member_specs'] = ' --member-specs=dict' else: pd['member_specs'] = '' + self.transform_1_param( + params, pd, 'export_spec', 'export', True) + pd['one_file_per_xsd'] = ( + ' --one-file-per-xsd' if params.get_one_file_per_xsd() else '') + self.transform_1_param( + params, pd, 'output_directory', 'output-directory', True) + self.transform_1_param( + params, pd, 'module_suffix', 'module-suffix', True) + pd['preserve_cdata_tags'] = ( + ' --preserve-cdata-tags' + if params.get_preserve_cdata_tags() + else '') + self.transform_1_param( + params, pd, 'cleanup_name_list', 'cleanup-name-list', True) return pd - def transform_1_param(self, params, params_dict, name, flag, longopt=False): + def transform_1_param( + self, params, params_dict, name, flag, longopt=False): value = getattr(params, name) if longopt: params_dict[name] = ( @@ -376,26 +465,36 @@ class GeneratedsGui(object): msg = '' if not p['input_schema']: result = 1 - elif not (p['output_superclass'] or - p['output_subclass']): + elif not (p['output_superclass'] or p['output_subclass']): result = 2 if result: msg = ErrorMessages[result] return result, msg - # Clear all the fields/widgets to default values. + # Clear all the fields/widgets to default values. def on_clear_menuitem_activate(self, menuitem, data=None): message = 'Clear all entries?\nAre you sure?' - dialog = gtk.MessageDialog( - None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_WARNING, - gtk.BUTTONS_OK_CANCEL, - message + + if sys.version_info.major == 2: + dialog = gtk.MessageDialog( + None, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_WARNING, + gtk.BUTTONS_OK_CANCEL, + message + ) + else: + dialog = gtk.MessageDialog( + None, + gtk.DialogFlags.MODAL | gtk.DialogFlags.DESTROY_WITH_PARENT, + gtk.MessageType.WARNING, + gtk.ButtonsType.OK_CANCEL, + message ) response = dialog.run() dialog.destroy() - if response == gtk.RESPONSE_OK: + if response == branch_version( + 'gtk.RESPONSE_OK', 'gtk.ResponseType.OK'): self.session_filename = None self.params = generateds_gui_session.sessionType( input_schema='', @@ -421,13 +520,20 @@ class GeneratedsGui(object): namespace_defs='', external_encoding='', member_specs='', - ) + export_spec='', + one_file_per_xsd=False, + output_directory='', + module_suffix='', + preserve_cdata_tags=False, + cleanup_name_list='', + ) self.trans_obj_2_gui() def run_command(self, cmd): - spobj = subprocess.Popen(cmd, + spobj = subprocess.Popen( + cmd, shell=True, - stdout=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=False) outcontent = spobj.stdout.read() @@ -441,7 +547,9 @@ class GeneratedsGui(object): error = True if not error: msg = 'Successfully generated.' - self.error_message(msg, gtk.MESSAGE_INFO) + self.error_message( + msg, + branch_version('gtk.MESSAGE_INFO', 'gtk.MessageType.INFO')) def display_content(self, title, content): #content_dialog = ContentDialog() @@ -453,28 +561,47 @@ class GeneratedsGui(object): ## self.dump_params('params:', self.params) if self.params != self.saved_params: message = 'Session data has changed.\n\nSave?' - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_NONE, - message) - dialog.add_buttons( - gtk.STOCK_YES, gtk.RESPONSE_YES, - '_Discard', 1, - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + if sys.version_info.major == 2: + dialog = gtk.MessageDialog( + None, + gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, + gtk.MESSAGE_ERROR, + gtk.BUTTONS_NONE, + message) + dialog.add_buttons( + gtk.STOCK_YES, gtk.RESPONSE_YES, + '_Discard', 1, + gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + ) + else: + dialog = gtk.MessageDialog( + None, + (gtk.DialogFlags.MODAL | + gtk.DialogFlags.DESTROY_WITH_PARENT), + gtk.MessageType.ERROR, + gtk.ButtonsType.NONE, + message) + dialog.add_buttons( + gtk.STOCK_YES, gtk.ResponseType.YES, + '_Discard', 1, + gtk.STOCK_CANCEL, gtk.ResponseType.CANCEL, ) response = dialog.run() dialog.destroy() - if response == gtk.RESPONSE_YES: + if response == branch_version( + 'gtk.RESPONSE_YES', 'gtk.ResponseType.YES'): self.save_session_action() elif response == 1: pass - elif response == gtk.RESPONSE_CANCEL: + elif response == branch_version( + 'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'): return session_filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_OPEN, + branch_version( + 'gtk.FILE_CHOOSER_ACTION_OPEN', + 'gtk.FileChooserAction.OPEN'), (('Session *.session', '*.session'),) - ) + ) if session_filename: self.session_filename = session_filename self.load_session(self.session_filename) @@ -488,15 +615,22 @@ class GeneratedsGui(object): def save_session_action(self): if not self.session_filename: filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_SAVE, + branch_version( + 'gtk.FILE_CHOOSER_ACTION_SAVE', + 'gtk.FileChooserAction.SAVE'), (('Session *.session', '*.session'),), confirm_overwrite=True, initfilename=self.session_filename, buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK, - ) + gtk.STOCK_CANCEL, + branch_version( + 'gtk.RESPONSE_CANCEL', + 'gtk.ResponseType.CANCEL'), + gtk.STOCK_SAVE, branch_version( + 'gtk.RESPONSE_OK', + 'gtk.ResponseType.OK'), ) + ) if filename: self.session_filename = filename if self.session_filename: @@ -510,15 +644,22 @@ class GeneratedsGui(object): def on_save_session_as_menuitem_activate(self, menuitem, data=None): filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_SAVE, + branch_version( + 'gtk.FILE_CHOOSER_ACTION_SAVE', + 'gtk.FileChooserAction.SAVE'), (('Session *.session', '*.session'),), confirm_overwrite=True, initfilename=self.session_filename, buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK, - ) + gtk.STOCK_CANCEL, + branch_version( + 'gtk.RESPONSE_CANCEL', + 'gtk.ResponseType.CANCEL'), + gtk.STOCK_SAVE, branch_version( + 'gtk.RESPONSE_OK', + 'gtk.ResponseType.OK'), ) + ) if filename: self.session_filename = filename stem, ext = os.path.splitext(self.session_filename) @@ -534,11 +675,13 @@ class GeneratedsGui(object): sessionObj = self.params outfile = open(filename, 'w') outfile.write('<?xml version="1.0" ?>\n') - sessionObj.export(outfile, 0, name_="session", + sessionObj.export( + outfile, 0, name_="session", namespacedef_='') outfile.close() msg = 'Session saved to file:\n%s' % (filename, ) - self.error_message(msg, gtk.MESSAGE_INFO) + msgTy = branch_version('gtk.MESSAGE_INFO', 'gtk.MessageType.INFO') + self.error_message(msg, msgTy) self.saved_params = self.params.copy() def load_session(self, filename): @@ -547,7 +690,7 @@ class GeneratedsGui(object): rootNode = doc.getroot() rootTag, rootClass = generateds_gui_session.get_root_tag(rootNode) if rootClass is None: - rootTag = 'session' + #rootTag = 'session' rootClass = generateds_gui_session.sessionType sessionObj = rootClass.factory() sessionObj.build(rootNode) @@ -555,12 +698,12 @@ class GeneratedsGui(object): self.trans_obj_2_gui() self.trans_gui_2_obj() self.saved_params = self.params.copy() - except IOError, exp: + except IOError as exp: msg = str(exp) - self.error_message(msg, gtk.MESSAGE_ERROR) - except expat.ExpatError, exp: + self.error_message(msg) + except expat.ExpatError as exp: msg = '%s file: %s' % (str(exp), filename, ) - self.error_message(msg, gtk.MESSAGE_ERROR) + self.error_message(msg) def on_about_menu_item_activate(self, menuitem, data=None): if self.about_dialog: @@ -579,25 +722,41 @@ class GeneratedsGui(object): about_dialog.set_comments("GTK+ and Glade3 GUI front end") about_dialog.set_authors(authors) about_dialog.set_logo_icon_name(gtk.STOCK_EDIT) + # callbacks for destroying the dialog def close(dialog, response, editor): editor.about_dialog = None dialog.destroy() + def delete_event(dialog, event, editor): editor.about_dialog = None return True + about_dialog.connect("response", close, self) about_dialog.connect("delete-event", delete_event, self) self.about_dialog = about_dialog about_dialog.show() - def error_message(self, message, message_type=gtk.MESSAGE_ERROR): + def error_message(self, message, message_type=None): # log to terminal window #print message # create an error message dialog and display modally to the user - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - message_type, gtk.BUTTONS_OK, message) + if message_type is None: + message_type = branch_version( + 'gtk.MESSAGE_ERROR', + 'gtk.MessageType.ERROR') + dialog = gtk.MessageDialog( + None, + branch_version( + 'gtk.DIALOG_MODAL', + 'gtk.DialogFlags.MODAL') | + branch_version( + 'gtk.DIALOG_DESTROY_WITH_PARENT', + 'gtk.DialogFlags.DESTROY_WITH_PARENT'), + message_type, branch_version( + 'gtk.BUTTONS_OK', + 'gtk.ButtonsType.OK'), + message) dialog.run() dialog.destroy() @@ -607,7 +766,10 @@ class GeneratedsGui(object): self.statusbar.push(self.statusbar_cid, msg) def on_input_schema_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, + filename = self.choose_filename( + branch_version( + 'gtk.FILE_CHOOSER_ACTION_OPEN', + 'gtk.FileChooserAction.OPEN'), (('Schemas *.xsd', '*.xsd'),)) if filename: self.input_schema_entry.set_text(filename) @@ -625,37 +787,66 @@ class GeneratedsGui(object): self.output_subclass_entry.set_text(filename) def on_behavior_filename_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, + filename = self.choose_filename( + branch_version( + 'gtk.FILE_CHOOSER_ACTION_OPEN', + 'gtk.FileChooserAction.OPEN'), (('Python *.py', '*.py'),)) if filename: self.behavior_filename_entry.set_text(filename) def on_validator_bodies_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, - ) + filename = self.choose_filename( + branch_version( + 'gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER', + 'gtk.FileChooserAction.SELECT_FOLDER'), + ) if filename: self.validator_bodies_entry.set_text(filename) def on_user_methods_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, + filename = self.choose_filename( + branch_version( + 'gtk.FILE_CHOOSER_ACTION_OPEN', + 'gtk.FileChooserAction.OPEN'), (('Python *.py', '*.py'),)) if filename: self.user_methods_entry.set_text(filename) - def choose_filename(self, action=gtk.FILE_CHOOSER_ACTION_SAVE, - patterns=(), confirm_overwrite=False, initfilename=None, - buttons=None): + def on_output_directory_chooser_button_clicked(self, button, data=None): + filename = self.choose_filename( + branch_version( + 'gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER', + 'gtk.FileChooserAction.SELECT_FOLDER'), + ) + if filename: + self.output_directory_entry.set_text(filename) + + def choose_filename( + self, + action=None, + patterns=(), + confirm_overwrite=False, + initfilename=None, + buttons=None): + if action is None: + action = branch_version( + 'gtk.FILE_CHOOSER_ACTION_SAVE', 'gtk.FileChooserAction.SAVE') filename = None + ty_CANCEL = branch_version( + 'gtk.RESPONSE_CANCEL', + 'gtk.ResponseType.CANCEL') + ty_OK = branch_version('gtk.RESPONSE_OK', 'gtk.ResponseType.OK') if buttons is None: - buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK, - ) + buttons = ( + gtk.STOCK_CANCEL, ty_CANCEL, + gtk.STOCK_OPEN, ty_OK, + ) dialog = gtk.FileChooserDialog( title=None, action=action, buttons=buttons, - ) + ) if self.current_folder is not None: dialog.set_current_folder(self.current_folder) if initfilename is not None: @@ -672,23 +863,25 @@ class GeneratedsGui(object): dialog.add_filter(filter) dialog.set_do_overwrite_confirmation(confirm_overwrite) response = dialog.run() - if response == gtk.RESPONSE_OK: + if response == branch_version( + 'gtk.RESPONSE_OK', 'gtk.ResponseType.OK'): filename = dialog.get_filename() self.current_folder = dialog.get_current_folder() - elif response == gtk.RESPONSE_CANCEL: + elif response == branch_version( + 'gtk.RESPONSE_CANCEL', 'gtk.ResponseType.CANCEL'): pass dialog.destroy() return filename def on_namespace_prefix_entry_changed(self, widget, data=None): - entry = self.ui_obj_dict['namespace_prefix_entry'] + #entry = self.ui_obj_dict['namespace_prefix_entry'] checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton'] checkbutton.set_active(False) return True def on_empty_namespace_prefix_checkbutton_toggled(self, widget, data=None): entry = self.ui_obj_dict['namespace_prefix_entry'] - checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton'] + #checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton'] if widget.get_active(): entry.set_text('') return True @@ -708,7 +901,7 @@ class GeneratedsGui(object): entry = self.ui_obj_dict['superclass_module_entry'] superclass_entry = self.ui_obj_dict['output_superclass_entry'] #checkbutton = self.auto_super_checkbutton - checkbutton = widget + #checkbutton = widget if widget.get_active(): path = superclass_entry.get_text() if path: @@ -718,7 +911,7 @@ class GeneratedsGui(object): return True def on_ok_button_activate(self, widget, data=None): - #print '(GeneratedsGui) widget:', widget + #print( '(GeneratedsGui) widget:', widget) response = self.content_dialog.on_ok_button_activate( self.content_dialog, data) return response @@ -729,12 +922,17 @@ class GeneratedsGui(object): # name of the button and the name of the related entry, # for example, xxx_yyy_entry : xxx_yyy_clear_button. def on_clear_button_clicked(self, widget, data=None): - name = widget.get_name() + # http://python.6.x6.nabble.com/Confused-about-a-widget-s-name-td5015372.html + name = ( + widget.get_name() + if sys.version_info.major == 2 + else gtk.Buildable.get_name(widget)) mo = GeneratedsGui.name_pat1.search(name) - stem = mo.group(1) - name1 = '%s_entry' % (stem, ) - ui_obj = self.ui_obj_dict[name1] - ui_obj.set_text('') + if mo is not None: + stem = mo.group(1) + name1 = '%s_entry' % (stem, ) + ui_obj = self.ui_obj_dict[name1] + ui_obj.set_text('') # Run main application window def main(self): @@ -747,16 +945,18 @@ class ContentDialog(gtk.Dialog): global Builder self.content_dialog = Builder.get_object('content_dialog') self.content_textview = Builder.get_object('content_textview') - buf = self.content_textview.get_buffer().set_text('') + self.content_textview.get_buffer().set_text('') def show(self, content): #Builder.connect_signals(self) + if isinstance(content, bytes): + content = content.decode('utf-8') self.content_textview.get_buffer().set_text(content) - response = self.content_dialog.run() + self.content_dialog.run() self.content_dialog.hide() def on_ok_button_activate(self, widget, data=None): - #print '(content_dialog) widget:', widget + #print( '(content_dialog) widget:', widget) return False @@ -764,12 +964,24 @@ class ContentDialog(gtk.Dialog): # Functions for internal use # +def branch_version(for_2, for_3): + """ + The Branch works depends on the version of Python + """ + if sys.version_info.major == 2: + return eval(for_2) + elif sys.version_info.major == 3: + return eval(for_3) + else: + return eval(for_3) + + def capture_options(options): config_parser = ConfigParser() config_parser.read([ os.path.expanduser('~/.generateds_gui.ini'), './generateds_gui.ini', - ]) + ]) section = 'general' names = ('exec-path', 'exec_path') capture_1_option(options, config_parser, section, names) @@ -783,12 +995,14 @@ def capture_options(options): if options.exec_path is None: options.exec_path = 'generateDS.py' + def capture_1_option(options, config_parser, section, names): - if (getattr(options, names[1]) is None and - config_parser.has_option(section, names[0]) - ): + if ( + getattr(options, names[1]) is None and + config_parser.has_option(section, names[0])): setattr(options, names[1], config_parser.get(section, names[0])) + def capture_ui_names(): items = generateds_gui_session.sessionType.member_data_items_ for item in items: @@ -809,9 +1023,10 @@ def capture_ui_names(): USAGE_TEXT = """ - python %prog [options] <somefile.xxx> + python %prog [options] --session=<some_session_file.session> example: - python %prog somefile.xxx""" + python %prog --session=generator01.session""" + def usage(parser): parser.print_help() @@ -820,30 +1035,41 @@ def usage(parser): def main(): parser = OptionParser(USAGE_TEXT) - parser.add_option("--exec-path", + parser.add_option( + "--exec-path", type="string", action="store", dest="exec_path", #default="generateDS.py", - help='path to executable generated in command line.' + help=( + 'path to executable generated in command line.' ' Example: "python /path/to/generateDS.py".' ' Default: "./generateDS.py".' - ' Use Tools/Generate CL (Ctrl-T) to see it.' - ) - parser.add_option("--impl-gui", + ' Use Tools/Generate CL (Ctrl-T) to see it.') + ) + parser.add_option( + "--impl-gui", type="string", action="store", dest="impl_gui", help="name of glade file that defines the GUI if not embedded." - ) - parser.add_option("-s", "--session", + ) + parser.add_option( + "-s", "--session", type="string", action="store", dest="session", help="name of a session file to be loaded." - ) + ) (options, args) = parser.parse_args() capture_options(options) capture_ui_names() if len(args) > 0: usage(parser) + # Set up for internationalization. + app_name = 'generateds_gui' + dir_name = 'locale' + locale.setlocale(locale.LC_ALL, '') + gettext.bindtextdomain(app_name, dir_name) + gettext.textdomain(app_name) + # Start the app. editor = GeneratedsGui(options) editor.main() @@ -851,94 +1077,189 @@ def main(): ## UI_SPECIFICATION ## Ui_spec = """ - -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> + <requires lib="gtk+" version="3.0"/> + <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkDialog" id="content_dialog"> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="title" translatable="yes">Messages and Content</property> + <property name="default_width">800</property> + <property name="default_height">600</property> + <property name="type_hint">normal</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="content_dialog_ok_button"> + <property name="label" translatable="yes">OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="activate" handler="on_ok_button_activate" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="min_content_width">250</property> + <property name="min_content_height">500</property> + <child> + <object class="GtkTextView" id="content_textview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">content_dialog_ok_button</action-widget> + </action-widgets> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save-as</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-open</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-clear</property> + </object> <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> <accel-groups> <group name="accelgroup1"/> </accel-groups> - <signal name="delete_event" handler="on_window_delete_event"/> + <signal name="delete-event" handler="on_window_delete_event" swapped="no"/> <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="menuitem1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_File</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="clear_menuitem"> <property name="label">Clear</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="image">image4</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/> <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_clear_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="open_session_menuitem"> <property name="label">_Load session</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Load a previous saved session.</property> <property name="use_underline">True</property> <property name="image">image3</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/> <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_open_session_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="save_session_menuitem"> <property name="label">_Save session</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Save the current session.</property> <property name="use_underline">True</property> <property name="image">image1</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/> <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_save_session_menuitem_activate"/> </object> </child> <child> <object class="GtkImageMenuItem" id="save_session_as_menuitem"> <property name="label">Save session as ...</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Save the current session in file chosen by the user.</property> <property name="image">image2</property> <property name="use_stock">False</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_save_session_as_menuitem_activate"/> + <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/> </object> </child> <child> <object class="GtkSeparatorMenuItem" id="menuitem5"> <property name="visible">True</property> + <property name="can_focus">False</property> </object> </child> <child> <object class="GtkImageMenuItem" id="imagemenuitem5"> <property name="label">gtk-quit</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Exit from the application.</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_quit_menu_item_activate"/> + <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/> </object> </child> </object> @@ -948,30 +1269,34 @@ file chosen by the user.</property> <child> <object class="GtkMenuItem" id="menuitem2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Tools</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu2"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkMenuItem" id="capture_cl_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Capture the command line that would be used to generate the bindings modules.</property> <property name="label" translatable="yes">_Capture CL</property> <property name="use_underline">True</property> + <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/> <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_capture_cl_menuitem_activate"/> </object> </child> <child> <object class="GtkMenuItem" id="generate_menuitem"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> <property name="label" translatable="yes">_Generate</property> <property name="use_underline">True</property> + <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/> <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_generate_menuitem_activate"/> </object> </child> </object> @@ -981,19 +1306,22 @@ to generate the bindings modules.</property> <child> <object class="GtkMenuItem" id="menuitem4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">_Help</property> <property name="use_underline">True</property> <child type="submenu"> <object class="GtkMenu" id="menu3"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImageMenuItem" id="imagemenuitem10"> <property name="label">gtk-about</property> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">True</property> <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_about_menu_item_activate"/> + <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/> </object> </child> </object> @@ -1003,1018 +1331,1384 @@ to generate the bindings modules.</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkTable" id="table1"> + <object class="GtkScrolledWindow" id="scrolledwindow2"> <property name="visible">True</property> - <property name="n_rows">22</property> - <property name="n_columns">4</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Input schema file:</property> - </object> - </child> - <child> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output superclass file:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output subclass file:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Overwrite without asking:</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <property name="min_content_width">1000</property> + <property name="min_content_height">600</property> <child> - <object class="GtkCheckButton" id="force_checkbutton"> - <property name="label" translatable="yes">Force</property> + <object class="GtkViewport" id="viewport1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Always overwrite output files. + <property name="can_focus">False</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">29</property> + <property name="n_columns">4</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Input schema file:</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output superclass file:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output subclass file:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Overwrite without asking:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="force_checkbutton"> + <property name="label" translatable="yes">Force</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Always overwrite output files. Do not ask for confirmation.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="input_schema_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="input_schema_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the input XML schema defining the bindings to be generated.</property> - <property name="invisible_char">●</property> - <property name="width_chars">80</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_superclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file + <property name="invisible_char">â—</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_superclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the output file to be generated and to contain the superclasses.</property> - <property name="invisible_char">●</property> - <signal name="changed" handler="on_output_superclass_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_subclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file + <property name="invisible_char">â—</property> + <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_subclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">The path and name of the output file to be generated and to contain the subclasses.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Prefix (for class names):</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Prefix for class names.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label6"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace prefix:</property> - </object> - <packing> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> - <property name="tooltip_text" translatable="yes">Override default namespace + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Prefix (for class names):</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Prefix for class names.</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Namespace prefix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="tooltip_text" translatable="yes">Override default namespace prefix in schema file. Example: -a "xsd:" Default: "xs:".</property> - <property name="invisible_char">●</property> - <signal name="changed" handler="on_namespace_prefix_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Behavior file name:</property> - </object> - <packing> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="behavior_filename_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Input file name for behaviors + <property name="invisible_char">â—</property> + <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Behavior file name:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="behavior_filename_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Input file name for behaviors added to subclasses.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label8"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Generate Python properties:</property> - </object> - <packing> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="properties_checkbutton"> - <property name="label" translatable="yes">Properties</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Generate Python properties for member variables + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Generate Python properties:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="properties_checkbutton"> + <property name="label" translatable="yes">Properties</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Generate Python properties for member variables so that the value can be retrieved and modified without calling getter and setter functions. </property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label10"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Subclass suffix:</property> - </object> - <packing> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="subclass_suffix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names. + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Subclass suffix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="subclass_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names. Default="Sub".</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label11"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Root element:</property> - </object> - <packing> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="root_element_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Assume that this value is the name + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Root element:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="root_element_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Assume that this value is the name of the root element of instance docs. Default is first element defined in schema.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the input schema file.</property> - <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property> - <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property> - <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the nput file name for + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the input schema file.</property> + <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property> + <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property> + <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the nput file name for behaviors added to subclasses.</property> - <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label12"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Superclass module:</property> - </object> - <packing> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="superclass_module_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Superclass module name in subclass module. + <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Superclass module:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="superclass_module_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Superclass module name in subclass module. Default="???".</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label13"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Use old getters and setters:</property> - </object> - <packing> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> - <property name="label" translatable="yes">Old getters and setters</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(), + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Use old getters and setters:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> + <property name="label" translatable="yes">Old getters and setters</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(), instead of get_var() and set_var().</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label14"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Validator bodies path:</property> - </object> - <packing> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">User methods module:</property> - </object> - <packing> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label16"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No dates:</property> - </object> - <packing> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label17"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No versions:</property> - </object> - <packing> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_dates_checkbutton"> - <property name="label" translatable="yes">No dates in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current date in the generated + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Validator bodies path:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">User methods module:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No dates:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No versions:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_dates_checkbutton"> + <property name="label" translatable="yes">No dates in generated output</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not include the current date in the generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="validator_bodies_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="validator_bodies_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide bodies (implementations) of validator methods.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide bodies (implementations) of validator methods.</property> - <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_versions_checkbutton"> - <property name="label" translatable="yes">No version info in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current version in the generated + <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_versions_checkbutton"> + <property name="label" translatable="yes">No version info in generated output</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not include the current version in the generated files. This is useful if you want to minimize the amount of (no-operation) changes to the generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods. See + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods. See section "User Methods" in the documentation.</property> - <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="user_methods_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Optional module containing user methods. See + <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="user_methods_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Optional module containing user methods. See section "User Methods" in the documentation.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label18"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No process includes:</property> - </object> - <packing> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label19"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Silence:</property> - </object> - <packing> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_process_includes_checkbutton"> - <property name="label" translatable="yes">Do not process includes in schema</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not process included XML Schema files. By + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">No process includes:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Silence:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_process_includes_checkbutton"> + <property name="label" translatable="yes">Do not process includes in schema</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Do not process included XML Schema files. By default, generateDS.py will insert content from files referenced by <include ... /> elements into the XML Schema to be processed.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="silence_checkbutton"> - <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="silence_checkbutton"> + <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS echoes the information being parsed. Use this option to turn off that behavior. </property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label20"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace definitions:</property> - </object> - <packing> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label21"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">External encoding:</property> - </object> - <packing> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label22"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Member specs:</property> - </object> - <packing> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_defs_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Namespace definitions:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">External encoding:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Member specs:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_defs_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the value for the namespacedef_ parameter of the export() method by the generated parse() and parseString() functions. Default=''. Example: xmlns:abc="http://www.abc.com"</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="external_encoding_entry"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Encode output written by the generated export + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="external_encoding_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Encode output written by the generated export methods using this encoding. Default, if omitted, is the value returned by sys.getdefaultencoding(). Example: utf-8.</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="member_specs_combobox_container"> - <property name="visible">True</property> - <child> - <placeholder/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="member_specs_combobox_container"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> + <property name="label" translatable="yes">Empty</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Assume an empty namespace +prefix in the XML schema, not +the default ("xs:").</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_super_checkbutton"> + <property name="label" translatable="yes">Auto</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Use the superclass file name +stem as the super-class module +name.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkButton" id="subclass_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkButton" id="root_element_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the root element entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="superclass_module_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_defs_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkButton" id="external_encoding_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Get encoded:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="get_encoded_checkbutton"> + <property name="label" translatable="yes">Getters return encoded values by default</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Getters return encoded value by default if true. +Can be changed at run-time by either +(1) changing global variable GetEncodedValue or +(2) using optional parameter to getter.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Exports:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="export_spec_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Specifies export functions to be generated. Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)). Example: "write etree". Default: "write".</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">One file per XSD:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton"> + <property name="label" translatable="yes">Create a python module for each XSD processed.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Create a python module for each XSD processed.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Output directory:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_directory_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Used in conjunction with --one-file-per-xsd. The directory where the modules will be created.</property> + <property name="invisible_char">â—</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_chooser_button"> + <property name="label" translatable="yes">Choose</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the output directory for one-file-per-xsd.</property> + <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the output directory entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="export_spec_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the exports entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Module suffix:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Preserve CData tags:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Cleanup name list:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="module_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">To be used in conjunction with --one-file-per-xsd. Append XXX to the end of each file created.</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="cleanup_name_list_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Specifies list of 2-tuples used for cleaning names. First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]". Default: "[('[-:.]', '_')]".</property> + <property name="invisible_char">â—</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton"> + <property name="label" translatable="yes">Preserve CData tags</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Preserve CDATA tags. Default: False.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkButton" id="module_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the module suffix entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cleanup_name_list_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Clear the cleanup name list entry.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> </child> </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> - <property name="label" translatable="yes">Empty</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Assume an empty namespace -prefix in the XML schema, not -the default ("xs:").</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="auto_super_checkbutton"> - <property name="label" translatable="yes">Auto</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Use the superclass file name -stem as the super-class module -name.</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkButton" id="subclass_suffix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkButton" id="root_element_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the root element entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="superclass_module_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_defs_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkButton" id="external_encoding_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="homogeneous">True</property> <child> <object class="GtkButton" id="generate_button"> @@ -2023,9 +2717,11 @@ name.</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> - <signal name="clicked" handler="on_generate_button_clicked"/> + <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> @@ -2036,24 +2732,30 @@ name.</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="tooltip_text" translatable="yes">Exit from the application.</property> - <signal name="clicked" handler="on_quit_button_clicked"/> + <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">2</property> </packing> </child> <child> <object class="GtkStatusbar" id="statusbar1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="spacing">2</property> </object> <packing> <property name="expand">False</property> + <property name="fill">True</property> <property name="position">3</property> </packing> </child> @@ -2063,86 +2765,9 @@ name.</property> </object> </child> </object> - <object class="GtkAccelGroup" id="accelgroup1"/> - <object class="GtkDialog" id="content_dialog"> - <property name="border_width">5</property> - <property name="title" translatable="yes">Messages and Content</property> - <property name="default_width">800</property> - <property name="default_height">600</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox3"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">2</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <object class="GtkTextView" id="content_textview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area3"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="content_dialog_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="activate" handler="on_ok_button_activate"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="0">content_dialog_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-save</property> - </object> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-save-as</property> - </object> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="stock">gtk-clear</property> - </object> <object class="GtkImage" id="image5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-missing-image</property> </object> </interface> @@ -2152,7 +2777,5 @@ name.</property> # Do not change the above 3 lines. - if __name__ == "__main__": main() - diff --git a/gui/generateds_gui_rus.glade b/gui/generateds_gui_rus.glade new file mode 100644 index 0000000..153fc4c --- /dev/null +++ b/gui/generateds_gui_rus.glade @@ -0,0 +1,1691 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <requires lib="gtk+" version="3."/> + <object class="GtkAccelGroup" id="accelgroup1"/> + <object class="GtkDialog" id="content_dialog"> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="title" translatable="yes">Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ контент</property> + <property name="default_width">800</property> + <property name="default_height">600</property> + <property name="type_hint">normal</property> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="content_dialog_ok_button"> + <property name="label" translatable="yes">OK</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="activate" handler="on_ok_button_activate" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="min_content_width">250</property> + <property name="min_content_height">500</property> + <child> + <object class="GtkTextView" id="content_textview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">content_dialog_ok_button</action-widget> + </action-widgets> + </object> + <object class="GtkImage" id="image1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save</property> + </object> + <object class="GtkImage" id="image2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-save-as</property> + </object> + <object class="GtkImage" id="image3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-open</property> + </object> + <object class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-clear</property> + </object> + <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> + <accel-groups> + <group name="accelgroup1"/> + </accel-groups> + <signal name="delete-event" handler="on_window_delete_event" swapped="no"/> + <child> + <object class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuBar" id="menubar1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="menuitem1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Файл</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="menu1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkImageMenuItem" id="clear_menuitem"> + <property name="label">Clear</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="image">image4</property> + <property name="use_stock">False</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_clear_menuitem_activate" swapped="no"/> + <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="open_session_menuitem"> + <property name="label">_Load session</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Загрузите предыдущую Ñохраненную ÑеÑÑию.</property> + <property name="use_underline">True</property> + <property name="image">image3</property> + <property name="use_stock">False</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_open_session_menuitem_activate" swapped="no"/> + <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="save_session_menuitem"> + <property name="label">_Save session</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Сохранить текущую ÑеÑÑию.</property> + <property name="use_underline">True</property> + <property name="image">image1</property> + <property name="use_stock">False</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_save_session_menuitem_activate" swapped="no"/> + <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="save_session_as_menuitem"> + <property name="label">Save session as ...</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Сохранить текущую ÑеÑÑию в +файле, выбранном пользователем.</property> + <property name="image">image2</property> + <property name="use_stock">False</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_save_session_as_menuitem_activate" swapped="no"/> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="menuitem5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + </child> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem5"> + <property name="label">gtk-quit</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Выход из приложениÑ.</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_quit_menu_item_activate" swapped="no"/> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="menuitem2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_ИнÑтрументы</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="menu2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkMenuItem" id="capture_cl_menuitem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Получить командную Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользовалаÑÑŒ бы +, чтобы произвеÑти модули (bindings modules).</property> + <property name="label" translatable="yes">_Capture CL</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_capture_cl_menuitem_activate" swapped="no"/> + <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> + <object class="GtkMenuItem" id="generate_menuitem"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Генерировать модули привÑзки.</property> + <property name="label" translatable="yes">_ПроизвеÑти</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_generate_menuitem_activate" swapped="no"/> + <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + </object> + </child> + </object> + </child> + <child> + <object class="GtkMenuItem" id="menuitem4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">_Помощь</property> + <property name="use_underline">True</property> + <child type="submenu"> + <object class="GtkMenu" id="menu3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkImageMenuItem" id="imagemenuitem10"> + <property name="label">gtk-about</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + <property name="accel_group">accelgroup1</property> + <signal name="activate" handler="on_about_menu_item_activate" swapped="no"/> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <property name="min_content_width">1000</property> + <property name="min_content_height">600</property> + <child> + <object class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">29</property> + <property name="n_columns">4</property> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Введите файл Ñхемы:</property> + <property name="xalign">0</property> + </object> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Выходной файл ÑуперклаÑÑа:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Выходной файл подклаÑÑа:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ПерезапиÑÑŒ без вопроÑов:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="force_checkbutton"> + <property name="label" translatable="yes">УÑкоорить</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Ð’Ñегда перезапиÑывать выходные файлы. +без запроÑа подтверждение.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="input_schema_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Путь и название +вводÑÑ‚ XML-Ñхему, определÑющую +привÑзки, которые будут произведены.</property> + <property name="invisible_char">-</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_superclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Путь и название выходного файла +, чтобы быть Ñгенерированными и Ñодержать +ÑуперклаÑÑÑ‹.</property> + <property name="invisible_char">-</property> + <signal name="changed" handler="on_output_superclass_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_subclass_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Путь и название выходного файла +, чтобы быть Ñгенерированными и Ñодержать +подклаÑÑÑ‹.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ð¹ клаÑÑов):</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ð¹ клаÑÑов.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¾ÑтранÑтва имен:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_prefix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> + <property name="tooltip_text" translatable="yes">Переопределите проÑтранÑтво имен по умолчанию +Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² файле Ñхемы. Пример +:-a "xsd": Значение по умолчанию +: "xs":.</property> + <property name="invisible_char">-</property> + <signal name="changed" handler="on_namespace_prefix_entry_changed" swapped="no"/> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° поведениÑ:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="behavior_filename_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ð¹ +добавлемых к подклаÑÑам.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Генерировать ÑвойÑтва Python:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="properties_checkbutton"> + <property name="label" translatable="yes">СвойÑтва</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Генерировать ÑвойÑтва Python Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…-членов +так, чтобы значение могло быть воÑÑтановлено и изменено +, не Ð½Ð°Ð·Ñ‹Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ getter и setter.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">7</property> + <property name="bottom_attach">8</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑа:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="subclass_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Дополнительный текÑÑ‚ к Ñгенерированными подназваниÑм клаÑÑов. Значение по умолчанию += "Sub".</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ðлемент корнÑ:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="root_element_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Предположите, что Ñто значение - Ð¸Ð¼Ñ +Ñлемента ÐºÐ¾Ñ€Ð½Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° +, Значение по умолчанию - первый Ñлемент, определенный в Ñхеме.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите входной файл Ñхемы.</property> + <signal name="clicked" handler="on_input_schema_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите выходной файл привÑзки ÑуперклаÑÑа.</property> + <signal name="clicked" handler="on_output_superclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите выходной файл привÑзки подклаÑÑа.</property> + <signal name="clicked" handler="on_output_subclass_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Choose the nput file name for +behaviors added to subclasses.</property> + <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Модуль ÑуперклаÑÑа:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="superclass_module_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑуперклаÑÑа в модуле подклаÑÑа. Значение по умолчанию += "???".</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ИÑпользовать Ñтарые getter и setter:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> + <property name="label" translatable="yes">Старые getter и setter</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Ðазывать getter и setter getVar () и setVar (), +вмеÑто get_var () и set_var ().</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">12</property> + <property name="bottom_attach">13</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Путь корпуÑов контрольного уÑтройÑтва:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ПользовательÑкий модуль методов:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ðикакие даты:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ðикакие верÑии:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_dates_checkbutton"> + <property name="label" translatable="yes">Ðикакие даты в произведенном выводе</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Ðе включать текущую дату в произведенные +файлы. Ðто полезно, еÑли Ð’Ñ‹ хотите минимизировать +, количеÑтво изменений (no-operation) +в Ñгенрированном коде питона.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">15</property> + <property name="bottom_attach">16</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="validator_bodies_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Путь к каталогу, Ñодержащему файлы, которые обеÑпечивают +корпуÑа (внедрениÑ) методов контрольного уÑтройÑтва.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите путь к каталогу, Ñодержащему файлы, которые обеÑпечивают +органы (реализации) методов проверки.</property> + <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_versions_checkbutton"> + <property name="label" translatable="yes">ÐÐ¸ÐºÐ°ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ верÑии в произведенном выводе</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Ðе включайть текущую верÑию в произведенные +файлы. Ðто полезно, еÑли Ð’Ñ‹ хотите минимизировать +, количеÑтво изменений (no-operationÑ‚) +в Ñгенрированном коде питона.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">16</property> + <property name="bottom_attach">17</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите дополнительный модуль, Ñодержащий пользовательÑкие методы. См. +Ñекцию "User Methods" в документации.</property> + <signal name="clicked" handler="on_user_methods_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="user_methods_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Дополнительный модуль, Ñодержащий пользовательÑкие методы. См. +Ñекцию "ПользовательÑкие Методы" в документации.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label18"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ðикакой процеÑÑ Ð½Ðµ включает:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label19"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Тишина:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="no_process_includes_checkbutton"> + <property name="label" translatable="yes">Ðе обрабатывать Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Ñхему</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Ðе обрабатывать включенные файлы XML-Ñхемы. +Значением по умолчанию generateDS.py вÑтавит контент +от файлов, на которые ÑÑылаютÑÑ &lt;включают.../&gt; +Ñлементы в XML-Ñхемы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ обработана.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">17</property> + <property name="bottom_attach">18</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="silence_checkbutton"> + <property name="label" translatable="yes">Генерировать код, который не повторÑет разобранный XML</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Обычно, код, произведенный Ñ generateDS +, повторÑет разбираемую информацию. ИÑпользуйте +Ñта опциÑ, чтобы выключить Ñто поведение.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">18</property> + <property name="bottom_attach">19</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label20"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑтранÑтва имен:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label21"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Внешнее кодировка:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Спецификации членов:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="namespace_defs_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Определение проÑтранÑтва имен, которое будет передано в как +, оценивает за namespacedef_ параметр +ÑкÑпорт () метод Ñгенерированными разбором +() и parseString () функции. Значение по умолчанию += ''. Пример: +xmlns:abc = "http://www.abc.com"</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="external_encoding_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">Закодируйте вывод, полученый Ñгенерированными ÑкÑпортом +методы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто кодирование. Значение по умолчанию, еÑли опущено, +ÑвлÑетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼, возвращенным sys.getdefaultencoding (). Пример +: utf-8.</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="member_specs_combobox_container"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder></placeholder> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">22</property> + <property name="bottom_attach">23</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> + <property name="label" translatable="yes">Свободный</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">ПуÑтое проÑтранÑтво имен +Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² XML-Ñхеме, не +значение по умолчанию ("xs":).</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_super_checkbutton"> + <property name="label" translatable="yes">ÐвтоматичеÑки</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">ИÑпользуйте Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° ÑуперклаÑÑа +как оÑнова имени Ð¼Ð¾Ð´ÑƒÐ»Ñ +ÑуперклаÑÑа.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_auto_super_checkbutton_toggled" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="input_schema_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле входного файла Ñхемы.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_superclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле выходного файла ÑуперклаÑÑа.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_subclass_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле выходного файла подклаÑÑа.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле префикÑа.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_prefix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле префикÑа проÑтранÑтва имен XML.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + </packing> + </child> + <child> + <object class="GtkButton" id="behavior_filename_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле имени файла поведениÑ.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">6</property> + <property name="bottom_attach">7</property> + </packing> + </child> + <child> + <object class="GtkButton" id="subclass_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑа.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">9</property> + <property name="bottom_attach">10</property> + </packing> + </child> + <child> + <object class="GtkButton" id="root_element_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле Ñлемента корнÑ.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">10</property> + <property name="bottom_attach">11</property> + </packing> + </child> + <child> + <object class="GtkButton" id="superclass_module_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑуперклаÑÑа.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">11</property> + <property name="bottom_attach">12</property> + </packing> + </child> + <child> + <object class="GtkButton" id="validator_bodies_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле пути контрольных методов.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">13</property> + <property name="bottom_attach">14</property> + </packing> + </child> + <child> + <object class="GtkButton" id="user_methods_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле пользовательÑкого Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð².</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">14</property> + <property name="bottom_attach">15</property> + </packing> + </child> + <child> + <object class="GtkButton" id="namespace_defs_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле определений проÑтранÑтва имен.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">19</property> + <property name="bottom_attach">20</property> + </packing> + </child> + <child> + <object class="GtkButton" id="external_encoding_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле внешней кодировки.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">20</property> + <property name="bottom_attach">21</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Получить в кодировке:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="get_encoded_checkbutton"> + <property name="label" translatable="yes">getter(Ñ‹) возвращают закодированные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">getter(Ñ‹)возвращают закодированное значение по умолчанию еÑли иÑтина. +Может быть изменен во времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ +(1) Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ GetEncodedValue или +(2) иÑпользовать дополнительный параметр getter</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">21</property> + <property name="bottom_attach">22</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label24"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ÐкÑпорт:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="export_spec_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">ОпределÑет ÑкÑпортные функции, которые будут произведены. Значение - отделенный ÑпиÑок Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñледующего: "write" (запиÑать XML файл), "literal" (запиÑать код питона), "etree" (Ñоздают дерево Ñлемента (может преобразовать в поÑледовательную форму к XML)). Пример: "write etree". Значение по умолчанию: "write".</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label25"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Один файл XSD:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="one_file_per_xsd_checkbutton"> + <property name="label" translatable="yes">Создавать модуль питона Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обработанного XSD.</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Создавать модуль питона Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обработанного XSD.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">24</property> + <property name="bottom_attach">25</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label26"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Каталог Output:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="output_directory_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">ИÑпользуемый вмеÑте Ñ --one-file-per-xsd. Каталог, где будут Ñозданы модули.</property> + <property name="invisible_char">-</property> + <property name="width_chars">80</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_chooser_button"> + <property name="label" translatable="yes">Выбрать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выберите выходной каталог Ð´Ð»Ñ one-file-per-xsd.</property> + <signal name="clicked" handler="on_output_directory_chooser_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="output_directory_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле выходного каталога .</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">25</property> + <property name="bottom_attach">26</property> + </packing> + </child> + <child> + <object class="GtkButton" id="export_spec_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле ÑкÑпорт.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">23</property> + <property name="bottom_attach">24</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label27"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð¼Ð¾Ð´ÑƒÐ»Ñ</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label28"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Сохранить теги CData:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label29"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">СпиÑок имени очиÑтки:</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="module_suffix_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">ИÑпользоватьÑÑ Ð²Ð¼ÐµÑте Ñ --one-file-per-xsd. Добавить XXX в конец каждого Ñозданного файла.</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="cleanup_name_list_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">ОпределÑет ÑпиÑок 2 кортежей, иÑпользуемых Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки имен. Первый Ñлемент - образец поиÑка регулÑрного выражениÑ, и второй замена. Пример: "[(' [-:]'. '_ '), ('^ __ ', 'ОÑобенный')]". Значение по умолчанию: "[(' [-:]'.', _ ')]".</property> + <property name="invisible_char">-</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="preserve_cdata_tags_checkbutton"> + <property name="label" translatable="yes">Сохранить теги CData</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Сохранить теги CDATA. Значение по умолчанию: False.</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">27</property> + <property name="bottom_attach">28</property> + </packing> + </child> + <child> + <object class="GtkButton" id="module_suffix_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле ÑуффикÑа модулÑ.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">26</property> + <property name="bottom_attach">27</property> + </packing> + </child> + <child> + <object class="GtkButton" id="cleanup_name_list_clear_button"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">ОчиÑтить поле ÑпиÑка имени очиÑтки.</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_clear_button_clicked" swapped="no"/> + </object> + <packing> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="top_attach">28</property> + <property name="bottom_attach">29</property> + </packing> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + <child> + <placeholder></placeholder> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkButton" id="generate_button"> + <property name="label" translatable="yes">Генерировать</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Генерировать модули привÑзки.</property> + <signal name="clicked" handler="on_generate_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="quit_button"> + <property name="label" translatable="yes">Выход</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="tooltip_text" translatable="yes">Выход из приложениÑ.</property> + <signal name="clicked" handler="on_quit_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkStatusbar" id="statusbar1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">3</property> + </packing> + </child> + <child> + <placeholder></placeholder> + </child> + </object> + </child> + </object> + <object class="GtkImage" id="image5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-missing-image</property> + </object> +</interface> diff --git a/gui/generateds_gui_session.py b/gui/generateds_gui_session.py index 6280722..1d11fb4 100644 --- a/gui/generateds_gui_session.py +++ b/gui/generateds_gui_session.py @@ -1,64 +1,45 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # -# Generated Wed Dec 8 14:24:46 2010 by generateDS.py version 2.3a. +# Generated Fri Apr 8 12:08:30 2016 by generateDS.py version 2.21a. +# +# Command line options: +# ('-f', '') +# ('-o', 'generateds_gui_session.py') +# ('--member-specs', 'list') +# +# Command line arguments: +# generateds_gui_session.xsd +# +# Command line: +# ../generateDS.py -f -o "generateds_gui_session.py" --member-specs="list" generateds_gui_session.xsd +# +# Current working directory (os.getcwd()): +# gui # import sys -import getopt import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +from lxml import etree as etree_ -etree_ = None -Verbose_import_ = False -( XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree - ) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError("Failed to import ElementTree from any known place") - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -70,23 +51,321 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + 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 '%f' % input_data + 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 + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() def gds_str_lower(self, instring): return instring.lower() - - + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + + def getSubclassFromModule_(module, class_): + '''Get the subclass of a class from a specific module.''' + name = class_.__name__ + 'Sub' + if hasattr(module, name): + return getattr(module, name) + else: + return None + # # If you have installed IPython you can uncomment and use the following. @@ -109,29 +388,52 @@ except ImportError, exp: ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') -STRING_CLEANUP_PAT = re_.compile(r"[\n\r\s]+") +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): - for idx in range(level): - outfile.write(' ') + +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, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 + def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -144,6 +446,7 @@ def quote_attrib(inStr): s1 = '"%s"' % s1 return s1 + def quote_python(inStr): s1 = inStr if s1.find("'") == -1: @@ -171,14 +474,26 @@ def get_all_text_(node): return text +def find_attr_value_(attr_name, node): + attrs = node.attrib + attr_parts = attr_name.split(':') + value = None + if len(attr_parts) == 1: + value = attrs.get(attr_name) + elif len(attr_parts) == 2: + prefix, name = attr_parts + namespace = node.nsmap.get(prefix) + if namespace is not None: + value = attrs.get('{%s}%s' % (namespace, name, )) + return value + + class GDSParseError(Exception): pass + def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -197,6 +512,7 @@ class MixedContainer: TypeDecimal = 5 TypeDouble = 6 TypeBoolean = 7 + TypeBase64 = 8 def __init__(self, category, content_type, name, value): self.category = category self.content_type = content_type @@ -210,39 +526,82 @@ class MixedContainer: return self.value def getName(self): return self.name - def export(self, outfile, level, name, namespace): + 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(): + 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) + self.value.export(outfile, level, namespace, name, pretty_print) def exportSimple(self, outfile, level, name): if self.content_type == MixedContainer.TypeString: - outfile.write('<%s>%s</%s>' % (self.name, self.value, self.name)) + 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)) + 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)) + 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)) + 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)) + 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)) + 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,)) + 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') @@ -268,6 +627,7 @@ class MemberSpec_(object): def set_container(self, container): self.container = container def get_container(self): return self.container + def _cast(typ, value): if typ is None or value is None: return value @@ -282,59 +642,71 @@ class SessionTypeMixin(object): """Produce a copy of myself. """ new_session = sessionType( - input_schema = self.input_schema, - output_superclass = self.output_superclass, - output_subclass = self.output_subclass, - force = self.force, - prefix = self.prefix, - namespace_prefix = self.namespace_prefix, - empty_namespace_prefix = self.empty_namespace_prefix, - behavior_filename = self.behavior_filename, - properties = self.properties, - subclass_suffix = self.subclass_suffix, - root_element = self.root_element, - superclass_module = self.superclass_module, - auto_super = self.auto_super, - old_getters_setters = self.old_getters_setters, - validator_bodies = self.validator_bodies, - user_methods = self.user_methods, - no_dates = self.no_dates, - no_versions = self.no_versions, - no_process_includes = self.no_process_includes, - silence = self.silence, - namespace_defs = self.namespace_defs, - external_encoding = self.external_encoding, - member_specs = self.member_specs, - ) + input_schema=self.input_schema, + output_superclass=self.output_superclass, + output_subclass=self.output_subclass, + force=self.force, + prefix=self.prefix, + namespace_prefix=self.namespace_prefix, + empty_namespace_prefix=self.empty_namespace_prefix, + behavior_filename=self.behavior_filename, + properties=self.properties, + subclass_suffix=self.subclass_suffix, + root_element=self.root_element, + superclass_module=self.superclass_module, + auto_super=self.auto_super, + old_getters_setters=self.old_getters_setters, + validator_bodies=self.validator_bodies, + user_methods=self.user_methods, + no_dates=self.no_dates, + no_versions=self.no_versions, + no_process_includes=self.no_process_includes, + silence=self.silence, + namespace_defs=self.namespace_defs, + external_encoding=self.external_encoding, + member_specs=self.member_specs, + export_spec=self.export_spec, + one_file_per_xsd=self.one_file_per_xsd, + output_directory=self.output_directory, + module_suffix=self.module_suffix, + preserve_cdata_tags=self.preserve_cdata_tags, + cleanup_name_list=self.cleanup_name_list, + ) return new_session def __eq__(self, obj): """Implement the == operator. """ if ( - obj.input_schema == self.input_schema and - obj.output_superclass == self.output_superclass and - obj.output_subclass == self.output_subclass and - obj.force == self.force and - obj.prefix == self.prefix and - obj.namespace_prefix == self.namespace_prefix and - obj.empty_namespace_prefix == self.empty_namespace_prefix and - obj.behavior_filename == self.behavior_filename and - obj.properties == self.properties and - obj.subclass_suffix == self.subclass_suffix and - obj.root_element == self.root_element and - obj.superclass_module == self.superclass_module and - obj.auto_super == self.auto_super and - obj.old_getters_setters == self.old_getters_setters and - obj.validator_bodies == self.validator_bodies and - obj.user_methods == self.user_methods and - obj.no_dates == self.no_dates and - obj.no_versions == self.no_versions and - obj.no_process_includes == self.no_process_includes and - obj.silence == self.silence and - obj.namespace_defs == self.namespace_defs and - obj.external_encoding == self.external_encoding and - obj.member_specs == self.member_specs): + obj.input_schema == self.input_schema and + obj.output_superclass == self.output_superclass and + obj.output_subclass == self.output_subclass and + obj.force == self.force and + obj.prefix == self.prefix and + obj.namespace_prefix == self.namespace_prefix and + obj.empty_namespace_prefix == self.empty_namespace_prefix and + obj.behavior_filename == self.behavior_filename and + obj.properties == self.properties and + obj.subclass_suffix == self.subclass_suffix and + obj.root_element == self.root_element and + obj.superclass_module == self.superclass_module and + obj.auto_super == self.auto_super and + obj.old_getters_setters == self.old_getters_setters and + obj.validator_bodies == self.validator_bodies and + obj.user_methods == self.user_methods and + obj.no_dates == self.no_dates and + obj.no_versions == self.no_versions and + obj.no_process_includes == self.no_process_includes and + obj.silence == self.silence and + obj.namespace_defs == self.namespace_defs and + obj.external_encoding == self.external_encoding and + obj.member_specs == self.member_specs and + obj.export_spec == self.export_spec and + obj.one_file_per_xsd == self.one_file_per_xsd and + obj.output_directory == self.output_directory and + obj.module_suffix == self.module_suffix and + obj.preserve_cdata_tags == self.preserve_cdata_tags and + obj.cleanup_name_list == self.cleanup_name_list): return True else: return False @@ -344,10 +716,12 @@ class SessionTypeMixin(object): """ return not self.__eq__(obj) + # # Data representation classes. # + class sessionType(GeneratedsSuper, SessionTypeMixin): member_data_items_ = [ MemberSpec_('input_schema', 'xs:string', 0), @@ -372,11 +746,19 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): MemberSpec_('silence', 'xs:boolean', 0), MemberSpec_('namespace_defs', 'xs:string', 0), MemberSpec_('external_encoding', 'xs:string', 0), + MemberSpec_('get_encoded', 'xs:boolean', 0), MemberSpec_('member_specs', 'xs:string', 0), - ] + MemberSpec_('export_spec', 'xs:string', 0), + MemberSpec_('one_file_per_xsd', 'xs:boolean', 0), + MemberSpec_('output_directory', 'xs:string', 0), + MemberSpec_('module_suffix', 'xs:string', 0), + MemberSpec_('preserve_cdata_tags', 'xs:boolean', 0), + MemberSpec_('cleanup_name_list', 'xs:string', 0), + ] subclass = None superclass = None - def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, member_specs=None): + def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, get_encoded=None, member_specs=None, export_spec=None, one_file_per_xsd=None, output_directory=None, module_suffix=None, preserve_cdata_tags=None, cleanup_name_list=None): + self.original_tagname_ = None self.input_schema = input_schema self.output_superclass = output_superclass self.output_subclass = output_subclass @@ -399,8 +781,20 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): self.silence = silence self.namespace_defs = namespace_defs self.external_encoding = external_encoding + self.get_encoded = get_encoded self.member_specs = member_specs + self.export_spec = export_spec + self.one_file_per_xsd = one_file_per_xsd + self.output_directory = output_directory + self.module_suffix = module_suffix + self.preserve_cdata_tags = preserve_cdata_tags + self.cleanup_name_list = cleanup_name_list def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, sessionType) + if subclass is not None: + return subclass(*args_, **kwargs_) if sessionType.subclass: return sessionType.subclass(*args_, **kwargs_) else: @@ -450,91 +844,22 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): def set_namespace_defs(self, namespace_defs): self.namespace_defs = namespace_defs def get_external_encoding(self): return self.external_encoding def set_external_encoding(self, external_encoding): self.external_encoding = external_encoding + def get_get_encoded(self): return self.get_encoded + def set_get_encoded(self, get_encoded): self.get_encoded = get_encoded def get_member_specs(self): return self.member_specs def set_member_specs(self, member_specs): self.member_specs = member_specs - def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_=''): - showIndent(outfile, level) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - self.exportAttributes(outfile, level, [], namespace_, name_='sessionType') - if self.hasContent_(): - outfile.write('>\n') - self.exportChildren(outfile, level + 1, namespace_, name_) - showIndent(outfile, level) - outfile.write('</%s%s>\n' % (namespace_, name_)) - else: - outfile.write('/>\n') - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='sessionType'): - if self.input_schema is not None: - showIndent(outfile, level) - outfile.write('<%sinput_schema>%s</%sinput_schema>\n' % (namespace_, self.gds_format_string(quote_xml(self.input_schema).encode(ExternalEncoding), input_name='input_schema'), namespace_)) - if self.output_superclass is not None: - showIndent(outfile, level) - outfile.write('<%soutput_superclass>%s</%soutput_superclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_superclass).encode(ExternalEncoding), input_name='output_superclass'), namespace_)) - if self.output_subclass is not None: - showIndent(outfile, level) - outfile.write('<%soutput_subclass>%s</%soutput_subclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_subclass).encode(ExternalEncoding), input_name='output_subclass'), namespace_)) - if self.force is not None: - showIndent(outfile, level) - outfile.write('<%sforce>%s</%sforce>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.force)), input_name='force'), namespace_)) - if self.prefix is not None: - showIndent(outfile, level) - outfile.write('<%sprefix>%s</%sprefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.prefix).encode(ExternalEncoding), input_name='prefix'), namespace_)) - if self.namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_prefix).encode(ExternalEncoding), input_name='namespace_prefix'), namespace_)) - if self.empty_namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.empty_namespace_prefix)), input_name='empty_namespace_prefix'), namespace_)) - if self.behavior_filename is not None: - showIndent(outfile, level) - outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>\n' % (namespace_, self.gds_format_string(quote_xml(self.behavior_filename).encode(ExternalEncoding), input_name='behavior_filename'), namespace_)) - if self.properties is not None: - showIndent(outfile, level) - outfile.write('<%sproperties>%s</%sproperties>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.properties)), input_name='properties'), namespace_)) - if self.subclass_suffix is not None: - showIndent(outfile, level) - outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>\n' % (namespace_, self.gds_format_string(quote_xml(self.subclass_suffix).encode(ExternalEncoding), input_name='subclass_suffix'), namespace_)) - if self.root_element is not None: - showIndent(outfile, level) - outfile.write('<%sroot_element>%s</%sroot_element>\n' % (namespace_, self.gds_format_string(quote_xml(self.root_element).encode(ExternalEncoding), input_name='root_element'), namespace_)) - if self.superclass_module is not None: - showIndent(outfile, level) - outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>\n' % (namespace_, self.gds_format_string(quote_xml(self.superclass_module).encode(ExternalEncoding), input_name='superclass_module'), namespace_)) - if self.auto_super is not None: - showIndent(outfile, level) - outfile.write('<%sauto_super>%s</%sauto_super>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.auto_super)), input_name='auto_super'), namespace_)) - if self.old_getters_setters is not None: - showIndent(outfile, level) - outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.old_getters_setters)), input_name='old_getters_setters'), namespace_)) - if self.validator_bodies is not None: - showIndent(outfile, level) - outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>\n' % (namespace_, self.gds_format_string(quote_xml(self.validator_bodies).encode(ExternalEncoding), input_name='validator_bodies'), namespace_)) - if self.user_methods is not None: - showIndent(outfile, level) - outfile.write('<%suser_methods>%s</%suser_methods>\n' % (namespace_, self.gds_format_string(quote_xml(self.user_methods).encode(ExternalEncoding), input_name='user_methods'), namespace_)) - if self.no_dates is not None: - showIndent(outfile, level) - outfile.write('<%sno_dates>%s</%sno_dates>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_dates)), input_name='no_dates'), namespace_)) - if self.no_versions is not None: - showIndent(outfile, level) - outfile.write('<%sno_versions>%s</%sno_versions>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_versions)), input_name='no_versions'), namespace_)) - if self.no_process_includes is not None: - showIndent(outfile, level) - outfile.write('<%sno_process_includes>%s</%sno_process_includes>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_process_includes)), input_name='no_process_includes'), namespace_)) - if self.silence is not None: - showIndent(outfile, level) - outfile.write('<%ssilence>%s</%ssilence>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.silence)), input_name='silence'), namespace_)) - if self.namespace_defs is not None: - showIndent(outfile, level) - outfile.write('<%snamespace_defs>%s</%snamespace_defs>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_defs).encode(ExternalEncoding), input_name='namespace_defs'), namespace_)) - if self.external_encoding is not None: - showIndent(outfile, level) - outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>\n' % (namespace_, self.gds_format_string(quote_xml(self.external_encoding).encode(ExternalEncoding), input_name='external_encoding'), namespace_)) - if self.member_specs is not None: - showIndent(outfile, level) - outfile.write('<%smember_specs>%s</%smember_specs>\n' % (namespace_, self.gds_format_string(quote_xml(self.member_specs).encode(ExternalEncoding), input_name='member_specs'), namespace_)) + def get_export_spec(self): return self.export_spec + def set_export_spec(self, export_spec): self.export_spec = export_spec + def get_one_file_per_xsd(self): return self.one_file_per_xsd + def set_one_file_per_xsd(self, one_file_per_xsd): self.one_file_per_xsd = one_file_per_xsd + def get_output_directory(self): return self.output_directory + def set_output_directory(self, output_directory): self.output_directory = output_directory + def get_module_suffix(self): return self.module_suffix + def set_module_suffix(self, module_suffix): self.module_suffix = module_suffix + def get_preserve_cdata_tags(self): return self.preserve_cdata_tags + def set_preserve_cdata_tags(self, preserve_cdata_tags): self.preserve_cdata_tags = preserve_cdata_tags + def get_cleanup_name_list(self): return self.cleanup_name_list + def set_cleanup_name_list(self, cleanup_name_list): self.cleanup_name_list = cleanup_name_list def hasContent_(self): if ( self.input_schema is not None or @@ -559,104 +884,154 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): self.silence is not None or self.namespace_defs is not None or self.external_encoding is not None or - self.member_specs is not None - ): + self.get_encoded is not None or + self.member_specs is not None or + self.export_spec is not None or + self.one_file_per_xsd is not None or + self.output_directory is not None or + self.module_suffix is not None or + self.preserve_cdata_tags is not None or + self.cleanup_name_list is not None + ): return True else: return False - def exportLiteral(self, outfile, level, name_='sessionType'): - level += 1 - self.exportLiteralAttributes(outfile, level, name_) + def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='sessionType') if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, name_): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='sessionType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'): pass - def exportLiteralChildren(self, outfile, level, name_): + def exportChildren(self, outfile, level, namespace_='', name_='sessionType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' if self.input_schema is not None: - showIndent(outfile, level) - outfile.write('input_schema=%s,\n' % quote_python(self.input_schema).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%sinput_schema>%s</%sinput_schema>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.input_schema), input_name='input_schema')), namespace_, eol_)) if self.output_superclass is not None: - showIndent(outfile, level) - outfile.write('output_superclass=%s,\n' % quote_python(self.output_superclass).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%soutput_superclass>%s</%soutput_superclass>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_superclass), input_name='output_superclass')), namespace_, eol_)) if self.output_subclass is not None: - showIndent(outfile, level) - outfile.write('output_subclass=%s,\n' % quote_python(self.output_subclass).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%soutput_subclass>%s</%soutput_subclass>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_subclass), input_name='output_subclass')), namespace_, eol_)) if self.force is not None: - showIndent(outfile, level) - outfile.write('force=%s,\n' % self.force) + showIndent(outfile, level, pretty_print) + outfile.write('<%sforce>%s</%sforce>%s' % (namespace_, self.gds_format_boolean(self.force, input_name='force'), namespace_, eol_)) if self.prefix is not None: - showIndent(outfile, level) - outfile.write('prefix=%s,\n' % quote_python(self.prefix).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%sprefix>%s</%sprefix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.prefix), input_name='prefix')), namespace_, eol_)) if self.namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('namespace_prefix=%s,\n' % quote_python(self.namespace_prefix).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.namespace_prefix), input_name='namespace_prefix')), namespace_, eol_)) if self.empty_namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('empty_namespace_prefix=%s,\n' % self.empty_namespace_prefix) + showIndent(outfile, level, pretty_print) + outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>%s' % (namespace_, self.gds_format_boolean(self.empty_namespace_prefix, input_name='empty_namespace_prefix'), namespace_, eol_)) if self.behavior_filename is not None: - showIndent(outfile, level) - outfile.write('behavior_filename=%s,\n' % quote_python(self.behavior_filename).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.behavior_filename), input_name='behavior_filename')), namespace_, eol_)) if self.properties is not None: - showIndent(outfile, level) - outfile.write('properties=%s,\n' % self.properties) + showIndent(outfile, level, pretty_print) + outfile.write('<%sproperties>%s</%sproperties>%s' % (namespace_, self.gds_format_boolean(self.properties, input_name='properties'), namespace_, eol_)) if self.subclass_suffix is not None: - showIndent(outfile, level) - outfile.write('subclass_suffix=%s,\n' % quote_python(self.subclass_suffix).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.subclass_suffix), input_name='subclass_suffix')), namespace_, eol_)) if self.root_element is not None: - showIndent(outfile, level) - outfile.write('root_element=%s,\n' % quote_python(self.root_element).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%sroot_element>%s</%sroot_element>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.root_element), input_name='root_element')), namespace_, eol_)) if self.superclass_module is not None: - showIndent(outfile, level) - outfile.write('superclass_module=%s,\n' % quote_python(self.superclass_module).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.superclass_module), input_name='superclass_module')), namespace_, eol_)) if self.auto_super is not None: - showIndent(outfile, level) - outfile.write('auto_super=%s,\n' % self.auto_super) + showIndent(outfile, level, pretty_print) + outfile.write('<%sauto_super>%s</%sauto_super>%s' % (namespace_, self.gds_format_boolean(self.auto_super, input_name='auto_super'), namespace_, eol_)) if self.old_getters_setters is not None: - showIndent(outfile, level) - outfile.write('old_getters_setters=%s,\n' % self.old_getters_setters) + showIndent(outfile, level, pretty_print) + outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>%s' % (namespace_, self.gds_format_boolean(self.old_getters_setters, input_name='old_getters_setters'), namespace_, eol_)) if self.validator_bodies is not None: - showIndent(outfile, level) - outfile.write('validator_bodies=%s,\n' % quote_python(self.validator_bodies).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.validator_bodies), input_name='validator_bodies')), namespace_, eol_)) if self.user_methods is not None: - showIndent(outfile, level) - outfile.write('user_methods=%s,\n' % quote_python(self.user_methods).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%suser_methods>%s</%suser_methods>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.user_methods), input_name='user_methods')), namespace_, eol_)) if self.no_dates is not None: - showIndent(outfile, level) - outfile.write('no_dates=%s,\n' % self.no_dates) + showIndent(outfile, level, pretty_print) + outfile.write('<%sno_dates>%s</%sno_dates>%s' % (namespace_, self.gds_format_boolean(self.no_dates, input_name='no_dates'), namespace_, eol_)) if self.no_versions is not None: - showIndent(outfile, level) - outfile.write('no_versions=%s,\n' % self.no_versions) + showIndent(outfile, level, pretty_print) + outfile.write('<%sno_versions>%s</%sno_versions>%s' % (namespace_, self.gds_format_boolean(self.no_versions, input_name='no_versions'), namespace_, eol_)) if self.no_process_includes is not None: - showIndent(outfile, level) - outfile.write('no_process_includes=%s,\n' % self.no_process_includes) + showIndent(outfile, level, pretty_print) + outfile.write('<%sno_process_includes>%s</%sno_process_includes>%s' % (namespace_, self.gds_format_boolean(self.no_process_includes, input_name='no_process_includes'), namespace_, eol_)) if self.silence is not None: - showIndent(outfile, level) - outfile.write('silence=%s,\n' % self.silence) + showIndent(outfile, level, pretty_print) + outfile.write('<%ssilence>%s</%ssilence>%s' % (namespace_, self.gds_format_boolean(self.silence, input_name='silence'), namespace_, eol_)) if self.namespace_defs is not None: - showIndent(outfile, level) - outfile.write('namespace_defs=%s,\n' % quote_python(self.namespace_defs).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%snamespace_defs>%s</%snamespace_defs>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.namespace_defs), input_name='namespace_defs')), namespace_, eol_)) if self.external_encoding is not None: - showIndent(outfile, level) - outfile.write('external_encoding=%s,\n' % quote_python(self.external_encoding).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.external_encoding), input_name='external_encoding')), namespace_, eol_)) + if self.get_encoded is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sget_encoded>%s</%sget_encoded>%s' % (namespace_, self.gds_format_boolean(self.get_encoded, input_name='get_encoded'), namespace_, eol_)) if self.member_specs is not None: - showIndent(outfile, level) - outfile.write('member_specs=%s,\n' % quote_python(self.member_specs).encode(ExternalEncoding)) + showIndent(outfile, level, pretty_print) + outfile.write('<%smember_specs>%s</%smember_specs>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.member_specs), input_name='member_specs')), namespace_, eol_)) + if self.export_spec is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sexport_spec>%s</%sexport_spec>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.export_spec), input_name='export_spec')), namespace_, eol_)) + if self.one_file_per_xsd is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sone_file_per_xsd>%s</%sone_file_per_xsd>%s' % (namespace_, self.gds_format_boolean(self.one_file_per_xsd, input_name='one_file_per_xsd'), namespace_, eol_)) + if self.output_directory is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%soutput_directory>%s</%soutput_directory>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.output_directory), input_name='output_directory')), namespace_, eol_)) + if self.module_suffix is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%smodule_suffix>%s</%smodule_suffix>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.module_suffix), input_name='module_suffix')), namespace_, eol_)) + if self.preserve_cdata_tags is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%spreserve_cdata_tags>%s</%spreserve_cdata_tags>%s' % (namespace_, self.gds_format_boolean(self.preserve_cdata_tags, input_name='preserve_cdata_tags'), namespace_, eol_)) + if self.cleanup_name_list is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%scleanup_name_list>%s</%scleanup_name_list>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.cleanup_name_list), input_name='cleanup_name_list')), namespace_, eol_)) def build(self, node): - self.buildAttributes(node, node.attrib, []) + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, nodeName_) + self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass - def buildChildren(self, child_, nodeName_, from_subclass=False): + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'input_schema': input_schema_ = child_.text + input_schema_ = self.gds_validate_string(input_schema_, node, 'input_schema') self.input_schema = input_schema_ elif nodeName_ == 'output_superclass': output_superclass_ = child_.text + output_superclass_ = self.gds_validate_string(output_superclass_, node, 'output_superclass') self.output_superclass = output_superclass_ elif nodeName_ == 'output_subclass': output_subclass_ = child_.text + output_subclass_ = self.gds_validate_string(output_subclass_, node, 'output_subclass') self.output_subclass = output_subclass_ elif nodeName_ == 'force': sval_ = child_.text @@ -666,12 +1041,15 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'force') self.force = ival_ elif nodeName_ == 'prefix': prefix_ = child_.text + prefix_ = self.gds_validate_string(prefix_, node, 'prefix') self.prefix = prefix_ elif nodeName_ == 'namespace_prefix': namespace_prefix_ = child_.text + namespace_prefix_ = self.gds_validate_string(namespace_prefix_, node, 'namespace_prefix') self.namespace_prefix = namespace_prefix_ elif nodeName_ == 'empty_namespace_prefix': sval_ = child_.text @@ -681,9 +1059,11 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'empty_namespace_prefix') self.empty_namespace_prefix = ival_ elif nodeName_ == 'behavior_filename': behavior_filename_ = child_.text + behavior_filename_ = self.gds_validate_string(behavior_filename_, node, 'behavior_filename') self.behavior_filename = behavior_filename_ elif nodeName_ == 'properties': sval_ = child_.text @@ -693,15 +1073,19 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'properties') self.properties = ival_ elif nodeName_ == 'subclass_suffix': subclass_suffix_ = child_.text + subclass_suffix_ = self.gds_validate_string(subclass_suffix_, node, 'subclass_suffix') self.subclass_suffix = subclass_suffix_ elif nodeName_ == 'root_element': root_element_ = child_.text + root_element_ = self.gds_validate_string(root_element_, node, 'root_element') self.root_element = root_element_ elif nodeName_ == 'superclass_module': superclass_module_ = child_.text + superclass_module_ = self.gds_validate_string(superclass_module_, node, 'superclass_module') self.superclass_module = superclass_module_ elif nodeName_ == 'auto_super': sval_ = child_.text @@ -711,6 +1095,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'auto_super') self.auto_super = ival_ elif nodeName_ == 'old_getters_setters': sval_ = child_.text @@ -720,12 +1105,15 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'old_getters_setters') self.old_getters_setters = ival_ elif nodeName_ == 'validator_bodies': validator_bodies_ = child_.text + validator_bodies_ = self.gds_validate_string(validator_bodies_, node, 'validator_bodies') self.validator_bodies = validator_bodies_ elif nodeName_ == 'user_methods': user_methods_ = child_.text + user_methods_ = self.gds_validate_string(user_methods_, node, 'user_methods') self.user_methods = user_methods_ elif nodeName_ == 'no_dates': sval_ = child_.text @@ -735,6 +1123,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'no_dates') self.no_dates = ival_ elif nodeName_ == 'no_versions': sval_ = child_.text @@ -744,6 +1133,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'no_versions') self.no_versions = ival_ elif nodeName_ == 'no_process_includes': sval_ = child_.text @@ -753,6 +1143,7 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'no_process_includes') self.no_process_includes = ival_ elif nodeName_ == 'silence': sval_ = child_.text @@ -762,85 +1153,176 @@ class sessionType(GeneratedsSuper, SessionTypeMixin): ival_ = False else: raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'silence') self.silence = ival_ elif nodeName_ == 'namespace_defs': namespace_defs_ = child_.text + namespace_defs_ = self.gds_validate_string(namespace_defs_, node, 'namespace_defs') self.namespace_defs = namespace_defs_ elif nodeName_ == 'external_encoding': external_encoding_ = child_.text + external_encoding_ = self.gds_validate_string(external_encoding_, node, 'external_encoding') self.external_encoding = external_encoding_ + elif nodeName_ == 'get_encoded': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'get_encoded') + self.get_encoded = ival_ elif nodeName_ == 'member_specs': member_specs_ = child_.text + member_specs_ = self.gds_validate_string(member_specs_, node, 'member_specs') self.member_specs = member_specs_ + elif nodeName_ == 'export_spec': + export_spec_ = child_.text + export_spec_ = self.gds_validate_string(export_spec_, node, 'export_spec') + self.export_spec = export_spec_ + elif nodeName_ == 'one_file_per_xsd': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'one_file_per_xsd') + self.one_file_per_xsd = ival_ + elif nodeName_ == 'output_directory': + output_directory_ = child_.text + output_directory_ = self.gds_validate_string(output_directory_, node, 'output_directory') + self.output_directory = output_directory_ + elif nodeName_ == 'module_suffix': + module_suffix_ = child_.text + module_suffix_ = self.gds_validate_string(module_suffix_, node, 'module_suffix') + self.module_suffix = module_suffix_ + elif nodeName_ == 'preserve_cdata_tags': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'preserve_cdata_tags') + self.preserve_cdata_tags = ival_ + elif nodeName_ == 'cleanup_name_list': + cleanup_name_list_ = child_.text + cleanup_name_list_ = self.gds_validate_string(cleanup_name_list_, node, 'cleanup_name_list') + self.cleanup_name_list = cleanup_name_list_ # end class sessionType +GDSClassesMapping = { + 'session': sessionType, +} + + USAGE_TEXT = """ Usage: python <Parser>.py [ -s ] <in_xml_file> """ + def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) def get_root_tag(node): tag = Tag_pattern_.match(node.tag).groups()[-1] - rootClass = globals().get(tag) + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) return tag, rootClass -def parse(inFileName): - doc = parsexml_(inFileName) +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'session' + rootTag = 'sessionType' rootClass = sessionType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export(sys.stdout, 0, name_=rootTag, - namespacedef_='') + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) return rootObj -def parseString(inString): +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'sessionType' + rootClass = sessionType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'session' + rootTag = 'sessionType' rootClass = sessionType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export(sys.stdout, 0, name_="session", - namespacedef_='') + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') return rootObj -def parseLiteral(inFileName): - doc = parsexml_(inFileName) +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'session' + rootTag = 'sessionType' rootClass = sessionType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None - sys.stdout.write('#from generateds_gui_session import *\n\n') - sys.stdout.write('import generateds_gui_session as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') - rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) - sys.stdout.write(')\n') + if not silence: + sys.stdout.write('#from generateds_gui_session import *\n\n') + sys.stdout.write('import generateds_gui_session as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') return rootObj @@ -859,4 +1341,4 @@ if __name__ == '__main__': __all__ = [ "sessionType" - ] +] diff --git a/gui/generateds_gui_session.xsd b/gui/generateds_gui_session.xsd index bb49045..986a982 100644 --- a/gui/generateds_gui_session.xsd +++ b/gui/generateds_gui_session.xsd @@ -29,6 +29,12 @@ <xs:element name="external_encoding" type="xs:string" /> <xs:element name="get_encoded" type="xs:boolean" /> <xs:element name="member_specs" type="xs:string" /> + <xs:element name="export_spec" type="xs:string" /> + <xs:element name="one_file_per_xsd" type="xs:boolean" /> + <xs:element name="output_directory" type="xs:string" /> + <xs:element name="module_suffix" type="xs:string" /> + <xs:element name="preserve_cdata_tags" type="xs:boolean" /> + <xs:element name="cleanup_name_list" type="xs:string" /> </xs:sequence> </xs:complexType> diff --git a/gui/run_generate_session b/gui/run_generate_session new file mode 100755 index 0000000..1abdbd2 --- /dev/null +++ b/gui/run_generate_session @@ -0,0 +1,5 @@ +#!/bin/bash +../generateDS.py \ + -o generateds_gui_session.py \ + --member-specs=list \ + generateds_gui_session.xsd diff --git a/gui/rus.dictionary b/gui/rus.dictionary new file mode 100644 index 0000000..99b9b14 --- /dev/null +++ b/gui/rus.dictionary @@ -0,0 +1,108 @@ +Always overwrite output files.\nDo not ask for confirmation.<-|->Ð’Ñегда перезапиÑывать выходные файлы.\nбез запроÑа подтверждение. +Append this text to the generated subclass names.\nDefault="Sub".<-|->Дополнительный текÑÑ‚ к Ñгенерированными подназваниÑм клаÑÑов. Значение по умолчанию\n= "Sub". +Assume an empty namespace\nprefix in the XML schema, not\nthe default ("xs:").<-|->ПуÑтое проÑтранÑтво имен\nÐ¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² XML-Ñхеме, не\nзначение по умолчанию ("xs":). +Assume that this value is the name\nof the root element of instance docs.\nDefault is first element defined in schema.<-|->Предположите, что Ñто значение - имÑ\nÑлемента ÐºÐ¾Ñ€Ð½Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°\n, Значение по умолчанию - первый Ñлемент, определенный в Ñхеме. +Auto<-|->ÐвтоматичеÑки +Behavior file name:<-|->Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° поведениÑ: +Capture the command line that would be used\nto generate the bindings modules.<-|->Получить командную Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸ÑпользовалаÑÑŒ бы\n, чтобы произвеÑти модули (bindings modules). +Choose<-|->Выбрать +Choose the input schema file.<-|->Выберите входной файл Ñхемы. +Choose the input file name for\nbehaviors added to subclasses.<-|->Выберите входное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° длÑ\nповедений, добавленных к подклаÑÑам. +Choose the optional module containing user methods. See\nsection "User Methods" in the documentation.<-|->Выберите дополнительный модуль, Ñодержащий пользовательÑкие методы. См.\nÑекцию "User Methods" в документации. +Choose the output directory for one-file-per-xsd.<-|->Выберите выходной каталог Ð´Ð»Ñ one-file-per-xsd. +Choose the output subclass bindings file.<-|->Выберите выходной файл привÑзки подклаÑÑа. +Choose the output superclass bindings file.<-|->Выберите выходной файл привÑзки ÑуперклаÑÑа. +Choose the path to a directory containing files that provide\nbodies (implementations) of validator methods.<-|->Выберите путь к каталогу, Ñодержащему файлы, которые обеÑпечивают\nорганы (реализации) методов проверки. +Cleanup name list:<-|->СпиÑок имени очиÑтки: +Clear the XML namespace prefix entry.<-|->ОчиÑтить поле префикÑа проÑтранÑтва имен XML. +Clear the behavior file name entry.<-|->ОчиÑтить поле имени файла поведениÑ. +Clear the cleanup name list entry.<-|->ОчиÑтить поле ÑпиÑка имени очиÑтки. +Clear the exports entry.<-|->ОчиÑтить поле ÑкÑпорт. +Clear the external encoding entry.<-|->ОчиÑтить поле внешней кодировки. +Clear the input schema file entry.<-|->ОчиÑтить поле входного файла Ñхемы. +Clear the module suffix entry.<-|->ОчиÑтить поле ÑуффикÑа модулÑ. +Clear the namespace definitions entry.<-|->ОчиÑтить поле определений проÑтранÑтва имен. +Clear the output directory entry.<-|->ОчиÑтить поле выходного каталога . +Clear the output subclass file entry.<-|->ОчиÑтить поле выходного файла подклаÑÑа. +Clear the output superclass file entry.<-|->ОчиÑтить поле выходного файла ÑуперклаÑÑа. +Clear the prefix entry.<-|->ОчиÑтить поле префикÑа. +Clear the root element entry.<-|->ОчиÑтить поле Ñлемента корнÑ. +Clear the subclass suffix.<-|->ОчиÑтить ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑа. +Clear the superclass module entry.<-|->ОчиÑтить поле Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑуперклаÑÑа. +Clear the user methods module entry.<-|->ОчиÑтить поле пользовательÑкого Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð². +Clear the validator bodies path entry.<-|->ОчиÑтить поле пути контрольных методов. +Create a python module for each XSD processed.<-|->Создавать модуль питона Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обработанного XSD. +Do not include the current date in the generated\nfiles. This is useful if you want to minimize\nthe amount of (no-operation) changes to the\ngenerated python code.<-|->Ðе включать текущую дату в произведенные\nфайлы. Ðто полезно, еÑли Ð’Ñ‹ хотите минимизировать\n, количеÑтво изменений (no-operation)\nв Ñгенрированном коде питона. +Do not include the current version in the generated\nfiles. This is useful if you want to minimize\nthe amount of (no-operation) changes to the\ngenerated python code.<-|->Ðе включайть текущую верÑию в произведенные\nфайлы. Ðто полезно, еÑли Ð’Ñ‹ хотите минимизировать\n, количеÑтво изменений (no-operationÑ‚)\nв Ñгенрированном коде питона. +Do not process included XML Schema files. By\ndefault, generateDS.py will insert content\nfrom files referenced by <include ... />\nelements into the XML Schema to be processed.<-|->Ðе обрабатывать включенные файлы XML-Ñхемы.\nЗначением по умолчанию generateDS.py вÑтавит контент\nот файлов, на которые ÑÑылаютÑÑ <включают.../>\nÑлементы в XML-Ñхемы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ обработана. +Do not process includes in schema<-|->Ðе обрабатывать Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² Ñхему +Empty<-|->Свободный +Encode output written by the generated export\nmethods using this encoding. Default, if omitted,\nis the value returned by sys.getdefaultencoding().\nExample: utf-8.<-|->Закодируйте вывод, полученый Ñгенерированными ÑкÑпортом\nметоды, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñто кодирование. Значение по умолчанию, еÑли опущено,\nÑвлÑетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼, возвращенным sys.getdefaultencoding (). Пример\n: utf-8. +Exit from the application.<-|->Выход из приложениÑ. +Exports:<-|->ÐкÑпорт: +External encoding:<-|->Внешнее кодировка: +Force<-|->УÑкоорить +Generate<-|->Генерировать +Generate Python properties for member variables\nso that the value can be retrieved and modified\nwithout calling getter and setter functions.\n<-|->Генерировать ÑвойÑтва Python Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…-членов\nтак, чтобы значение могло быть воÑÑтановлено и изменено\n, не Ð½Ð°Ð·Ñ‹Ð²Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ getter и setter.\n +Generate Python properties:<-|->Генерировать ÑвойÑтва Python: +Generate code that does not echo the parsed XML<-|->Генерировать код, который не повторÑет разобранный XML +Generate the bindings modules.<-|->Генерировать модули привÑзки. +Get encoded:<-|->Получить в кодировке: +Getters return encoded value by default if true.\nCan be changed at run-time by either\n(1) changing global variable GetEncodedValue or\n(2) using optional parameter to getter.<-|->getter(Ñ‹)возвращают закодированное значение по умолчанию еÑли иÑтина.\nМожет быть изменен во времени Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸\n(1) Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ GetEncodedValue или\n(2) иÑпользовать дополнительный параметр getter +Getters return encoded values by default<-|->getter(Ñ‹) возвращают закодированные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию +Input file name for behaviors\nadded to subclasses.<-|->Введите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ð¹\nдобавлемых к подклаÑÑам. +Input schema file:<-|->Введите файл Ñхемы: +Load a previous saved session.<-|->Загрузите предыдущую Ñохраненную ÑеÑÑию. +Member specs:<-|->Спецификации членов: +Messages and Content<-|->Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ контент +Module suffix:<-|->Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð¼Ð¾Ð´ÑƒÐ»Ñ +Name getters and setters getVar() and setVar(),\ninstead of get_var() and set_var().<-|->Ðазывать getter и setter getVar () и setVar (),\nвмеÑто get_var () и set_var (). +Namespace definition to be passed in as the\nvalue for the namespacedef_ parameter of\nthe export() method by the generated\nparse() and parseString() functions.\nDefault=''. Example:\nxmlns:abc="http://www.abc.com"<-|->Определение проÑтранÑтва имен, которое будет передано в как\n, оценивает за namespacedef_ параметр\nÑкÑпорт () метод Ñгенерированными разбором\n() и parseString () функции. Значение по умолчанию\n= ''. Пример:\nxmlns:abc = "http://www.abc.com" +Namespace definitions:<-|->ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÑтранÑтва имен: +Namespace prefix:<-|->ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¾ÑтранÑтва имен: +No dates in generated output<-|->Ðикакие даты в произведенном выводе +No dates:<-|->Ðикакие даты: +No process includes:<-|->Ðикакой процеÑÑ Ð½Ðµ включает: +No version info in generated output<-|->ÐÐ¸ÐºÐ°ÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ верÑии в произведенном выводе +No versions:<-|->Ðикакие верÑии: +Normally, the code generated with generateDS\nechoes the information being parsed. Use\nthis option to turn off that behavior.\n<-|->Обычно, код, произведенный Ñ generateDS\n, повторÑет разбираемую информацию. ИÑпользуйте\nÑта опциÑ, чтобы выключить Ñто поведение.\n +OK<-|->OK +Old getters and setters<-|->Старые getter и setter +One file per XSD:<-|->Один файл XSD: +Optional module containing user methods. See\nsection "User Methods" in the documentation.<-|->Дополнительный модуль, Ñодержащий пользовательÑкие методы. См.\nÑекцию "ПользовательÑкие Методы" в документации. +Output directory:<-|->Каталог Output: +Output subclass file:<-|->Выходной файл подклаÑÑа: +Output superclass file:<-|->Выходной файл ÑуперклаÑÑа: +Override default namespace\nprefix in schema file.\nExample: -a "xsd:"\nDefault: "xs:".<-|->Переопределите проÑтранÑтво имен по умолчанию\nÐ¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² файле Ñхемы. Пример\n:-a "xsd": Значение по умолчанию\n: "xs":. +Overwrite without asking:<-|->ПерезапиÑÑŒ без вопроÑов: +Path to a directory containing files that provide\nbodies (implementations) of validator methods.<-|->Путь к каталогу, Ñодержащему файлы, которые обеÑпечивают\nкорпуÑа (внедрениÑ) методов контрольного уÑтройÑтва. +Prefix (for class names):<-|->ÐŸÑ€ÐµÑ„Ð¸ÐºÑ (Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ð¹ клаÑÑов): +Prefix for class names.<-|->ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ð¹ клаÑÑов. +Preserve CDATA tags. Default: False.<-|->Сохранить теги CDATA. Значение по умолчанию: False. +Preserve CData tags<-|->Сохранить теги CData +Preserve CData tags:<-|->Сохранить теги CData: +Properties<-|->СвойÑтва +Quit<-|->Выход +Root element:<-|->Ðлемент корнÑ: +Save the current session in\nfile chosen by the user.<-|->Сохранить текущую ÑеÑÑию в\nфайле, выбранном пользователем. +Save the current session.<-|->Сохранить текущую ÑеÑÑию. +Silence:<-|->Тишина: +Specifies export functions to be generated. Value is a whitespace separated list of any of the following: "write" (write XML to file), "literal" (write out python code), "etree" (build element tree (can serialize to XML)). Example: "write etree". Default: "write".<-|->ОпределÑет ÑкÑпортные функции, которые будут произведены. Значение - отделенный ÑпиÑок Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ñледующего: "write" (запиÑать XML файл), "literal" (запиÑать код питона), "etree" (Ñоздают дерево Ñлемента (может преобразовать в поÑледовательную форму к XML)). Пример: "write etree". Значение по умолчанию: "write". +Specifies list of 2-tuples used for cleaning names. First element is a regular expression search pattern and second is a replacement. Example: "[('[-:.]', '_'), ('^__', 'Special')]". Default: "[('[-:.]', '_')]".<-|->ОпределÑет ÑпиÑок 2 кортежей, иÑпользуемых Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки имен. Первый Ñлемент - образец поиÑка регулÑрного выражениÑ, и второй замена. Пример: "[(' [-:]'. '_ '), ('^ __ ', 'ОÑобенный')]". Значение по умолчанию: "[(' [-:]'.', _ ')]". +Subclass suffix:<-|->Ð¡ÑƒÑ„Ñ„Ð¸ÐºÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑа: +Superclass module name in subclass module.\nDefault="???".<-|->Ð˜Ð¼Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑуперклаÑÑа в модуле подклаÑÑа. Значение по умолчанию\n= "???". +Superclass module:<-|->Модуль ÑуперклаÑÑа: +The path and name of the\ninput XML schema defining the\nbindings to be generated.<-|->Путь и название\nвводÑÑ‚ XML-Ñхему, определÑющую\nпривÑзки, которые будут произведены. +The path and name of the output file\nto be generated and to contain the \nsubclasses.<-|->Путь и название выходного файла\n, чтобы быть Ñгенерированными и Ñодержать\nподклаÑÑÑ‹. +The path and name of the output file\nto be generated and to contain the \nsuperclasses.<-|->Путь и название выходного файла\n, чтобы быть Ñгенерированными и Ñодержать\nÑуперклаÑÑÑ‹. +To be used in conjunction with --one-file-per-xsd. Append XXX to the end of each file created.<-|->ИÑпользоватьÑÑ Ð²Ð¼ÐµÑте Ñ --one-file-per-xsd. Добавить XXX в конец каждого Ñозданного файла. +Use old getters and setters:<-|->ИÑпользовать Ñтарые getter и setter: +Use the superclass file name\nstem as the super-class module\nname.<-|->ИÑпользуйте Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° ÑуперклаÑÑа\nкак оÑнова имени модулÑ\nÑуперклаÑÑа. +Used in conjunction with --one-file-per-xsd. The directory where the modules will be created.<-|->ИÑпользуемый вмеÑте Ñ --one-file-per-xsd. Каталог, где будут Ñозданы модули. +User methods module:<-|->ПользовательÑкий модуль методов: +Validator bodies path:<-|->Путь корпуÑов контрольного уÑтройÑтва: +_Capture CL<-|->_Capture CL +_File<-|->_Файл +_Generate<-|->_ПроизвеÑти +_Help<-|->_Помощь +_Tools<-|->_ИнÑтрументы diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py deleted file mode 100755 index 272b6e7..0000000 --- a/libgenerateDS/gui/generateds_gui.py +++ /dev/null @@ -1,2158 +0,0 @@ -#!/usr/bin/env python - -import sys -import os -from optparse import OptionParser -from ConfigParser import ConfigParser -from xml.dom import minidom -from xml.parsers import expat -import subprocess -import re -import gtk -# import pango -from libgenerateDS.gui import generateds_gui_session -#import generateds_gui_session - -## import warnings -## warnings.warn('importing IPShellEmbed', UserWarning) -## 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 and constants: - -# -# Do not modify the following VERSION comments. -# Used by updateversion.py. -##VERSION## -VERSION = '2.11b' -##VERSION## - - -Builder = None -ParamNameList = [] -CmdTemplate = ( - '%(exec_path)s --no-questions' + - '%(force)s' + - '%(output_superclass)s' + - '%(output_subclass)s' + - '%(prefix)s' + - '%(namespace_prefix)s' + - '%(behavior_filename)s' + - '%(properties)s' + - '%(old_getters_setters)s' + - '%(subclass_suffix)s' + - '%(root_element)s' + - '%(superclass_module)s' + - '%(validator_bodies)s' + - '%(user_methods)s' + - '%(no_dates)s' + - '%(no_versions)s' + - '%(no_process_includes)s' + - '%(silence)s' + - '%(namespace_defs)s' + - '%(external_encoding)s' + - '%(member_specs)s' + - ' %(input_schema)s' + - '' - ) -CaptureCmdTemplate = ( - '%(exec_path)s --no-questions' + - '%(force)s' + - '%(properties)s' + - '%(namespace_prefix)s' + - '%(output_superclass)s' + - '%(output_subclass)s' + - '%(prefix)s' + - '%(behavior_filename)s' + - '%(old_getters_setters)s' + - '%(subclass_suffix)s' + - '%(root_element)s' + - '%(superclass_module)s' + - '%(validator_bodies)s' + - '%(user_methods)s' + - '%(no_dates)s' + - '%(no_versions)s' + - '%(no_process_includes)s' + - '%(silence)s' + - '%(namespace_defs)s' + - '%(external_encoding)s' + - '%(member_specs)s' + - ' \\\n %(input_schema)s' + - '' - ) -ErrorMessages = [ - '', - 'Must enter input schema name.', - 'Must enter either output superclass name or output subclass file name.', - ] -Memberspecs_tooltip_text = '''\ -Generate member (type) specifications in each -class: a dictionary of instances of class -MemberSpec_ containing member name, type, -and array or not. Allowed values are -"list" or "dict". Default: None. -''' - - -# -# Classes -# - -class UIItemSpec(object): - def __init__(self, name='', ui_type='', access_action=''): - self.name = name - self.ui_type = ui_type - self.access_action = access_action - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_ui_type(self): return self.ui_type - def set_ui_type(self, ui_type): self.ui_type = ui_type - def get_access_action(self): return self.access_action - def set_access_action(self, access_action): self.access_action = access_action - - -class GeneratedsGui(object): - - def __init__(self, options): - global Builder - # Default values - Builder = gtk.Builder() - self.options = options - # self.ui_spec_filename = ui_spec_filename - self.filename = None - self.about_dialog = None - self.params = generateds_gui_session.sessionType() - self.ui_obj_dict = {} - self.session_filename = None - self.current_folder = None - # use GtkBuilder to build our interface from the XML file - ui_spec_filename = options.impl_gui - try: - if ui_spec_filename is None: - Builder.add_from_string(Ui_spec, len(Ui_spec)) - else: - Builder.add_from_file(ui_spec_filename) - except: - msg = "Failed to load UI XML file: %s" % ui_spec_filename - self.error_message(msg) - sys.exit(1) - # get the widgets which will be referenced in callbacks - bgo = Builder.get_object - self.window = bgo("window1") - self.statusbar = bgo("statusbar1") - for item in ParamNameList: - if item.get_ui_type() != 'combobox': - s1 = '%s_%s' % (item.get_name(), item.get_ui_type(), ) - setattr(self, s1, bgo(s1)) - self.ui_obj_dict[s1] = bgo(s1) - # Create the member-specs combobox. - member_specs_combobox = gtk.combo_box_new_text() - member_specs_combobox.set_name('member_specs_combobox') - member_specs_combobox.set_tooltip_text(Memberspecs_tooltip_text) - self.ui_obj_dict['member_specs_combobox'] = member_specs_combobox - member_specs_combobox.append_text("none") - member_specs_combobox.append_text("list") - member_specs_combobox.append_text("dict") - member_specs_combobox_container = bgo('member_specs_combobox_container') - member_specs_combobox_container.add(member_specs_combobox) - member_specs_combobox.set_active(0) - member_specs_combobox.show() - self.content_dialog = ContentDialog() - # connect signals - Builder.connect_signals(self) - Builder.connect_signals(self.content_dialog) - # set the default icon to the GTK "edit" icon - gtk.window_set_default_icon_name(gtk.STOCK_EDIT) - # setup and initialize our statusbar - self.statusbar_cid = self.statusbar.get_context_id("Tutorial GTK+ Text Editor") - self.reset_default_status() - self.params = generateds_gui_session.sessionType() - # Load a session if specified. - session = self.options.session - if session: - session = os.path.abspath(session) - self.session_filename = session - self.load_session(session) - msg = 'Session file: %s' % (self.session_filename, ) - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, msg) - else: - self.trans_gui_2_obj() - self.saved_params = self.params.copy() - - # When our window is destroyed, we want to break out of the GTK main loop. - # We do this by calling gtk_main_quit(). We could have also just specified - # gtk_main_quit as the handler in Glade! - def on_window_destroy(self, widget, data=None): - self.trans_gui_2_obj() -## self.dump_params('saved_params:', self.saved_params) -## self.dump_params('params:', self.params) - if self.params != self.saved_params: - message = 'Session data has changed.\n\nSave?' - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_NONE, - message) - dialog.add_buttons( - gtk.STOCK_YES, gtk.RESPONSE_YES, - '_Discard', 1, - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - ) - response = dialog.run() - dialog.destroy() - if response == gtk.RESPONSE_YES: - self.save_session_action() - elif response == 1: - pass - elif response == gtk.RESPONSE_CANCEL: - return - gtk.main_quit() - - def on_window_delete_event(self, widget, event, data=None): - self.on_window_destroy(widget, data) - - def on_quit_menu_item_activate(self, widget, data=None): - self.on_window_destroy(widget, data) - - def on_quit_button_clicked(self, widget, data=None): - self.on_window_destroy(widget, data) - - # Get the values from the widgets in the UI. - # Format the command line. - # Generate the output files. - def on_generate_menuitem_activate(self, menuitem, data=None): - self.trans_gui_2_obj() - params_dict = self.trans_params_2_dict() - result, msg = self.validate_params(params_dict) - if result: - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, 'Error: %s' % (msg, )) - self.error_message(msg) - else: - cmd = self.create_command_line(params_dict, CmdTemplate) - #print 'cmd: %s' % (cmd, ) - self.run_command(cmd) - return True - - on_generate_button_clicked = on_generate_menuitem_activate - - def on_capture_cl_menuitem_activate(self, menuitem, data=None): - self.trans_gui_2_obj() - params_dict = self.trans_params_2_dict() - result, msg = self.validate_params(params_dict) - if result: - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, 'Error: %s' % (msg, )) - self.error_message(msg) - else: - cmd = self.create_command_line(params_dict, CaptureCmdTemplate) - cmd = cmd.replace(' --', ' \\\n --') - cmd = cmd.replace(' -o', ' \\\n -o') - cmd = cmd.replace(' -s', ' \\\n -s') - self.display_content('Command line', cmd) - return True - - def trans_gui_2_obj(self): - for item in ParamNameList: - ui_name = '%s_%s' % (item.get_name(), item.get_ui_type(), ) - ui_obj = self.ui_obj_dict[ui_name] - if ui_obj is not None: - if item.get_name() == 'member_specs': - value = ui_obj.get_active() - if value == 1: - self.params.set_member_specs('list') - elif value == 2: - self.params.set_member_specs('dict') - else: - self.params.set_member_specs('none') - else: - s2 = '%s_%s' % (item.get_name(), item.get_ui_type(), ) - method = getattr(ui_obj, 'get_%s' % item.get_access_action()) - value = method() - setattr(self.params, item.get_name(), value) - - def trans_obj_2_gui(self): - for item in ParamNameList: - ui_name = '%s_%s' % (item.get_name(), item.get_ui_type(), ) - ui_obj = self.ui_obj_dict[ui_name] - if ui_obj is not None: - if item.get_name() == 'member_specs': - if self.params.get_member_specs() == 'list': - ui_obj.set_active(1) - elif self.params.get_member_specs() == 'dict': - ui_obj.set_active(2) - else: - ui_obj.set_active(0) - else: - value = getattr(self.params, item.get_name()) - if value is None: - if item.get_ui_type() == 'entry': - value = '' - elif item.get_ui_type() == 'checkbutton': - value = False - elif item.get_ui_type() == 'combobox': - value = 0 - method = getattr(ui_obj, - 'set_%s' % item.get_access_action()) - method(value) - - def dump_params(self, msg, params): - print msg - params.export(sys.stdout, 0, name_='session') - - def trans_params_2_dict(self): - params = self.params - params_dict = {} - pd = params_dict - pd['input_schema'] = getattr(params, 'input_schema') - self.transform_1_param(params, pd, 'output_superclass', 'o') - self.transform_1_param(params, pd, 'output_subclass', 's') - pd['force'] = (' -f' if params.get_force() else '') - self.transform_1_param(params, pd, 'prefix', 'p') - if params.get_empty_namespace_prefix(): - pd['namespace_prefix'] = ' -a ""' - else: - self.transform_1_param(params, pd, 'namespace_prefix', 'a') - self.transform_1_param(params, pd, 'behavior_filename', 'b') - pd['properties'] = (' -m' if params.get_properties() else '') - self.transform_1_param(params, pd, 'subclass_suffix', 'subclass-suffix', True) - self.transform_1_param(params, pd, 'root_element', 'root-element', True) - self.transform_1_param(params, pd, 'superclass_module', 'super', True) - pd['old_getters_setters'] = (' --use-old-getter-setter' if params.get_old_getters_setters() else '') - self.transform_1_param(params, pd, 'user_methods', 'user-methods', True) - self.transform_1_param(params, pd, 'validator_bodies', 'validator-bodies', True) - pd['no_dates'] = (' --no-dates' if params.get_no_dates() else '') - pd['no_versions'] = (' --no-versions' if params.get_no_versions() else '') - pd['no_process_includes'] = (' --no-process-includes' if params.get_no_process_includes() else '') - pd['silence'] = (' --silence' if params.get_silence() else '') - # Special case for namespacedefs because of quoting. - #self.transform_1_param(params, pd, 'namespace_defs', 'namespacedef', True) - name = 'namespace_defs' - flag = 'namespacedef' - value = getattr(params, name) - params_dict[name] = ( - " --%s='%s'" % (flag, value, ) - if value.strip() - else '') - self.transform_1_param(params, pd, 'external_encoding', 'external-encoding', True) - if params.get_member_specs() == 'list': - pd['member_specs'] = ' --member-specs=list' - elif params.get_member_specs() == 'dict': - pd['member_specs'] = ' --member-specs=dict' - else: - pd['member_specs'] = '' - return pd - - def transform_1_param(self, params, params_dict, name, flag, longopt=False): - value = getattr(params, name) - if longopt: - params_dict[name] = ( - ' --%s="%s"' % (flag, value, ) - if value.strip() - else '') - else: - params_dict[name] = ( - ' -%s "%s"' % (flag, value, ) - if value.strip() - else '') - - def create_command_line(self, params_dict, template): - params_dict['exec_path'] = self.options.exec_path - cmd = template % params_dict - return cmd - - def validate_params(self, params_dict): - p = params_dict - #print sorted(p.keys()) - result = 0 - msg = '' - if not p['input_schema']: - result = 1 - elif not (p['output_superclass'] or - p['output_subclass']): - result = 2 - if result: - msg = ErrorMessages[result] - return result, msg - - # Clear all the fields/widgets to default values. - def on_clear_menuitem_activate(self, menuitem, data=None): - message = 'Clear all entries?\nAre you sure?' - dialog = gtk.MessageDialog( - None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_WARNING, - gtk.BUTTONS_OK_CANCEL, - message - ) - response = dialog.run() - dialog.destroy() - if response == gtk.RESPONSE_OK: - self.session_filename = None - self.params = generateds_gui_session.sessionType( - input_schema='', - output_superclass='', - output_subclass='', - force=False, - prefix='', - namespace_prefix='', - empty_namespace_prefix=False, - behavior_filename='', - properties=False, - subclass_suffix='', - root_element='', - superclass_module='', - auto_super=False, - old_getters_setters=False, - validator_bodies='', - user_methods='', - no_dates=False, - no_versions=False, - no_process_includes=False, - silence=False, - namespace_defs='', - external_encoding='', - member_specs='', - ) - self.trans_obj_2_gui() - - def run_command(self, cmd): - spobj = subprocess.Popen(cmd, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - close_fds=False) - outcontent = spobj.stdout.read() - errcontent = spobj.stderr.read() - error = False - if outcontent.strip(): - self.display_content('Messages', outcontent) - error = True - if errcontent.strip(): - self.display_content('Errors', errcontent) - error = True - if not error: - msg = 'Successfully generated.' - self.error_message(msg, gtk.MESSAGE_INFO) - - def display_content(self, title, content): - #content_dialog = ContentDialog() - self.content_dialog.show(content) - - def on_open_session_menuitem_activate(self, menuitem, data=None): - self.trans_gui_2_obj() -## self.dump_params('saved_params:', self.saved_params) -## self.dump_params('params:', self.params) - if self.params != self.saved_params: - message = 'Session data has changed.\n\nSave?' - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - gtk.MESSAGE_ERROR, - gtk.BUTTONS_NONE, - message) - dialog.add_buttons( - gtk.STOCK_YES, gtk.RESPONSE_YES, - '_Discard', 1, - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - ) - response = dialog.run() - dialog.destroy() - if response == gtk.RESPONSE_YES: - self.save_session_action() - elif response == 1: - pass - elif response == gtk.RESPONSE_CANCEL: - return - session_filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_OPEN, - (('Session *.session', '*.session'),) - ) - if session_filename: - self.session_filename = session_filename - self.load_session(self.session_filename) - msg = 'Session file: %s' % (self.session_filename, ) - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, msg) - - def on_save_session_menuitem_activate(self, menuitem, data=None): - self.save_session_action() - - def save_session_action(self): - if not self.session_filename: - filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_SAVE, - (('Session *.session', '*.session'),), - confirm_overwrite=True, - initfilename=self.session_filename, - buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK, - ) - ) - if filename: - self.session_filename = filename - if self.session_filename: - stem, ext = os.path.splitext(self.session_filename) - if not ext: - self.session_filename += '.session' - self.save_session(self.session_filename) - msg = 'Session file: %s' % (self.session_filename, ) - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, msg) - - def on_save_session_as_menuitem_activate(self, menuitem, data=None): - filename = self.choose_filename( - gtk.FILE_CHOOSER_ACTION_SAVE, - (('Session *.session', '*.session'),), - confirm_overwrite=True, - initfilename=self.session_filename, - buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, gtk.RESPONSE_OK, - ) - ) - if filename: - self.session_filename = filename - stem, ext = os.path.splitext(self.session_filename) - if not ext: - self.session_filename += '.session' - self.save_session(self.session_filename) - msg = 'Session file: %s' % (self.session_filename, ) - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, msg) - - def save_session(self, filename): - self.trans_gui_2_obj() - sessionObj = self.params - outfile = open(filename, 'w') - outfile.write('<?xml version="1.0" ?>\n') - sessionObj.export(outfile, 0, name_="session", - namespacedef_='') - outfile.close() - msg = 'Session saved to file:\n%s' % (filename, ) - self.error_message(msg, gtk.MESSAGE_INFO) - self.saved_params = self.params.copy() - - def load_session(self, filename): - try: - doc = generateds_gui_session.parsexml_(filename) - rootNode = doc.getroot() - rootTag, rootClass = generateds_gui_session.get_root_tag(rootNode) - if rootClass is None: - rootTag = 'session' - rootClass = generateds_gui_session.sessionType - sessionObj = rootClass.factory() - sessionObj.build(rootNode) - self.params = sessionObj - self.trans_obj_2_gui() - self.trans_gui_2_obj() - self.saved_params = self.params.copy() - except IOError, exp: - msg = str(exp) - self.error_message(msg, gtk.MESSAGE_ERROR) - except expat.ExpatError, exp: - msg = '%s file: %s' % (str(exp), filename, ) - self.error_message(msg, gtk.MESSAGE_ERROR) - - def on_about_menu_item_activate(self, menuitem, data=None): - if self.about_dialog: - self.about_dialog.present() - return - authors = [ - 'Dave Kuhlman <dkuhlman@rexx.com>', - ] - about_dialog = gtk.AboutDialog() - about_dialog.set_transient_for(self.window) - about_dialog.set_destroy_with_parent(True) - about_dialog.set_name("generateDS.py Python bindings generator") - about_dialog.set_version(VERSION) - about_dialog.set_copyright("Copyright \xc2\xa9 2009 Dave Kuhlman") - about_dialog.set_website("http://www.rexx.com/~dkuhlman") - about_dialog.set_comments("GTK+ and Glade3 GUI front end") - about_dialog.set_authors(authors) - about_dialog.set_logo_icon_name(gtk.STOCK_EDIT) - # callbacks for destroying the dialog - def close(dialog, response, editor): - editor.about_dialog = None - dialog.destroy() - def delete_event(dialog, event, editor): - editor.about_dialog = None - return True - about_dialog.connect("response", close, self) - about_dialog.connect("delete-event", delete_event, self) - self.about_dialog = about_dialog - about_dialog.show() - - def error_message(self, message, message_type=gtk.MESSAGE_ERROR): - # log to terminal window - #print message - # create an error message dialog and display modally to the user - dialog = gtk.MessageDialog(None, - gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, - message_type, gtk.BUTTONS_OK, message) - dialog.run() - dialog.destroy() - - def reset_default_status(self): - msg = "Session file: (UNTITLED)" - self.statusbar.pop(self.statusbar_cid) - self.statusbar.push(self.statusbar_cid, msg) - - def on_input_schema_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, - (('Schemas *.xsd', '*.xsd'),)) - if filename: - self.input_schema_entry.set_text(filename) - - def on_output_superclass_chooser_button_clicked(self, widget, data=None): - filename = self.choose_filename(patterns=(('Python *.py', '*.py'), )) - if filename: - self.output_superclass_entry.set_text(filename) - #self.on_output_superclass_entry_changed( - # self.output_superclass_entry, data) - - def on_output_subclass_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(patterns=(('Python *.py', '*.py'), )) - if filename: - self.output_subclass_entry.set_text(filename) - - def on_behavior_filename_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, - (('Python *.py', '*.py'),)) - if filename: - self.behavior_filename_entry.set_text(filename) - - def on_validator_bodies_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, - ) - if filename: - self.validator_bodies_entry.set_text(filename) - - def on_user_methods_chooser_button_clicked(self, button, data=None): - filename = self.choose_filename(gtk.FILE_CHOOSER_ACTION_OPEN, - (('Python *.py', '*.py'),)) - if filename: - self.user_methods_entry.set_text(filename) - - def choose_filename(self, action=gtk.FILE_CHOOSER_ACTION_SAVE, - patterns=(), confirm_overwrite=False, initfilename=None, - buttons=None): - filename = None - if buttons is None: - buttons=( - gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, - gtk.STOCK_OPEN, gtk.RESPONSE_OK, - ) - dialog = gtk.FileChooserDialog( - title=None, - action=action, - buttons=buttons, - ) - if self.current_folder is not None: - dialog.set_current_folder(self.current_folder) - if initfilename is not None: - dialog.set_filename(initfilename) - if patterns: - filter = gtk.FileFilter() - for name, pattern in patterns: - filter.set_name(name) - filter.add_pattern(pattern) - dialog.add_filter(filter) - filter = gtk.FileFilter() - filter.set_name("All files *.*") - filter.add_pattern("*") - dialog.add_filter(filter) - dialog.set_do_overwrite_confirmation(confirm_overwrite) - response = dialog.run() - if response == gtk.RESPONSE_OK: - filename = dialog.get_filename() - self.current_folder = dialog.get_current_folder() - elif response == gtk.RESPONSE_CANCEL: - pass - dialog.destroy() - return filename - - def on_namespace_prefix_entry_changed(self, widget, data=None): - entry = self.ui_obj_dict['namespace_prefix_entry'] - checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton'] - checkbutton.set_active(False) - return True - - def on_empty_namespace_prefix_checkbutton_toggled(self, widget, data=None): - entry = self.ui_obj_dict['namespace_prefix_entry'] - checkbutton = self.ui_obj_dict['empty_namespace_prefix_checkbutton'] - if widget.get_active(): - entry.set_text('') - return True - - def on_output_superclass_entry_changed(self, widget, data=None): - entry = self.ui_obj_dict['superclass_module_entry'] - checkbutton = self.auto_super_checkbutton - if checkbutton.get_active(): - path = widget.get_text() - if path: - stem = os.path.splitext(os.path.split(path)[1])[0] - if stem: - entry.set_text(stem) - return True - - def on_auto_super_checkbutton_toggled(self, widget, data=None): - entry = self.ui_obj_dict['superclass_module_entry'] - superclass_entry = self.ui_obj_dict['output_superclass_entry'] - #checkbutton = self.auto_super_checkbutton - checkbutton = widget - if widget.get_active(): - path = superclass_entry.get_text() - if path: - stem = os.path.splitext(os.path.split(path)[1])[0] - if stem: - entry.set_text(stem) - return True - - def on_ok_button_activate(self, widget, data=None): - #print '(GeneratedsGui) widget:', widget - response = self.content_dialog.on_ok_button_activate( - self.content_dialog, data) - return response - - name_pat1 = re.compile(r'^(.*)_clear_button') - - # This method keys off the correspondence between the - # name of the button and the name of the related entry, - # for example, xxx_yyy_entry : xxx_yyy_clear_button. - def on_clear_button_clicked(self, widget, data=None): - name = widget.get_name() - mo = GeneratedsGui.name_pat1.search(name) - stem = mo.group(1) - name1 = '%s_entry' % (stem, ) - ui_obj = self.ui_obj_dict[name1] - ui_obj.set_text('') - - # Run main application window - def main(self): - self.window.show() - gtk.main() - - -class ContentDialog(gtk.Dialog): - def __init__(self): - global Builder - self.content_dialog = Builder.get_object('content_dialog') - self.content_textview = Builder.get_object('content_textview') - buf = self.content_textview.get_buffer().set_text('') - - def show(self, content): - #Builder.connect_signals(self) - self.content_textview.get_buffer().set_text(content) - response = self.content_dialog.run() - self.content_dialog.hide() - - def on_ok_button_activate(self, widget, data=None): - #print '(content_dialog) widget:', widget - return False - - -# -# Functions for internal use -# - -def capture_options(options): - config_parser = ConfigParser() - config_parser.read([ - os.path.expanduser('~/.generateds_gui.ini'), - './generateds_gui.ini', - ]) - section = 'general' - names = ('exec-path', 'exec_path') - capture_1_option(options, config_parser, section, names) -## names = ('impl-schema', 'impl_schema') -## capture_1_option(options, config_parser, section, names) - names = ('impl-gui', 'impl_gui') - capture_1_option(options, config_parser, section, names) - names = ('session', 'session') - capture_1_option(options, config_parser, section, names) - # Set some defaults. - if options.exec_path is None: - options.exec_path = 'generateDS.py' - -def capture_1_option(options, config_parser, section, names): - if (getattr(options, names[1]) is None and - config_parser.has_option(section, names[0]) - ): - setattr(options, names[1], config_parser.get(section, names[0])) - -def capture_ui_names(): - items = generateds_gui_session.sessionType.member_data_items_ - for item in items: - ui_item = UIItemSpec(item.get_name()) - if item.get_name() == 'member_specs': - ui_item.set_ui_type('combobox') - ui_item.set_access_action('active') - elif item.get_data_type() == 'xs:string': - ui_item.set_ui_type('entry') - ui_item.set_access_action('text') - elif item.get_data_type() == 'xs:boolean': - ui_item.set_ui_type('checkbutton') - ui_item.set_access_action('active') - ParamNameList.append(ui_item) -## print 'ParamNameList:' -## for item in ParamNameList: -## print ' %s %s' % (item.get_name(), item.get_ui_type(), ) - - -USAGE_TEXT = """ - python %prog [options] <somefile.xxx> -example: - python %prog somefile.xxx""" - -def usage(parser): - parser.print_help() - sys.exit(1) - - -def main(): - parser = OptionParser(USAGE_TEXT) - parser.add_option("--exec-path", - type="string", action="store", - dest="exec_path", - #default="generateDS.py", - help='path to executable generated in command line.' - ' Example: "python /path/to/generateDS.py".' - ' Default: "./generateDS.py".' - ' Use Tools/Generate CL (Ctrl-T) to see it.' - ) - parser.add_option("--impl-gui", - type="string", action="store", - dest="impl_gui", - help="name of glade file that defines the GUI if not embedded." - ) - parser.add_option("-s", "--session", - type="string", action="store", - dest="session", - help="name of a session file to be loaded." - ) - (options, args) = parser.parse_args() - capture_options(options) - capture_ui_names() - if len(args) > 0: - usage(parser) - editor = GeneratedsGui(options) - editor.main() - -# Do not change the next 3 lines. -## UI_SPECIFICATION ## - -Ui_spec = """ - -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkWindow" id="window1"> - <accel-groups> - <group name="accelgroup1"/> - </accel-groups> - <signal name="delete_event" handler="on_window_delete_event"/> - <child> - <object class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkMenuBar" id="menubar1"> - <property name="visible">True</property> - <child> - <object class="GtkMenuItem" id="menuitem1"> - <property name="visible">True</property> - <property name="label" translatable="yes">_File</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu1"> - <property name="visible">True</property> - <child> - <object class="GtkImageMenuItem" id="clear_menuitem"> - <property name="label">Clear</property> - <property name="visible">True</property> - <property name="image">image4</property> - <property name="use_stock">False</property> - <property name="accel_group">accelgroup1</property> - <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_clear_menuitem_activate"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="open_session_menuitem"> - <property name="label">_Load session</property> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Load a previous saved session.</property> - <property name="use_underline">True</property> - <property name="image">image3</property> - <property name="use_stock">False</property> - <property name="accel_group">accelgroup1</property> - <accelerator key="o" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_open_session_menuitem_activate"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="save_session_menuitem"> - <property name="label">_Save session</property> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Save the current session.</property> - <property name="use_underline">True</property> - <property name="image">image1</property> - <property name="use_stock">False</property> - <property name="accel_group">accelgroup1</property> - <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_save_session_menuitem_activate"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="save_session_as_menuitem"> - <property name="label">Save session as ...</property> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Save the current session in -file chosen by the user.</property> - <property name="image">image2</property> - <property name="use_stock">False</property> - <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_save_session_as_menuitem_activate"/> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="menuitem5"> - <property name="visible">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="imagemenuitem5"> - <property name="label">gtk-quit</property> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Exit from the application.</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_quit_menu_item_activate"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="menuitem2"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Tools</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu2"> - <property name="visible">True</property> - <child> - <object class="GtkMenuItem" id="capture_cl_menuitem"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Capture the command line that would be used -to generate the bindings modules.</property> - <property name="label" translatable="yes">_Capture CL</property> - <property name="use_underline">True</property> - <accelerator key="t" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_capture_cl_menuitem_activate"/> - </object> - </child> - <child> - <object class="GtkMenuItem" id="generate_menuitem"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> - <property name="label" translatable="yes">_Generate</property> - <property name="use_underline">True</property> - <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/> - <signal name="activate" handler="on_generate_menuitem_activate"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="menuitem4"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Help</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu3"> - <property name="visible">True</property> - <child> - <object class="GtkImageMenuItem" id="imagemenuitem10"> - <property name="label">gtk-about</property> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <property name="accel_group">accelgroup1</property> - <signal name="activate" handler="on_about_menu_item_activate"/> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">22</property> - <property name="n_columns">4</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Input schema file:</property> - </object> - </child> - <child> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output superclass file:</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Output subclass file:</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Overwrite without asking:</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="force_checkbutton"> - <property name="label" translatable="yes">Force</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Always overwrite output files. -Do not ask for confirmation.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="input_schema_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the -input XML schema defining the -bindings to be generated.</property> - <property name="invisible_char">●</property> - <property name="width_chars">80</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_superclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file -to be generated and to contain the -superclasses.</property> - <property name="invisible_char">●</property> - <signal name="changed" handler="on_output_superclass_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="output_subclass_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">The path and name of the output file -to be generated and to contain the -subclasses.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Prefix (for class names):</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Prefix for class names.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label6"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace prefix:</property> - </object> - <packing> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_prefix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property> - <property name="tooltip_text" translatable="yes">Override default namespace -prefix in schema file. -Example: -a "xsd:" -Default: "xs:".</property> - <property name="invisible_char">●</property> - <signal name="changed" handler="on_namespace_prefix_entry_changed"/> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Behavior file name:</property> - </object> - <packing> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="behavior_filename_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Input file name for behaviors -added to subclasses.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label8"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Generate Python properties:</property> - </object> - <packing> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="properties_checkbutton"> - <property name="label" translatable="yes">Properties</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Generate Python properties for member variables -so that the value can be retrieved and modified -without calling getter and setter functions. -</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label10"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Subclass suffix:</property> - </object> - <packing> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="subclass_suffix_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Append this text to the generated subclass names. -Default="Sub".</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label11"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Root element:</property> - </object> - <packing> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="root_element_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Assume that this value is the name -of the root element of instance docs. -Default is first element defined in schema.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the input schema file.</property> - <signal name="clicked" handler="on_input_schema_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output superclass bindings file.</property> - <signal name="clicked" handler="on_output_superclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the output subclass bindings file.</property> - <signal name="clicked" handler="on_output_subclass_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the nput file name for -behaviors added to subclasses.</property> - <signal name="clicked" handler="on_behavior_filename_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label12"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Superclass module:</property> - </object> - <packing> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="superclass_module_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Superclass module name in subclass module. -Default="???".</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label13"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Use old getters and setters:</property> - </object> - <packing> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="old_getters_setters_checkbutton"> - <property name="label" translatable="yes">Old getters and setters</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Name getters and setters getVar() and setVar(), -instead of get_var() and set_var().</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label14"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Validator bodies path:</property> - </object> - <packing> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label15"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">User methods module:</property> - </object> - <packing> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label16"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No dates:</property> - </object> - <packing> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label17"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No versions:</property> - </object> - <packing> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_dates_checkbutton"> - <property name="label" translatable="yes">No dates in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current date in the generated -files. This is useful if you want to minimize -the amount of (no-operation) changes to the -generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">15</property> - <property name="bottom_attach">16</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="validator_bodies_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Path to a directory containing files that provide -bodies (implementations) of validator methods.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_chooser_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the path to a directory containing files that provide -bodies (implementations) of validator methods.</property> - <signal name="clicked" handler="on_validator_bodies_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_versions_checkbutton"> - <property name="label" translatable="yes">No version info in generated output</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not include the current version in the generated -files. This is useful if you want to minimize -the amount of (no-operation) changes to the -generated python code.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">16</property> - <property name="bottom_attach">17</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_button"> - <property name="label" translatable="yes">Choose</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Choose the optional module containing user methods. See -section "User Methods" in the documentation.</property> - <signal name="clicked" handler="on_user_methods_chooser_button_clicked"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="user_methods_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Optional module containing user methods. See -section "User Methods" in the documentation.</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label18"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">No process includes:</property> - </object> - <packing> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label19"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Silence:</property> - </object> - <packing> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="no_process_includes_checkbutton"> - <property name="label" translatable="yes">Do not process includes in schema</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Do not process included XML Schema files. By -default, generateDS.py will insert content -from files referenced by <include ... /> -elements into the XML Schema to be processed.</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">17</property> - <property name="bottom_attach">18</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="silence_checkbutton"> - <property name="label" translatable="yes">Generate code that does not echo the parsed XML</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Normally, the code generated with generateDS -echoes the information being parsed. Use -this option to turn off that behavior. -</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">18</property> - <property name="bottom_attach">19</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label20"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Namespace definitions:</property> - </object> - <packing> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label21"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">External encoding:</property> - </object> - <packing> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label22"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Member specs:</property> - </object> - <packing> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="namespace_defs_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip_text" translatable="yes">Namespace definition to be passed in as the -value for the namespacedef_ parameter of -the export() method by the generated -parse() and parseString() functions. -Default=''. Example: -xmlns:abc="http://www.abc.com"</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="external_encoding_entry"> - <property name="visible">True</property> - <property name="tooltip_text" translatable="yes">Encode output written by the generated export -methods using this encoding. Default, if omitted, -is the value returned by sys.getdefaultencoding(). -Example: utf-8.</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="member_specs_combobox_container"> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">21</property> - <property name="bottom_attach">22</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="empty_namespace_prefix_checkbutton"> - <property name="label" translatable="yes">Empty</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Assume an empty namespace -prefix in the XML schema, not -the default ("xs:").</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_empty_namespace_prefix_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkCheckButton" id="auto_super_checkbutton"> - <property name="label" translatable="yes">Auto</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="tooltip_text" translatable="yes">Use the superclass file name -stem as the super-class module -name.</property> - <property name="draw_indicator">True</property> - <signal name="toggled" handler="on_auto_super_checkbutton_toggled"/> - </object> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="input_schema_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the input schema file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_superclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output superclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - </packing> - </child> - <child> - <object class="GtkButton" id="output_subclass_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the output subclass file entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - <child> - <object class="GtkButton" id="prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_prefix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the XML namespace prefix entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - </packing> - </child> - <child> - <object class="GtkButton" id="behavior_filename_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the behavior file name entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - </packing> - </child> - <child> - <object class="GtkButton" id="subclass_suffix_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the subclass suffix.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - </packing> - </child> - <child> - <object class="GtkButton" id="root_element_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the root element entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - </packing> - </child> - <child> - <object class="GtkButton" id="superclass_module_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the superclass module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - </packing> - </child> - <child> - <object class="GtkButton" id="validator_bodies_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the validator bodies path entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - </packing> - </child> - <child> - <object class="GtkButton" id="user_methods_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the user methods module entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - </packing> - </child> - <child> - <object class="GtkButton" id="namespace_defs_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the namespace definitions entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">19</property> - <property name="bottom_attach">20</property> - </packing> - </child> - <child> - <object class="GtkButton" id="external_encoding_clear_button"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Clear the external encoding entry.</property> - <property name="use_stock">True</property> - <signal name="clicked" handler="on_clear_button_clicked"/> - </object> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">20</property> - <property name="bottom_attach">21</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="homogeneous">True</property> - <child> - <object class="GtkButton" id="generate_button"> - <property name="label" translatable="yes">Generate</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Generate the bindings modules.</property> - <signal name="clicked" handler="on_generate_button_clicked"/> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="quit_button"> - <property name="label" translatable="yes">Quit</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="tooltip_text" translatable="yes">Exit from the application.</property> - <signal name="clicked" handler="on_quit_button_clicked"/> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkStatusbar" id="statusbar1"> - <property name="visible">True</property> - <property name="spacing">2</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">3</property> - </packing> - </child> - <child> - <placeholder/> - </child> - </object> - </child> - </object> - <object class="GtkAccelGroup" id="accelgroup1"/> - <object class="GtkDialog" id="content_dialog"> - <property name="border_width">5</property> - <property name="title" translatable="yes">Messages and Content</property> - <property name="default_width">800</property> - <property name="default_height">600</property> - <property name="type_hint">normal</property> - <property name="has_separator">False</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox3"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">2</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <object class="GtkTextView" id="content_textview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area3"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="content_dialog_ok_button"> - <property name="label" translatable="yes">OK</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <signal name="activate" handler="on_ok_button_activate"/> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="0">content_dialog_ok_button</action-widget> - </action-widgets> - </object> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-save</property> - </object> - <object class="GtkImage" id="image2"> - <property name="visible">True</property> - <property name="stock">gtk-save-as</property> - </object> - <object class="GtkImage" id="image3"> - <property name="visible">True</property> - <property name="stock">gtk-open</property> - </object> - <object class="GtkImage" id="image4"> - <property name="visible">True</property> - <property name="stock">gtk-clear</property> - </object> - <object class="GtkImage" id="image5"> - <property name="visible">True</property> - <property name="stock">gtk-missing-image</property> - </object> -</interface> -""" - -## UI_SPECIFICATION ## -# Do not change the above 3 lines. - - - -if __name__ == "__main__": - main() - diff --git a/libgenerateDS/gui/generateds_gui.py b/libgenerateDS/gui/generateds_gui.py new file mode 120000 index 0000000..84913b4 --- /dev/null +++ b/libgenerateDS/gui/generateds_gui.py @@ -0,0 +1 @@ +../../gui/generateds_gui.py \ No newline at end of file diff --git a/libgenerateDS/gui/generateds_gui_session.py b/libgenerateDS/gui/generateds_gui_session.py deleted file mode 100644 index 6280722..0000000 --- a/libgenerateDS/gui/generateds_gui_session.py +++ /dev/null @@ -1,862 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Generated Wed Dec 8 14:24:46 2010 by generateDS.py version 2.3a. -# - -import sys -import getopt -import re as re_ - -etree_ = None -Verbose_import_ = False -( XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree - ) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError("Failed to import ElementTree from any known place") - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# User methods -# -# Calls to the methods in these classes are generated by generateDS.py. -# You can replace these methods by re-implementing the following class -# in a module named generatedssuper.py. - -try: - from generatedssuper import GeneratedsSuper -except ImportError, exp: - - class GeneratedsSuper(object): - def gds_format_string(self, input_data, input_name=''): - return input_data - def gds_format_integer(self, input_data, input_name=''): - return '%d' % input_data - def gds_format_float(self, input_data, input_name=''): - return '%f' % input_data - def gds_format_double(self, input_data, input_name=''): - return '%e' % input_data - def gds_format_boolean(self, input_data, input_name=''): - return '%s' % input_data - def gds_str_lower(self, instring): - return instring.lower() - - - -# -# 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]+") - -# -# Support/utility functions. -# - -def showIndent(outfile, level): - for idx in range(level): - outfile.write(' ') - -def quote_xml(inStr): - if not inStr: - return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - return s1 - -def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - if '"' in s1: - if "'" in s1: - s1 = '"%s"' % s1.replace('"', """) - else: - s1 = "'%s'" % s1 - else: - s1 = '"%s"' % s1 - return s1 - -def quote_python(inStr): - s1 = inStr - if s1.find("'") == -1: - if s1.find('\n') == -1: - return "'%s'" % s1 - else: - return "'''%s'''" % s1 - else: - if s1.find('"') != -1: - s1 = s1.replace('"', '\\"') - if s1.find('\n') == -1: - return '"%s"' % s1 - else: - return '"""%s"""' % s1 - - -def get_all_text_(node): - if node.text is not None: - text = node.text - else: - text = '' - for child in node: - if child.tail is not None: - text += child.tail - return text - - -class GDSParseError(Exception): - pass - -def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) - raise GDSParseError(msg) - - -class MixedContainer: - # Constants for category: - CategoryNone = 0 - CategoryText = 1 - CategorySimple = 2 - CategoryComplex = 3 - # Constants for content_type: - TypeNone = 0 - TypeText = 1 - TypeString = 2 - TypeInteger = 3 - TypeFloat = 4 - TypeDecimal = 5 - TypeDouble = 6 - TypeBoolean = 7 - 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): - 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) - 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)) - def exportLiteral(self, outfile, level, name): - if self.category == MixedContainer.CategoryText: - showIndent(outfile, level) - outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \ - (self.category, self.content_type, self.name, self.value)) - elif self.category == MixedContainer.CategorySimple: - showIndent(outfile, level) - outfile.write('model_.MixedContainer(%d, %d, "%s", "%s"),\n' % \ - (self.category, self.content_type, self.name, self.value)) - else: # category == MixedContainer.CategoryComplex - showIndent(outfile, level) - outfile.write('model_.MixedContainer(%d, %d, "%s",\n' % \ - (self.category, self.content_type, self.name,)) - self.value.exportLiteral(outfile, level + 1) - showIndent(outfile, level) - outfile.write(')\n') - - -class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0): - self.name = name - self.data_type = data_type - self.container = container - def set_name(self, name): self.name = name - def get_name(self): return self.name - def set_data_type(self, data_type): self.data_type = data_type - def get_data_type_chain(self): return self.data_type - def get_data_type(self): - if isinstance(self.data_type, list): - if len(self.data_type) > 0: - return self.data_type[-1] - else: - return 'xs:string' - else: - return self.data_type - def set_container(self, container): self.container = container - def get_container(self): return self.container - -def _cast(typ, value): - if typ is None or value is None: - return value - return typ(value) - -# -# Mixin class for additional behaviors. -# - -class SessionTypeMixin(object): - def copy(self): - """Produce a copy of myself. - """ - new_session = sessionType( - input_schema = self.input_schema, - output_superclass = self.output_superclass, - output_subclass = self.output_subclass, - force = self.force, - prefix = self.prefix, - namespace_prefix = self.namespace_prefix, - empty_namespace_prefix = self.empty_namespace_prefix, - behavior_filename = self.behavior_filename, - properties = self.properties, - subclass_suffix = self.subclass_suffix, - root_element = self.root_element, - superclass_module = self.superclass_module, - auto_super = self.auto_super, - old_getters_setters = self.old_getters_setters, - validator_bodies = self.validator_bodies, - user_methods = self.user_methods, - no_dates = self.no_dates, - no_versions = self.no_versions, - no_process_includes = self.no_process_includes, - silence = self.silence, - namespace_defs = self.namespace_defs, - external_encoding = self.external_encoding, - member_specs = self.member_specs, - ) - return new_session - - def __eq__(self, obj): - """Implement the == operator. - """ - if ( - obj.input_schema == self.input_schema and - obj.output_superclass == self.output_superclass and - obj.output_subclass == self.output_subclass and - obj.force == self.force and - obj.prefix == self.prefix and - obj.namespace_prefix == self.namespace_prefix and - obj.empty_namespace_prefix == self.empty_namespace_prefix and - obj.behavior_filename == self.behavior_filename and - obj.properties == self.properties and - obj.subclass_suffix == self.subclass_suffix and - obj.root_element == self.root_element and - obj.superclass_module == self.superclass_module and - obj.auto_super == self.auto_super and - obj.old_getters_setters == self.old_getters_setters and - obj.validator_bodies == self.validator_bodies and - obj.user_methods == self.user_methods and - obj.no_dates == self.no_dates and - obj.no_versions == self.no_versions and - obj.no_process_includes == self.no_process_includes and - obj.silence == self.silence and - obj.namespace_defs == self.namespace_defs and - obj.external_encoding == self.external_encoding and - obj.member_specs == self.member_specs): - return True - else: - return False - - def __ne__(self, obj): - """Implement the != operator. - """ - return not self.__eq__(obj) - -# -# Data representation classes. -# - -class sessionType(GeneratedsSuper, SessionTypeMixin): - member_data_items_ = [ - MemberSpec_('input_schema', 'xs:string', 0), - MemberSpec_('output_superclass', 'xs:string', 0), - MemberSpec_('output_subclass', 'xs:string', 0), - MemberSpec_('force', 'xs:boolean', 0), - MemberSpec_('prefix', 'xs:string', 0), - MemberSpec_('namespace_prefix', 'xs:string', 0), - MemberSpec_('empty_namespace_prefix', 'xs:boolean', 0), - MemberSpec_('behavior_filename', 'xs:string', 0), - MemberSpec_('properties', 'xs:boolean', 0), - MemberSpec_('subclass_suffix', 'xs:string', 0), - MemberSpec_('root_element', 'xs:string', 0), - MemberSpec_('superclass_module', 'xs:string', 0), - MemberSpec_('auto_super', 'xs:boolean', 0), - MemberSpec_('old_getters_setters', 'xs:boolean', 0), - MemberSpec_('validator_bodies', 'xs:string', 0), - MemberSpec_('user_methods', 'xs:string', 0), - MemberSpec_('no_dates', 'xs:boolean', 0), - MemberSpec_('no_versions', 'xs:boolean', 0), - MemberSpec_('no_process_includes', 'xs:boolean', 0), - MemberSpec_('silence', 'xs:boolean', 0), - MemberSpec_('namespace_defs', 'xs:string', 0), - MemberSpec_('external_encoding', 'xs:string', 0), - MemberSpec_('member_specs', 'xs:string', 0), - ] - subclass = None - superclass = None - def __init__(self, input_schema=None, output_superclass=None, output_subclass=None, force=None, prefix=None, namespace_prefix=None, empty_namespace_prefix=None, behavior_filename=None, properties=None, subclass_suffix=None, root_element=None, superclass_module=None, auto_super=None, old_getters_setters=None, validator_bodies=None, user_methods=None, no_dates=None, no_versions=None, no_process_includes=None, silence=None, namespace_defs=None, external_encoding=None, member_specs=None): - self.input_schema = input_schema - self.output_superclass = output_superclass - self.output_subclass = output_subclass - self.force = force - self.prefix = prefix - self.namespace_prefix = namespace_prefix - self.empty_namespace_prefix = empty_namespace_prefix - self.behavior_filename = behavior_filename - self.properties = properties - self.subclass_suffix = subclass_suffix - self.root_element = root_element - self.superclass_module = superclass_module - self.auto_super = auto_super - self.old_getters_setters = old_getters_setters - self.validator_bodies = validator_bodies - self.user_methods = user_methods - self.no_dates = no_dates - self.no_versions = no_versions - self.no_process_includes = no_process_includes - self.silence = silence - self.namespace_defs = namespace_defs - self.external_encoding = external_encoding - self.member_specs = member_specs - def factory(*args_, **kwargs_): - if sessionType.subclass: - return sessionType.subclass(*args_, **kwargs_) - else: - return sessionType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_input_schema(self): return self.input_schema - def set_input_schema(self, input_schema): self.input_schema = input_schema - def get_output_superclass(self): return self.output_superclass - def set_output_superclass(self, output_superclass): self.output_superclass = output_superclass - def get_output_subclass(self): return self.output_subclass - def set_output_subclass(self, output_subclass): self.output_subclass = output_subclass - def get_force(self): return self.force - def set_force(self, force): self.force = force - def get_prefix(self): return self.prefix - def set_prefix(self, prefix): self.prefix = prefix - def get_namespace_prefix(self): return self.namespace_prefix - def set_namespace_prefix(self, namespace_prefix): self.namespace_prefix = namespace_prefix - def get_empty_namespace_prefix(self): return self.empty_namespace_prefix - def set_empty_namespace_prefix(self, empty_namespace_prefix): self.empty_namespace_prefix = empty_namespace_prefix - def get_behavior_filename(self): return self.behavior_filename - def set_behavior_filename(self, behavior_filename): self.behavior_filename = behavior_filename - def get_properties(self): return self.properties - def set_properties(self, properties): self.properties = properties - def get_subclass_suffix(self): return self.subclass_suffix - def set_subclass_suffix(self, subclass_suffix): self.subclass_suffix = subclass_suffix - def get_root_element(self): return self.root_element - def set_root_element(self, root_element): self.root_element = root_element - def get_superclass_module(self): return self.superclass_module - def set_superclass_module(self, superclass_module): self.superclass_module = superclass_module - def get_auto_super(self): return self.auto_super - def set_auto_super(self, auto_super): self.auto_super = auto_super - def get_old_getters_setters(self): return self.old_getters_setters - def set_old_getters_setters(self, old_getters_setters): self.old_getters_setters = old_getters_setters - def get_validator_bodies(self): return self.validator_bodies - def set_validator_bodies(self, validator_bodies): self.validator_bodies = validator_bodies - def get_user_methods(self): return self.user_methods - def set_user_methods(self, user_methods): self.user_methods = user_methods - def get_no_dates(self): return self.no_dates - def set_no_dates(self, no_dates): self.no_dates = no_dates - def get_no_versions(self): return self.no_versions - def set_no_versions(self, no_versions): self.no_versions = no_versions - def get_no_process_includes(self): return self.no_process_includes - def set_no_process_includes(self, no_process_includes): self.no_process_includes = no_process_includes - def get_silence(self): return self.silence - def set_silence(self, silence): self.silence = silence - def get_namespace_defs(self): return self.namespace_defs - def set_namespace_defs(self, namespace_defs): self.namespace_defs = namespace_defs - def get_external_encoding(self): return self.external_encoding - def set_external_encoding(self, external_encoding): self.external_encoding = external_encoding - def get_member_specs(self): return self.member_specs - def set_member_specs(self, member_specs): self.member_specs = member_specs - def export(self, outfile, level, namespace_='', name_='sessionType', namespacedef_=''): - showIndent(outfile, level) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - self.exportAttributes(outfile, level, [], namespace_, name_='sessionType') - if self.hasContent_(): - outfile.write('>\n') - self.exportChildren(outfile, level + 1, namespace_, name_) - showIndent(outfile, level) - outfile.write('</%s%s>\n' % (namespace_, name_)) - else: - outfile.write('/>\n') - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='sessionType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='sessionType'): - if self.input_schema is not None: - showIndent(outfile, level) - outfile.write('<%sinput_schema>%s</%sinput_schema>\n' % (namespace_, self.gds_format_string(quote_xml(self.input_schema).encode(ExternalEncoding), input_name='input_schema'), namespace_)) - if self.output_superclass is not None: - showIndent(outfile, level) - outfile.write('<%soutput_superclass>%s</%soutput_superclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_superclass).encode(ExternalEncoding), input_name='output_superclass'), namespace_)) - if self.output_subclass is not None: - showIndent(outfile, level) - outfile.write('<%soutput_subclass>%s</%soutput_subclass>\n' % (namespace_, self.gds_format_string(quote_xml(self.output_subclass).encode(ExternalEncoding), input_name='output_subclass'), namespace_)) - if self.force is not None: - showIndent(outfile, level) - outfile.write('<%sforce>%s</%sforce>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.force)), input_name='force'), namespace_)) - if self.prefix is not None: - showIndent(outfile, level) - outfile.write('<%sprefix>%s</%sprefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.prefix).encode(ExternalEncoding), input_name='prefix'), namespace_)) - if self.namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('<%snamespace_prefix>%s</%snamespace_prefix>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_prefix).encode(ExternalEncoding), input_name='namespace_prefix'), namespace_)) - if self.empty_namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('<%sempty_namespace_prefix>%s</%sempty_namespace_prefix>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.empty_namespace_prefix)), input_name='empty_namespace_prefix'), namespace_)) - if self.behavior_filename is not None: - showIndent(outfile, level) - outfile.write('<%sbehavior_filename>%s</%sbehavior_filename>\n' % (namespace_, self.gds_format_string(quote_xml(self.behavior_filename).encode(ExternalEncoding), input_name='behavior_filename'), namespace_)) - if self.properties is not None: - showIndent(outfile, level) - outfile.write('<%sproperties>%s</%sproperties>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.properties)), input_name='properties'), namespace_)) - if self.subclass_suffix is not None: - showIndent(outfile, level) - outfile.write('<%ssubclass_suffix>%s</%ssubclass_suffix>\n' % (namespace_, self.gds_format_string(quote_xml(self.subclass_suffix).encode(ExternalEncoding), input_name='subclass_suffix'), namespace_)) - if self.root_element is not None: - showIndent(outfile, level) - outfile.write('<%sroot_element>%s</%sroot_element>\n' % (namespace_, self.gds_format_string(quote_xml(self.root_element).encode(ExternalEncoding), input_name='root_element'), namespace_)) - if self.superclass_module is not None: - showIndent(outfile, level) - outfile.write('<%ssuperclass_module>%s</%ssuperclass_module>\n' % (namespace_, self.gds_format_string(quote_xml(self.superclass_module).encode(ExternalEncoding), input_name='superclass_module'), namespace_)) - if self.auto_super is not None: - showIndent(outfile, level) - outfile.write('<%sauto_super>%s</%sauto_super>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.auto_super)), input_name='auto_super'), namespace_)) - if self.old_getters_setters is not None: - showIndent(outfile, level) - outfile.write('<%sold_getters_setters>%s</%sold_getters_setters>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.old_getters_setters)), input_name='old_getters_setters'), namespace_)) - if self.validator_bodies is not None: - showIndent(outfile, level) - outfile.write('<%svalidator_bodies>%s</%svalidator_bodies>\n' % (namespace_, self.gds_format_string(quote_xml(self.validator_bodies).encode(ExternalEncoding), input_name='validator_bodies'), namespace_)) - if self.user_methods is not None: - showIndent(outfile, level) - outfile.write('<%suser_methods>%s</%suser_methods>\n' % (namespace_, self.gds_format_string(quote_xml(self.user_methods).encode(ExternalEncoding), input_name='user_methods'), namespace_)) - if self.no_dates is not None: - showIndent(outfile, level) - outfile.write('<%sno_dates>%s</%sno_dates>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_dates)), input_name='no_dates'), namespace_)) - if self.no_versions is not None: - showIndent(outfile, level) - outfile.write('<%sno_versions>%s</%sno_versions>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_versions)), input_name='no_versions'), namespace_)) - if self.no_process_includes is not None: - showIndent(outfile, level) - outfile.write('<%sno_process_includes>%s</%sno_process_includes>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.no_process_includes)), input_name='no_process_includes'), namespace_)) - if self.silence is not None: - showIndent(outfile, level) - outfile.write('<%ssilence>%s</%ssilence>\n' % (namespace_, self.gds_format_boolean(self.gds_str_lower(str(self.silence)), input_name='silence'), namespace_)) - if self.namespace_defs is not None: - showIndent(outfile, level) - outfile.write('<%snamespace_defs>%s</%snamespace_defs>\n' % (namespace_, self.gds_format_string(quote_xml(self.namespace_defs).encode(ExternalEncoding), input_name='namespace_defs'), namespace_)) - if self.external_encoding is not None: - showIndent(outfile, level) - outfile.write('<%sexternal_encoding>%s</%sexternal_encoding>\n' % (namespace_, self.gds_format_string(quote_xml(self.external_encoding).encode(ExternalEncoding), input_name='external_encoding'), namespace_)) - if self.member_specs is not None: - showIndent(outfile, level) - outfile.write('<%smember_specs>%s</%smember_specs>\n' % (namespace_, self.gds_format_string(quote_xml(self.member_specs).encode(ExternalEncoding), input_name='member_specs'), namespace_)) - def hasContent_(self): - if ( - self.input_schema is not None or - self.output_superclass is not None or - self.output_subclass is not None or - self.force is not None or - self.prefix is not None or - self.namespace_prefix is not None or - self.empty_namespace_prefix is not None or - self.behavior_filename is not None or - self.properties is not None or - self.subclass_suffix is not None or - self.root_element is not None or - self.superclass_module is not None or - self.auto_super is not None or - self.old_getters_setters is not None or - self.validator_bodies is not None or - self.user_methods is not None or - self.no_dates is not None or - self.no_versions is not None or - self.no_process_includes is not None or - self.silence is not None or - self.namespace_defs is not None or - self.external_encoding is not None or - self.member_specs is not None - ): - return True - else: - return False - def exportLiteral(self, outfile, level, name_='sessionType'): - level += 1 - self.exportLiteralAttributes(outfile, level, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.input_schema is not None: - showIndent(outfile, level) - outfile.write('input_schema=%s,\n' % quote_python(self.input_schema).encode(ExternalEncoding)) - if self.output_superclass is not None: - showIndent(outfile, level) - outfile.write('output_superclass=%s,\n' % quote_python(self.output_superclass).encode(ExternalEncoding)) - if self.output_subclass is not None: - showIndent(outfile, level) - outfile.write('output_subclass=%s,\n' % quote_python(self.output_subclass).encode(ExternalEncoding)) - if self.force is not None: - showIndent(outfile, level) - outfile.write('force=%s,\n' % self.force) - if self.prefix is not None: - showIndent(outfile, level) - outfile.write('prefix=%s,\n' % quote_python(self.prefix).encode(ExternalEncoding)) - if self.namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('namespace_prefix=%s,\n' % quote_python(self.namespace_prefix).encode(ExternalEncoding)) - if self.empty_namespace_prefix is not None: - showIndent(outfile, level) - outfile.write('empty_namespace_prefix=%s,\n' % self.empty_namespace_prefix) - if self.behavior_filename is not None: - showIndent(outfile, level) - outfile.write('behavior_filename=%s,\n' % quote_python(self.behavior_filename).encode(ExternalEncoding)) - if self.properties is not None: - showIndent(outfile, level) - outfile.write('properties=%s,\n' % self.properties) - if self.subclass_suffix is not None: - showIndent(outfile, level) - outfile.write('subclass_suffix=%s,\n' % quote_python(self.subclass_suffix).encode(ExternalEncoding)) - if self.root_element is not None: - showIndent(outfile, level) - outfile.write('root_element=%s,\n' % quote_python(self.root_element).encode(ExternalEncoding)) - if self.superclass_module is not None: - showIndent(outfile, level) - outfile.write('superclass_module=%s,\n' % quote_python(self.superclass_module).encode(ExternalEncoding)) - if self.auto_super is not None: - showIndent(outfile, level) - outfile.write('auto_super=%s,\n' % self.auto_super) - if self.old_getters_setters is not None: - showIndent(outfile, level) - outfile.write('old_getters_setters=%s,\n' % self.old_getters_setters) - if self.validator_bodies is not None: - showIndent(outfile, level) - outfile.write('validator_bodies=%s,\n' % quote_python(self.validator_bodies).encode(ExternalEncoding)) - if self.user_methods is not None: - showIndent(outfile, level) - outfile.write('user_methods=%s,\n' % quote_python(self.user_methods).encode(ExternalEncoding)) - if self.no_dates is not None: - showIndent(outfile, level) - outfile.write('no_dates=%s,\n' % self.no_dates) - if self.no_versions is not None: - showIndent(outfile, level) - outfile.write('no_versions=%s,\n' % self.no_versions) - if self.no_process_includes is not None: - showIndent(outfile, level) - outfile.write('no_process_includes=%s,\n' % self.no_process_includes) - if self.silence is not None: - showIndent(outfile, level) - outfile.write('silence=%s,\n' % self.silence) - if self.namespace_defs is not None: - showIndent(outfile, level) - outfile.write('namespace_defs=%s,\n' % quote_python(self.namespace_defs).encode(ExternalEncoding)) - if self.external_encoding is not None: - showIndent(outfile, level) - outfile.write('external_encoding=%s,\n' % quote_python(self.external_encoding).encode(ExternalEncoding)) - if self.member_specs is not None: - showIndent(outfile, level) - outfile.write('member_specs=%s,\n' % quote_python(self.member_specs).encode(ExternalEncoding)) - def build(self, node): - self.buildAttributes(node, node.attrib, []) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, nodeName_, from_subclass=False): - if nodeName_ == 'input_schema': - input_schema_ = child_.text - self.input_schema = input_schema_ - elif nodeName_ == 'output_superclass': - output_superclass_ = child_.text - self.output_superclass = output_superclass_ - elif nodeName_ == 'output_subclass': - output_subclass_ = child_.text - self.output_subclass = output_subclass_ - elif nodeName_ == 'force': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.force = ival_ - elif nodeName_ == 'prefix': - prefix_ = child_.text - self.prefix = prefix_ - elif nodeName_ == 'namespace_prefix': - namespace_prefix_ = child_.text - self.namespace_prefix = namespace_prefix_ - elif nodeName_ == 'empty_namespace_prefix': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.empty_namespace_prefix = ival_ - elif nodeName_ == 'behavior_filename': - behavior_filename_ = child_.text - self.behavior_filename = behavior_filename_ - elif nodeName_ == 'properties': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.properties = ival_ - elif nodeName_ == 'subclass_suffix': - subclass_suffix_ = child_.text - self.subclass_suffix = subclass_suffix_ - elif nodeName_ == 'root_element': - root_element_ = child_.text - self.root_element = root_element_ - elif nodeName_ == 'superclass_module': - superclass_module_ = child_.text - self.superclass_module = superclass_module_ - elif nodeName_ == 'auto_super': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.auto_super = ival_ - elif nodeName_ == 'old_getters_setters': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.old_getters_setters = ival_ - elif nodeName_ == 'validator_bodies': - validator_bodies_ = child_.text - self.validator_bodies = validator_bodies_ - elif nodeName_ == 'user_methods': - user_methods_ = child_.text - self.user_methods = user_methods_ - elif nodeName_ == 'no_dates': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.no_dates = ival_ - elif nodeName_ == 'no_versions': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.no_versions = ival_ - elif nodeName_ == 'no_process_includes': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.no_process_includes = ival_ - elif nodeName_ == 'silence': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - self.silence = ival_ - elif nodeName_ == 'namespace_defs': - namespace_defs_ = child_.text - self.namespace_defs = namespace_defs_ - elif nodeName_ == 'external_encoding': - external_encoding_ = child_.text - self.external_encoding = external_encoding_ - elif nodeName_ == 'member_specs': - member_specs_ = child_.text - self.member_specs = member_specs_ -# end class sessionType - - -USAGE_TEXT = """ -Usage: python <Parser>.py [ -s ] <in_xml_file> -""" - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def get_root_tag(node): - tag = Tag_pattern_.match(node.tag).groups()[-1] - rootClass = globals().get(tag) - return tag, rootClass - - -def parse(inFileName): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'session' - rootClass = sessionType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export(sys.stdout, 0, name_=rootTag, - namespacedef_='') - return rootObj - - -def parseString(inString): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'session' - rootClass = sessionType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export(sys.stdout, 0, name_="session", - namespacedef_='') - return rootObj - - -def parseLiteral(inFileName): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'session' - rootClass = sessionType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - sys.stdout.write('#from generateds_gui_session import *\n\n') - sys.stdout.write('import generateds_gui_session as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') - rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) - sys.stdout.write(')\n') - return rootObj - - -def main(): - args = sys.argv[1:] - if len(args) == 1: - parse(args[0]) - else: - usage() - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() - - -__all__ = [ - "sessionType" - ] diff --git a/libgenerateDS/gui/generateds_gui_session.py b/libgenerateDS/gui/generateds_gui_session.py new file mode 120000 index 0000000..15763a3 --- /dev/null +++ b/libgenerateDS/gui/generateds_gui_session.py @@ -0,0 +1 @@ +../../gui/generateds_gui_session.py \ No newline at end of file diff --git a/librarytemplate-1.0a.zip b/librarytemplate-1.0a.zip index 36313a504fbc4cd9ecbd5edd471eb7dc426c432f..3abcb751cdb9c86cfca169cc3b903f354eee146e 100644 GIT binary patch delta 1472 zcmZWpdo+}39R6m^7`cu$VlHQlYR6>^b0O+r#u%az;}S`6Dy$5#M;o!uj4~~Cu;VQi z<*th*n>lE=spNLHR!EzoB27xvh-y(`zi)Q?r~S@(zRUCbz0do8=l7gvC;{v>7K?N+ z`Vevn;v_<aF+<PrJF8Hic&ku_7ZFpMmFuI3X6bP?vM^m3FsEqZVP%!V02#RKNB}Il zp3($0Yie`~?lg>=Jz9W*pgCY<#*#Y0{Rn=@Fn~~)NgW8%-Wq|IsEdV{&n%j!g$-!3 zZ-Pub0fYUp?%w_bW^G#p#oLc9jGe7*luTD!q$PItei~H;HU+$IO^o|%C{H<T`fSO= z&&SA<oHVJf8T!_?ey1$q=0S!XCPVd`Zn8kQc9lKj(UE}X`ck=RlD`M<Ziua`k*geU zveDj6w(;Y^h%3vMnU4+$b<RFebR}DzaG@ppBuSWEc8{w~Fgp}1P<O2+wy>l<r6dp| zd!HLz_U1tX>NS0Si;Co3`F&teU#KPRb#*#nTTOMr`moDgUQgY4?bn`-);VUDiYSIP ze(G|YCg=2zC#4?Y#)H!w33qZ{$a!Ji?J+ETnaE@(-?7X_x9AkdXM~TDw{e<JJ4hE_ zG+0qa=H#)xQLPJkJM1*geEj))rq7nof3mhp$Y_(0JadeniZ!XCfn72tagMSBOHL_M zo%@vUooE-X7Ig$pSfn>x{b>crn=5oOnB_e#O{+X?aM2^{I~tCx_ykF+cJH6QUqAhO zbw|WVOZ~n9!ca=Y*zK)JiHd$3FhTIe*{<Cb07J<!@4<XET_ULyg;Vtl17H9(xk7i! zI3{4qSeZvDK$-Gk&-9)#ztam(Jr@H(G+=5*1U#yVR1bC$;+U_dUl$@uDdXd>&orId zlf|m_*gjWPzjgvI3O=*>&8_Vvm(%ZO(+=oW+OAyd6i{}jT_AMj$WPDQihp-eq*4j% z?%q0l(l{oj(XQ(y-c^vqt{(}DJ!D}~ap_g1%g`a;s2u!mi$sjNs7iWZE>ntLG$V-z z5Bo%BrFI^55O}BN^j&bd)IHJRmL(`^S@&3@tgoQE1h@3PYfV;$c&f*IqinKQPlbAt zA3S$BylhxL5K2hf`-{lvb!vM|<5Pe2iT04<+>V98g-~~q{rEPV4V18JVqQb-aUDkQ z^zP}&e`~=bPmMp!aFNCmQT}o5!vZr!nvDmG)h}Q;9xvz?DkkE@Y%5xumrLQ6^ZR5o z*fuCV=xUZPlV>O)R`K6+Px{}yKG>74`Vc;-P($8^KW`pac7LcH7d!WqEDrGd_B^cP z&`;D92T$Vv&I(~;^&8jQN5;?B-1x&Gri83+xGwlpe-wKoe%3D{(!Ex5DzTz4|IUKn zAj3VXsF$9f@7)!-hM(Pi<KX9tL;XM6A9qt{P5P%byh>g(9%zBu#Ow9ks{iYz&w6FN z(dCDlecY+M4e~2oh2Y7t;i9FbbJKJCO-SY3g_0+J?C2E;ytVSdmCA(yFcf@}GMwgZ zfI)%;oMmjlAV~sDnC3w2psS4%u*mSlAX)Ms8;U|wgbF$w?tT>@l}t|z5*~0P87wiW z=y3w5Vp#&Bxrr_o(t*7SP%H|Fcch{(5w(?a$8WT1?q~y&mcTiQ(Z|Tz*G}?kWEJAz zaV7;^bfTi+2cj28Az|Rk6j*U`N6#W04eVqIQ2wBj6-4`=y&+3&RKjkDYIAT@tpty1 zh=U~%!+-f%u$2w(K!eLfP{_ukN<jtN9i9I#5zR3GD2@O<@#QlD-E6H@>gR~jcsj7= g#-Sy2n4y9MIv%ug`Dm=IRts55ady_d%|MRv54&1o!~g&Q delta 1404 zcmbQ7c`bu4z?+$civa{ShOyaB<kM!A^NI0!F<HS_ga;<0p2=Z5G0uSFC11SH86ckM zC^>PxJxBcl7oXGHJb_%{$^24moB0_(3i2-Z`D!C{I;C$SBLl<N$-Ke_jFyuZ@`~3_ zHuOJiAkbR=zf0P&DP{c;79J0UP^OgzipO_eTh^I-v+vT1ru*k^dS*-x+weeh<GXv` z-#z`bpxHQ8xyfkOT_3*W-+RS{vj45C?43V<s+L1isx1riHOa<%hhJY-)_BW&ooS)T zqLqQ{t0veqXl_`nK8JhhvVUsHIZK;bj8}AD-d%sDZ2E<nY%JF=Scy*1-L25emguDt z&3$ZL;>o%03%WWab!BB-i!IpYB6lS*98%=>%CB?#oN#Sr{*%x<)iTdYGGu?rIq6w- z&ol9g(e73CoWsiZnR$=LtGTa>+JiecC#DqMx&1<Px!?ay?x*4`LRE5^{?79_v?l4! zV&A;nr7ZpR(Z(+Fj=udzIOkpAXM5I@qIUBB`!$7oor7x@aAclNlb@({vsmcEn<|^0 zy>oWG|J*pMZ1<sm!W#V3x^?d>Y`Jro&D4r(UCUPE(x}UakJxQX`T0R;WAe|t#xLa_ z{7+f<Vi`kJ_x8lI+E4nJ^nHXAf}H;^I?Os*@rLWX?YXlp@4OW@N__Qa^&PWKt9G92 zw@O)|J?)(N<cA_|?CQ$yK9jb4Zq^e$#)2H9oB5?qGP3VJ@8TnH&2#d7>G^D+*gwg$ zxkaXzk?%nCH=E`80ruU%SpLsESzb=NUcJx5XTdX1pVA6$21b?_%nS@*V(BD%P{bcC zukVsh%-Ez{>LAkD=+)8068zLEJm;bP#M(fqg`aNjv|#j_&A2kG?a8C+{pIK9oj)J- z=&`b9uiv`8B|Gj%Zx(#6d9F1gA?V_jlqPZa{eFcPq_Q0suXW_u$Rl|0M{b8-{k(7e zO6wOgs@g_Ox!C+V`iYtei~FlJQXjo!%z3KsUr3(P(j6LD{@BkqBz|h@?QO0{?yd_s zICcKj>cwj(@3VPv;fc=cdo2DhG&`NkHz!Nmr1Z}?`@r*Y=W(w|ExjM7e$0P)Je2je z#2khNoztd2wdI+b#B_ba#!MEw&$}1$ZR-uMubsm=A%syz--Oe$>XL1vr7-(rr>hZX zIu@;I@=Dd;$+4=?ro>L}L3+}yg{d0+v45ZJ-xfTNFDf_W+2*N?({7wRT2hnqM<~i} z+5Mh<mY1%IUAOdbTl*<}ndE$rs@8zsWx|(L3@w(_y?AdF5dL|q_kYjd?aQ57+4r>f znJk~UT2l28qdynlXM@@^;t8!k!nf7z*&C;m&wWeKxOIndr_-Aw2X&>di%-^7aOIfU z>f*B<oNpyJPgZc|W&!2=$+xsEC(9elvw$-DWHTK*W?+0z{-7r|xmPEcv3~MHo%d*Y z`>w7Xv!#+dP>sxFD?K@;ry`R-=*mu(66IoJWnc!TE3odldMZqtB*8Kd^mxGr$xY_b zmt*3W0t(7c_SW}g>X!z~ACVSh1?t>=e)4-g*~#WILX&^!^Dr68fF;vpL_x;F92H`q z!t@m+BQbft8r$R<1};p#vT*Jn0|N!rB+9^`z#suG=71@dVM!ym99Xfn91qyBeI8)P z_86)#eUJys>{VdrNl7e8)DH~-T0659=qB;WUkp_keI_>=sZO>ta$;NoWEC=%DuUJX o7zZ$2Rs}Q5jD4B()WFR7YGRW=8#^$aPzQ5;O&r*IwL#7R01SjkmjD0& diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html index ca714f8..47bc84a 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.12: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> <title>How to package a generateDS.py generated library</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -187,9 +187,12 @@ div.warning p.admonition-title { font-family: sans-serif } tt.docutils { - background-color: #eeeeee; + background-color: #dddddd; } +ul.auto-toc { + list-style-type: none } + </style> </head> <body> @@ -203,8 +206,8 @@ tt.docutils { <td>Dave Kuhlman</td></tr> <tr><th class="docinfo-name">Address:</th> <td><pre class="address"> -<a class="first reference external" href="mailto:dkuhlman@rexx.com">dkuhlman@rexx.com</a> -<a class="last reference external" href="http://www.rexx.com/~dkuhlman">http://www.rexx.com/~dkuhlman</a> +dkuhlman (at) davekuhlman (dot) org +<a class="last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a> </pre> </td></tr> </tbody> @@ -214,7 +217,7 @@ tt.docutils { <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.11a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -223,7 +226,7 @@ tt.docutils { <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">August 16, 2013</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td> </tr> </tbody> </table> @@ -247,15 +250,15 @@ formats (for example HTML, LaTeX, PDF) with Sphinx</li> </ul> <p>The latest copy of these instructions is here:</p> <blockquote> -<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate_howto.html">http://www.rexx.com/~dkuhlman/librarytemplate_howto.html</a></blockquote> +<a class="reference external" href="http://www.davekuhlman.org/librarytemplate_howto.html">http://www.davekuhlman.org/librarytemplate_howto.html</a></blockquote> <p>and the template package itself is here:</p> <blockquote> -<a class="reference external" href="http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip">http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip</a></blockquote> +<a class="reference external" href="http://www.davekuhlman.org/librarytemplate-1.0a.zip">http://www.davekuhlman.org/librarytemplate-1.0a.zip</a></blockquote> <p>These instructions assume the name "peach" as the name of the schema. You should replace "peach" in these instructions with the name of your schema.</p> <p>Find out more about generateDS.py here: -<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p> +<a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p> <p>You will need to install Sphinx in order to build the documentation in your package. Learn about Sphinx here: <a class="reference external" href="http://sphinx.pocoo.org/">http://sphinx.pocoo.org/</a>.</p> </div> @@ -377,6 +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-01-17 00:01 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 9948374..6969b4d 100644 --- a/librarytemplate_howto.txt +++ b/librarytemplate_howto.txt @@ -3,12 +3,12 @@ How to package a generateDS.py generated library ================================================== :author: Dave Kuhlman -:address: dkuhlman@rexx.com - http://www.rexx.com/~dkuhlman +:address: dkuhlman (at) davekuhlman (dot) org + http://www.davekuhlman.org .. version -:revision: 2.11b +:revision: 2.24b .. version @@ -44,18 +44,18 @@ below will help you to create the following: The latest copy of these instructions is here: - http://www.rexx.com/~dkuhlman/librarytemplate_howto.html + http://www.davekuhlman.org/librarytemplate_howto.html and the template package itself is here: - http://www.rexx.com/~dkuhlman/librarytemplate0-1.0a.zip + http://www.davekuhlman.org/librarytemplate-1.0a.zip These instructions assume the name "peach" as the name of the schema. You should replace "peach" in these instructions with the name of your schema. Find out more about generateDS.py here: -http://www.rexx.com/~dkuhlman/generateDS.html +http://www.davekuhlman.org/generateDS.html You will need to install Sphinx in order to build the documentation in your package. Learn about Sphinx here: http://sphinx.pocoo.org/. diff --git a/process_includes.py b/process_includes.py index 4f4ab1d..8fe5493 100755 --- a/process_includes.py +++ b/process_includes.py @@ -15,13 +15,23 @@ Examples: import sys import os -import urllib2 +if sys.version_info.major == 2: + import urllib2 +else: + import urllib.request + import urllib.error + import urllib.parse import copy from optparse import OptionParser, Values import itertools from copy import deepcopy from lxml import etree +try: + from gds_inner_name_map import Inner_name_map +except ImportError: + Inner_name_map = None + # # Globals and constants @@ -30,16 +40,25 @@ from lxml import etree # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.11b' +VERSION = '2.24b' ##VERSION## -Namespaces = {'xs': 'http://www.w3.org/2001/XMLSchema'} -Xsd_namespace_uri = 'http://www.w3.org/2001/XMLSchema' CatalogDict = {} # the base url to use for all relative paths in the catalog CatalogBaseUrl = None +# +# Exceptions + +class SchemaIOError(IOError): + pass + + +class InnerNameMapError(Exception): + pass + + def load_catalog(catalogpath): global CatalogBaseUrl if catalogpath: @@ -61,7 +80,22 @@ def process_include_files( 'force': False, 'fixtypenames': fixtypenames, }) - prep_schema_doc(infile, outfile, inpath, options) + doc = prep_schema_doc(infile, outfile, inpath, options) + return doc + + +def get_all_root_file_paths(infile, inpath='', catalogpath=None): + load_catalog(catalogpath) + + doc1 = etree.parse(infile) + root1 = doc1.getroot() + rootPaths = [] + params = Params() + params.parent_url = infile + params.base_url = os.path.split(inpath)[0] + get_root_file_paths(root1, params, rootPaths) + rootPaths.append(inpath) + return rootPaths # @@ -78,17 +112,10 @@ class Params(object): def __setattr__(self, name, value): if name not in self.members: raise AttributeError('Class %s has no set-able attribute "%s"' % ( - self.__class__.__name__, name, )) + self.__class__.__name__, name, )) self.__dict__[name] = value -class SchemaIOError(IOError): - pass - - -class RaiseComplexTypesError(Exception): - pass - # # Functions for internal use and testing @@ -103,8 +130,7 @@ def clear_includes_and_imports(node): node.replace(child, repl) -def resolve_ref(node, params, options): - content = None +def get_ref_info(node, params): # first look for the schema location in the catalog, if not # there, then see if it's specified in the node namespace = node.get('namespace') @@ -122,7 +148,7 @@ def resolve_ref(node, params, options): msg = '*** Warning: missing "schemaLocation" attribute in %s\n' % ( params.parent_url, ) sys.stderr.write(msg) - return None + return (None, None) # Uncomment the next lines to help track down missing schemaLocation etc. # print '(resolve_ref) url: %s\n parent-url: %s' % ( # url, params.parent_url, ) @@ -139,10 +165,19 @@ def resolve_ref(node, params, options): else: locn = url schema_name = url - if not ( - url.startswith('/') or - url.startswith('http:') or - url.startswith('ftp:')): + + return locn, schema_name + + +def resolve_ref(node, params, options): + content = None + + locn, schema_name = get_ref_info(node, params) + + if locn is not None and not ( + locn.startswith('/') or + locn.startswith('http:') or + locn.startswith('ftp:')): schema_name = os.path.abspath(locn) if locn is not None: if schema_name not in params.already_processed: @@ -154,20 +189,26 @@ def resolve_ref(node, params, options): ## print ' locn : %s' % (locn, ) ## print ' schema_name : %s\n' % (schema_name, ) if locn.startswith('http:') or locn.startswith('ftp:'): + if sys.version_info.major == 2: + urllib_urlopen = urllib2.urlopen + urllib_httperror = urllib2.HTTPError + else: + urllib_urlopen = urllib.request.urlopen + urllib_httperror = urllib.error.HTTPError try: - urlfile = urllib2.urlopen(locn) + urlfile = urllib_urlopen(locn) content = urlfile.read() urlfile.close() params.parent_url = locn params.base_url = os.path.split(locn)[0] - except urllib2.HTTPError: + except urllib_httperror: msg = "Can't find file %s referenced in %s." % ( locn, params.parent_url, ) raise SchemaIOError(msg) else: if os.path.exists(locn): infile = open(locn) - content = infile.read() + content = infile.read().encode() infile.close() params.parent_url = locn params.base_url = os.path.split(locn)[0] @@ -184,17 +225,23 @@ def resolve_ref(node, params, options): def collect_inserts(node, params, inserts, options): namespace = node.nsmap[node.prefix] + roots = [] child_iter1 = node.iterfind('{%s}include' % (namespace, )) child_iter2 = node.iterfind('{%s}import' % (namespace, )) for child in itertools.chain(child_iter1, child_iter2): - collect_inserts_aux(child, params, inserts, options) + aux_roots = collect_inserts_aux(child, params, inserts, options) + roots.extend(aux_roots) + + return roots def collect_inserts_aux(child, params, inserts, options): + roots = [] save_base_url = params.base_url string_content = resolve_ref(child, params, options) if string_content is not None: root = etree.fromstring(string_content, base_url=params.base_url) + roots.append(root) for child1 in root: if not isinstance(child1, etree._Comment): namespace = child1.nsmap[child1.prefix] @@ -204,14 +251,42 @@ def collect_inserts_aux(child, params, inserts, options): comment.tail = '\n' inserts.append(comment) inserts.append(child1) - collect_inserts(root, params, inserts, options) + insert_roots = collect_inserts(root, params, inserts, options) + roots.extend(insert_roots) + params.base_url = save_base_url + return roots + + +def get_root_file_paths(node, params, rootPaths): + + namespace = node.nsmap[node.prefix] + child_iter1 = node.iterfind('{%s}include' % (namespace, )) + child_iter2 = node.iterfind('{%s}import' % (namespace, )) + for child in itertools.chain(child_iter1, child_iter2): + get_root_file_paths_aux(child, params, rootPaths) + + +def get_root_file_paths_aux(child, params, rootPaths): + save_base_url = params.base_url + path, _ = get_ref_info(child, params) + string_content = resolve_ref(child, params, None) + if string_content is not None: + root = etree.fromstring(string_content, base_url=params.base_url) + get_root_file_paths(root, params, rootPaths) + + if path is not None and path not in rootPaths: + rootPaths.append(path) + params.base_url = save_base_url def make_file(outFileName, options): outFile = None if (not options.force) and os.path.exists(outFileName): - reply = raw_input('File %s exists. Overwrite? (y/n): ' % outFileName) + if sys.version_info.major == 3: + raw_input = input + reply = raw_input( + 'File %s exists. Overwrite? (y/n): ' % outFileName) if reply == 'y': outFile = open(outFileName, 'w') else: @@ -235,7 +310,10 @@ def prep_schema_doc(infile, outfile, inpath, options): raise_anon_complextypes(root2) fix_type_names(root2, options) doc2 = etree.ElementTree(root2) - doc2.write(outfile) + if sys.version_info.major == 2: + doc2.write(outfile) + else: + outfile.write(etree.tostring(root2).decode('utf-8')) return doc2 @@ -259,10 +337,22 @@ def prep_schema(inpath, outpath, options): def process_groups(root): # Get all the xs:group definitions at top level. - defs = root.xpath('./xs:group', namespaces=Namespaces) + if root.prefix: + namespaces = {root.prefix: root.nsmap[root.prefix]} + pattern = './%s:group' % (root.prefix, ) + defs = root.xpath(pattern, namespaces=namespaces) + else: + pattern = './group' + defs = root.xpath(pattern) defs = [node for node in defs if node.get('name') is not None] # Get all the xs:group references (below top level). - refs = root.xpath('./*//xs:group', namespaces=Namespaces) + if root.prefix: + namespaces = {root.prefix: root.nsmap[root.prefix]} + pattern = './*//%s:group' % (root.prefix, ) + refs = root.xpath(pattern, namespaces=namespaces) + else: + pattern = './*//group' + refs = root.xpath(pattern) refs = [node for node in refs if node.get('ref') is not None] # Create a dictionary of the named model groups (definitions). def_dict = {} @@ -352,23 +442,27 @@ def replace_group_defs(def_dict, refs): if name is None: continue def_node = def_dict.get(name) + namespaces = {def_node.prefix: def_node.nsmap[def_node.prefix]} if def_node is not None: + pattern = './%s:sequence|./%s:choice|./%s:all' % ( + def_node.prefix, def_node.prefix, def_node.prefix, ) content = def_node.xpath( - './xs:sequence|./xs:choice|./xs:all', - namespaces=Namespaces) + pattern, + namespaces=namespaces) if content: content = content[0] parent = ref_node.getparent() for node in content: - new_node = deepcopy(node) - # Copy minOccurs and maxOccurs attributes to new node. - value = ref_node.get('minOccurs') - if value is not None: - new_node.set('minOccurs', value) - value = ref_node.get('maxOccurs') - if value is not None: - new_node.set('maxOccurs', value) - ref_node.addprevious(new_node) + if not isinstance(node, etree._Comment): + new_node = deepcopy(node) + # Copy minOccurs and maxOccurs attributes to new node. + value = ref_node.get('minOccurs') + if value is not None: + new_node.set('minOccurs', value) + value = ref_node.get('maxOccurs') + if value is not None: + new_node.set('maxOccurs', value) + ref_node.addprevious(new_node) parent.remove(ref_node) @@ -393,10 +487,12 @@ def raise_anon_complextypes(root): pattern = './*/*//%s:complexType|./*/*//%s:simpleType' % ( prefix, prefix, ) element_tag = '{%s}element' % (root.nsmap[prefix], ) + namespaces = {prefix: root.nsmap[prefix]} + defs = root.xpath(pattern, namespaces=namespaces) else: pattern = './*/*//complexType|./*/*//simpleType' element_tag = 'element' - defs = root.xpath(pattern, namespaces=Namespaces) + defs = root.xpath(pattern) for node in defs: parent = node.getparent() if parent.tag != element_tag: @@ -405,7 +501,10 @@ def raise_anon_complextypes(root): if not name: continue type_name = '%sType' % (name, ) - type_name, def_count = unique_name(type_name, def_names, def_count) + if Inner_name_map is None: + type_name, def_count = unique_name(type_name, def_names, def_count) + else: + type_name = map_inner_name(node, Inner_name_map) def_names.add(type_name) parent.set('type', type_name) node.set('name', type_name) @@ -413,6 +512,35 @@ def raise_anon_complextypes(root): root.append(node) +def map_inner_name(node, inner_name_map): + """Use a user-supplied mapping table to look up a name for this class/type. + """ + # find the name for the enclosing type definition and + # the name of the type definition that encloses that. + node1 = node + name2 = node1.get('name') + while name2 is None: + node1 = node1.getparent() + if node1 is None: + raise InnerNameMapError('cannot find parent with "name" attribute') + name2 = node1.get('name') + node1 = node1.getparent() + name1 = node1.get('name') + while name1 is None: + node1 = node1.getparent() + if node1 is None: + raise InnerNameMapError('cannot find parent with "name" attribute') + name1 = node1.get('name') + new_name = inner_name_map.get((name1, name2)) + if new_name is None: + msg1 = '("{}", "{}")'.format( + name1, name2) + sys.stderr.write('\n*** error. Must add entry to inner_name_map:\n') + sys.stderr.write('\n {}: "xxxx",\n\n'.format(msg1)) + raise InnerNameMapError('mapping missing for {}'.format(msg1)) + return new_name + + # # Collect the names of all currently defined types (complexType, # simpleType, element). @@ -428,11 +556,10 @@ def collect_type_names(node): else: pattern = './/complexType|.//simpleType|.//element' elements = node.xpath(pattern) - names = [ + names = { el.attrib['name'] for el in elements if 'name' in el.attrib and el.getchildren() - ] - names = set(names) + } return names @@ -469,6 +596,10 @@ def main(): "-f", "--force", action="store_true", dest="force", default=False, help="force overwrite without asking") + parser.add_option( + "--fix-type-names", action="store", + dest="fixtypenames", default=None, + help="Fix up (replace) complex type names.") (options, args) = parser.parse_args() if len(args) == 2: inpath = args[0] diff --git a/setup.py b/setup.py index 19d94e8..7963851 100644 --- a/setup.py +++ b/setup.py @@ -7,13 +7,13 @@ setup(name="generateDS", # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## - version="2.11b", + version="2.24b", ##VERSION## author="Dave Kuhlman", - author_email="dkuhlman@rexx.com", + author_email="dkuhlman@davekuhlman.org", maintainer="Dave Kuhlman", - maintainer_email="dkuhlman@rexx.com", - url="http://www.rexx.com/~dkuhlman/generateDS.html", + maintainer_email="dkuhlman@davekuhlman.org", + url="http://www.davekuhlman.org/generateDS.html", description="Generate Python data structures and XML parser from Xschema", long_description="""\ generateDS.py generates Python data structures (for example, class @@ -32,6 +32,9 @@ XML document.""", ## "gui.generateds_gui", ## "gui.generateds_gui_session", ## ], + py_modules=[ + "process_includes", + ], # include_package_data=True, packages = [ "libgenerateDS", @@ -45,5 +48,15 @@ XML document.""", "django/gends_extract_simple_types.py", "django/gends_generate_django.py", ], + entry_points = { + "console_scripts": [ + "generateDS = generateDS:main", + "process_includes = process_includes:main", + "generateds_gui = generateds_gui:main", + "gends_run_gen_django = gends_run_gen_django:main", + "gends_extract_simple_types = gends_extract_simple_types:main", + "gends_generate_django = gends_generate_django:main", + ], + } ) diff --git a/tests/OnePer/compare b/tests/OnePer/compare new file mode 100755 index 0000000..5e9838b --- /dev/null +++ b/tests/OnePer/compare @@ -0,0 +1,7 @@ +#!/bin/bash +# +# Usage: +# ./compare N where N = 0 or 1 or 2 or 3 +# +#diffless.py oneperType0$1_?One.py +diff -u oneperType0$1_2One.py oneperType0$1_1One.py | vim -R - diff --git a/tests/OnePer/copy b/tests/OnePer/copy new file mode 100755 index 0000000..4ff384f --- /dev/null +++ b/tests/OnePer/copy @@ -0,0 +1,6 @@ +#!/bin/bash +cp oneperType00_1One.py oneperType00_2One.py +cp oneperType01_1One.py oneperType01_2One.py +cp oneperType02_1One.py oneperType02_2One.py +cp oneperType03_1One.py oneperType03_2One.py + diff --git a/tests/recursive_simpletype2_sup.py b/tests/OnePer/oneperType00_2One.py similarity index 73% rename from tests/recursive_simpletype2_sup.py rename to tests/OnePer/oneperType00_2One.py index a675310..99f1c66 100644 --- a/tests/recursive_simpletype2_sup.py +++ b/tests/OnePer/oneperType00_2One.py @@ -4,66 +4,55 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('--one-file-per-xsd', '') +# ('--output-directory', 'tests/OnePer') +# ('--module-suffix', 'One') +# ('--super', 'oneper2_sup') +# +# Command line arguments: +# tests/oneper00.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +80,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +149,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +204,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +215,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +238,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +262,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +294,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +364,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +412,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +515,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +556,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,119 +661,94 @@ def _cast(typ, value): # -class PersonType(GeneratedsSuper): +class oneperType00_1(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('personId', 'xs:integer', 0), - MemberSpec_('fname', 'xs:string', 0), - MemberSpec_('lname', 'xs:string', 0), + MemberSpec_('inner01', 'oneperType01_1', 0), + MemberSpec_('inner02', 'oneperType01_2', 0), ] subclass = None superclass = None - def __init__(self, personId=None, fname=None, lname=None): - self.personId = personId - self.fname = fname - self.lname = lname + def __init__(self, inner01=None, inner02=None): + self.original_tagname_ = None + self.inner01 = inner01 + self.inner02 = inner02 def factory(*args_, **kwargs_): - if PersonType.subclass: - return PersonType.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType00_1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType00_1.subclass: + return oneperType00_1.subclass(*args_, **kwargs_) else: - return PersonType(*args_, **kwargs_) + return oneperType00_1(*args_, **kwargs_) factory = staticmethod(factory) - def get_personId(self): return self.personId - def set_personId(self, personId): self.personId = personId - def get_fname(self): return self.fname - def set_fname(self, fname): self.fname = fname - def get_lname(self): return self.lname - def set_lname(self, lname): self.lname = lname + def get_inner01(self): return self.inner01 + def set_inner01(self, inner01): self.inner01 = inner01 + def get_inner02(self): return self.inner02 + def set_inner02(self, inner02): self.inner02 = inner02 def hasContent_(self): if ( - self.personId is not None or - self.fname is not None or - self.lname is not None + self.inner01 is not None or + self.inner02 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='PersonType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='oneperType00_1', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='PersonType') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType00_1') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType00_1', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PersonType'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType00_1'): pass - def exportChildren(self, outfile, level, namespace_='', name_='PersonType', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='oneperType00_1', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.personId is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spersonId>%s</%spersonId>%s' % (namespace_, self.gds_format_integer(self.personId, input_name='personId'), namespace_, eol_)) - if self.fname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fname).encode(ExternalEncoding), input_name='fname'), namespace_, eol_)) - if self.lname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lname).encode(ExternalEncoding), input_name='lname'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='PersonType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.personId is not None: - showIndent(outfile, level) - outfile.write('personId=%d,\n' % self.personId) - if self.fname is not None: - showIndent(outfile, level) - outfile.write('fname=%s,\n' % quote_python(self.fname).encode(ExternalEncoding)) - if self.lname is not None: - showIndent(outfile, level) - outfile.write('lname=%s,\n' % quote_python(self.lname).encode(ExternalEncoding)) + if self.inner01 is not None: + self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print) + if self.inner02 is not None: + self.inner02.export(outfile, level, namespace_, name_='inner02', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'personId': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'personId') - self.personId = ival_ - elif nodeName_ == 'fname': - fname_ = child_.text - fname_ = self.gds_validate_string(fname_, node, 'fname') - self.fname = fname_ - elif nodeName_ == 'lname': - lname_ = child_.text - lname_ = self.gds_validate_string(lname_, node, 'lname') - self.lname = lname_ -# end class PersonType + if nodeName_ == 'inner01': + obj_ = oneperType01_1.factory() + obj_.build(child_) + self.inner01 = obj_ + obj_.original_tagname_ = 'inner01' + elif nodeName_ == 'inner02': + obj_ = oneperType01_2.factory() + obj_.build(child_) + self.inner02 = obj_ + obj_.original_tagname_ = 'inner02' +# end class oneperType00_1 GDSClassesMapping = { - 'person': PersonType, + 'root00': oneperType00_1, } @@ -730,7 +758,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -743,12 +771,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = PersonType + rootTag = 'oneperType00_1' + rootClass = oneperType00_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -763,12 +792,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = PersonType + rootTag = 'oneperType00_1' + rootClass = oneperType00_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -786,13 +816,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = PersonType + rootTag = 'oneperType00_1' + rootClass = oneperType00_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -800,26 +834,27 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="person", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = PersonType + rootTag = 'oneperType00_1' + rootClass = oneperType00_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from recursive_simpletype2_sup import *\n\n') -## sys.stdout.write('import recursive_simpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('#from oneperType00_1One import *\n\n') +## sys.stdout.write('import oneperType00_1One as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -839,5 +874,5 @@ if __name__ == '__main__': __all__ = [ - "PersonType" + "oneperType00_1" ] diff --git a/tests/annotations2_sup.py b/tests/OnePer/oneperType01_2One.py similarity index 62% rename from tests/annotations2_sup.py rename to tests/OnePer/oneperType01_2One.py index 0c99662..652b9e6 100644 --- a/tests/annotations2_sup.py +++ b/tests/OnePer/oneperType01_2One.py @@ -4,66 +4,55 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('--one-file-per-xsd', '') +# ('--output-directory', 'tests/OnePer') +# ('--module-suffix', 'One') +# ('--super', 'oneper2_sup') +# +# Command line arguments: +# tests/oneper00.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +80,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +149,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +204,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +215,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +238,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +262,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +294,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +364,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +412,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +515,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +556,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,320 +661,169 @@ def _cast(typ, value): # -class document1Type(GeneratedsSuper): - """This is a element of Type 1. It has some very nice documentation for - test purposes. It should make a somewhat uninteresting - docstring.""" +class oneperType01_1(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('comments', 'xs:string', 0), - MemberSpec_('otherdoc', 'document2Type', 0), + MemberSpec_('username', 'xs:string', 0), + MemberSpec_('inner01', 'oneperType01_2', 0), ] subclass = None superclass = None - def __init__(self, comments=None, otherdoc=None): - self.comments = comments - self.otherdoc = otherdoc + def __init__(self, username=None, inner01=None): + self.original_tagname_ = None + self.username = username + self.inner01 = inner01 def factory(*args_, **kwargs_): - if document1Type.subclass: - return document1Type.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType01_1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType01_1.subclass: + return oneperType01_1.subclass(*args_, **kwargs_) else: - return document1Type(*args_, **kwargs_) + return oneperType01_1(*args_, **kwargs_) factory = staticmethod(factory) - def get_comments(self): return self.comments - def set_comments(self, comments): self.comments = comments - def get_otherdoc(self): return self.otherdoc - def set_otherdoc(self, otherdoc): self.otherdoc = otherdoc + def get_username(self): return self.username + def set_username(self, username): self.username = username + def get_inner01(self): return self.inner01 + def set_inner01(self, inner01): self.inner01 = inner01 def hasContent_(self): if ( - self.comments is not None or - self.otherdoc is not None + self.username is not None or + self.inner01 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='document1Type', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='oneperType01_1', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='document1Type') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType01_1') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType01_1', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document1Type'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType01_1'): pass - def exportChildren(self, outfile, level, namespace_='', name_='document1Type', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='oneperType01_1', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.comments is not None: + if self.username is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) - if self.otherdoc is not None: - self.otherdoc.export(outfile, level, namespace_, name_='otherdoc', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='document1Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.otherdoc is not None: - showIndent(outfile, level) - outfile.write('otherdoc=model_.document2Type(\n') - self.otherdoc.exportLiteral(outfile, level, name_='otherdoc') - showIndent(outfile, level) - outfile.write('),\n') + outfile.write('<%susername>%s</%susername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.username), input_name='username')), namespace_, eol_)) + if self.inner01 is not None: + self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'comments': - comments_ = child_.text - comments_ = self.gds_validate_string(comments_, node, 'comments') - self.comments = comments_ - elif nodeName_ == 'otherdoc': - obj_ = document2Type.factory() + if nodeName_ == 'username': + username_ = child_.text + username_ = self.gds_validate_string(username_, node, 'username') + self.username = username_ + elif nodeName_ == 'inner01': + obj_ = oneperType01_2.factory() obj_.build(child_) - self.otherdoc = obj_ -# end class document1Type + self.inner01 = obj_ + obj_.original_tagname_ = 'inner01' +# end class oneperType01_1 -class document2Type(GeneratedsSuper): - """This is a element of Type 2. It has some very nice documentation for - test purposes. It should make a somewhat uninteresting - docstring.""" +class oneperType01_2(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('comments', 'xs:string', 0), - MemberSpec_('rating', 'xs:integer', 0), - MemberSpec_('anotherdoc', 'document3Type', 0), + MemberSpec_('userdescription', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, comments=None, rating=None, anotherdoc=None): - self.comments = comments - self.rating = rating - self.anotherdoc = anotherdoc + def __init__(self, userdescription=None): + self.original_tagname_ = None + self.userdescription = userdescription def factory(*args_, **kwargs_): - if document2Type.subclass: - return document2Type.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType01_2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType01_2.subclass: + return oneperType01_2.subclass(*args_, **kwargs_) else: - return document2Type(*args_, **kwargs_) + return oneperType01_2(*args_, **kwargs_) factory = staticmethod(factory) - def get_comments(self): return self.comments - def set_comments(self, comments): self.comments = comments - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_anotherdoc(self): return self.anotherdoc - def set_anotherdoc(self, anotherdoc): self.anotherdoc = anotherdoc + def get_userdescription(self): return self.userdescription + def set_userdescription(self, userdescription): self.userdescription = userdescription def hasContent_(self): if ( - self.comments is not None or - self.rating is not None or - self.anotherdoc is not None + self.userdescription is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='document2Type', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='oneperType01_2', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='document2Type') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType01_2') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType01_2', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document2Type'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType01_2'): pass - def exportChildren(self, outfile, level, namespace_='', name_='document2Type', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='oneperType01_2', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.comments is not None: + if self.userdescription is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) - if self.rating is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_)) - if self.anotherdoc is not None: - self.anotherdoc.export(outfile, level, namespace_, name_='anotherdoc', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='document2Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.rating is not None: - showIndent(outfile, level) - outfile.write('rating=%d,\n' % self.rating) - if self.anotherdoc is not None: - showIndent(outfile, level) - outfile.write('anotherdoc=model_.document3Type(\n') - self.anotherdoc.exportLiteral(outfile, level, name_='anotherdoc') - showIndent(outfile, level) - outfile.write('),\n') + outfile.write('<%suserdescription>%s</%suserdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.userdescription), input_name='userdescription')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'comments': - comments_ = child_.text - comments_ = self.gds_validate_string(comments_, node, 'comments') - self.comments = comments_ - elif nodeName_ == 'rating': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'rating') - self.rating = ival_ - elif nodeName_ == 'anotherdoc': - obj_ = document3Type.factory() - obj_.build(child_) - self.anotherdoc = obj_ -# end class document2Type - - -class document3Type(GeneratedsSuper): - """This is a element of Type 3. It is short.""" - member_data_items_ = [ - MemberSpec_('comments', 'xs:string', 0), - MemberSpec_('rating', 'xs:integer', 0), - ] - subclass = None - superclass = None - def __init__(self, comments=None, rating=None): - self.comments = comments - self.rating = rating - def factory(*args_, **kwargs_): - if document3Type.subclass: - return document3Type.subclass(*args_, **kwargs_) - else: - return document3Type(*args_, **kwargs_) - factory = staticmethod(factory) - def get_comments(self): return self.comments - def set_comments(self, comments): self.comments = comments - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def hasContent_(self): - if ( - self.comments is not None or - self.rating is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='document3Type', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='document3Type') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='document3Type'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='document3Type', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.comments is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) - if self.rating is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='document3Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.rating is not None: - showIndent(outfile, level) - outfile.write('rating=%d,\n' % self.rating) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'comments': - comments_ = child_.text - comments_ = self.gds_validate_string(comments_, node, 'comments') - self.comments = comments_ - elif nodeName_ == 'rating': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'rating') - self.rating = ival_ -# end class document3Type + if nodeName_ == 'userdescription': + userdescription_ = child_.text + userdescription_ = self.gds_validate_string(userdescription_, node, 'userdescription') + self.userdescription = userdescription_ +# end class oneperType01_2 GDSClassesMapping = { - 'document1': document1Type, - 'otherdoc': document2Type, - 'anotherdoc': document3Type, + 'inner01': oneperType01_2, + 'root01': oneperType01_1, } @@ -931,7 +833,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -944,12 +846,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' - rootClass = document1Type + rootTag = 'oneperType01_1' + rootClass = oneperType01_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -964,12 +867,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' - rootClass = document1Type + rootTag = 'oneperType01_1' + rootClass = oneperType01_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -987,13 +891,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = document1Type + rootTag = 'oneperType01_1' + rootClass = oneperType01_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -1001,26 +909,27 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="document1", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' - rootClass = document1Type + rootTag = 'oneperType01_1' + rootClass = oneperType01_1 rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from annotations2_sup import *\n\n') -## sys.stdout.write('import annotations2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('#from oneperType01_1One import *\n\n') +## sys.stdout.write('import oneperType01_1One as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -1040,7 +949,6 @@ if __name__ == '__main__': __all__ = [ - "document1Type", - "document2Type", - "document3Type" + "oneperType01_1", + "oneperType01_2" ] diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py new file mode 100644 index 0000000..06578e2 --- /dev/null +++ b/tests/OnePer/oneperType02_2One.py @@ -0,0 +1,954 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('--one-file-per-xsd', '') +# ('--output-directory', 'tests/OnePer') +# ('--module-suffix', 'One') +# ('--super', 'oneper2_sup') +# +# Command line arguments: +# tests/oneper00.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class oneperType02_1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('clientname', 'xs:string', 0), + MemberSpec_('inner01', 'oneperType02_2', 0), + ] + subclass = None + superclass = None + def __init__(self, clientname=None, inner01=None): + self.original_tagname_ = None + self.clientname = clientname + self.inner01 = inner01 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType02_1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType02_1.subclass: + return oneperType02_1.subclass(*args_, **kwargs_) + else: + return oneperType02_1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_clientname(self): return self.clientname + def set_clientname(self, clientname): self.clientname = clientname + def get_inner01(self): return self.inner01 + def set_inner01(self, inner01): self.inner01 = inner01 + def hasContent_(self): + if ( + self.clientname is not None or + self.inner01 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='oneperType02_1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType02_1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType02_1', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType02_1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='oneperType02_1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.clientname is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sclientname>%s</%sclientname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.clientname), input_name='clientname')), namespace_, eol_)) + if self.inner01 is not None: + self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'clientname': + clientname_ = child_.text + clientname_ = self.gds_validate_string(clientname_, node, 'clientname') + self.clientname = clientname_ + elif nodeName_ == 'inner01': + obj_ = oneperType02_2.factory() + obj_.build(child_) + self.inner01 = obj_ + obj_.original_tagname_ = 'inner01' +# end class oneperType02_1 + + +class oneperType02_2(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('clientdescription', 'xs:string', 0), + ] + subclass = None + superclass = None + def __init__(self, clientdescription=None): + self.original_tagname_ = None + self.clientdescription = clientdescription + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType02_2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType02_2.subclass: + return oneperType02_2.subclass(*args_, **kwargs_) + else: + return oneperType02_2(*args_, **kwargs_) + factory = staticmethod(factory) + def get_clientdescription(self): return self.clientdescription + def set_clientdescription(self, clientdescription): self.clientdescription = clientdescription + def hasContent_(self): + if ( + self.clientdescription is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='oneperType02_2', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType02_2') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType02_2', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType02_2'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='oneperType02_2', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.clientdescription is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sclientdescription>%s</%sclientdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.clientdescription), input_name='clientdescription')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'clientdescription': + clientdescription_ = child_.text + clientdescription_ = self.gds_validate_string(clientdescription_, node, 'clientdescription') + self.clientdescription = clientdescription_ +# end class oneperType02_2 + + +GDSClassesMapping = { + 'inner01': oneperType02_2, + 'root02': oneperType02_1, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType02_1' + rootClass = oneperType02_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType02_1' + rootClass = oneperType02_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType02_1' + rootClass = oneperType02_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType02_1' + rootClass = oneperType02_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from oneperType02_1One import *\n\n') +## sys.stdout.write('import oneperType02_1One as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "oneperType02_1", + "oneperType02_2" +] diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py new file mode 100644 index 0000000..6bea073 --- /dev/null +++ b/tests/OnePer/oneperType03_2One.py @@ -0,0 +1,953 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('--one-file-per-xsd', '') +# ('--output-directory', 'tests/OnePer') +# ('--module-suffix', 'One') +# ('--super', 'oneper2_sup') +# +# Command line arguments: +# tests/oneper00.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f --one-file-per-xsd --output-directory="tests/OnePer" --module-suffix="One" --super="oneper2_sup" tests/oneper00.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class oneperType03_1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('helpername', 'xs:string', 0), + MemberSpec_('inner01', 'oneperType02_2', 0), + ] + subclass = None + superclass = None + def __init__(self, helpername=None, inner01=None): + self.original_tagname_ = None + self.helpername = helpername + self.inner01 = inner01 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType03_1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType03_1.subclass: + return oneperType03_1.subclass(*args_, **kwargs_) + else: + return oneperType03_1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_helpername(self): return self.helpername + def set_helpername(self, helpername): self.helpername = helpername + def get_inner01(self): return self.inner01 + def set_inner01(self, inner01): self.inner01 = inner01 + def hasContent_(self): + if ( + self.helpername is not None or + self.inner01 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='oneperType03_1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType03_1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_1', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType03_1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.helpername is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%shelpername>%s</%shelpername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.helpername), input_name='helpername')), namespace_, eol_)) + if self.inner01 is not None: + self.inner01.export(outfile, level, namespace_, name_='inner01', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'helpername': + helpername_ = child_.text + helpername_ = self.gds_validate_string(helpername_, node, 'helpername') + self.helpername = helpername_ + elif nodeName_ == 'inner01': + obj_ = oneperType02_2.factory() + obj_.build(child_) + self.inner01 = obj_ + obj_.original_tagname_ = 'inner01' +# end class oneperType03_1 + + +class oneperType03_2(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('helperdescription', 'xs:string', 0), + ] + subclass = None + superclass = None + def __init__(self, helperdescription=None): + self.original_tagname_ = None + self.helperdescription = helperdescription + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, oneperType03_2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if oneperType03_2.subclass: + return oneperType03_2.subclass(*args_, **kwargs_) + else: + return oneperType03_2(*args_, **kwargs_) + factory = staticmethod(factory) + def get_helperdescription(self): return self.helperdescription + def set_helperdescription(self, helperdescription): self.helperdescription = helperdescription + def hasContent_(self): + if ( + self.helperdescription is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='oneperType03_2', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='oneperType03_2') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='oneperType03_2', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='oneperType03_2'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='oneperType03_2', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.helperdescription is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%shelperdescription>%s</%shelperdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.helperdescription), input_name='helperdescription')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'helperdescription': + helperdescription_ = child_.text + helperdescription_ = self.gds_validate_string(helperdescription_, node, 'helperdescription') + self.helperdescription = helperdescription_ +# end class oneperType03_2 + + +GDSClassesMapping = { + 'root03': oneperType03_1, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType03_1' + rootClass = oneperType03_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType03_1' + rootClass = oneperType03_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType03_1' + rootClass = oneperType03_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'oneperType03_1' + rootClass = oneperType03_1 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from oneperType03_1One import *\n\n') +## sys.stdout.write('import oneperType03_1One as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "oneperType03_1", + "oneperType03_2" +] diff --git a/tests/abstract_type1_sub.py b/tests/abstract_type1_sub.py index c8c5af4..b7e815b 100644 --- a/tests/abstract_type1_sub.py +++ b/tests/abstract_type1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/abstract_type2_sup.py') +# ('-s', 'tests/abstract_type2_sub.py') +# ('--super', 'abstract_type2_sup') +# +# Command line arguments: +# tests/abstract_type.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/abstract_type2_sup.py" -s "tests/abstract_type2_sub.py" --super="abstract_type2_sup" tests/abstract_type.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import abstract_type2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -112,11 +85,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = supermod.carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -132,11 +106,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = supermod.carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -156,11 +131,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = supermod.carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -175,11 +151,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'carrierType' rootClass = supermod.carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -188,8 +165,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from abstract_type2_sup import *\n\n') ## sys.stdout.write('import abstract_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.carrier(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="carrier") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -200,7 +177,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py index 41f17dd..08422d5 100644 --- a/tests/abstract_type1_sup.py +++ b/tests/abstract_type1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/abstract_type2_sup.py') +# ('-s', 'tests/abstract_type2_sub.py') +# ('--super', 'abstract_type2_sup') +# +# Command line arguments: +# tests/abstract_type.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/abstract_type2_sup.py" -s "tests/abstract_type2_sub.py" --super="abstract_type2_sup" tests/abstract_type.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -615,11 +667,17 @@ class carrierType(GeneratedsSuper): subclass = None superclass = None def __init__(self, fleet=None): + self.original_tagname_ = None if fleet is None: self.fleet = [] else: self.fleet = fleet def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, carrierType) + if subclass is not None: + return subclass(*args_, **kwargs_) if carrierType.subclass: return carrierType.subclass(*args_, **kwargs_) else: @@ -628,7 +686,8 @@ class carrierType(GeneratedsSuper): def get_fleet(self): return self.fleet def set_fleet(self, fleet): self.fleet = fleet def add_fleet(self, value): self.fleet.append(value) - def insert_fleet(self, index, value): self.fleet[index] = value + def insert_fleet_at(self, index, value): self.fleet.insert(index, value) + def replace_fleet_at(self, index, value): self.fleet[index] = value def hasContent_(self): if ( self.fleet @@ -636,18 +695,20 @@ class carrierType(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='carrierType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='target:', name_='carrierType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -661,33 +722,13 @@ class carrierType(GeneratedsSuper): eol_ = '' for fleet_ in self.fleet: fleet_.export(outfile, level, namespace_, name_='fleet', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='carrierType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('fleet=[\n') - level += 1 - for fleet_ in self.fleet: - showIndent(outfile, level) - outfile.write('model_.Vehicle(\n') - fleet_.exportLiteral(outfile, level, name_='Vehicle') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -709,6 +750,7 @@ class carrierType(GeneratedsSuper): raise NotImplementedError( 'Class not implemented for <fleet> element') self.fleet.append(obj_) + obj_.original_tagname_ = 'fleet' # end class carrierType @@ -718,8 +760,14 @@ class Vehicle(GeneratedsSuper): subclass = None superclass = None def __init__(self, extensiontype_=None): + self.original_tagname_ = None self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Vehicle) + if subclass is not None: + return subclass(*args_, **kwargs_) if Vehicle.subclass: return Vehicle.subclass(*args_, **kwargs_) else: @@ -734,18 +782,20 @@ class Vehicle(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Vehicle') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='target:', name_='Vehicle', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -757,22 +807,13 @@ class Vehicle(GeneratedsSuper): pass def exportChildren(self, outfile, level, namespace_='target:', name_='Vehicle', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='Vehicle'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -789,9 +830,14 @@ class Car(Vehicle): subclass = None superclass = Vehicle def __init__(self): + self.original_tagname_ = None super(Car, self).__init__() - pass def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Car) + if subclass is not None: + return subclass(*args_, **kwargs_) if Car.subclass: return Car.subclass(*args_, **kwargs_) else: @@ -804,18 +850,20 @@ class Car(Vehicle): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Car') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='target:', name_='Car', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -824,23 +872,13 @@ class Car(Vehicle): def exportChildren(self, outfile, level, namespace_='target:', name_='Car', fromsubclass_=False, pretty_print=True): super(Car, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) pass - def exportLiteral(self, outfile, level, name_='Car'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(Car, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(Car, self).exportLiteralChildren(outfile, level, name_) - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(Car, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -855,9 +893,14 @@ class Plane(Vehicle): subclass = None superclass = Vehicle def __init__(self): + self.original_tagname_ = None super(Plane, self).__init__() - pass def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Plane) + if subclass is not None: + return subclass(*args_, **kwargs_) if Plane.subclass: return Plane.subclass(*args_, **kwargs_) else: @@ -870,18 +913,20 @@ class Plane(Vehicle): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='xmlns:target="http://cars.example.com/schema"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Plane') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='target:', name_='Plane', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -890,23 +935,13 @@ class Plane(Vehicle): def exportChildren(self, outfile, level, namespace_='target:', name_='Plane', fromsubclass_=False, pretty_print=True): super(Plane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) pass - def exportLiteral(self, outfile, level, name_='Plane'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(Plane, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(Plane, self).exportLiteralChildren(outfile, level, name_) - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(Plane, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -916,8 +951,8 @@ class Plane(Vehicle): GDSClassesMapping = { - 'fleet': Vehicle, 'carrier': carrierType, + 'fleet': Vehicle, } @@ -927,7 +962,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -940,11 +975,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -960,11 +996,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -983,12 +1020,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'carrierType' rootClass = carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -997,17 +1038,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="carrier", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='xmlns:target="http://cars.example.com/schema"') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' + rootTag = 'carrierType' rootClass = carrierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1016,7 +1058,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from abstract_type2_sup import *\n\n') ## sys.stdout.write('import abstract_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/abstract_type2_sub.py b/tests/abstract_type2_sub.py deleted file mode 100644 index c8c5af4..0000000 --- a/tests/abstract_type2_sub.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import abstract_type2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class carrierTypeSub(supermod.carrierType): - def __init__(self, fleet=None): - super(carrierTypeSub, self).__init__(fleet, ) -supermod.carrierType.subclass = carrierTypeSub -# end class carrierTypeSub - - -class VehicleSub(supermod.Vehicle): - def __init__(self, extensiontype_=None): - super(VehicleSub, self).__init__(extensiontype_, ) -supermod.Vehicle.subclass = VehicleSub -# end class VehicleSub - - -class CarSub(supermod.Car): - def __init__(self): - super(CarSub, self).__init__() -supermod.Car.subclass = CarSub -# end class CarSub - - -class PlaneSub(supermod.Plane): - def __init__(self): - super(PlaneSub, self).__init__() -supermod.Plane.subclass = PlaneSub -# end class PlaneSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'carrier' - rootClass = supermod.carrierType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='xmlns:target="http://cars.example.com/schema"', -## pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'carrier' - rootClass = supermod.carrierType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'carrier' - rootClass = supermod.carrierType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='xmlns:target="http://cars.example.com/schema"') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.carrierType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from abstract_type2_sup import *\n\n') -## sys.stdout.write('import abstract_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.carrier(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="carrier") -## sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/address.xsd b/tests/address.xsd new file mode 100644 index 0000000..1793e80 --- /dev/null +++ b/tests/address.xsd @@ -0,0 +1,56 @@ +<schema targetNamespace="http://www.example.com/IPO" + xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:ipo="http://www.example.com/IPO"> + + <annotation> + <documentation xml:lang="en"> + Addresses for International Purchase order schema + Copyright 2000 Example.com. All rights reserved. + </documentation> + </annotation> + + <complexType name="Address"> + <sequence> + <element name="name" type="string"/> + <element name="street" type="string"/> + <element name="city" type="string"/> + </sequence> + </complexType> + + <complexType name="USAddress"> + <complexContent> + <extension base="ipo:Address"> + <sequence> + <element name="state" type="ipo:USState"/> + <element name="zip" type="positiveInteger"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <complexType name="UKAddress"> + <complexContent> + <extension base="ipo:Address"> + <sequence> + <element name="postcode" type="ipo:UKPostcode"/> + </sequence> + <attribute name="exportCode" type="positiveInteger" fixed="1"/> + </extension> + </complexContent> + </complexType> + + <!-- other Address derivations for more countries --> + + <simpleType name="USState"> + <restriction base="string"> + <enumeration value="AK"/> + <enumeration value="AL"/> + <enumeration value="AR"/> + <enumeration value="PA"/> + <!-- and so on ... --> + </restriction> + </simpleType> + + <!-- simple type definition for UKPostcode --> + +</schema> diff --git a/tests/annotations1_sub.py b/tests/annotations1_sub.py index 63d361b..ee65ce6 100644 --- a/tests/annotations1_sub.py +++ b/tests/annotations1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/annotations2_sup.py') +# ('-s', 'tests/annotations2_sub.py') +# ('--super', 'annotations2_sup') +# +# Command line arguments: +# tests/annotations.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/annotations2_sup.py" -s "tests/annotations2_sub.py" --super="annotations2_sup" tests/annotations.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import annotations2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -105,11 +78,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = supermod.document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -125,11 +99,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = supermod.document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -149,11 +124,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = supermod.document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -168,11 +144,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'document1Type' rootClass = supermod.document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -181,8 +158,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from annotations2_sup import *\n\n') ## sys.stdout.write('import annotations2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.document1(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="document1") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -193,7 +170,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py index 0c99662..87aa8d7 100644 --- a/tests/annotations1_sup.py +++ b/tests/annotations1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/annotations2_sup.py') +# ('-s', 'tests/annotations2_sub.py') +# ('--super', 'annotations2_sup') +# +# Command line arguments: +# tests/annotations.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/annotations2_sup.py" -s "tests/annotations2_sub.py" --super="annotations2_sup" tests/annotations.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -619,9 +671,15 @@ class document1Type(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, otherdoc=None): + self.original_tagname_ = None self.comments = comments self.otherdoc = otherdoc def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, document1Type) + if subclass is not None: + return subclass(*args_, **kwargs_) if document1Type.subclass: return document1Type.subclass(*args_, **kwargs_) else: @@ -644,13 +702,15 @@ class document1Type(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='document1Type') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='document1Type', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -664,33 +724,16 @@ class document1Type(GeneratedsSuper): eol_ = '' if self.comments is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) + outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_)) if self.otherdoc is not None: self.otherdoc.export(outfile, level, namespace_, name_='otherdoc', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='document1Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.otherdoc is not None: - showIndent(outfile, level) - outfile.write('otherdoc=model_.document2Type(\n') - self.otherdoc.exportLiteral(outfile, level, name_='otherdoc') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -702,6 +745,7 @@ class document1Type(GeneratedsSuper): obj_ = document2Type.factory() obj_.build(child_) self.otherdoc = obj_ + obj_.original_tagname_ = 'otherdoc' # end class document1Type @@ -717,10 +761,16 @@ class document2Type(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, rating=None, anotherdoc=None): + self.original_tagname_ = None self.comments = comments self.rating = rating self.anotherdoc = anotherdoc def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, document2Type) + if subclass is not None: + return subclass(*args_, **kwargs_) if document2Type.subclass: return document2Type.subclass(*args_, **kwargs_) else: @@ -746,13 +796,15 @@ class document2Type(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='document2Type') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='document2Type', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -766,39 +818,19 @@ class document2Type(GeneratedsSuper): eol_ = '' if self.comments is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) + outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_)) if self.rating is not None: showIndent(outfile, level, pretty_print) outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_)) if self.anotherdoc is not None: self.anotherdoc.export(outfile, level, namespace_, name_='anotherdoc', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='document2Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.rating is not None: - showIndent(outfile, level) - outfile.write('rating=%d,\n' % self.rating) - if self.anotherdoc is not None: - showIndent(outfile, level) - outfile.write('anotherdoc=model_.document3Type(\n') - self.anotherdoc.exportLiteral(outfile, level, name_='anotherdoc') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -810,7 +842,7 @@ class document2Type(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'rating') self.rating = ival_ @@ -818,6 +850,7 @@ class document2Type(GeneratedsSuper): obj_ = document3Type.factory() obj_.build(child_) self.anotherdoc = obj_ + obj_.original_tagname_ = 'anotherdoc' # end class document2Type @@ -830,9 +863,15 @@ class document3Type(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, rating=None): + self.original_tagname_ = None self.comments = comments self.rating = rating def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, document3Type) + if subclass is not None: + return subclass(*args_, **kwargs_) if document3Type.subclass: return document3Type.subclass(*args_, **kwargs_) else: @@ -855,13 +894,15 @@ class document3Type(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='document3Type') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='document3Type', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -875,31 +916,17 @@ class document3Type(GeneratedsSuper): eol_ = '' if self.comments is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_format_string(quote_xml(self.comments).encode(ExternalEncoding), input_name='comments'), namespace_, eol_)) + outfile.write('<%scomments>%s</%scomments>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comments), input_name='comments')), namespace_, eol_)) if self.rating is not None: showIndent(outfile, level, pretty_print) outfile.write('<%srating>%s</%srating>%s' % (namespace_, self.gds_format_integer(self.rating, input_name='rating'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='document3Type'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.comments is not None: - showIndent(outfile, level) - outfile.write('comments=%s,\n' % quote_python(self.comments).encode(ExternalEncoding)) - if self.rating is not None: - showIndent(outfile, level) - outfile.write('rating=%d,\n' % self.rating) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -911,7 +938,7 @@ class document3Type(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'rating') self.rating = ival_ @@ -919,9 +946,9 @@ class document3Type(GeneratedsSuper): GDSClassesMapping = { + 'anotherdoc': document3Type, 'document1': document1Type, 'otherdoc': document2Type, - 'anotherdoc': document3Type, } @@ -931,7 +958,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -944,11 +971,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -964,11 +992,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -987,12 +1016,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'document1Type' rootClass = document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1001,17 +1034,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="document1", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'document1' + rootTag = 'document1Type' rootClass = document1Type rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1020,7 +1054,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from annotations2_sup import *\n\n') ## sys.stdout.write('import annotations2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/annotations2_sub.py b/tests/annotations2_sub.py deleted file mode 100644 index 63d361b..0000000 --- a/tests/annotations2_sub.py +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import annotations2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class document1TypeSub(supermod.document1Type): - def __init__(self, comments=None, otherdoc=None): - super(document1TypeSub, self).__init__(comments, otherdoc, ) -supermod.document1Type.subclass = document1TypeSub -# end class document1TypeSub - - -class document2TypeSub(supermod.document2Type): - def __init__(self, comments=None, rating=None, anotherdoc=None): - super(document2TypeSub, self).__init__(comments, rating, anotherdoc, ) -supermod.document2Type.subclass = document2TypeSub -# end class document2TypeSub - - -class document3TypeSub(supermod.document3Type): - def __init__(self, comments=None, rating=None): - super(document3TypeSub, self).__init__(comments, rating, ) -supermod.document3Type.subclass = document3TypeSub -# end class document3TypeSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'document1' - rootClass = supermod.document1Type - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'document1' - rootClass = supermod.document1Type - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'document1' - rootClass = supermod.document1Type - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.document1Type - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from annotations2_sup import *\n\n') -## sys.stdout.write('import annotations2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.document1(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="document1") -## sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/anonymous_type.xsd b/tests/anonymous_type.xsd index 271664f..a9bb07f 100644 --- a/tests/anonymous_type.xsd +++ b/tests/anonymous_type.xsd @@ -14,6 +14,8 @@ <xs:element name="FooType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="10"/> + <xs:maxLength value="19"/> </xs:restriction> </xs:simpleType> </xs:element> @@ -26,6 +28,8 @@ <xs:element name="BarType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="20"/> + <xs:maxLength value="29"/> </xs:restriction> </xs:simpleType> </xs:element> @@ -38,6 +42,8 @@ <xs:element name="BazType"> <xs:simpleType> <xs:restriction base="xs:string"> + <xs:minLength value="30"/> + <xs:maxLength value="39"/> </xs:restriction> </xs:simpleType> </xs:element> diff --git a/tests/anonymous_type1_sub.py b/tests/anonymous_type1_sub.py index f608777..e6d3696 100644 --- a/tests/anonymous_type1_sub.py +++ b/tests/anonymous_type1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anonymous_type2_sup.py') +# ('-s', 'tests/anonymous_type2_sub.py') +# ('--super', 'anonymous_type2_sup') +# +# Command line arguments: +# tests/anonymous_type.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anonymous_type2_sup.py" -s "tests/anonymous_type2_sub.py" --super="anonymous_type2_sup" tests/anonymous_type.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import anonymous_type2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -112,7 +85,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -132,7 +106,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -156,7 +131,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -175,11 +151,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'FooList' rootClass = supermod.FooList rootObj = rootClass.factory() rootObj.build(rootNode) @@ -188,8 +165,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from anonymous_type2_sup import *\n\n') ## sys.stdout.write('import anonymous_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.FooList(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="FooList") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -200,7 +177,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py index 692916a..e373bf8 100644 --- a/tests/anonymous_type1_sup.py +++ b/tests/anonymous_type1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anonymous_type2_sup.py') +# ('-s', 'tests/anonymous_type2_sub.py') +# ('--super', 'anonymous_type2_sup') +# +# Command line arguments: +# tests/anonymous_type.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anonymous_type2_sup.py" -s "tests/anonymous_type2_sub.py" --super="anonymous_type2_sup" tests/anonymous_type.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -617,10 +669,16 @@ class FooList(GeneratedsSuper): subclass = None superclass = None def __init__(self, Foo=None, Bar=None, Baz=None): + self.original_tagname_ = None self.Foo = Foo self.Bar = Bar self.Baz = Baz def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, FooList) + if subclass is not None: + return subclass(*args_, **kwargs_) if FooList.subclass: return FooList.subclass(*args_, **kwargs_) else: @@ -646,13 +704,15 @@ class FooList(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooList') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='FooList', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -670,39 +730,13 @@ class FooList(GeneratedsSuper): self.Bar.export(outfile, level, namespace_, name_='Bar', pretty_print=pretty_print) if self.Baz is not None: self.Baz.export(outfile, level, namespace_, name_='Baz', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='FooList'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.Foo is not None: - showIndent(outfile, level) - outfile.write('Foo=model_.FooType1(\n') - self.Foo.exportLiteral(outfile, level, name_='Foo') - showIndent(outfile, level) - outfile.write('),\n') - if self.Bar is not None: - showIndent(outfile, level) - outfile.write('Bar=model_.BarType2(\n') - self.Bar.exportLiteral(outfile, level, name_='Bar') - showIndent(outfile, level) - outfile.write('),\n') - if self.Baz is not None: - showIndent(outfile, level) - outfile.write('Baz=model_.BazType3(\n') - self.Baz.exportLiteral(outfile, level, name_='Baz') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -710,14 +744,17 @@ class FooList(GeneratedsSuper): obj_ = FooType1.factory() obj_.build(child_) self.Foo = obj_ + obj_.original_tagname_ = 'Foo' elif nodeName_ == 'Bar': obj_ = BarType2.factory() obj_.build(child_) self.Bar = obj_ + obj_.original_tagname_ = 'Bar' elif nodeName_ == 'Baz': obj_ = BazType3.factory() obj_.build(child_) self.Baz = obj_ + obj_.original_tagname_ = 'Baz' # end class FooList @@ -728,8 +765,15 @@ class FooType1(GeneratedsSuper): subclass = None superclass = None def __init__(self, FooType=None): + self.original_tagname_ = None self.FooType = FooType + self.validate_FooTypeType(self.FooType) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, FooType1) + if subclass is not None: + return subclass(*args_, **kwargs_) if FooType1.subclass: return FooType1.subclass(*args_, **kwargs_) else: @@ -739,7 +783,11 @@ class FooType1(GeneratedsSuper): def set_FooType(self, FooType): self.FooType = FooType def validate_FooTypeType(self, value): # Validate type FooTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) > 19: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on FooTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.FooType is not None @@ -752,13 +800,15 @@ class FooType1(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='FooType1') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='FooType1', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -772,25 +822,14 @@ class FooType1(GeneratedsSuper): eol_ = '' if self.FooType is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_format_string(quote_xml(self.FooType).encode(ExternalEncoding), input_name='FooType'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='FooType1'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.FooType is not None: - showIndent(outfile, level) - outfile.write('FooType=%s,\n' % quote_python(self.FooType).encode(ExternalEncoding)) + outfile.write('<%sFooType>%s</%sFooType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.FooType), input_name='FooType')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -798,7 +837,8 @@ class FooType1(GeneratedsSuper): FooType_ = child_.text FooType_ = self.gds_validate_string(FooType_, node, 'FooType') self.FooType = FooType_ - self.validate_FooTypeType(self.FooType) # validate type FooTypeType + # validate type FooTypeType + self.validate_FooTypeType(self.FooType) # end class FooType1 @@ -809,8 +849,15 @@ class BarType2(GeneratedsSuper): subclass = None superclass = None def __init__(self, BarType=None): + self.original_tagname_ = None self.BarType = BarType + self.validate_BarTypeType(self.BarType) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, BarType2) + if subclass is not None: + return subclass(*args_, **kwargs_) if BarType2.subclass: return BarType2.subclass(*args_, **kwargs_) else: @@ -820,7 +867,11 @@ class BarType2(GeneratedsSuper): def set_BarType(self, BarType): self.BarType = BarType def validate_BarTypeType(self, value): # Validate type BarTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) > 29: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) < 20: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on BarTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BarType is not None @@ -833,13 +884,15 @@ class BarType2(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='BarType2') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='BarType2', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -853,25 +906,14 @@ class BarType2(GeneratedsSuper): eol_ = '' if self.BarType is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sBarType>%s</%sBarType>%s' % (namespace_, self.gds_format_string(quote_xml(self.BarType).encode(ExternalEncoding), input_name='BarType'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='BarType2'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.BarType is not None: - showIndent(outfile, level) - outfile.write('BarType=%s,\n' % quote_python(self.BarType).encode(ExternalEncoding)) + outfile.write('<%sBarType>%s</%sBarType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.BarType), input_name='BarType')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -879,7 +921,8 @@ class BarType2(GeneratedsSuper): BarType_ = child_.text BarType_ = self.gds_validate_string(BarType_, node, 'BarType') self.BarType = BarType_ - self.validate_BarTypeType(self.BarType) # validate type BarTypeType + # validate type BarTypeType + self.validate_BarTypeType(self.BarType) # end class BarType2 @@ -890,8 +933,15 @@ class BazType3(GeneratedsSuper): subclass = None superclass = None def __init__(self, BazType=None): + self.original_tagname_ = None self.BazType = BazType + self.validate_BazTypeType(self.BazType) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, BazType3) + if subclass is not None: + return subclass(*args_, **kwargs_) if BazType3.subclass: return BazType3.subclass(*args_, **kwargs_) else: @@ -901,7 +951,11 @@ class BazType3(GeneratedsSuper): def set_BazType(self, BazType): self.BazType = BazType def validate_BazTypeType(self, value): # Validate type BazTypeType, a restriction on xs:string. - pass + if value is not None and Validate_simpletypes_: + if len(value) > 39: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) + if len(value) < 30: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on BazTypeType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.BazType is not None @@ -914,13 +968,15 @@ class BazType3(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='BazType3') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='BazType3', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -934,25 +990,14 @@ class BazType3(GeneratedsSuper): eol_ = '' if self.BazType is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sBazType>%s</%sBazType>%s' % (namespace_, self.gds_format_string(quote_xml(self.BazType).encode(ExternalEncoding), input_name='BazType'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='BazType3'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.BazType is not None: - showIndent(outfile, level) - outfile.write('BazType=%s,\n' % quote_python(self.BazType).encode(ExternalEncoding)) + outfile.write('<%sBazType>%s</%sBazType>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.BazType), input_name='BazType')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -960,14 +1005,15 @@ class BazType3(GeneratedsSuper): BazType_ = child_.text BazType_ = self.gds_validate_string(BazType_, node, 'BazType') self.BazType = BazType_ - self.validate_BazTypeType(self.BazType) # validate type BazTypeType + # validate type BazTypeType + self.validate_BazTypeType(self.BazType) # end class BazType3 GDSClassesMapping = { + 'Bar': BarType2, 'Baz': BazType3, 'Foo': FooType1, - 'Bar': BarType2, } @@ -977,7 +1023,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -990,7 +1036,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1010,7 +1057,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1033,12 +1081,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'FooList' rootClass = FooList rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1047,13 +1099,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="FooList", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1066,7 +1119,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from anonymous_type2_sup import *\n\n') ## sys.stdout.write('import anonymous_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/anysimpletype1_sub.py b/tests/anysimpletype1_sub.py index e79e857..a8d0cc3 100644 --- a/tests/anysimpletype1_sub.py +++ b/tests/anysimpletype1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anysimpletype2_sup.py') +# ('-s', 'tests/anysimpletype2_sub.py') +# ('--super', 'anysimpletype2_sup') +# +# Command line arguments: +# tests/anysimpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anysimpletype2_sup.py" -s "tests/anysimpletype2_sub.py" --super="anysimpletype2_sup" tests/anysimpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import anysimpletype2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -98,7 +71,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -118,7 +92,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -142,7 +117,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -161,11 +137,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'test1element' rootClass = supermod.test1element rootObj = rootClass.factory() rootObj.build(rootNode) @@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from anysimpletype2_sup import *\n\n') ## sys.stdout.write('import anysimpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.test1element(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="test1element") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -186,7 +163,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py index ff144ef..28a1450 100644 --- a/tests/anysimpletype1_sup.py +++ b/tests/anysimpletype1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anysimpletype2_sup.py') +# ('-s', 'tests/anysimpletype2_sub.py') +# ('--super', 'anysimpletype2_sup') +# +# Command line arguments: +# tests/anysimpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anysimpletype2_sup.py" -s "tests/anysimpletype2_sub.py" --super="anysimpletype2_sup" tests/anysimpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -616,9 +668,15 @@ class test1element(GeneratedsSuper): subclass = None superclass = None def __init__(self, test1attribute=None, test1member=None): + self.original_tagname_ = None self.test1attribute = _cast(None, test1attribute) self.test1member = test1member def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, test1element) + if subclass is not None: + return subclass(*args_, **kwargs_) if test1element.subclass: return test1element.subclass(*args_, **kwargs_) else: @@ -640,13 +698,15 @@ class test1element(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='test1element') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='test1element', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -662,30 +722,13 @@ class test1element(GeneratedsSuper): eol_ = '' if self.test1member is not None: self.test1member.export(outfile, level, namespace_, name_='test1member', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='test1element'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.test1attribute is not None and 'test1attribute' not in already_processed: - already_processed.add('test1attribute') - showIndent(outfile, level) - outfile.write('test1attribute=%s,\n' % (self.test1attribute,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.test1member is not None: - showIndent(outfile, level) - outfile.write('test1member=model_.cimAnySimpleType(\n') - self.test1member.exportLiteral(outfile, level, name_='test1member') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('test1attribute', node) if value is not None and 'test1attribute' not in already_processed: @@ -696,6 +739,7 @@ class test1element(GeneratedsSuper): obj_ = cimAnySimpleType.factory() obj_.build(child_) self.test1member = obj_ + obj_.original_tagname_ = 'test1member' # end class test1element @@ -706,9 +750,15 @@ class cimAnySimpleType(GeneratedsSuper): subclass = None superclass = None def __init__(self, valueOf_=None): + self.original_tagname_ = None self.valueOf_ = valueOf_ self.anyAttributes_ = {} def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, cimAnySimpleType) + if subclass is not None: + return subclass(*args_, **kwargs_) if cimAnySimpleType.subclass: return cimAnySimpleType.subclass(*args_, **kwargs_) else: @@ -720,7 +770,7 @@ class cimAnySimpleType(GeneratedsSuper): def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ = anyAttributes_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -730,14 +780,16 @@ class cimAnySimpleType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='cimAnySimpleType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='cimAnySimpleType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -764,9 +816,9 @@ class cimAnySimpleType(GeneratedsSuper): name, quote_attrib(value), )) else: unique_counter += 1 - outfile.write(' xmlns:yyy%d="%s"' % ( + outfile.write(' xmlns:%d="%s"' % ( unique_counter, namespace, )) - outfile.write(' yyy%d:%s=%s' % ( + outfile.write(' %d:%s=%s' % ( unique_counter, name, quote_attrib(value), )) else: if name not in already_processed: @@ -776,20 +828,6 @@ class cimAnySimpleType(GeneratedsSuper): pass def exportChildren(self, outfile, level, namespace_='', name_='cimAnySimpleType', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='cimAnySimpleType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - for name, value in self.anyAttributes_.items(): - showIndent(outfile, level) - outfile.write('%s="%s",\n' % (name, value,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -797,6 +835,7 @@ class cimAnySimpleType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): self.anyAttributes_ = {} for name, value in attrs.items(): @@ -818,7 +857,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -831,7 +870,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -851,7 +891,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -874,12 +915,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'test1element' rootClass = test1element rootObj = rootClass.factory() rootObj.build(rootNode) @@ -888,13 +933,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="test1element", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -907,7 +953,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from anysimpletype2_sup import *\n\n') ## sys.stdout.write('import anysimpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/anywildcard.xsd b/tests/anywildcard.xsd index 2db93a3..9931e20 100644 --- a/tests/anywildcard.xsd +++ b/tests/anywildcard.xsd @@ -48,6 +48,7 @@ <xs:any minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> + <!-- <xs:complexType name="DescriptionType"> <xs:annotation> <xs:documentation>A standard complexType.</xs:documentation> @@ -66,4 +67,5 @@ <xs:element name="catagory" type="xs:integer"/> </xs:sequence> </xs:complexType> + --> </xs:schema> diff --git a/tests/anywildcard1_sub.py b/tests/anywildcard1_sub.py index cc4939c..7e40b28 100644 --- a/tests/anywildcard1_sub.py +++ b/tests/anywildcard1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anywildcard2_sup.py') +# ('-s', 'tests/anywildcard2_sub.py') +# ('--super', 'anywildcard2_sup') +# +# Command line arguments: +# tests/anywildcard.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anywildcard2_sup.py" -s "tests/anywildcard2_sub.py" --super="anywildcard2_sup" tests/anywildcard.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import anywildcard2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -126,7 +99,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -146,7 +120,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -170,7 +145,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -189,11 +165,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PlantType_single' rootClass = supermod.PlantType_single rootObj = rootClass.factory() rootObj.build(rootNode) @@ -202,8 +179,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from anywildcard2_sup import *\n\n') ## sys.stdout.write('import anywildcard2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.PlantType_single(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -214,7 +191,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py index 3f3e914..2d7a08c 100644 --- a/tests/anywildcard1_sup.py +++ b/tests/anywildcard1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/anywildcard2_sup.py') +# ('-s', 'tests/anywildcard2_sub.py') +# ('--super', 'anywildcard2_sup') +# +# Command line arguments: +# tests/anywildcard.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/anywildcard2_sup.py" -s "tests/anywildcard2_sub.py" --super="anywildcard2_sup" tests/anywildcard.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -617,10 +669,16 @@ class PlantType_single(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, anytypeobjs_=None, description=None): + self.original_tagname_ = None self.name = name self.anytypeobjs_ = anytypeobjs_ self.description = description def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PlantType_single) + if subclass is not None: + return subclass(*args_, **kwargs_) if PlantType_single.subclass: return PlantType_single.subclass(*args_, **kwargs_) else: @@ -646,13 +704,15 @@ class PlantType_single(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_single', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -666,41 +726,18 @@ class PlantType_single(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.description is not None: self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print) if self.anytypeobjs_ is not None: self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_single'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.anytypeobjs_ is not None: - showIndent(outfile, level) - outfile.write('anytypeobjs_=model_.anytypeobjs_(\n') - self.anytypeobjs_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=model_.DescriptionType(\n') - self.description.exportLiteral(outfile, level, name_='description') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -712,6 +749,7 @@ class PlantType_single(GeneratedsSuper): obj_ = DescriptionType.factory() obj_.build(child_) self.description = obj_ + obj_.original_tagname_ = 'description' else: obj_ = self.gds_build_any(child_, 'PlantType_single') if obj_ is not None: @@ -728,6 +766,7 @@ class PlantType_multiple(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, anytypeobjs_=None, description=None): + self.original_tagname_ = None self.name = name if anytypeobjs_ is None: self.anytypeobjs_ = [] @@ -735,6 +774,11 @@ class PlantType_multiple(GeneratedsSuper): self.anytypeobjs_ = anytypeobjs_ self.description = description def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PlantType_multiple) + if subclass is not None: + return subclass(*args_, **kwargs_) if PlantType_multiple.subclass: return PlantType_multiple.subclass(*args_, **kwargs_) else: @@ -762,13 +806,15 @@ class PlantType_multiple(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_multiple', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -782,43 +828,18 @@ class PlantType_multiple(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.description is not None: self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print) for obj_ in self.anytypeobjs_: obj_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_multiple'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('anytypeobjs_=[\n') - level += 1 - for anytypeobjs_ in self.anytypeobjs_: - anytypeobjs_.exportLiteral(outfile, level) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=model_.DescriptionType(\n') - self.description.exportLiteral(outfile, level, name_='description') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -830,6 +851,7 @@ class PlantType_multiple(GeneratedsSuper): obj_ = DescriptionType.factory() obj_.build(child_) self.description = obj_ + obj_.original_tagname_ = 'description' else: obj_ = self.gds_build_any(child_, 'PlantType_multiple') if obj_ is not None: @@ -846,9 +868,15 @@ class DescriptionType(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, size=None): + self.original_tagname_ = None self.name = name self.size = size def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DescriptionType) + if subclass is not None: + return subclass(*args_, **kwargs_) if DescriptionType.subclass: return DescriptionType.subclass(*args_, **kwargs_) else: @@ -871,13 +899,15 @@ class DescriptionType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='DescriptionType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='DescriptionType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -891,31 +921,17 @@ class DescriptionType(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.size is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_format_string(quote_xml(self.size).encode(ExternalEncoding), input_name='size'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='DescriptionType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.size is not None: - showIndent(outfile, level) - outfile.write('size=%s,\n' % quote_python(self.size).encode(ExternalEncoding)) + outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.size), input_name='size')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -939,9 +955,15 @@ class CatalogType(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, catagory=None): + self.original_tagname_ = None self.name = name self.catagory = catagory def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, CatalogType) + if subclass is not None: + return subclass(*args_, **kwargs_) if CatalogType.subclass: return CatalogType.subclass(*args_, **kwargs_) else: @@ -964,13 +986,15 @@ class CatalogType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='CatalogType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='CatalogType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -984,31 +1008,17 @@ class CatalogType(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.catagory is not None: showIndent(outfile, level, pretty_print) outfile.write('<%scatagory>%s</%scatagory>%s' % (namespace_, self.gds_format_integer(self.catagory, input_name='catagory'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='CatalogType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.catagory is not None: - showIndent(outfile, level) - outfile.write('catagory=%d,\n' % self.catagory) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1020,7 +1030,7 @@ class CatalogType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'catagory') self.catagory = ival_ @@ -1034,8 +1044,14 @@ class PlantType_single_nochild(GeneratedsSuper): subclass = None superclass = None def __init__(self, anytypeobjs_=None): + self.original_tagname_ = None self.anytypeobjs_ = anytypeobjs_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PlantType_single_nochild) + if subclass is not None: + return subclass(*args_, **kwargs_) if PlantType_single_nochild.subclass: return PlantType_single_nochild.subclass(*args_, **kwargs_) else: @@ -1055,13 +1071,15 @@ class PlantType_single_nochild(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single_nochild') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_single_nochild', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1075,27 +1093,13 @@ class PlantType_single_nochild(GeneratedsSuper): eol_ = '' if self.anytypeobjs_ is not None: self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_single_nochild'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.anytypeobjs_ is not None: - showIndent(outfile, level) - outfile.write('anytypeobjs_=model_.anytypeobjs_(\n') - self.anytypeobjs_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1112,11 +1116,17 @@ class PlantType_multiple_nochild(GeneratedsSuper): subclass = None superclass = None def __init__(self, anytypeobjs_=None): + self.original_tagname_ = None if anytypeobjs_ is None: self.anytypeobjs_ = [] else: self.anytypeobjs_ = anytypeobjs_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PlantType_multiple_nochild) + if subclass is not None: + return subclass(*args_, **kwargs_) if PlantType_multiple_nochild.subclass: return PlantType_multiple_nochild.subclass(*args_, **kwargs_) else: @@ -1138,13 +1148,15 @@ class PlantType_multiple_nochild(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple_nochild') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='PlantType_multiple_nochild', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1158,29 +1170,13 @@ class PlantType_multiple_nochild(GeneratedsSuper): eol_ = '' for obj_ in self.anytypeobjs_: obj_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_multiple_nochild'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('anytypeobjs_=[\n') - level += 1 - for anytypeobjs_ in self.anytypeobjs_: - anytypeobjs_.exportLiteral(outfile, level) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1201,7 +1197,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1214,7 +1210,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1234,7 +1231,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1257,12 +1255,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PlantType_single' rootClass = PlantType_single rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1271,13 +1273,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="PlantType_single", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1290,7 +1293,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from anywildcard2_sup import *\n\n') ## sys.stdout.write('import anywildcard2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/anywildcard2_sub.py b/tests/anywildcard2_sub.py deleted file mode 100644 index cc4939c..0000000 --- a/tests/anywildcard2_sub.py +++ /dev/null @@ -1,231 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import anywildcard2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class PlantType_singleSub(supermod.PlantType_single): - def __init__(self, name=None, anytypeobjs_=None, description=None): - super(PlantType_singleSub, self).__init__(name, anytypeobjs_, description, ) -supermod.PlantType_single.subclass = PlantType_singleSub -# end class PlantType_singleSub - - -class PlantType_multipleSub(supermod.PlantType_multiple): - def __init__(self, name=None, anytypeobjs_=None, description=None): - super(PlantType_multipleSub, self).__init__(name, anytypeobjs_, description, ) -supermod.PlantType_multiple.subclass = PlantType_multipleSub -# end class PlantType_multipleSub - - -class DescriptionTypeSub(supermod.DescriptionType): - def __init__(self, name=None, size=None): - super(DescriptionTypeSub, self).__init__(name, size, ) -supermod.DescriptionType.subclass = DescriptionTypeSub -# end class DescriptionTypeSub - - -class CatalogTypeSub(supermod.CatalogType): - def __init__(self, name=None, catagory=None): - super(CatalogTypeSub, self).__init__(name, catagory, ) -supermod.CatalogType.subclass = CatalogTypeSub -# end class CatalogTypeSub - - -class PlantType_single_nochildSub(supermod.PlantType_single_nochild): - def __init__(self, anytypeobjs_=None): - super(PlantType_single_nochildSub, self).__init__(anytypeobjs_, ) -supermod.PlantType_single_nochild.subclass = PlantType_single_nochildSub -# end class PlantType_single_nochildSub - - -class PlantType_multiple_nochildSub(supermod.PlantType_multiple_nochild): - def __init__(self, anytypeobjs_=None): - super(PlantType_multiple_nochildSub, self).__init__(anytypeobjs_, ) -supermod.PlantType_multiple_nochild.subclass = PlantType_multiple_nochildSub -# end class PlantType_multiple_nochildSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'PlantType_single' - rootClass = supermod.PlantType_single - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'PlantType_single' - rootClass = supermod.PlantType_single - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'PlantType_single' - rootClass = supermod.PlantType_single - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.PlantType_single - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from anywildcard2_sup import *\n\n') -## sys.stdout.write('import anywildcard2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.PlantType_single(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="PlantType_single") -## sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/attr_groups.xsd b/tests/attr_groups.xsd index 98a2afd..1678548 100644 --- a/tests/attr_groups.xsd +++ b/tests/attr_groups.xsd @@ -27,6 +27,13 @@ <xsd:attribute name="value05" type="xsd:string"/> <xsd:attribute name="value06" type="xsd:integer"/> <xsd:attribute name="value07" type="xsd:integer"/> + <xsd:attributeGroup ref="value08"/> + </xsd:attributeGroup> + + <!-- Check for avoidance of infinite recursion. + --> + <xsd:attributeGroup name="value08"> + <xsd:attribute name="value08" type="xsd:string"/> </xsd:attributeGroup> </xsd:schema> diff --git a/tests/attr_groups1_sub.py b/tests/attr_groups1_sub.py index bc8d0a6..446338a 100644 --- a/tests/attr_groups1_sub.py +++ b/tests/attr_groups1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/attr_groups2_sup.py') +# ('-s', 'tests/attr_groups2_sub.py') +# ('--super', 'attr_groups2_sup') +# +# Command line arguments: +# tests/attr_groups.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/attr_groups2_sup.py" -s "tests/attr_groups2_sub.py" --super="attr_groups2_sup" tests/attr_groups.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import attr_groups2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,8 +48,8 @@ ExternalEncoding = 'ascii' class GetUserReqSub(supermod.GetUserReq): - def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None): - super(GetUserReqSub, self).__init__(value04, value05, value06, value07, value01, value02, value03, sequence, returnedTags, ) + def __init__(self, sequence=None, value01=None, value02=None, value03=None, value04=None, value05=None, value06=None, value07=None, value08=None, returnedTags=None): + super(GetUserReqSub, self).__init__(sequence, value01, value02, value03, value04, value05, value06, value07, value08, returnedTags, ) supermod.GetUserReq.subclass = GetUserReqSub # end class GetUserReqSub @@ -91,11 +64,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = supermod.GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -111,11 +85,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = supermod.GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -135,11 +110,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = supermod.GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -154,11 +130,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'GetUserReq' rootClass = supermod.GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -167,8 +144,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from attr_groups2_sup import *\n\n') ## sys.stdout.write('import attr_groups2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.getUser(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="getUser") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -179,7 +156,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py index d1db370..c9f62ff 100644 --- a/tests/attr_groups1_sup.py +++ b/tests/attr_groups1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/attr_groups2_sup.py') +# ('-s', 'tests/attr_groups2_sub.py') +# ('--super', 'attr_groups2_sup') +# +# Command line arguments: +# tests/attr_groups.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/attr_groups2_sup.py" -s "tests/attr_groups2_sub.py" --super="attr_groups2_sup" tests/attr_groups.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -610,29 +662,37 @@ def _cast(typ, value): class GetUserReq(GeneratedsSuper): member_data_items_ = [ + MemberSpec_('sequence', 'xsd:unsignedLong', 0), + MemberSpec_('value01', 'xsd:string', 0), + MemberSpec_('value02', 'xsd:integer', 0), + MemberSpec_('value03', 'xsd:string', 0), MemberSpec_('value04', 'xsd:integer', 0), MemberSpec_('value05', 'xsd:string', 0), MemberSpec_('value06', 'xsd:integer', 0), MemberSpec_('value07', 'xsd:integer', 0), - MemberSpec_('value01', 'xsd:string', 0), - MemberSpec_('value02', 'xsd:integer', 0), - MemberSpec_('value03', 'xsd:string', 0), - MemberSpec_('sequence', 'xsd:unsignedLong', 0), + MemberSpec_('value08', 'xsd:string', 0), MemberSpec_('returnedTags', 'xsd:string', 0), ] subclass = None superclass = None - def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None): + def __init__(self, sequence=None, value01=None, value02=None, value03=None, value04=None, value05=None, value06=None, value07=None, value08=None, returnedTags=None): + self.original_tagname_ = None + self.sequence = _cast(int, sequence) + self.value01 = _cast(None, value01) + self.value02 = _cast(int, value02) + self.value03 = _cast(None, value03) self.value04 = _cast(int, value04) self.value05 = _cast(None, value05) self.value06 = _cast(int, value06) self.value07 = _cast(int, value07) - self.value01 = _cast(None, value01) - self.value02 = _cast(int, value02) - self.value03 = _cast(None, value03) - self.sequence = _cast(int, sequence) + self.value08 = _cast(None, value08) self.returnedTags = returnedTags def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, GetUserReq) + if subclass is not None: + return subclass(*args_, **kwargs_) if GetUserReq.subclass: return GetUserReq.subclass(*args_, **kwargs_) else: @@ -640,6 +700,14 @@ class GetUserReq(GeneratedsSuper): factory = staticmethod(factory) def get_returnedTags(self): return self.returnedTags def set_returnedTags(self, returnedTags): self.returnedTags = returnedTags + def get_sequence(self): return self.sequence + def set_sequence(self, sequence): self.sequence = sequence + def get_value01(self): return self.value01 + def set_value01(self, value01): self.value01 = value01 + def get_value02(self): return self.value02 + def set_value02(self, value02): self.value02 = value02 + def get_value03(self): return self.value03 + def set_value03(self, value03): self.value03 = value03 def get_value04(self): return self.value04 def set_value04(self, value04): self.value04 = value04 def get_value05(self): return self.value05 @@ -648,14 +716,8 @@ class GetUserReq(GeneratedsSuper): def set_value06(self, value06): self.value06 = value06 def get_value07(self): return self.value07 def set_value07(self, value07): self.value07 = value07 - def get_value01(self): return self.value01 - def set_value01(self, value01): self.value01 = value01 - def get_value02(self): return self.value02 - def set_value02(self, value02): self.value02 = value02 - def get_value03(self): return self.value03 - def set_value03(self, value03): self.value03 = value03 - def get_sequence(self): return self.sequence - def set_sequence(self, sequence): self.sequence = sequence + def get_value08(self): return self.value08 + def set_value08(self, value08): self.value08 = value08 def hasContent_(self): if ( self.returnedTags is not None @@ -668,42 +730,47 @@ class GetUserReq(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='GetUserReq') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='GetUserReq', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='GetUserReq'): + if self.sequence is not None and 'sequence' not in already_processed: + already_processed.add('sequence') + outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence')) + if self.value01 is not None and 'value01' not in already_processed: + already_processed.add('value01') + outfile.write(' value01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value01), input_name='value01')), )) + if self.value02 is not None and 'value02' not in already_processed: + already_processed.add('value02') + outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02')) + if self.value03 is not None and 'value03' not in already_processed: + already_processed.add('value03') + outfile.write(' value03=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value03), input_name='value03')), )) if self.value04 is not None and 'value04' not in already_processed: already_processed.add('value04') outfile.write(' value04="%s"' % self.gds_format_integer(self.value04, input_name='value04')) if self.value05 is not None and 'value05' not in already_processed: already_processed.add('value05') - outfile.write(' value05=%s' % (self.gds_format_string(quote_attrib(self.value05).encode(ExternalEncoding), input_name='value05'), )) + outfile.write(' value05=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value05), input_name='value05')), )) if self.value06 is not None and 'value06' not in already_processed: already_processed.add('value06') outfile.write(' value06="%s"' % self.gds_format_integer(self.value06, input_name='value06')) if self.value07 is not None and 'value07' not in already_processed: already_processed.add('value07') outfile.write(' value07="%s"' % self.gds_format_integer(self.value07, input_name='value07')) - if self.value01 is not None and 'value01' not in already_processed: - already_processed.add('value01') - outfile.write(' value01=%s' % (self.gds_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='value01'), )) - if self.value02 is not None and 'value02' not in already_processed: - already_processed.add('value02') - outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02')) - if self.value03 is not None and 'value03' not in already_processed: - already_processed.add('value03') - outfile.write(' value03=%s' % (self.gds_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='value03'), )) - if self.sequence is not None and 'sequence' not in already_processed: - already_processed.add('sequence') - outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence')) + if self.value08 is not None and 'value08' not in already_processed: + already_processed.add('value08') + outfile.write(' value08=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value08), input_name='value08')), )) def exportChildren(self, outfile, level, namespace_='', name_='GetUserReq', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' @@ -711,63 +778,43 @@ class GetUserReq(GeneratedsSuper): eol_ = '' if self.returnedTags is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_format_string(quote_xml(self.returnedTags).encode(ExternalEncoding), input_name='returnedTags'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='GetUserReq'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.value04 is not None and 'value04' not in already_processed: - already_processed.add('value04') - showIndent(outfile, level) - outfile.write('value04=%d,\n' % (self.value04,)) - if self.value05 is not None and 'value05' not in already_processed: - already_processed.add('value05') - showIndent(outfile, level) - outfile.write('value05="%s",\n' % (self.value05,)) - if self.value06 is not None and 'value06' not in already_processed: - already_processed.add('value06') - showIndent(outfile, level) - outfile.write('value06=%d,\n' % (self.value06,)) - if self.value07 is not None and 'value07' not in already_processed: - already_processed.add('value07') - showIndent(outfile, level) - outfile.write('value07=%d,\n' % (self.value07,)) - if self.value01 is not None and 'value01' not in already_processed: - already_processed.add('value01') - showIndent(outfile, level) - outfile.write('value01="%s",\n' % (self.value01,)) - if self.value02 is not None and 'value02' not in already_processed: - already_processed.add('value02') - showIndent(outfile, level) - outfile.write('value02=%d,\n' % (self.value02,)) - if self.value03 is not None and 'value03' not in already_processed: - already_processed.add('value03') - showIndent(outfile, level) - outfile.write('value03="%s",\n' % (self.value03,)) - if self.sequence is not None and 'sequence' not in already_processed: - already_processed.add('sequence') - showIndent(outfile, level) - outfile.write('sequence=%d,\n' % (self.sequence,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.returnedTags is not None: - showIndent(outfile, level) - outfile.write('returnedTags=%s,\n' % quote_python(self.returnedTags).encode(ExternalEncoding)) + outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.returnedTags), input_name='returnedTags')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('sequence', node) + if value is not None and 'sequence' not in already_processed: + already_processed.add('sequence') + try: + self.sequence = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + value = find_attr_value_('value01', node) + if value is not None and 'value01' not in already_processed: + already_processed.add('value01') + self.value01 = value + value = find_attr_value_('value02', node) + if value is not None and 'value02' not in already_processed: + already_processed.add('value02') + try: + self.value02 = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + value = find_attr_value_('value03', node) + if value is not None and 'value03' not in already_processed: + already_processed.add('value03') + self.value03 = value value = find_attr_value_('value04', node) if value is not None and 'value04' not in already_processed: already_processed.add('value04') try: self.value04 = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) value = find_attr_value_('value05', node) if value is not None and 'value05' not in already_processed: @@ -778,37 +825,19 @@ class GetUserReq(GeneratedsSuper): already_processed.add('value06') try: self.value06 = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) value = find_attr_value_('value07', node) if value is not None and 'value07' not in already_processed: already_processed.add('value07') try: self.value07 = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value01', node) - if value is not None and 'value01' not in already_processed: - already_processed.add('value01') - self.value01 = value - value = find_attr_value_('value02', node) - if value is not None and 'value02' not in already_processed: - already_processed.add('value02') - try: - self.value02 = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value03', node) - if value is not None and 'value03' not in already_processed: - already_processed.add('value03') - self.value03 = value - value = find_attr_value_('sequence', node) - if value is not None and 'sequence' not in already_processed: - already_processed.add('sequence') - try: - self.sequence = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) + value = find_attr_value_('value08', node) + if value is not None and 'value08' not in already_processed: + already_processed.add('value08') + self.value08 = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'returnedTags': returnedTags_ = child_.text @@ -828,7 +857,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -841,11 +870,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -861,11 +891,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -884,12 +915,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'GetUserReq' rootClass = GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -898,17 +933,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="getUser", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' + rootTag = 'GetUserReq' rootClass = GetUserReq rootObj = rootClass.factory() rootObj.build(rootNode) @@ -917,7 +953,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from attr_groups2_sup import *\n\n') ## sys.stdout.write('import attr_groups2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/attr_groups2_sub.py b/tests/attr_groups2_sub.py deleted file mode 100644 index bc8d0a6..0000000 --- a/tests/attr_groups2_sub.py +++ /dev/null @@ -1,196 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import attr_groups2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class GetUserReqSub(supermod.GetUserReq): - def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None): - super(GetUserReqSub, self).__init__(value04, value05, value06, value07, value01, value02, value03, sequence, returnedTags, ) -supermod.GetUserReq.subclass = GetUserReqSub -# end class GetUserReqSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'getUser' - rootClass = supermod.GetUserReq - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'getUser' - rootClass = supermod.GetUserReq - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'getUser' - rootClass = supermod.GetUserReq - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.GetUserReq - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from attr_groups2_sup import *\n\n') -## sys.stdout.write('import attr_groups2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.getUser(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="getUser") -## sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/catalog.xml b/tests/catalog.xml new file mode 100644 index 0000000..e4d0c61 --- /dev/null +++ b/tests/catalog.xml @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> + +</catalog> diff --git a/tests/catalogtest.xsd b/tests/catalogtest.xsd new file mode 100644 index 0000000..aaa3f57 --- /dev/null +++ b/tests/catalogtest.xsd @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <!-- + <xs:include namespace="http://www.generateds.com/catalog-part1"/> + --> + +</xs:schema> diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py new file mode 100644 index 0000000..ba9ea61 --- /dev/null +++ b/tests/catalogtest1_sub.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/catalogtest2_sup.py') +# ('-s', 'tests/catalogtest2_sub.py') +# ('--super', 'catalogtest2_sup') +# ('-c', 'tests/catalog.xml') +# +# Command line arguments: +# tests/catalogtest.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/catalogtest2_sup.py" -s "tests/catalogtest2_sub.py" --super="catalogtest2_sup" -c "tests/catalog.xml" tests/catalogtest.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import catalogtest2_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 +# + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = supermod. + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = supermod. + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = supermod. + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = supermod. + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from catalogtest2_sup import *\n\n') +## sys.stdout.write('import catalogtest2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py new file mode 100644 index 0000000..6fa48d3 --- /dev/null +++ b/tests/catalogtest1_sup.py @@ -0,0 +1,791 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/catalogtest2_sup.py') +# ('-s', 'tests/catalogtest2_sub.py') +# ('--super', 'catalogtest2_sup') +# ('-c', 'tests/catalog.xml') +# +# Command line arguments: +# tests/catalogtest.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/catalogtest2_sup.py" -s "tests/catalogtest2_sub.py" --super="catalogtest2_sup" -c "tests/catalog.xml" tests/catalogtest.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +GDSClassesMapping = { +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = '' + rootClass = + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from catalogtest2_sup import *\n\n') +## sys.stdout.write('import catalogtest2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + +] diff --git a/tests/cdata.xsd b/tests/cdata.xsd new file mode 100644 index 0000000..9f652aa --- /dev/null +++ b/tests/cdata.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="cdata" type="cdataListType"/> + + <xs:complexType name="cdataListType"> + <xs:sequence> + <xs:element name="cdatalist" type="cdataType" + minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="cdataType"> + <xs:sequence> + <xs:element name="script" type="xs:string"/> + </xs:sequence> + </xs:complexType> +</xs:schema> diff --git a/tests/cdata1.xml b/tests/cdata1.xml new file mode 100644 index 0000000..b9dd591 --- /dev/null +++ b/tests/cdata1.xml @@ -0,0 +1,8 @@ +<cdataListType> + <cdatalist> + <script><![CDATA[ccc < ddd & eee]]></script> + </cdatalist> + <cdatalist> + <script>aaa < bbb <![CDATA[ccc < ddd]]> eee < & fff<<![CDATA[ggg < & hhh]]>& iii < jjj</script> + </cdatalist> +</cdataListType> diff --git a/tests/cdata1_sub.py b/tests/cdata1_sub.py new file mode 100644 index 0000000..137519f --- /dev/null +++ b/tests/cdata1_sub.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/cdata2_sup.py') +# ('-s', 'tests/cdata2_sub.py') +# ('--silence', '') +# ('--super', 'cdata2_sup') +# +# Command line arguments: +# tests/cdata.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cdata2_sup.py" -s "tests/cdata2_sub.py" --silence --super="cdata2_sup" tests/cdata.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import cdata2_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 cdataListTypeSub(supermod.cdataListType): + def __init__(self, cdatalist=None): + super(cdataListTypeSub, self).__init__(cdatalist, ) +supermod.cdataListType.subclass = cdataListTypeSub +# end class cdataListTypeSub + + +class cdataTypeSub(supermod.cdataType): + def __init__(self, script=None): + super(cdataTypeSub, self).__init__(script, ) +supermod.cdataType.subclass = cdataTypeSub +# end class cdataTypeSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'cdataListType' + rootClass = supermod.cdataListType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'cdataListType' + rootClass = supermod.cdataListType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'cdataListType' + rootClass = supermod.cdataListType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'cdataListType' + rootClass = supermod.cdataListType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from cdata2_sup import *\n\n') +## sys.stdout.write('import cdata2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/abstract_type2_sup.py b/tests/cdata1_sup.py similarity index 62% rename from tests/abstract_type2_sup.py rename to tests/cdata1_sup.py index 41f17dd..af309dd 100644 --- a/tests/abstract_type2_sup.py +++ b/tests/cdata1_sup.py @@ -4,66 +4,55 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/cdata2_sup.py') +# ('-s', 'tests/cdata2_sub.py') +# ('--silence', '') +# ('--super', 'cdata2_sup') +# +# Command line arguments: +# tests/cdata.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cdata2_sup.py" -s "tests/cdata2_sub.py" --silence --super="cdata2_sup" tests/cdata.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +80,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +149,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +204,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +215,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +238,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +262,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +294,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +364,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +412,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +515,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +556,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,316 +661,163 @@ def _cast(typ, value): # -class carrierType(GeneratedsSuper): +class cdataListType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('fleet', 'Vehicle', 1), + MemberSpec_('cdatalist', 'cdataType', 1), ] subclass = None superclass = None - def __init__(self, fleet=None): - if fleet is None: - self.fleet = [] + def __init__(self, cdatalist=None): + self.original_tagname_ = None + if cdatalist is None: + self.cdatalist = [] else: - self.fleet = fleet + self.cdatalist = cdatalist def factory(*args_, **kwargs_): - if carrierType.subclass: - return carrierType.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, cdataListType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if cdataListType.subclass: + return cdataListType.subclass(*args_, **kwargs_) else: - return carrierType(*args_, **kwargs_) + return cdataListType(*args_, **kwargs_) factory = staticmethod(factory) - def get_fleet(self): return self.fleet - def set_fleet(self, fleet): self.fleet = fleet - def add_fleet(self, value): self.fleet.append(value) - def insert_fleet(self, index, value): self.fleet[index] = value + def get_cdatalist(self): return self.cdatalist + def set_cdatalist(self, cdatalist): self.cdatalist = cdatalist + def add_cdatalist(self, value): self.cdatalist.append(value) + def insert_cdatalist_at(self, index, value): self.cdatalist.insert(index, value) + def replace_cdatalist_at(self, index, value): self.cdatalist[index] = value def hasContent_(self): if ( - self.fleet + self.cdatalist ): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='carrierType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='cdataListType', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='carrierType') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='cdataListType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='cdataListType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='carrierType'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='cdataListType'): pass - def exportChildren(self, outfile, level, namespace_='target:', name_='carrierType', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='cdataListType', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - for fleet_ in self.fleet: - fleet_.export(outfile, level, namespace_, name_='fleet', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='carrierType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('fleet=[\n') - level += 1 - for fleet_ in self.fleet: - showIndent(outfile, level) - outfile.write('model_.Vehicle(\n') - fleet_.exportLiteral(outfile, level, name_='Vehicle') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') + for cdatalist_ in self.cdatalist: + cdatalist_.export(outfile, level, namespace_, name_='cdatalist', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'fleet': - type_name_ = child_.attrib.get( - '{http://www.w3.org/2001/XMLSchema-instance}type') - if type_name_ is None: - type_name_ = child_.attrib.get('type') - if type_name_ is not None: - type_names_ = type_name_.split(':') - if len(type_names_) == 1: - type_name_ = type_names_[0] - else: - type_name_ = type_names_[1] - class_ = globals()[type_name_] - obj_ = class_.factory() - obj_.build(child_) - else: - raise NotImplementedError( - 'Class not implemented for <fleet> element') - self.fleet.append(obj_) -# end class carrierType + if nodeName_ == 'cdatalist': + obj_ = cdataType.factory() + obj_.build(child_) + self.cdatalist.append(obj_) + obj_.original_tagname_ = 'cdatalist' +# end class cdataListType -class Vehicle(GeneratedsSuper): +class cdataType(GeneratedsSuper): member_data_items_ = [ + MemberSpec_('script', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, extensiontype_=None): - self.extensiontype_ = extensiontype_ + def __init__(self, script=None): + self.original_tagname_ = None + self.script = script def factory(*args_, **kwargs_): - if Vehicle.subclass: - return Vehicle.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, cdataType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if cdataType.subclass: + return cdataType.subclass(*args_, **kwargs_) else: - return Vehicle(*args_, **kwargs_) + return cdataType(*args_, **kwargs_) factory = staticmethod(factory) - def get_extensiontype_(self): return self.extensiontype_ - def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def get_script(self): return self.script + def set_script(self, script): self.script = script def hasContent_(self): if ( - + self.script is not None ): return True else: return False - def export(self, outfile, level, namespace_='target:', name_='Vehicle', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='cdataType', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='Vehicle') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='cdataType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='cdataType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Vehicle'): - if self.extensiontype_ is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') - outfile.write(' xsi:type="%s"' % self.extensiontype_) - pass - def exportChildren(self, outfile, level, namespace_='target:', name_='Vehicle', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='Vehicle'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('xsi:type', node) - if value is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - self.extensiontype_ = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='cdataType'): pass -# end class Vehicle - - -class Car(Vehicle): - member_data_items_ = [ - ] - subclass = None - superclass = Vehicle - def __init__(self): - super(Car, self).__init__() - pass - def factory(*args_, **kwargs_): - if Car.subclass: - return Car.subclass(*args_, **kwargs_) - else: - return Car(*args_, **kwargs_) - factory = staticmethod(factory) - def hasContent_(self): - if ( - super(Car, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='target:', name_='Car', namespacedef_='', pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='cdataType', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='Car') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Car'): - super(Car, self).exportAttributes(outfile, level, already_processed, namespace_, name_='Car') - def exportChildren(self, outfile, level, namespace_='target:', name_='Car', fromsubclass_=False, pretty_print=True): - super(Car, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - pass - def exportLiteral(self, outfile, level, name_='Car'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(Car, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(Car, self).exportLiteralChildren(outfile, level, name_) - pass + if self.script is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sscript>%s</%sscript>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.script), input_name='script')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - super(Car, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - super(Car, self).buildChildren(child_, node, nodeName_, True) pass -# end class Car - - -class Plane(Vehicle): - member_data_items_ = [ - ] - subclass = None - superclass = Vehicle - def __init__(self): - super(Plane, self).__init__() - pass - def factory(*args_, **kwargs_): - if Plane.subclass: - return Plane.subclass(*args_, **kwargs_) - else: - return Plane(*args_, **kwargs_) - factory = staticmethod(factory) - def hasContent_(self): - if ( - super(Plane, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='target:', name_='Plane', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='Plane') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='target:', name_='Plane'): - super(Plane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='Plane') - def exportChildren(self, outfile, level, namespace_='target:', name_='Plane', fromsubclass_=False, pretty_print=True): - super(Plane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - pass - def exportLiteral(self, outfile, level, name_='Plane'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(Plane, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(Plane, self).exportLiteralChildren(outfile, level, name_) - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - super(Plane, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - super(Plane, self).buildChildren(child_, node, nodeName_, True) - pass -# end class Plane + if nodeName_ == 'script': + script_ = child_.text + script_ = self.gds_validate_string(script_, node, 'script') + self.script = script_ +# end class cdataType GDSClassesMapping = { - 'fleet': Vehicle, - 'carrier': carrierType, + 'cdata': cdataListType, + 'cdatalist': cdataType, } @@ -927,7 +827,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -940,12 +840,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' - rootClass = carrierType + rootTag = 'cdataListType' + rootClass = cdataListType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -954,18 +855,19 @@ def parse(inFileName, silence=False): ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( ## sys.stdout, 0, name_=rootTag, -## namespacedef_='xmlns:target="http://cars.example.com/schema"', +## namespacedef_='', ## pretty_print=True) return rootObj def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' - rootClass = carrierType + rootTag = 'cdataListType' + rootClass = cdataListType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -983,13 +885,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = carrierType + rootTag = 'cdataListType' + rootClass = cdataListType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -997,26 +903,27 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="carrier", -## namespacedef_='xmlns:target="http://cars.example.com/schema"') +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'carrier' - rootClass = carrierType + rootTag = 'cdataListType' + rootClass = cdataListType rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from abstract_type2_sup import *\n\n') -## sys.stdout.write('import abstract_type2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('#from cdata2_sup import *\n\n') +## sys.stdout.write('import cdata2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -1036,8 +943,6 @@ if __name__ == '__main__': __all__ = [ - "Car", - "Plane", - "Vehicle", - "carrierType" + "cdataListType", + "cdataType" ] diff --git a/tests/check_results.rb b/tests/check_results.rb new file mode 100755 index 0000000..bdbec1e --- /dev/null +++ b/tests/check_results.rb @@ -0,0 +1,95 @@ +#!/usr/bin/env ruby + +# +# Unit tests -- +# Step 1: Run the unit tests: ``./test.py`` +# Step 2: If there are errors, run this script to view the differences. +# +# When adding a new unit test, also add lines to the list $commands. +# + +$divider = "-" * 70 + +$commands = [ + "diff -u out1_sub.py out2_sub.py", + "diff -u out1_sup.py out2_sup.py", + "diff -u anysimpletype1_sub.py anysimpletype2_sub.py", + "diff -u anysimpletype1_sup.py anysimpletype2_sup.py", + "diff -u simpletype_memberspecs1_sub.py simpletype_memberspecs2_sub.py", + "diff -u simpletype_memberspecs1_sup.py simpletype_memberspecs2_sup.py", + "diff -u extensions1_sub.py extensions2_sub.py", + "diff -u extensions1_sup.py extensions2_sup.py", + "diff -u simplecontent_restriction1_sub.py simplecontent_restriction2_sub.py", + "diff -u simplecontent_restriction1_sup.py simplecontent_restriction2_sup.py", + "diff -u annotations1_sub.py annotations2_sub.py", + "diff -u annotations1_sup.py annotations2_sup.py", + "diff -u abstract_type1_sub.py abstract_type2_sub.py", + "diff -u abstract_type1_sup.py abstract_type2_sup.py", + "diff -u people_procincl1_sub.py people_procincl2_sub.py", + "diff -u people_procincl1_sup.py people_procincl2_sup.py", + "diff -u ipo1_sub.py ipo2_sub.py", + "diff -u ipo1_sup.py ipo2_sup.py", + "diff -u recursive_simpletype1_sub.py recursive_simpletype2_sub.py", + "diff -u recursive_simpletype1_sup.py recursive_simpletype2_sup.py", + "diff -u anywildcard1_sub.py anywildcard2_sub.py", + "diff -u anywildcard1_sup.py anywildcard2_sup.py", + "diff -u attr_groups1_sub.py attr_groups2_sub.py", + "diff -u attr_groups1_sup.py attr_groups2_sup.py", + "diff -u simpletypes_other1_sub.py simpletypes_other2_sub.py", + "diff -u simpletypes_other1_sup.py simpletypes_other2_sup.py", + "diff -u to_etree1_sub.py to_etree2_sub.py", + "diff -u to_etree1_sup.py to_etree2_sup.py", + "diff -u anonymous_type1_sub.py anonymous_type2_sub.py", + "diff -u anonymous_type1_sup.py anonymous_type2_sup.py", + "diff -u mapcleanname1_sub.py mapcleanname2_sub.py", + "diff -u mapcleanname1_sup.py mapcleanname2_sup.py", + "diff -u prefix_classname1_sub.py prefix_classname2_sub.py", + "diff -u prefix_classname1_sup.py prefix_classname2_sup.py", + "diff -u validate_simpletypes1_sub.py validate_simpletypes2_sub.py", + "diff -u validate_simpletypes1_sup.py validate_simpletypes2_sup.py", + "diff -u validate_simpletypes1_warnings.txt validate_simpletypes2_warnings.txt", + "diff -u reference_simpletype1_sub.py reference_simpletype2_sub.py", + "diff -u reference_simpletype1_sup.py reference_simpletype2_sup.py", + "diff -u OnePer/oneperType00_2One.py OnePer/oneperType00_1One.py", + "diff -u OnePer/oneperType01_2One.py OnePer/oneperType01_1One.py", + "diff -u OnePer/oneperType02_2One.py OnePer/oneperType02_1One.py", + "diff -u OnePer/oneperType03_2One.py OnePer/oneperType03_1One.py", + "diff -u cdata1_sub.py cdata2_sub.py", + "diff -u cdata1_sup.py cdata2_sup.py", + "diff -u cdata1.xml cdata2.xml", + "diff -u defaults_coverage1_sub.py defaults_coverage2_sub.py", + "diff -u defaults_coverage1_sup.py defaults_coverage2_sup.py", + "diff -u defaults_cases1_sub.py defaults_cases2_sub.py", + "diff -u defaults_cases1_sup.py defaults_cases2_sup.py", + "diff -u cleanupname1_sub.py cleanupname2_sub.py", + "diff -u cleanupname1_sup.py cleanupname2_sup.py", + "diff -u rem_dup_elems1_sub.py rem_dup_elems2_sub.py", + "diff -u rem_dup_elems1_sup.py rem_dup_elems2_sup.py", +] + +def check + #puts $divider + error_count = 0 + $commands.each do |command| + infile = IO.popen command + has_content = false + infile.each_line do |line| + puts line + has_content = true + end + infile.close + if has_content + puts $divider + error_count += 1 + end + end + puts "Error count: #{error_count}" +end + +def main + check +end + +if __FILE__ == $0 + main() +end diff --git a/tests/cleanupname.xsd b/tests/cleanupname.xsd new file mode 100644 index 0000000..0674221 --- /dev/null +++ b/tests/cleanupname.xsd @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="data" type="dataType"/> + + <xs:complexType name="dataType"> + <xs:sequence> + <xs:element name="data1" type="data1Type"/> + <xs:element name="data2" type="TypeData2"/> + <xs:element name="data3" type="RealTypeData3"/> + <xs:element name="data4" type="AABBCCdataType"/> + <xs:element name="data5" type="dataTypeXYZAXYZ"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="data1Type"> + <xs:sequence> + <xs:element name="content1" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="TypeData2"> + <xs:sequence> + <xs:element name="content1" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="RealTypeData3"> + <xs:sequence> + <xs:element name="content1" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="AABBCCdataType"> + <xs:sequence> + <xs:element name="content1" type="xs:string"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="dataTypeXYZAXYZ"> + <xs:sequence> + <xs:element name="content1" type="xs:string"/> + </xs:sequence> + </xs:complexType> + +</xs:schema> diff --git a/tests/cleanupname1_sub.py b/tests/cleanupname1_sub.py new file mode 100644 index 0000000..c00f3e0 --- /dev/null +++ b/tests/cleanupname1_sub.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/cleanupname2_sup.py') +# ('-s', 'tests/cleanupname2_sub.py') +# ('--super', 'cleanupname2_sup') +# ('--cleanup-name-list', "[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]") +# +# Command line arguments: +# tests/cleanupname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cleanupname2_sup.py" -s "tests/cleanupname2_sub.py" --super="cleanupname2_sup" --cleanup-name-list="[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]" tests/cleanupname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import cleanupname2_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 dataKindSub(supermod.dataKind): + def __init__(self, data1=None, data2=None, data3=None, data4=None, data5=None): + super(dataKindSub, self).__init__(data1, data2, data3, data4, data5, ) +supermod.dataKind.subclass = dataKindSub +# end class dataKindSub + + +class data1KindSub(supermod.data1Kind): + def __init__(self, content1=None): + super(data1KindSub, self).__init__(content1, ) +supermod.data1Kind.subclass = data1KindSub +# end class data1KindSub + + +class MlassData2Sub(supermod.MlassData2): + def __init__(self, content1=None): + super(MlassData2Sub, self).__init__(content1, ) +supermod.MlassData2.subclass = MlassData2Sub +# end class MlassData2Sub + + +class RealTypeData3Sub(supermod.RealTypeData3): + def __init__(self, content1=None): + super(RealTypeData3Sub, self).__init__(content1, ) +supermod.RealTypeData3.subclass = RealTypeData3Sub +# end class RealTypeData3Sub + + +class MMMMMMdataKindSub(supermod.MMMMMMdataKind): + def __init__(self, content1=None): + super(MMMMMMdataKindSub, self).__init__(content1, ) +supermod.MMMMMMdataKind.subclass = MMMMMMdataKindSub +# end class MMMMMMdataKindSub + + +class dataTypeNNNMNNNSub(supermod.dataTypeNNNMNNN): + def __init__(self, content1=None): + super(dataTypeNNNMNNNSub, self).__init__(content1, ) +supermod.dataTypeNNNMNNN.subclass = dataTypeNNNMNNNSub +# end class dataTypeNNNMNNNSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'dataKind' + rootClass = supermod.dataKind + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'dataKind' + rootClass = supermod.dataKind + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'dataKind' + rootClass = supermod.dataKind + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'dataKind' + rootClass = supermod.dataKind + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from cleanupname2_sup import *\n\n') +## sys.stdout.write('import cleanupname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/anywildcard2_sup.py b/tests/cleanupname1_sup.py similarity index 60% rename from tests/anywildcard2_sup.py rename to tests/cleanupname1_sup.py index 3f3e914..59f05e9 100644 --- a/tests/anywildcard2_sup.py +++ b/tests/cleanupname1_sup.py @@ -4,66 +4,55 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/cleanupname2_sup.py') +# ('-s', 'tests/cleanupname2_sub.py') +# ('--super', 'cleanupname2_sup') +# ('--cleanup-name-list', "[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]") +# +# Command line arguments: +# tests/cleanupname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/cleanupname2_sup.py" -s "tests/cleanupname2_sub.py" --super="cleanupname2_sup" --cleanup-name-list="[('[-:.]', '_'), ('^Type', 'Class'), ('Type$', 'Kind'), ('[ABC]', 'M'), ('[XYZ]', 'N'), ]" tests/cleanupname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +64,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +80,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +149,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +204,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +215,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +238,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +262,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +294,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +364,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +412,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +430,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +515,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +556,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,590 +661,505 @@ def _cast(typ, value): # -class PlantType_single(GeneratedsSuper): +class dataKind(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('name', 'xs:string', 0), - MemberSpec_('', 'xs:string', 0), - MemberSpec_('description', 'DescriptionType', 0), + MemberSpec_('data1', 'data1Type', 0), + MemberSpec_('data2', 'TypeData2', 0), + MemberSpec_('data3', 'RealTypeData3', 0), + MemberSpec_('data4', 'AABBCCdataType', 0), + MemberSpec_('data5', 'dataTypeXYZAXYZ', 0), ] subclass = None superclass = None - def __init__(self, name=None, anytypeobjs_=None, description=None): - self.name = name - self.anytypeobjs_ = anytypeobjs_ - self.description = description + def __init__(self, data1=None, data2=None, data3=None, data4=None, data5=None): + self.original_tagname_ = None + self.data1 = data1 + self.data2 = data2 + self.data3 = data3 + self.data4 = data4 + self.data5 = data5 def factory(*args_, **kwargs_): - if PlantType_single.subclass: - return PlantType_single.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, dataKind) + if subclass is not None: + return subclass(*args_, **kwargs_) + if dataKind.subclass: + return dataKind.subclass(*args_, **kwargs_) else: - return PlantType_single(*args_, **kwargs_) + return dataKind(*args_, **kwargs_) factory = staticmethod(factory) - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_anytypeobjs_(self): return self.anytypeobjs_ - def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_ - def get_description(self): return self.description - def set_description(self, description): self.description = description + def get_data1(self): return self.data1 + def set_data1(self, data1): self.data1 = data1 + def get_data2(self): return self.data2 + def set_data2(self, data2): self.data2 = data2 + def get_data3(self): return self.data3 + def set_data3(self, data3): self.data3 = data3 + def get_data4(self): return self.data4 + def set_data4(self, data4): self.data4 = data4 + def get_data5(self): return self.data5 + def set_data5(self, data5): self.data5 = data5 def hasContent_(self): if ( - self.name is not None or - self.anytypeobjs_ is not None or - self.description is not None + self.data1 is not None or + self.data2 is not None or + self.data3 is not None or + self.data4 is not None or + self.data5 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='PlantType_single', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='dataType', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='dataType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='dataType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_single'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dataType'): pass - def exportChildren(self, outfile, level, namespace_='', name_='PlantType_single', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='dataType', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.name is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) - if self.description is not None: - self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print) - if self.anytypeobjs_ is not None: - self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_single'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.anytypeobjs_ is not None: - showIndent(outfile, level) - outfile.write('anytypeobjs_=model_.anytypeobjs_(\n') - self.anytypeobjs_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=model_.DescriptionType(\n') - self.description.exportLiteral(outfile, level, name_='description') - showIndent(outfile, level) - outfile.write('),\n') + if self.data1 is not None: + self.data1.export(outfile, level, namespace_, name_='data1', pretty_print=pretty_print) + if self.data2 is not None: + self.data2.export(outfile, level, namespace_, name_='data2', pretty_print=pretty_print) + if self.data3 is not None: + self.data3.export(outfile, level, namespace_, name_='data3', pretty_print=pretty_print) + if self.data4 is not None: + self.data4.export(outfile, level, namespace_, name_='data4', pretty_print=pretty_print) + if self.data5 is not None: + self.data5.export(outfile, level, namespace_, name_='data5', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'name': - name_ = child_.text - name_ = self.gds_validate_string(name_, node, 'name') - self.name = name_ - elif nodeName_ == 'description': - obj_ = DescriptionType.factory() + if nodeName_ == 'data1': + obj_ = data1Kind.factory() obj_.build(child_) - self.description = obj_ - else: - obj_ = self.gds_build_any(child_, 'PlantType_single') - if obj_ is not None: - self.set_anytypeobjs_(obj_) -# end class PlantType_single + self.data1 = obj_ + obj_.original_tagname_ = 'data1' + elif nodeName_ == 'data2': + obj_ = MlassData2.factory() + obj_.build(child_) + self.data2 = obj_ + obj_.original_tagname_ = 'data2' + elif nodeName_ == 'data3': + obj_ = RealTypeData3.factory() + obj_.build(child_) + self.data3 = obj_ + obj_.original_tagname_ = 'data3' + elif nodeName_ == 'data4': + obj_ = MMMMMMdataKind.factory() + obj_.build(child_) + self.data4 = obj_ + obj_.original_tagname_ = 'data4' + elif nodeName_ == 'data5': + obj_ = dataTypeNNNMNNN.factory() + obj_.build(child_) + self.data5 = obj_ + obj_.original_tagname_ = 'data5' +# end class dataKind -class PlantType_multiple(GeneratedsSuper): +class data1Kind(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('name', 'xs:string', 0), - MemberSpec_('', 'xs:string', 1), - MemberSpec_('description', 'DescriptionType', 0), + MemberSpec_('content1', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, name=None, anytypeobjs_=None, description=None): - self.name = name - if anytypeobjs_ is None: - self.anytypeobjs_ = [] - else: - self.anytypeobjs_ = anytypeobjs_ - self.description = description + def __init__(self, content1=None): + self.original_tagname_ = None + self.content1 = content1 def factory(*args_, **kwargs_): - if PlantType_multiple.subclass: - return PlantType_multiple.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, data1Kind) + if subclass is not None: + return subclass(*args_, **kwargs_) + if data1Kind.subclass: + return data1Kind.subclass(*args_, **kwargs_) else: - return PlantType_multiple(*args_, **kwargs_) + return data1Kind(*args_, **kwargs_) factory = staticmethod(factory) - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_anytypeobjs_(self): return self.anytypeobjs_ - def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_ - def add_anytypeobjs_(self, value): self.anytypeobjs_.append(value) - def insert_anytypeobjs_(self, index, value): self._anytypeobjs_[index] = value - def get_description(self): return self.description - def set_description(self, description): self.description = description + def get_content1(self): return self.content1 + def set_content1(self, content1): self.content1 = content1 def hasContent_(self): if ( - self.name is not None or - self.anytypeobjs_ or - self.description is not None + self.content1 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='PlantType_multiple', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='data1Type', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='data1Type') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='data1Type', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_multiple'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='data1Type'): pass - def exportChildren(self, outfile, level, namespace_='', name_='PlantType_multiple', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='data1Type', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.name is not None: + if self.content1 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) - if self.description is not None: - self.description.export(outfile, level, namespace_, name_='description', pretty_print=pretty_print) - for obj_ in self.anytypeobjs_: - obj_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_multiple'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('anytypeobjs_=[\n') - level += 1 - for anytypeobjs_ in self.anytypeobjs_: - anytypeobjs_.exportLiteral(outfile, level) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=model_.DescriptionType(\n') - self.description.exportLiteral(outfile, level, name_='description') - showIndent(outfile, level) - outfile.write('),\n') + outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'name': - name_ = child_.text - name_ = self.gds_validate_string(name_, node, 'name') - self.name = name_ - elif nodeName_ == 'description': - obj_ = DescriptionType.factory() - obj_.build(child_) - self.description = obj_ - else: - obj_ = self.gds_build_any(child_, 'PlantType_multiple') - if obj_ is not None: - self.add_anytypeobjs_(obj_) -# end class PlantType_multiple + if nodeName_ == 'content1': + content1_ = child_.text + content1_ = self.gds_validate_string(content1_, node, 'content1') + self.content1 = content1_ +# end class data1Kind -class DescriptionType(GeneratedsSuper): - """A standard complexType.""" +class MlassData2(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('name', 'xs:string', 0), - MemberSpec_('size', 'xs:string', 0), + MemberSpec_('content1', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, name=None, size=None): - self.name = name - self.size = size + def __init__(self, content1=None): + self.original_tagname_ = None + self.content1 = content1 def factory(*args_, **kwargs_): - if DescriptionType.subclass: - return DescriptionType.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MlassData2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if MlassData2.subclass: + return MlassData2.subclass(*args_, **kwargs_) else: - return DescriptionType(*args_, **kwargs_) + return MlassData2(*args_, **kwargs_) factory = staticmethod(factory) - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_size(self): return self.size - def set_size(self, size): self.size = size + def get_content1(self): return self.content1 + def set_content1(self, content1): self.content1 = content1 def hasContent_(self): if ( - self.name is not None or - self.size is not None + self.content1 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='DescriptionType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='TypeData2', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='DescriptionType') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='TypeData2') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='TypeData2', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DescriptionType'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='TypeData2'): pass - def exportChildren(self, outfile, level, namespace_='', name_='DescriptionType', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='TypeData2', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.name is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) - if self.size is not None: + if self.content1 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%ssize>%s</%ssize>%s' % (namespace_, self.gds_format_string(quote_xml(self.size).encode(ExternalEncoding), input_name='size'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='DescriptionType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.size is not None: - showIndent(outfile, level) - outfile.write('size=%s,\n' % quote_python(self.size).encode(ExternalEncoding)) + outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'name': - name_ = child_.text - name_ = self.gds_validate_string(name_, node, 'name') - self.name = name_ - elif nodeName_ == 'size': - size_ = child_.text - size_ = self.gds_validate_string(size_, node, 'size') - self.size = size_ -# end class DescriptionType - - -class CatalogType(GeneratedsSuper): - """A standard complexType.""" + if nodeName_ == 'content1': + content1_ = child_.text + content1_ = self.gds_validate_string(content1_, node, 'content1') + self.content1 = content1_ +# end class MlassData2 + + +class RealTypeData3(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('name', 'xs:string', 0), - MemberSpec_('catagory', 'xs:integer', 0), + MemberSpec_('content1', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, name=None, catagory=None): - self.name = name - self.catagory = catagory + def __init__(self, content1=None): + self.original_tagname_ = None + self.content1 = content1 def factory(*args_, **kwargs_): - if CatalogType.subclass: - return CatalogType.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, RealTypeData3) + if subclass is not None: + return subclass(*args_, **kwargs_) + if RealTypeData3.subclass: + return RealTypeData3.subclass(*args_, **kwargs_) else: - return CatalogType(*args_, **kwargs_) + return RealTypeData3(*args_, **kwargs_) factory = staticmethod(factory) - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_catagory(self): return self.catagory - def set_catagory(self, catagory): self.catagory = catagory + def get_content1(self): return self.content1 + def set_content1(self, content1): self.content1 = content1 def hasContent_(self): if ( - self.name is not None or - self.catagory is not None + self.content1 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='CatalogType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='RealTypeData3', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='CatalogType') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='RealTypeData3') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='RealTypeData3', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='CatalogType'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='RealTypeData3'): pass - def exportChildren(self, outfile, level, namespace_='', name_='CatalogType', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='RealTypeData3', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.name is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) - if self.catagory is not None: + if self.content1 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scatagory>%s</%scatagory>%s' % (namespace_, self.gds_format_integer(self.catagory, input_name='catagory'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='CatalogType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.catagory is not None: - showIndent(outfile, level) - outfile.write('catagory=%d,\n' % self.catagory) + outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'name': - name_ = child_.text - name_ = self.gds_validate_string(name_, node, 'name') - self.name = name_ - elif nodeName_ == 'catagory': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'catagory') - self.catagory = ival_ -# end class CatalogType + if nodeName_ == 'content1': + content1_ = child_.text + content1_ = self.gds_validate_string(content1_, node, 'content1') + self.content1 = content1_ +# end class RealTypeData3 -class PlantType_single_nochild(GeneratedsSuper): +class MMMMMMdataKind(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('', 'xs:string', 0), + MemberSpec_('content1', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, anytypeobjs_=None): - self.anytypeobjs_ = anytypeobjs_ + def __init__(self, content1=None): + self.original_tagname_ = None + self.content1 = content1 def factory(*args_, **kwargs_): - if PlantType_single_nochild.subclass: - return PlantType_single_nochild.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MMMMMMdataKind) + if subclass is not None: + return subclass(*args_, **kwargs_) + if MMMMMMdataKind.subclass: + return MMMMMMdataKind.subclass(*args_, **kwargs_) else: - return PlantType_single_nochild(*args_, **kwargs_) + return MMMMMMdataKind(*args_, **kwargs_) factory = staticmethod(factory) - def get_anytypeobjs_(self): return self.anytypeobjs_ - def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_ + def get_content1(self): return self.content1 + def set_content1(self, content1): self.content1 = content1 def hasContent_(self): if ( - self.anytypeobjs_ is not None + self.content1 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='PlantType_single_nochild', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='AABBCCdataType', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_single_nochild') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='AABBCCdataType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='AABBCCdataType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_single_nochild'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='AABBCCdataType'): pass - def exportChildren(self, outfile, level, namespace_='', name_='PlantType_single_nochild', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='AABBCCdataType', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.anytypeobjs_ is not None: - self.anytypeobjs_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_single_nochild'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.anytypeobjs_ is not None: - showIndent(outfile, level) - outfile.write('anytypeobjs_=model_.anytypeobjs_(\n') - self.anytypeobjs_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') + if self.content1 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - obj_ = self.gds_build_any(child_, 'PlantType_single_nochild') - if obj_ is not None: - self.set_anytypeobjs_(obj_) -# end class PlantType_single_nochild + if nodeName_ == 'content1': + content1_ = child_.text + content1_ = self.gds_validate_string(content1_, node, 'content1') + self.content1 = content1_ +# end class MMMMMMdataKind -class PlantType_multiple_nochild(GeneratedsSuper): +class dataTypeNNNMNNN(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('', 'xs:string', 1), + MemberSpec_('content1', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, anytypeobjs_=None): - if anytypeobjs_ is None: - self.anytypeobjs_ = [] - else: - self.anytypeobjs_ = anytypeobjs_ + def __init__(self, content1=None): + self.original_tagname_ = None + self.content1 = content1 def factory(*args_, **kwargs_): - if PlantType_multiple_nochild.subclass: - return PlantType_multiple_nochild.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, dataTypeNNNMNNN) + if subclass is not None: + return subclass(*args_, **kwargs_) + if dataTypeNNNMNNN.subclass: + return dataTypeNNNMNNN.subclass(*args_, **kwargs_) else: - return PlantType_multiple_nochild(*args_, **kwargs_) + return dataTypeNNNMNNN(*args_, **kwargs_) factory = staticmethod(factory) - def get_anytypeobjs_(self): return self.anytypeobjs_ - def set_anytypeobjs_(self, anytypeobjs_): self.anytypeobjs_ = anytypeobjs_ - def add_anytypeobjs_(self, value): self.anytypeobjs_.append(value) - def insert_anytypeobjs_(self, index, value): self._anytypeobjs_[index] = value + def get_content1(self): return self.content1 + def set_content1(self, content1): self.content1 = content1 def hasContent_(self): if ( - self.anytypeobjs_ + self.content1 is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='PlantType_multiple_nochild', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='dataTypeXYZAXYZ', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='PlantType_multiple_nochild') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='dataTypeXYZAXYZ') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='dataTypeXYZAXYZ', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='PlantType_multiple_nochild'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dataTypeXYZAXYZ'): pass - def exportChildren(self, outfile, level, namespace_='', name_='PlantType_multiple_nochild', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='dataTypeXYZAXYZ', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - for obj_ in self.anytypeobjs_: - obj_.export(outfile, level, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PlantType_multiple_nochild'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('anytypeobjs_=[\n') - level += 1 - for anytypeobjs_ in self.anytypeobjs_: - anytypeobjs_.exportLiteral(outfile, level) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') + if self.content1 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%scontent1>%s</%scontent1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.content1), input_name='content1')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - obj_ = self.gds_build_any(child_, 'PlantType_multiple_nochild') - if obj_ is not None: - self.add_anytypeobjs_(obj_) -# end class PlantType_multiple_nochild + if nodeName_ == 'content1': + content1_ = child_.text + content1_ = self.gds_validate_string(content1_, node, 'content1') + self.content1 = content1_ +# end class dataTypeNNNMNNN GDSClassesMapping = { - 'description': DescriptionType, + 'data': dataKind, + 'data1': data1Kind, + 'data2': MlassData2, + 'data3': RealTypeData3, + 'data4': MMMMMMdataKind, + 'data5': dataTypeNNNMNNN, } @@ -1201,7 +1169,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1214,12 +1182,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'PlantType_single' - rootClass = PlantType_single + rootTag = 'dataKind' + rootClass = dataKind rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -1234,12 +1203,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'PlantType_single' - rootClass = PlantType_single + rootTag = 'dataKind' + rootClass = dataKind rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -1257,13 +1227,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = PlantType_single + rootTag = 'dataKind' + rootClass = dataKind rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -1271,26 +1245,27 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="PlantType_single", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'PlantType_single' - rootClass = PlantType_single + rootTag = 'dataKind' + rootClass = dataKind rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from anywildcard2_sup import *\n\n') -## sys.stdout.write('import anywildcard2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('#from cleanupname2_sup import *\n\n') +## sys.stdout.write('import cleanupname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -1310,10 +1285,10 @@ if __name__ == '__main__': __all__ = [ - "CatalogType", - "DescriptionType", - "PlantType_multiple", - "PlantType_multiple_nochild", - "PlantType_single", - "PlantType_single_nochild" + "MMMMMMdataKind", + "MlassData2", + "RealTypeData3", + "data1Kind", + "dataKind", + "dataTypeNNNMNNN" ] diff --git a/tests/compare_sub b/tests/compare_sub new file mode 100755 index 0000000..df57aba --- /dev/null +++ b/tests/compare_sub @@ -0,0 +1,3 @@ +#!/bin/bash -x +diff -u ${1}1_sub.py ${1}2_sub.py | vim -R - + diff --git a/tests/compare_sup b/tests/compare_sup new file mode 100755 index 0000000..552d6ac --- /dev/null +++ b/tests/compare_sup @@ -0,0 +1,3 @@ +#!/bin/bash -x +diff -u ${1}1_sup.py ${1}2_sup.py | vim -R - + diff --git a/tests/copy_all b/tests/copy_all new file mode 100755 index 0000000..b89ea43 --- /dev/null +++ b/tests/copy_all @@ -0,0 +1,59 @@ +#!/bin/bash -x +cp out2_sub.py out1_sub.py +cp out2_sup.py out1_sup.py +cp anysimpletype2_sub.py anysimpletype1_sub.py +cp anysimpletype2_sup.py anysimpletype1_sup.py +cp simpletype_memberspecs2_sub.py simpletype_memberspecs1_sub.py +cp simpletype_memberspecs2_sup.py simpletype_memberspecs1_sup.py +cp extensions2_sub.py extensions1_sub.py +cp extensions2_sup.py extensions1_sup.py +cp simplecontent_restriction2_sub.py simplecontent_restriction1_sub.py +cp simplecontent_restriction2_sup.py simplecontent_restriction1_sup.py +cp annotations2_sub.py annotations1_sub.py +cp annotations2_sup.py annotations1_sup.py +cp abstract_type2_sub.py abstract_type1_sub.py +cp abstract_type2_sup.py abstract_type1_sup.py +cp people_procincl2_sub.py people_procincl1_sub.py +cp people_procincl2_sup.py people_procincl1_sup.py +cp ipo2_sub.py ipo1_sub.py +cp ipo2_sup.py ipo1_sup.py +cp recursive_simpletype2_sub.py recursive_simpletype1_sub.py +cp recursive_simpletype2_sup.py recursive_simpletype1_sup.py +cp anywildcard2_sub.py anywildcard1_sub.py +cp anywildcard2_sup.py anywildcard1_sup.py +cp attr_groups2_sub.py attr_groups1_sub.py +cp attr_groups2_sup.py attr_groups1_sup.py +cp simpletypes_other2_sub.py simpletypes_other1_sub.py +cp simpletypes_other2_sup.py simpletypes_other1_sup.py +cp to_etree2_sub.py to_etree1_sub.py +cp to_etree2_sup.py to_etree1_sup.py +cp anonymous_type2_sub.py anonymous_type1_sub.py +cp anonymous_type2_sup.py anonymous_type1_sup.py +cp mapcleanname2_sub.py mapcleanname1_sub.py +cp mapcleanname2_sup.py mapcleanname1_sup.py +cp prefix_classname2_sub.py prefix_classname1_sub.py +cp prefix_classname2_sup.py prefix_classname1_sup.py +cp validate_simpletypes2_sub.py validate_simpletypes1_sub.py +cp validate_simpletypes2_sup.py validate_simpletypes1_sup.py +cp validate_simpletypes2_warnings.txt validate_simpletypes1_warnings.txt +cp reference_simpletype2_sub.py reference_simpletype1_sub.py +cp reference_simpletype2_sup.py reference_simpletype1_sup.py +cp OnePer/oneperType00_1One.py OnePer/oneperType00_2One.py +cp OnePer/oneperType01_1One.py OnePer/oneperType01_2One.py +cp OnePer/oneperType02_1One.py OnePer/oneperType02_2One.py +cp OnePer/oneperType03_1One.py OnePer/oneperType03_2One.py +cp cdata2_sup.py cdata1_sup.py +cp cdata2_sub.py cdata1_sub.py +cp cdata2.xml cdata1.xml +cp defaults_coverage2_sup.py defaults_coverage1_sup.py +cp defaults_coverage2_sub.py defaults_coverage1_sub.py +cp defaults_cases2_sup.py defaults_cases1_sup.py +cp defaults_cases2_sub.py defaults_cases1_sub.py +cp nested_def2_sup.py nested_def1_sup.py +cp nested_def2_sub.py nested_def1_sub.py +cp cleanupname2_sup.py cleanupname1_sup.py +cp cleanupname2_sub.py cleanupname1_sub.py +cp catalogtest2_sup.py catalogtest1_sup.py +cp catalogtest2_sub.py catalogtest1_sub.py +cp rem_dup_elems2_sup.py rem_dup_elems1_sup.py +cp rem_dup_elems2_sub.py rem_dup_elems1_sub.py diff --git a/tests/copy_both b/tests/copy_both new file mode 100755 index 0000000..ded86d8 --- /dev/null +++ b/tests/copy_both @@ -0,0 +1,3 @@ +#!/bin/bash -x +cp ${1}2_sup.py ${1}1_sup.py +cp ${1}2_sub.py ${1}1_sub.py diff --git a/tests/defaults_cases.xml b/tests/defaults_cases.xml new file mode 100644 index 0000000..5862ed4 --- /dev/null +++ b/tests/defaults_cases.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<defaults> + <default1> + <!-- case 1 --> + <!-- case 2 --> + <normal02>a new value 1</normal02> + <!-- case 3 --> + <!-- case 4 --> + <default02>a new value 2</default02> + <!-- case 5 --> + <!-- + --> + <normal03>55.66</normal03> + <!-- case 6 --> + <normal04>66.77</normal04> + <!-- case 7 --> + <!-- + --> + <default03>77.88</default03> + <!-- case 8 --> + <default04>88.99</default04> + </default1> + + <default2 attrdefault01="xyz"/> + <default2 attrdefault02="14"/> + <default2 /> + <default2 attrnormal01="wxy"/> + <default2 attrnormal02="89"/> + +</defaults> + diff --git a/tests/defaults_cases.xsd b/tests/defaults_cases.xsd new file mode 100644 index 0000000..32cafe4 --- /dev/null +++ b/tests/defaults_cases.xsd @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="defaults" type="DefaultTypes"/> + + <xs:complexType name="DefaultTypes"> + <xs:sequence> + <xs:element name="default1" type="DefaultType1" + maxOccurs="unbounded"/> + <xs:element name="default2" type="DefaultType2" + maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="DefaultType1"> + <xs:sequence> + <!-- + *case 1:* + xsd: element optional, no default value given + xml: element missing + output: element missing + --> + <xs:element name="normal01" type="xs:integer" + minOccurs="0"/> + <!-- + *case 2:* + xsd: element optional, no default value given + xml: element exists + output: element is unchanged + --> + <xs:element name="normal02" type="xs:string" + minOccurs="0"/> + <!-- + *case 3:* + xsd: element optional, default value given + xml: element missing + expected output: element missing + current output: missing element is added with default value + --> + <xs:element name="default01" type="xs:integer" default="23" + minOccurs="0"/> + <!-- + *case 4:* + xsd: element optional, default value given + xml: element exists + output: element is unchanged + --> + <xs:element name="default02" type="xs:string" default="Peach" + minOccurs="0"/> + <!-- + *case 5:* + xsd: element mandatory, no default value given + xml: element missing + error on reading xml + --> + <xs:element name="normal03" type="xs:float" + minOccurs="1"/> + <!-- + *case 6:* + xsd: element mandatory, no default value given + xml: element exists + output: element is unchanged + --> + <xs:element name="normal04" type="xs:double" + minOccurs="1"/> + <!-- + *case 7:* + xsd: element mandatory, default value given + xml: element missing + error on reading xml + output: missing element is generated with default value + --> + <xs:element name="default03" type="xs:float" default="23.45" + minOccurs="1"/> + <!-- + *case 8:* + xsd: element mandatory, default value given + xml: element exists + output: element is unchanged + --> + <xs:element name="default04" type="xs:double" default="54.32" + minOccurs="1"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="DefaultType2"> + <xs:sequence> + </xs:sequence> + <xs:attribute name="attrdefault01" type="xs:string" default="abcd"/> + <xs:attribute name="attrdefault02" type="xs:integer" default="14"/> + <xs:attribute name="attrnormal01" type="xs:string"/> + <xs:attribute name="attrnormal02" type="xs:integer"/> + </xs:complexType> + +</xs:schema> diff --git a/tests/defaults_cases1_out.xml b/tests/defaults_cases1_out.xml new file mode 100644 index 0000000..58064fb --- /dev/null +++ b/tests/defaults_cases1_out.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" ?> +<defaults> + <default1> + <normal02>a new value 1</normal02> + <default02>a new value 2</default02> + <normal03>55.659999999999997</normal03> + <normal04>6.677000e+01</normal04> + <default03>77.879999999999995</default03> + <default04>8.899000e+01</default04> + </default1> + <default2 attrdefault01="xyz"/> + <default2/> + <default2/> + <default2 attrnormal01="wxy"/> + <default2 attrnormal02="89"/> +</defaults> diff --git a/tests/defaults_cases1_sub.py b/tests/defaults_cases1_sub.py new file mode 100644 index 0000000..3e60267 --- /dev/null +++ b/tests/defaults_cases1_sub.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/defaults_cases2_sup.py') +# ('-s', 'tests/defaults_cases2_sub.py') +# ('--super', 'defaults_cases2_sup') +# +# Command line arguments: +# tests/defaults_cases.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import defaults_cases2_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 DefaultTypesSub(supermod.DefaultTypes): + def __init__(self, default1=None, default2=None): + super(DefaultTypesSub, self).__init__(default1, default2, ) +supermod.DefaultTypes.subclass = DefaultTypesSub +# end class DefaultTypesSub + + +class DefaultType1Sub(supermod.DefaultType1): + def __init__(self, normal01=None, normal02=None, default01=23, default02='Peach', normal03=None, normal04=None, default03=23.45, default04=54.32): + super(DefaultType1Sub, self).__init__(normal01, normal02, default01, default02, normal03, normal04, default03, default04, ) +supermod.DefaultType1.subclass = DefaultType1Sub +# end class DefaultType1Sub + + +class DefaultType2Sub(supermod.DefaultType2): + def __init__(self, attrdefault01='abcd', attrdefault02=14, attrnormal01=None, attrnormal02=None): + super(DefaultType2Sub, self).__init__(attrdefault01, attrdefault02, attrnormal01, attrnormal02, ) +supermod.DefaultType2.subclass = DefaultType2Sub +# end class DefaultType2Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from defaults_cases2_sup import *\n\n') + sys.stdout.write('import defaults_cases2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py new file mode 100644 index 0000000..7eb901a --- /dev/null +++ b/tests/defaults_cases1_sup.py @@ -0,0 +1,1182 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/defaults_cases2_sup.py') +# ('-s', 'tests/defaults_cases2_sub.py') +# ('--super', 'defaults_cases2_sup') +# +# Command line arguments: +# tests/defaults_cases.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/defaults_cases2_sup.py" -s "tests/defaults_cases2_sub.py" --super="defaults_cases2_sup" tests/defaults_cases.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class DefaultTypes(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('default1', 'DefaultType1', 1), + MemberSpec_('default2', 'DefaultType2', 1), + ] + subclass = None + superclass = None + def __init__(self, default1=None, default2=None): + self.original_tagname_ = None + if default1 is None: + self.default1 = [] + else: + self.default1 = default1 + if default2 is None: + self.default2 = [] + else: + self.default2 = default2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultTypes) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultTypes.subclass: + return DefaultTypes.subclass(*args_, **kwargs_) + else: + return DefaultTypes(*args_, **kwargs_) + factory = staticmethod(factory) + def get_default1(self): return self.default1 + def set_default1(self, default1): self.default1 = default1 + def add_default1(self, value): self.default1.append(value) + def insert_default1_at(self, index, value): self.default1.insert(index, value) + def replace_default1_at(self, index, value): self.default1[index] = value + def get_default2(self): return self.default2 + def set_default2(self, default2): self.default2 = default2 + def add_default2(self, value): self.default2.append(value) + def insert_default2_at(self, index, value): self.default2.insert(index, value) + def replace_default2_at(self, index, value): self.default2[index] = value + def hasContent_(self): + if ( + self.default1 or + self.default2 + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultTypes') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultTypes', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultTypes'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='DefaultTypes', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for default1_ in self.default1: + default1_.export(outfile, level, namespace_, name_='default1', pretty_print=pretty_print) + for default2_ in self.default2: + default2_.export(outfile, level, namespace_, name_='default2', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'default1': + obj_ = DefaultType1.factory() + obj_.build(child_) + self.default1.append(obj_) + obj_.original_tagname_ = 'default1' + elif nodeName_ == 'default2': + obj_ = DefaultType2.factory() + obj_.build(child_) + self.default2.append(obj_) + obj_.original_tagname_ = 'default2' +# end class DefaultTypes + + +class DefaultType1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('normal01', 'xs:integer', 0), + MemberSpec_('normal02', 'xs:string', 0), + MemberSpec_('default01', 'xs:integer', 0), + MemberSpec_('default02', 'xs:string', 0), + MemberSpec_('normal03', 'xs:float', 0), + MemberSpec_('normal04', 'xs:double', 0), + MemberSpec_('default03', 'xs:float', 0), + MemberSpec_('default04', 'xs:double', 0), + ] + subclass = None + superclass = None + def __init__(self, normal01=None, normal02=None, default01=23, default02='Peach', normal03=None, normal04=None, default03=23.45, default04=54.32): + self.original_tagname_ = None + self.normal01 = normal01 + self.normal02 = normal02 + self.default01 = default01 + self.default02 = default02 + self.normal03 = normal03 + self.normal04 = normal04 + self.default03 = default03 + self.default04 = default04 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultType1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultType1.subclass: + return DefaultType1.subclass(*args_, **kwargs_) + else: + return DefaultType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_normal01(self): return self.normal01 + def set_normal01(self, normal01): self.normal01 = normal01 + def get_normal02(self): return self.normal02 + def set_normal02(self, normal02): self.normal02 = normal02 + def get_default01(self): return self.default01 + def set_default01(self, default01): self.default01 = default01 + def get_default02(self): return self.default02 + def set_default02(self, default02): self.default02 = default02 + def get_normal03(self): return self.normal03 + def set_normal03(self, normal03): self.normal03 = normal03 + def get_normal04(self): return self.normal04 + def set_normal04(self, normal04): self.normal04 = normal04 + def get_default03(self): return self.default03 + def set_default03(self, default03): self.default03 = default03 + def get_default04(self): return self.default04 + def set_default04(self, default04): self.default04 = default04 + def hasContent_(self): + if ( + self.normal01 is not None or + self.normal02 is not None or + self.default01 != 23 or + self.default02 != "Peach" or + self.normal03 is not None or + self.normal04 is not None or + self.default03 != 23.45 or + self.default04 != 54.32 + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType1', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='DefaultType1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.normal01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_)) + if self.normal02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_)) + if self.default01 != 23: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_)) + if self.default02 != "Peach": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_)) + if self.normal03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_)) + if self.normal04 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_)) + if self.default03 != 23.45: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_)) + if self.default04 != 54.32: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'normal01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'normal01') + self.normal01 = ival_ + elif nodeName_ == 'normal02': + normal02_ = child_.text + normal02_ = self.gds_validate_string(normal02_, node, 'normal02') + self.normal02 = normal02_ + elif nodeName_ == 'default01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'default01') + self.default01 = ival_ + elif nodeName_ == 'default02': + default02_ = child_.text + default02_ = self.gds_validate_string(default02_, node, 'default02') + self.default02 = default02_ + elif nodeName_ == 'normal03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal03') + self.normal03 = fval_ + elif nodeName_ == 'normal04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal04') + self.normal04 = fval_ + elif nodeName_ == 'default03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default03') + self.default03 = fval_ + elif nodeName_ == 'default04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default04') + self.default04 = fval_ +# end class DefaultType1 + + +class DefaultType2(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('attrdefault01', 'xs:string', 0), + MemberSpec_('attrdefault02', 'xs:integer', 0), + MemberSpec_('attrnormal01', 'xs:string', 0), + MemberSpec_('attrnormal02', 'xs:integer', 0), + ] + subclass = None + superclass = None + def __init__(self, attrdefault01='abcd', attrdefault02=14, attrnormal01=None, attrnormal02=None): + self.original_tagname_ = None + self.attrdefault01 = _cast(None, attrdefault01) + self.attrdefault02 = _cast(int, attrdefault02) + self.attrnormal01 = _cast(None, attrnormal01) + self.attrnormal02 = _cast(int, attrnormal02) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultType2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultType2.subclass: + return DefaultType2.subclass(*args_, **kwargs_) + else: + return DefaultType2(*args_, **kwargs_) + factory = staticmethod(factory) + def get_attrdefault01(self): return self.attrdefault01 + def set_attrdefault01(self, attrdefault01): self.attrdefault01 = attrdefault01 + def get_attrdefault02(self): return self.attrdefault02 + def set_attrdefault02(self, attrdefault02): self.attrdefault02 = attrdefault02 + def get_attrnormal01(self): return self.attrnormal01 + def set_attrnormal01(self, attrnormal01): self.attrnormal01 = attrnormal01 + def get_attrnormal02(self): return self.attrnormal02 + def set_attrnormal02(self, attrnormal02): self.attrnormal02 = attrnormal02 + def hasContent_(self): + if ( + + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType2') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType2', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType2'): + if self.attrdefault01 != "abcd" and 'attrdefault01' not in already_processed: + already_processed.add('attrdefault01') + outfile.write(' attrdefault01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrdefault01), input_name='attrdefault01')), )) + if self.attrdefault02 != 14 and 'attrdefault02' not in already_processed: + already_processed.add('attrdefault02') + outfile.write(' attrdefault02="%s"' % self.gds_format_integer(self.attrdefault02, input_name='attrdefault02')) + if self.attrnormal01 is not None and 'attrnormal01' not in already_processed: + already_processed.add('attrnormal01') + outfile.write(' attrnormal01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrnormal01), input_name='attrnormal01')), )) + if self.attrnormal02 is not None and 'attrnormal02' not in already_processed: + already_processed.add('attrnormal02') + outfile.write(' attrnormal02="%s"' % self.gds_format_integer(self.attrnormal02, input_name='attrnormal02')) + def exportChildren(self, outfile, level, namespace_='', name_='DefaultType2', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('attrdefault01', node) + if value is not None and 'attrdefault01' not in already_processed: + already_processed.add('attrdefault01') + self.attrdefault01 = value + value = find_attr_value_('attrdefault02', node) + if value is not None and 'attrdefault02' not in already_processed: + already_processed.add('attrdefault02') + try: + self.attrdefault02 = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + value = find_attr_value_('attrnormal01', node) + if value is not None and 'attrnormal01' not in already_processed: + already_processed.add('attrnormal01') + self.attrnormal01 = value + value = find_attr_value_('attrnormal02', node) + if value is not None and 'attrnormal02' not in already_processed: + already_processed.add('attrnormal02') + try: + self.attrnormal02 = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class DefaultType2 + + +GDSClassesMapping = { + 'default1': DefaultType1, + 'default2': DefaultType2, + 'defaults': DefaultTypes, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from defaults_cases2_sup import *\n\n') + sys.stdout.write('import defaults_cases2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "DefaultType1", + "DefaultType2", + "DefaultTypes" +] diff --git a/tests/defaults_coverage.xsd b/tests/defaults_coverage.xsd new file mode 100644 index 0000000..a519503 --- /dev/null +++ b/tests/defaults_coverage.xsd @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="defaults" type="DefaultTypes"/> + + <xs:complexType name="DefaultTypes"> + <xs:sequence> + <xs:element name="default1" type="DefaultType1"/> + <xs:element name="default2" type="DefaultType2"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="DefaultType1"> + <xs:sequence> + <xs:element name="default01" type="xs:integer" default="23" + minOccurs="0"/> + <xs:element name="normal01" type="xs:integer" + minOccurs="0"/> + <xs:element name="default02" type="xs:string" default="Peach" + minOccurs="0"/> + <xs:element name="normal02" type="xs:string" + minOccurs="0"/> + <xs:element name="default03" type="xs:float" default="23.45" + minOccurs="0"/> + <xs:element name="normal03" type="xs:float" + minOccurs="0"/> + <xs:element name="default04" type="xs:double" default="54.32" + minOccurs="0"/> + <xs:element name="normal04" type="xs:double" + minOccurs="0"/> + <xs:element name="default05a" type="xs:boolean" default="true" + minOccurs="0"/> + <xs:element name="default05b" type="xs:boolean" default="false" + minOccurs="0"/> + <xs:element name="normal05" type="xs:boolean" + minOccurs="0"/> + <xs:element name="default06" type="xs:date" default="2015-06-21" + minOccurs="0"/> + <xs:element name="normal06" type="xs:date" + minOccurs="0"/> + <xs:element name="default07" type="xs:time" default="11:10:09" + minOccurs="0"/> + <xs:element name="normal07" type="xs:date" + minOccurs="0"/> + <xs:element name="default08" type="xs:dateTime" + default="2015-06-21T14:13:12" + minOccurs="0"/> + <xs:element name="normal08" type="xs:dateTime" + minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="DefaultType2"> + <xs:sequence> + <xs:element name="default01" type="xs:integer" default="23"/> + <xs:element name="normal01" type="xs:integer"/> + <xs:element name="default02" type="xs:string" default="Peach"/> + <xs:element name="normal02" type="xs:string"/> + <xs:element name="default03" type="xs:float" default="23.45"/> + <xs:element name="normal03" type="xs:float"/> + <xs:element name="default04" type="xs:double" default="54.32"/> + <xs:element name="normal04" type="xs:double"/> + <xs:element name="default05a" type="xs:boolean" default="true"/> + <xs:element name="default05b" type="xs:boolean" default="false"/> + <xs:element name="normal05" type="xs:boolean"/> + <xs:element name="default06" type="xs:date" default="2015-06-21"/> + <xs:element name="normal06" type="xs:date"/> + <xs:element name="default07" type="xs:time" default="11:10:09"/> + <xs:element name="normal07" type="xs:date"/> + <xs:element name="default08" type="xs:dateTime" + default="2015-06-21T14:13:12"/> + <xs:element name="normal08" type="xs:dateTime"/> + </xs:sequence> + </xs:complexType> + +</xs:schema> diff --git a/tests/defaults_coverage1_sub.py b/tests/defaults_coverage1_sub.py new file mode 100644 index 0000000..3452d18 --- /dev/null +++ b/tests/defaults_coverage1_sub.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/defaults_coverage2_sup.py') +# ('-s', 'tests/defaults_coverage2_sub.py') +# ('--super', 'defaults_coverage2_sup') +# +# Command line arguments: +# tests/defaults_coverage.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_coverage2_sup.py" -s "tests/defaults_coverage2_sub.py" --super="defaults_coverage2_sup" tests/defaults_coverage.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import defaults_coverage2_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 DefaultTypesSub(supermod.DefaultTypes): + def __init__(self, default1=None, default2=None): + super(DefaultTypesSub, self).__init__(default1, default2, ) +supermod.DefaultTypes.subclass = DefaultTypesSub +# end class DefaultTypesSub + + +class DefaultType1Sub(supermod.DefaultType1): + def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None): + super(DefaultType1Sub, self).__init__(default01, normal01, default02, normal02, default03, normal03, default04, normal04, default05a, default05b, normal05, default06, normal06, default07, normal07, default08, normal08, ) +supermod.DefaultType1.subclass = DefaultType1Sub +# end class DefaultType1Sub + + +class DefaultType2Sub(supermod.DefaultType2): + def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None): + super(DefaultType2Sub, self).__init__(default01, normal01, default02, normal02, default03, normal03, default04, normal04, default05a, default05b, normal05, default06, normal06, default07, normal07, default08, normal08, ) +supermod.DefaultType2.subclass = DefaultType2Sub +# end class DefaultType2Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = supermod.DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from defaults_coverage2_sup import *\n\n') +## sys.stdout.write('import defaults_coverage2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py new file mode 100644 index 0000000..702722d --- /dev/null +++ b/tests/defaults_coverage1_sup.py @@ -0,0 +1,1545 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/defaults_coverage2_sup.py') +# ('-s', 'tests/defaults_coverage2_sub.py') +# ('--super', 'defaults_coverage2_sup') +# +# Command line arguments: +# tests/defaults_coverage.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/defaults_coverage2_sup.py" -s "tests/defaults_coverage2_sub.py" --super="defaults_coverage2_sup" tests/defaults_coverage.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class DefaultTypes(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('default1', 'DefaultType1', 0), + MemberSpec_('default2', 'DefaultType2', 0), + ] + subclass = None + superclass = None + def __init__(self, default1=None, default2=None): + self.original_tagname_ = None + self.default1 = default1 + self.default2 = default2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultTypes) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultTypes.subclass: + return DefaultTypes.subclass(*args_, **kwargs_) + else: + return DefaultTypes(*args_, **kwargs_) + factory = staticmethod(factory) + def get_default1(self): return self.default1 + def set_default1(self, default1): self.default1 = default1 + def get_default2(self): return self.default2 + def set_default2(self, default2): self.default2 = default2 + def hasContent_(self): + if ( + self.default1 is not None or + self.default2 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultTypes', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultTypes') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultTypes', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultTypes'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='DefaultTypes', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.default1 is not None: + self.default1.export(outfile, level, namespace_, name_='default1', pretty_print=pretty_print) + if self.default2 is not None: + self.default2.export(outfile, level, namespace_, name_='default2', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'default1': + obj_ = DefaultType1.factory() + obj_.build(child_) + self.default1 = obj_ + obj_.original_tagname_ = 'default1' + elif nodeName_ == 'default2': + obj_ = DefaultType2.factory() + obj_.build(child_) + self.default2 = obj_ + obj_.original_tagname_ = 'default2' +# end class DefaultTypes + + +class DefaultType1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('default01', 'xs:integer', 0), + MemberSpec_('normal01', 'xs:integer', 0), + MemberSpec_('default02', 'xs:string', 0), + MemberSpec_('normal02', 'xs:string', 0), + MemberSpec_('default03', 'xs:float', 0), + MemberSpec_('normal03', 'xs:float', 0), + MemberSpec_('default04', 'xs:double', 0), + MemberSpec_('normal04', 'xs:double', 0), + MemberSpec_('default05a', 'xs:boolean', 0), + MemberSpec_('default05b', 'xs:boolean', 0), + MemberSpec_('normal05', 'xs:boolean', 0), + MemberSpec_('default06', 'xs:date', 0), + MemberSpec_('normal06', 'xs:date', 0), + MemberSpec_('default07', 'xs:time', 0), + MemberSpec_('normal07', 'xs:date', 0), + MemberSpec_('default08', 'xs:dateTime', 0), + MemberSpec_('normal08', 'xs:dateTime', 0), + ] + subclass = None + superclass = None + def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None): + self.original_tagname_ = None + self.default01 = default01 + self.normal01 = normal01 + self.default02 = default02 + self.normal02 = normal02 + self.default03 = default03 + self.normal03 = normal03 + self.default04 = default04 + self.normal04 = normal04 + self.default05a = default05a + self.default05b = default05b + self.normal05 = normal05 + if isinstance(default06, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date() + else: + initvalue_ = default06 + self.default06 = initvalue_ + if isinstance(normal06, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date() + else: + initvalue_ = normal06 + self.normal06 = initvalue_ + if isinstance(default07, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time() + else: + initvalue_ = default07 + self.default07 = initvalue_ + if isinstance(normal07, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date() + else: + initvalue_ = normal07 + self.normal07 = initvalue_ + if isinstance(default08, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = default08 + self.default08 = initvalue_ + if isinstance(normal08, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = normal08 + self.normal08 = initvalue_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultType1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultType1.subclass: + return DefaultType1.subclass(*args_, **kwargs_) + else: + return DefaultType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_default01(self): return self.default01 + def set_default01(self, default01): self.default01 = default01 + def get_normal01(self): return self.normal01 + def set_normal01(self, normal01): self.normal01 = normal01 + def get_default02(self): return self.default02 + def set_default02(self, default02): self.default02 = default02 + def get_normal02(self): return self.normal02 + def set_normal02(self, normal02): self.normal02 = normal02 + def get_default03(self): return self.default03 + def set_default03(self, default03): self.default03 = default03 + def get_normal03(self): return self.normal03 + def set_normal03(self, normal03): self.normal03 = normal03 + def get_default04(self): return self.default04 + def set_default04(self, default04): self.default04 = default04 + def get_normal04(self): return self.normal04 + def set_normal04(self, normal04): self.normal04 = normal04 + def get_default05a(self): return self.default05a + def set_default05a(self, default05a): self.default05a = default05a + def get_default05b(self): return self.default05b + def set_default05b(self, default05b): self.default05b = default05b + def get_normal05(self): return self.normal05 + def set_normal05(self, normal05): self.normal05 = normal05 + def get_default06(self): return self.default06 + def set_default06(self, default06): self.default06 = default06 + def get_normal06(self): return self.normal06 + def set_normal06(self, normal06): self.normal06 = normal06 + def get_default07(self): return self.default07 + def set_default07(self, default07): self.default07 = default07 + def get_normal07(self): return self.normal07 + def set_normal07(self, normal07): self.normal07 = normal07 + def get_default08(self): return self.default08 + def set_default08(self, default08): self.default08 = default08 + def get_normal08(self): return self.normal08 + def set_normal08(self, normal08): self.normal08 = normal08 + def hasContent_(self): + if ( + self.default01 != 23 or + self.normal01 is not None or + self.default02 != "Peach" or + self.normal02 is not None or + self.default03 != 23.45 or + self.normal03 is not None or + self.default04 != 54.32 or + self.normal04 is not None or + not self.default05a or + self.default05b or + self.normal05 is not None or + self.default06 != "2015-06-21" or + self.normal06 is not None or + self.default07 != "11:10:09" or + self.normal07 is not None or + self.default08 != "2015-06-21T14:13:12" or + self.normal08 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultType1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType1', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType1'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='DefaultType1', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.default01 != 23: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_)) + if self.normal01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_)) + if self.default02 != "Peach": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_)) + if self.normal02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_)) + if self.default03 != 23.45: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_)) + if self.normal03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_)) + if self.default04 != 54.32: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_)) + if self.normal04 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_)) + if not self.default05a: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault05a>%s</%sdefault05a>%s' % (namespace_, self.gds_format_boolean(self.default05a, input_name='default05a'), namespace_, eol_)) + if self.default05b: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault05b>%s</%sdefault05b>%s' % (namespace_, self.gds_format_boolean(self.default05b, input_name='default05b'), namespace_, eol_)) + if self.normal05 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal05>%s</%snormal05>%s' % (namespace_, self.gds_format_boolean(self.normal05, input_name='normal05'), namespace_, eol_)) + if self.default06 != "2015-06-21": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault06>%s</%sdefault06>%s' % (namespace_, self.gds_format_date(self.default06, input_name='default06'), namespace_, eol_)) + if self.normal06 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal06>%s</%snormal06>%s' % (namespace_, self.gds_format_date(self.normal06, input_name='normal06'), namespace_, eol_)) + if self.default07 != "11:10:09": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault07>%s</%sdefault07>%s' % (namespace_, self.gds_format_time(self.default07, input_name='default07'), namespace_, eol_)) + if self.normal07 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal07>%s</%snormal07>%s' % (namespace_, self.gds_format_date(self.normal07, input_name='normal07'), namespace_, eol_)) + if self.default08 != "2015-06-21T14:13:12": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault08>%s</%sdefault08>%s' % (namespace_, self.gds_format_datetime(self.default08, input_name='default08'), namespace_, eol_)) + if self.normal08 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal08>%s</%snormal08>%s' % (namespace_, self.gds_format_datetime(self.normal08, input_name='normal08'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'default01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'default01') + self.default01 = ival_ + elif nodeName_ == 'normal01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'normal01') + self.normal01 = ival_ + elif nodeName_ == 'default02': + default02_ = child_.text + default02_ = self.gds_validate_string(default02_, node, 'default02') + self.default02 = default02_ + elif nodeName_ == 'normal02': + normal02_ = child_.text + normal02_ = self.gds_validate_string(normal02_, node, 'normal02') + self.normal02 = normal02_ + elif nodeName_ == 'default03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default03') + self.default03 = fval_ + elif nodeName_ == 'normal03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal03') + self.normal03 = fval_ + elif nodeName_ == 'default04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default04') + self.default04 = fval_ + elif nodeName_ == 'normal04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal04') + self.normal04 = fval_ + elif nodeName_ == 'default05a': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'default05a') + self.default05a = ival_ + elif nodeName_ == 'default05b': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'default05b') + self.default05b = ival_ + elif nodeName_ == 'normal05': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'normal05') + self.normal05 = ival_ + elif nodeName_ == 'default06': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.default06 = dval_ + elif nodeName_ == 'normal06': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.normal06 = dval_ + elif nodeName_ == 'default07': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.default07 = dval_ + elif nodeName_ == 'normal07': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.normal07 = dval_ + elif nodeName_ == 'default08': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.default08 = dval_ + elif nodeName_ == 'normal08': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.normal08 = dval_ +# end class DefaultType1 + + +class DefaultType2(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('default01', 'xs:integer', 0), + MemberSpec_('normal01', 'xs:integer', 0), + MemberSpec_('default02', 'xs:string', 0), + MemberSpec_('normal02', 'xs:string', 0), + MemberSpec_('default03', 'xs:float', 0), + MemberSpec_('normal03', 'xs:float', 0), + MemberSpec_('default04', 'xs:double', 0), + MemberSpec_('normal04', 'xs:double', 0), + MemberSpec_('default05a', 'xs:boolean', 0), + MemberSpec_('default05b', 'xs:boolean', 0), + MemberSpec_('normal05', 'xs:boolean', 0), + MemberSpec_('default06', 'xs:date', 0), + MemberSpec_('normal06', 'xs:date', 0), + MemberSpec_('default07', 'xs:time', 0), + MemberSpec_('normal07', 'xs:date', 0), + MemberSpec_('default08', 'xs:dateTime', 0), + MemberSpec_('normal08', 'xs:dateTime', 0), + ] + subclass = None + superclass = None + def __init__(self, default01=23, normal01=None, default02='Peach', normal02=None, default03=23.45, normal03=None, default04=54.32, normal04=None, default05a=True, default05b=False, normal05=None, default06='2015-06-21', normal06=None, default07='11:10:09', normal07=None, default08='2015-06-21T14:13:12', normal08=None): + self.original_tagname_ = None + self.default01 = default01 + self.normal01 = normal01 + self.default02 = default02 + self.normal02 = normal02 + self.default03 = default03 + self.normal03 = normal03 + self.default04 = default04 + self.normal04 = normal04 + self.default05a = default05a + self.default05b = default05b + self.normal05 = normal05 + if isinstance(default06, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default06, '%Y-%m-%d').date() + else: + initvalue_ = default06 + self.default06 = initvalue_ + if isinstance(normal06, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal06, '%Y-%m-%d').date() + else: + initvalue_ = normal06 + self.normal06 = initvalue_ + if isinstance(default07, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default07, '%H:%M:%S').time() + else: + initvalue_ = default07 + self.default07 = initvalue_ + if isinstance(normal07, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal07, '%Y-%m-%d').date() + else: + initvalue_ = normal07 + self.normal07 = initvalue_ + if isinstance(default08, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(default08, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = default08 + self.default08 = initvalue_ + if isinstance(normal08, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(normal08, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = normal08 + self.normal08 = initvalue_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DefaultType2) + if subclass is not None: + return subclass(*args_, **kwargs_) + if DefaultType2.subclass: + return DefaultType2.subclass(*args_, **kwargs_) + else: + return DefaultType2(*args_, **kwargs_) + factory = staticmethod(factory) + def get_default01(self): return self.default01 + def set_default01(self, default01): self.default01 = default01 + def get_normal01(self): return self.normal01 + def set_normal01(self, normal01): self.normal01 = normal01 + def get_default02(self): return self.default02 + def set_default02(self, default02): self.default02 = default02 + def get_normal02(self): return self.normal02 + def set_normal02(self, normal02): self.normal02 = normal02 + def get_default03(self): return self.default03 + def set_default03(self, default03): self.default03 = default03 + def get_normal03(self): return self.normal03 + def set_normal03(self, normal03): self.normal03 = normal03 + def get_default04(self): return self.default04 + def set_default04(self, default04): self.default04 = default04 + def get_normal04(self): return self.normal04 + def set_normal04(self, normal04): self.normal04 = normal04 + def get_default05a(self): return self.default05a + def set_default05a(self, default05a): self.default05a = default05a + def get_default05b(self): return self.default05b + def set_default05b(self, default05b): self.default05b = default05b + def get_normal05(self): return self.normal05 + def set_normal05(self, normal05): self.normal05 = normal05 + def get_default06(self): return self.default06 + def set_default06(self, default06): self.default06 = default06 + def get_normal06(self): return self.normal06 + def set_normal06(self, normal06): self.normal06 = normal06 + def get_default07(self): return self.default07 + def set_default07(self, default07): self.default07 = default07 + def get_normal07(self): return self.normal07 + def set_normal07(self, normal07): self.normal07 = normal07 + def get_default08(self): return self.default08 + def set_default08(self, default08): self.default08 = default08 + def get_normal08(self): return self.normal08 + def set_normal08(self, normal08): self.normal08 = normal08 + def hasContent_(self): + if ( + self.default01 != 23 or + self.normal01 is not None or + self.default02 != "Peach" or + self.normal02 is not None or + self.default03 != 23.45 or + self.normal03 is not None or + self.default04 != 54.32 or + self.normal04 is not None or + not self.default05a or + self.default05b or + self.normal05 is not None or + self.default06 != "2015-06-21" or + self.normal06 is not None or + self.default07 != "11:10:09" or + self.normal07 is not None or + self.default08 != "2015-06-21T14:13:12" or + self.normal08 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='DefaultType2', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='DefaultType2') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='DefaultType2', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='DefaultType2'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='DefaultType2', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.default01 != 23: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault01>%s</%sdefault01>%s' % (namespace_, self.gds_format_integer(self.default01, input_name='default01'), namespace_, eol_)) + if self.normal01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal01>%s</%snormal01>%s' % (namespace_, self.gds_format_integer(self.normal01, input_name='normal01'), namespace_, eol_)) + if self.default02 != "Peach": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault02>%s</%sdefault02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.default02), input_name='default02')), namespace_, eol_)) + if self.normal02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal02>%s</%snormal02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), namespace_, eol_)) + if self.default03 != 23.45: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault03>%s</%sdefault03>%s' % (namespace_, self.gds_format_float(self.default03, input_name='default03'), namespace_, eol_)) + if self.normal03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal03>%s</%snormal03>%s' % (namespace_, self.gds_format_float(self.normal03, input_name='normal03'), namespace_, eol_)) + if self.default04 != 54.32: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault04>%s</%sdefault04>%s' % (namespace_, self.gds_format_double(self.default04, input_name='default04'), namespace_, eol_)) + if self.normal04 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal04>%s</%snormal04>%s' % (namespace_, self.gds_format_double(self.normal04, input_name='normal04'), namespace_, eol_)) + if not self.default05a: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault05a>%s</%sdefault05a>%s' % (namespace_, self.gds_format_boolean(self.default05a, input_name='default05a'), namespace_, eol_)) + if self.default05b: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault05b>%s</%sdefault05b>%s' % (namespace_, self.gds_format_boolean(self.default05b, input_name='default05b'), namespace_, eol_)) + if self.normal05 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal05>%s</%snormal05>%s' % (namespace_, self.gds_format_boolean(self.normal05, input_name='normal05'), namespace_, eol_)) + if self.default06 != "2015-06-21": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault06>%s</%sdefault06>%s' % (namespace_, self.gds_format_date(self.default06, input_name='default06'), namespace_, eol_)) + if self.normal06 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal06>%s</%snormal06>%s' % (namespace_, self.gds_format_date(self.normal06, input_name='normal06'), namespace_, eol_)) + if self.default07 != "11:10:09": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault07>%s</%sdefault07>%s' % (namespace_, self.gds_format_time(self.default07, input_name='default07'), namespace_, eol_)) + if self.normal07 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal07>%s</%snormal07>%s' % (namespace_, self.gds_format_date(self.normal07, input_name='normal07'), namespace_, eol_)) + if self.default08 != "2015-06-21T14:13:12": + showIndent(outfile, level, pretty_print) + outfile.write('<%sdefault08>%s</%sdefault08>%s' % (namespace_, self.gds_format_datetime(self.default08, input_name='default08'), namespace_, eol_)) + if self.normal08 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%snormal08>%s</%snormal08>%s' % (namespace_, self.gds_format_datetime(self.normal08, input_name='normal08'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'default01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'default01') + self.default01 = ival_ + elif nodeName_ == 'normal01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'normal01') + self.normal01 = ival_ + elif nodeName_ == 'default02': + default02_ = child_.text + default02_ = self.gds_validate_string(default02_, node, 'default02') + self.default02 = default02_ + elif nodeName_ == 'normal02': + normal02_ = child_.text + normal02_ = self.gds_validate_string(normal02_, node, 'normal02') + self.normal02 = normal02_ + elif nodeName_ == 'default03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default03') + self.default03 = fval_ + elif nodeName_ == 'normal03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal03') + self.normal03 = fval_ + elif nodeName_ == 'default04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'default04') + self.default04 = fval_ + elif nodeName_ == 'normal04': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'normal04') + self.normal04 = fval_ + elif nodeName_ == 'default05a': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'default05a') + self.default05a = ival_ + elif nodeName_ == 'default05b': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'default05b') + self.default05b = ival_ + elif nodeName_ == 'normal05': + sval_ = child_.text + if sval_ in ('true', '1'): + ival_ = True + elif sval_ in ('false', '0'): + ival_ = False + else: + raise_parse_error(child_, 'requires boolean') + ival_ = self.gds_validate_boolean(ival_, node, 'normal05') + self.normal05 = ival_ + elif nodeName_ == 'default06': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.default06 = dval_ + elif nodeName_ == 'normal06': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.normal06 = dval_ + elif nodeName_ == 'default07': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.default07 = dval_ + elif nodeName_ == 'normal07': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.normal07 = dval_ + elif nodeName_ == 'default08': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.default08 = dval_ + elif nodeName_ == 'normal08': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.normal08 = dval_ +# end class DefaultType2 + + +GDSClassesMapping = { + 'default1': DefaultType1, + 'default2': DefaultType2, + 'defaults': DefaultTypes, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'DefaultTypes' + rootClass = DefaultTypes + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from defaults_coverage2_sup import *\n\n') +## sys.stdout.write('import defaults_coverage2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "DefaultType1", + "DefaultType2", + "DefaultTypes" +] diff --git a/tests/extensions.xsd b/tests/extensions.xsd index b56e28b..3f24329 100644 --- a/tests/extensions.xsd +++ b/tests/extensions.xsd @@ -22,14 +22,14 @@ </xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> - <xs:enumeration value="down"> + <xs:enumeration value="right"> <xs:annotation> <xs:documentation xml:lang="en"> An item in this container. </xs:documentation> </xs:annotation> </xs:enumeration> - <xs:enumeration value="add"> + <xs:enumeration value="divide"> <xs:annotation> <xs:documentation xml:lang="en"> Add something to this container. @@ -47,14 +47,14 @@ </xs:documentation> </xs:annotation> <xs:restriction base="RelationType3"> - <xs:enumeration value="down"> + <xs:enumeration value="up"> <xs:annotation> <xs:documentation xml:lang="en"> An item in this container. </xs:documentation> </xs:annotation> </xs:enumeration> - <xs:enumeration value="add"> + <xs:enumeration value="subtract"> <xs:annotation> <xs:documentation xml:lang="en"> Add something to this container. diff --git a/tests/extensions1_sub.py b/tests/extensions1_sub.py index 46cfd20..27b9cc6 100644 --- a/tests/extensions1_sub.py +++ b/tests/extensions1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/extensions2_sup.py') +# ('-s', 'tests/extensions2_sub.py') +# ('--super', 'extensions2_sup') +# +# Command line arguments: +# tests/extensions.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/extensions2_sup.py" -s "tests/extensions2_sub.py" --super="extensions2_sup" tests/extensions.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import extensions2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -168,11 +141,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = supermod.containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -188,11 +162,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = supermod.containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -212,11 +187,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = supermod.containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -231,11 +207,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'containerType' rootClass = supermod.containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -244,8 +221,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from extensions2_sup import *\n\n') ## sys.stdout.write('import extensions2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.container(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="container") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -256,7 +233,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py index fc86ba7..5f3cb9a 100644 --- a/tests/extensions1_sup.py +++ b/tests/extensions1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/extensions2_sup.py') +# ('-s', 'tests/extensions2_sub.py') +# ('--super', 'extensions2_sup') +# +# Command line arguments: +# tests/extensions.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/extensions2_sup.py" -s "tests/extensions2_sub.py" --super="extensions2_sup" tests/extensions.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -616,9 +668,15 @@ class SpecialDate(GeneratedsSuper): subclass = None superclass = None def __init__(self, SpecialProperty=None, valueOf_=None): + self.original_tagname_ = None self.SpecialProperty = _cast(None, SpecialProperty) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, SpecialDate) + if subclass is not None: + return subclass(*args_, **kwargs_) if SpecialDate.subclass: return SpecialDate.subclass(*args_, **kwargs_) else: @@ -630,7 +688,7 @@ class SpecialDate(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -640,38 +698,25 @@ class SpecialDate(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='SpecialDate', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='SpecialDate'): if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed: already_processed.add('SpecialProperty') - outfile.write(' SpecialProperty=%s' % (self.gds_format_string(quote_attrib(self.SpecialProperty).encode(ExternalEncoding), input_name='SpecialProperty'), )) + outfile.write(' SpecialProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.SpecialProperty), input_name='SpecialProperty')), )) def exportChildren(self, outfile, level, namespace_='', name_='SpecialDate', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='SpecialDate'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed: - already_processed.add('SpecialProperty') - showIndent(outfile, level) - outfile.write('SpecialProperty="%s",\n' % (self.SpecialProperty,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -679,6 +724,7 @@ class SpecialDate(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('SpecialProperty', node) if value is not None and 'SpecialProperty' not in already_processed: @@ -697,9 +743,15 @@ class ExtremeDate(GeneratedsSuper): subclass = None superclass = None def __init__(self, ExtremeProperty=None, valueOf_=None): + self.original_tagname_ = None self.ExtremeProperty = _cast(None, ExtremeProperty) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, ExtremeDate) + if subclass is not None: + return subclass(*args_, **kwargs_) if ExtremeDate.subclass: return ExtremeDate.subclass(*args_, **kwargs_) else: @@ -711,7 +763,7 @@ class ExtremeDate(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -721,38 +773,25 @@ class ExtremeDate(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='ExtremeDate', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='ExtremeDate'): if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: already_processed.add('ExtremeProperty') - outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), )) + outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), )) def exportChildren(self, outfile, level, namespace_='', name_='ExtremeDate', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='ExtremeDate'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: - already_processed.add('ExtremeProperty') - showIndent(outfile, level) - outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -760,6 +799,7 @@ class ExtremeDate(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('ExtremeProperty', node) if value is not None and 'ExtremeProperty' not in already_processed: @@ -778,9 +818,15 @@ class singleExtremeDate(GeneratedsSuper): subclass = None superclass = None def __init__(self, ExtremeProperty=None, valueOf_=None): + self.original_tagname_ = None self.ExtremeProperty = _cast(None, ExtremeProperty) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, singleExtremeDate) + if subclass is not None: + return subclass(*args_, **kwargs_) if singleExtremeDate.subclass: return singleExtremeDate.subclass(*args_, **kwargs_) else: @@ -792,7 +838,7 @@ class singleExtremeDate(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -802,38 +848,25 @@ class singleExtremeDate(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='singleExtremeDate') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='singleExtremeDate', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='singleExtremeDate'): if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: already_processed.add('ExtremeProperty') - outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), )) + outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), )) def exportChildren(self, outfile, level, namespace_='', name_='singleExtremeDate', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='singleExtremeDate'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: - already_processed.add('ExtremeProperty') - showIndent(outfile, level) - outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -841,6 +874,7 @@ class singleExtremeDate(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('ExtremeProperty', node) if value is not None and 'ExtremeProperty' not in already_processed: @@ -859,12 +893,18 @@ class containerType(GeneratedsSuper): subclass = None superclass = None def __init__(self, simplefactoid=None, mixedfactoid=None): + self.original_tagname_ = None if simplefactoid is None: self.simplefactoid = [] else: self.simplefactoid = simplefactoid self.mixedfactoid = mixedfactoid def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, containerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if containerType.subclass: return containerType.subclass(*args_, **kwargs_) else: @@ -873,7 +913,8 @@ class containerType(GeneratedsSuper): def get_simplefactoid(self): return self.simplefactoid def set_simplefactoid(self, simplefactoid): self.simplefactoid = simplefactoid def add_simplefactoid(self, value): self.simplefactoid.append(value) - def insert_simplefactoid(self, index, value): self.simplefactoid[index] = value + def insert_simplefactoid_at(self, index, value): self.simplefactoid.insert(index, value) + def replace_simplefactoid_at(self, index, value): self.simplefactoid[index] = value def get_mixedfactoid(self): return self.mixedfactoid def set_mixedfactoid(self, mixedfactoid): self.mixedfactoid = mixedfactoid def hasContent_(self): @@ -889,13 +930,15 @@ class containerType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -911,39 +954,13 @@ class containerType(GeneratedsSuper): simplefactoid_.export(outfile, level, namespace_, name_='simplefactoid', pretty_print=pretty_print) if self.mixedfactoid is not None: self.mixedfactoid.export(outfile, level, namespace_, name_='mixedfactoid', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='containerType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('simplefactoid=[\n') - level += 1 - for simplefactoid_ in self.simplefactoid: - showIndent(outfile, level) - outfile.write('model_.simpleFactoidType(\n') - simplefactoid_.exportLiteral(outfile, level, name_='simpleFactoidType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.mixedfactoid is not None: - showIndent(outfile, level) - outfile.write('mixedfactoid=model_.mixedFactoidType(\n') - self.mixedfactoid.exportLiteral(outfile, level, name_='mixedfactoid') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -951,10 +968,12 @@ class containerType(GeneratedsSuper): obj_ = simpleFactoidType.factory() obj_.build(child_) self.simplefactoid.append(obj_) + obj_.original_tagname_ = 'simplefactoid' elif nodeName_ == 'mixedfactoid': obj_ = mixedFactoidType.factory() obj_.build(child_) self.mixedfactoid = obj_ + obj_.original_tagname_ = 'mixedfactoid' # end class containerType @@ -965,8 +984,15 @@ class simpleFactoidType(GeneratedsSuper): subclass = None superclass = None def __init__(self, relation=None): + self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleFactoidType) + if subclass is not None: + return subclass(*args_, **kwargs_) if simpleFactoidType.subclass: return simpleFactoidType.subclass(*args_, **kwargs_) else: @@ -976,7 +1002,34 @@ class simpleFactoidType(GeneratedsSuper): def set_relation(self, relation): self.relation = relation def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['down', 'add'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) + value = str(value) + enumerations = ['up', 'subtract'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) + value = str(value) + enumerations = ['right', 'divide'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None @@ -989,13 +1042,15 @@ class simpleFactoidType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleFactoidType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleFactoidType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1009,25 +1064,14 @@ class simpleFactoidType(GeneratedsSuper): eol_ = '' if self.relation is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%srelation>%s</%srelation>%s' % (namespace_, self.gds_format_string(quote_xml(self.relation).encode(ExternalEncoding), input_name='relation'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='simpleFactoidType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.relation is not None: - showIndent(outfile, level) - outfile.write('relation=%s,\n' % quote_python(self.relation).encode(ExternalEncoding)) + outfile.write('<%srelation>%s</%srelation>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.relation), input_name='relation')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1035,7 +1079,8 @@ class simpleFactoidType(GeneratedsSuper): relation_ = child_.text relation_ = self.gds_validate_string(relation_, node, 'relation') self.relation = relation_ - self.validate_RelationType(self.relation) # validate type RelationType + # validate type RelationType + self.validate_RelationType(self.relation) # end class simpleFactoidType @@ -1047,7 +1092,9 @@ class mixedFactoidType(GeneratedsSuper): subclass = None superclass = None def __init__(self, relation=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None self.relation = relation + self.validate_RelationType(self.relation) self.valueOf_ = valueOf_ if mixedclass_ is None: self.mixedclass_ = MixedContainer @@ -1059,6 +1106,11 @@ class mixedFactoidType(GeneratedsSuper): self.content_ = content_ self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, mixedFactoidType) + if subclass is not None: + return subclass(*args_, **kwargs_) if mixedFactoidType.subclass: return mixedFactoidType.subclass(*args_, **kwargs_) else: @@ -1070,11 +1122,38 @@ class mixedFactoidType(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_RelationType(self, value): # Validate type RelationType, a restriction on RelationType2. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['down', 'add'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) + value = str(value) + enumerations = ['up', 'subtract'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) + value = str(value) + enumerations = ['right', 'divide'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on RelationType' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.relation is not None or - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1084,13 +1163,15 @@ class mixedFactoidType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='mixedFactoidType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='mixedFactoidType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1101,24 +1182,6 @@ class mixedFactoidType(GeneratedsSuper): if not fromsubclass_: for item_ in self.content_: item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='mixedFactoidType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1130,6 +1193,7 @@ class mixedFactoidType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1154,11 +1218,17 @@ class BaseType(GeneratedsSuper): subclass = None superclass = None def __init__(self, BaseProperty1=None, BaseProperty2=None, valueOf_=None, extensiontype_=None): + self.original_tagname_ = None self.BaseProperty1 = _cast(None, BaseProperty1) self.BaseProperty2 = _cast(None, BaseProperty2) self.valueOf_ = valueOf_ self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, BaseType) + if subclass is not None: + return subclass(*args_, **kwargs_) if BaseType.subclass: return BaseType.subclass(*args_, **kwargs_) else: @@ -1174,7 +1244,7 @@ class BaseType(GeneratedsSuper): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1184,49 +1254,32 @@ class BaseType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='BaseType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='BaseType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='BaseType'): if self.BaseProperty1 is not None and 'BaseProperty1' not in already_processed: already_processed.add('BaseProperty1') - outfile.write(' BaseProperty1=%s' % (self.gds_format_string(quote_attrib(self.BaseProperty1).encode(ExternalEncoding), input_name='BaseProperty1'), )) + outfile.write(' BaseProperty1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.BaseProperty1), input_name='BaseProperty1')), )) if self.BaseProperty2 is not None and 'BaseProperty2' not in already_processed: already_processed.add('BaseProperty2') - outfile.write(' BaseProperty2=%s' % (self.gds_format_string(quote_attrib(self.BaseProperty2).encode(ExternalEncoding), input_name='BaseProperty2'), )) + outfile.write(' BaseProperty2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.BaseProperty2), input_name='BaseProperty2')), )) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') outfile.write(' xsi:type="%s"' % self.extensiontype_) def exportChildren(self, outfile, level, namespace_='', name_='BaseType', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='BaseType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.BaseProperty1 is not None and 'BaseProperty1' not in already_processed: - already_processed.add('BaseProperty1') - showIndent(outfile, level) - outfile.write('BaseProperty1="%s",\n' % (self.BaseProperty1,)) - if self.BaseProperty2 is not None and 'BaseProperty2' not in already_processed: - already_processed.add('BaseProperty2') - showIndent(outfile, level) - outfile.write('BaseProperty2="%s",\n' % (self.BaseProperty2,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1234,6 +1287,7 @@ class BaseType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('BaseProperty1', node) if value is not None and 'BaseProperty1' not in already_processed: @@ -1261,11 +1315,17 @@ class DerivedType(BaseType): subclass = None superclass = BaseType def __init__(self, BaseProperty1=None, BaseProperty2=None, DerivedProperty1=None, DerivedProperty2=None, valueOf_=None): + self.original_tagname_ = None super(DerivedType, self).__init__(BaseProperty1, BaseProperty2, valueOf_, ) self.DerivedProperty1 = _cast(None, DerivedProperty1) self.DerivedProperty2 = _cast(None, DerivedProperty2) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, DerivedType) + if subclass is not None: + return subclass(*args_, **kwargs_) if DerivedType.subclass: return DerivedType.subclass(*args_, **kwargs_) else: @@ -1279,7 +1339,7 @@ class DerivedType(BaseType): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ or + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ or super(DerivedType, self).hasContent_() ): return True @@ -1290,14 +1350,16 @@ class DerivedType(BaseType): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='DerivedType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -1305,34 +1367,13 @@ class DerivedType(BaseType): super(DerivedType, self).exportAttributes(outfile, level, already_processed, namespace_, name_='DerivedType') if self.DerivedProperty1 is not None and 'DerivedProperty1' not in already_processed: already_processed.add('DerivedProperty1') - outfile.write(' DerivedProperty1=%s' % (self.gds_format_string(quote_attrib(self.DerivedProperty1).encode(ExternalEncoding), input_name='DerivedProperty1'), )) + outfile.write(' DerivedProperty1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.DerivedProperty1), input_name='DerivedProperty1')), )) if self.DerivedProperty2 is not None and 'DerivedProperty2' not in already_processed: already_processed.add('DerivedProperty2') - outfile.write(' DerivedProperty2=%s' % (self.gds_format_string(quote_attrib(self.DerivedProperty2).encode(ExternalEncoding), input_name='DerivedProperty2'), )) + outfile.write(' DerivedProperty2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.DerivedProperty2), input_name='DerivedProperty2')), )) def exportChildren(self, outfile, level, namespace_='', name_='DerivedType', fromsubclass_=False, pretty_print=True): super(DerivedType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) pass - def exportLiteral(self, outfile, level, name_='DerivedType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.DerivedProperty1 is not None and 'DerivedProperty1' not in already_processed: - already_processed.add('DerivedProperty1') - showIndent(outfile, level) - outfile.write('DerivedProperty1="%s",\n' % (self.DerivedProperty1,)) - if self.DerivedProperty2 is not None and 'DerivedProperty2' not in already_processed: - already_processed.add('DerivedProperty2') - showIndent(outfile, level) - outfile.write('DerivedProperty2="%s",\n' % (self.DerivedProperty2,)) - super(DerivedType, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(DerivedType, self).exportLiteralChildren(outfile, level, name_) - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1340,6 +1381,7 @@ class DerivedType(BaseType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('DerivedProperty1', node) if value is not None and 'DerivedProperty1' not in already_processed: @@ -1363,9 +1405,15 @@ class MyInteger(GeneratedsSuper): subclass = None superclass = None def __init__(self, MyAttr=None, valueOf_=None): + self.original_tagname_ = None self.MyAttr = _cast(None, MyAttr) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MyInteger) + if subclass is not None: + return subclass(*args_, **kwargs_) if MyInteger.subclass: return MyInteger.subclass(*args_, **kwargs_) else: @@ -1377,7 +1425,7 @@ class MyInteger(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1387,38 +1435,25 @@ class MyInteger(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyInteger') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='MyInteger', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyInteger'): if self.MyAttr is not None and 'MyAttr' not in already_processed: already_processed.add('MyAttr') - outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), )) + outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), )) def exportChildren(self, outfile, level, namespace_='', name_='MyInteger', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='MyInteger'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.MyAttr is not None and 'MyAttr' not in already_processed: - already_processed.add('MyAttr') - showIndent(outfile, level) - outfile.write('MyAttr="%s",\n' % (self.MyAttr,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1426,6 +1461,7 @@ class MyInteger(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('MyAttr', node) if value is not None and 'MyAttr' not in already_processed: @@ -1444,9 +1480,15 @@ class MyBoolean(GeneratedsSuper): subclass = None superclass = None def __init__(self, MyAttr=None, valueOf_=None): + self.original_tagname_ = None self.MyAttr = _cast(None, MyAttr) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MyBoolean) + if subclass is not None: + return subclass(*args_, **kwargs_) if MyBoolean.subclass: return MyBoolean.subclass(*args_, **kwargs_) else: @@ -1458,7 +1500,7 @@ class MyBoolean(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1468,38 +1510,25 @@ class MyBoolean(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyBoolean') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='MyBoolean', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyBoolean'): if self.MyAttr is not None and 'MyAttr' not in already_processed: already_processed.add('MyAttr') - outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), )) + outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), )) def exportChildren(self, outfile, level, namespace_='', name_='MyBoolean', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='MyBoolean'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.MyAttr is not None and 'MyAttr' not in already_processed: - already_processed.add('MyAttr') - showIndent(outfile, level) - outfile.write('MyAttr="%s",\n' % (self.MyAttr,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1507,6 +1536,7 @@ class MyBoolean(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('MyAttr', node) if value is not None and 'MyAttr' not in already_processed: @@ -1525,9 +1555,15 @@ class MyFloat(GeneratedsSuper): subclass = None superclass = None def __init__(self, MyAttr=None, valueOf_=None): + self.original_tagname_ = None self.MyAttr = _cast(None, MyAttr) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MyFloat) + if subclass is not None: + return subclass(*args_, **kwargs_) if MyFloat.subclass: return MyFloat.subclass(*args_, **kwargs_) else: @@ -1539,7 +1575,7 @@ class MyFloat(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1549,38 +1585,25 @@ class MyFloat(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyFloat') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='MyFloat', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyFloat'): if self.MyAttr is not None and 'MyAttr' not in already_processed: already_processed.add('MyAttr') - outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), )) + outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), )) def exportChildren(self, outfile, level, namespace_='', name_='MyFloat', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='MyFloat'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.MyAttr is not None and 'MyAttr' not in already_processed: - already_processed.add('MyAttr') - showIndent(outfile, level) - outfile.write('MyAttr="%s",\n' % (self.MyAttr,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1588,6 +1611,7 @@ class MyFloat(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('MyAttr', node) if value is not None and 'MyAttr' not in already_processed: @@ -1606,9 +1630,15 @@ class MyDouble(GeneratedsSuper): subclass = None superclass = None def __init__(self, MyAttr=None, valueOf_=None): + self.original_tagname_ = None self.MyAttr = _cast(None, MyAttr) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, MyDouble) + if subclass is not None: + return subclass(*args_, **kwargs_) if MyDouble.subclass: return MyDouble.subclass(*args_, **kwargs_) else: @@ -1620,7 +1650,7 @@ class MyDouble(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1630,38 +1660,25 @@ class MyDouble(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='MyDouble') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='MyDouble', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='MyDouble'): if self.MyAttr is not None and 'MyAttr' not in already_processed: already_processed.add('MyAttr') - outfile.write(' MyAttr=%s' % (self.gds_format_string(quote_attrib(self.MyAttr).encode(ExternalEncoding), input_name='MyAttr'), )) + outfile.write(' MyAttr=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.MyAttr), input_name='MyAttr')), )) def exportChildren(self, outfile, level, namespace_='', name_='MyDouble', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='MyDouble'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.MyAttr is not None and 'MyAttr' not in already_processed: - already_processed.add('MyAttr') - showIndent(outfile, level) - outfile.write('MyAttr="%s",\n' % (self.MyAttr,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -1669,6 +1686,7 @@ class MyDouble(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('MyAttr', node) if value is not None and 'MyAttr' not in already_processed: @@ -1680,8 +1698,8 @@ class MyDouble(GeneratedsSuper): GDSClassesMapping = { - 'mixedfactoid': mixedFactoidType, 'container': containerType, + 'mixedfactoid': mixedFactoidType, 'simplefactoid': simpleFactoidType, } @@ -1692,7 +1710,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1705,11 +1723,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1725,11 +1744,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1748,12 +1768,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'containerType' rootClass = containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1762,17 +1786,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="container", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'container' + rootTag = 'containerType' rootClass = containerType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1781,7 +1806,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from extensions2_sup import *\n\n') ## sys.stdout.write('import extensions2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/gds_inner_name_map.py b/tests/gds_inner_name_map.py new file mode 100644 index 0000000..a883760 --- /dev/null +++ b/tests/gds_inner_name_map.py @@ -0,0 +1,7 @@ + +Inner_name_map = { + ("classAType", "inner"): "inner_001", + ("classBType", "inner"): "inner_002", + #("classAType", "inner"): "class_a_inner", + #("classBType", "inner"): "class_b_inner", +} diff --git a/tests/ipo1_out.xml b/tests/ipo1_out.xml index 3456bed..44ae582 100644 --- a/tests/ipo1_out.xml +++ b/tests/ipo1_out.xml @@ -1,21 +1,20 @@ <?xml version="1.0" ?> <ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01"> - <ipo:shipTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" category="1-a" exportCode="1"> + <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" exportCode="1"> <ipo:name>Helen Zoe</ipo:name> <ipo:street>47 Eden Street</ipo:street> <ipo:city>Cambridge</ipo:city> <ipo:postcode>CB1 1JR</ipo:postcode> - <ipo:category>oneA</ipo:category> </ipo:shipTo> - <ipo:billTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress"> + <ipo:billTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress"> <ipo:name>Robert Smith</ipo:name> <ipo:street>8 Oak Avenue</ipo:street> <ipo:city>Old Town</ipo:city> <ipo:state>PA</ipo:state> <ipo:zip>95819</ipo:zip> </ipo:billTo> - <ipo:items> - <ipo:item partNum="833-AA"> + <ipo:items xmlns:ipo="http://www.example.com/IPO"> + <ipo:item xmlns:ipo="http://www.example.com/IPO" partNum="833-AA"> <ipo:productName>Lapis necklace</ipo:productName> <ipo:quantity>1</ipo:quantity> <ipo:USPrice>99.950000000000003</ipo:USPrice> diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py index 5665691..01e5965 100644 --- a/tests/ipo1_sub.py +++ b/tests/ipo1_sub.py @@ -3,64 +3,36 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/ipo2_sup.py') +# ('-s', 'tests/ipo2_sub.py') +# ('--super', 'ipo2_sup') +# +# Command line arguments: +# tests/ipo.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import ipo2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -88,6 +60,13 @@ supermod.Items.subclass = ItemsSub # end class ItemsSub +class itemSub(supermod.item): + def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): + super(itemSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, ) +supermod.item.subclass = itemSub +# end class itemSub + + class AddressSub(supermod.Address): def __init__(self, name=None, street=None, city=None, extensiontype_=None): super(AddressSub, self).__init__(name, street, city, extensiontype_, ) @@ -103,19 +82,12 @@ supermod.USAddress.subclass = USAddressSub class UKAddressSub(supermod.UKAddress): - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): - super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, ) + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, ) supermod.UKAddress.subclass = UKAddressSub # end class UKAddressSub -class itemTypeSub(supermod.itemType): - def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): - super(itemTypeSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, ) -supermod.itemType.subclass = itemTypeSub -# end class itemTypeSub - - def get_root_tag(node): tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] rootClass = None @@ -126,11 +98,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -146,11 +119,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -170,11 +144,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -189,11 +164,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -202,8 +178,8 @@ def parseLiteral(inFilename, silence=False): if not silence: sys.stdout.write('#from ipo2_sup import *\n\n') sys.stdout.write('import ipo2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.purchaseOrder(\n') - rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder") + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -214,7 +190,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py index 2e452f2..5a27592 100644 --- a/tests/ipo1_sup.py +++ b/tests/ipo1_sup.py @@ -4,66 +4,53 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/ipo2_sup.py') +# ('-s', 'tests/ipo2_sub.py') +# ('--super', 'ipo2_sup') +# +# Command line arguments: +# tests/ipo.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +62,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +78,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +147,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +202,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +213,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +236,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +260,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +292,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +362,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +410,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +428,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +513,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +554,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -619,7 +670,8 @@ class PurchaseOrderType(GeneratedsSuper): subclass = None superclass = None def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None): - if isinstance(orderDate, basestring): + self.original_tagname_ = None + if isinstance(orderDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date() else: initvalue_ = orderDate @@ -629,6 +681,11 @@ class PurchaseOrderType(GeneratedsSuper): self.comment = comment self.items = items def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PurchaseOrderType) + if subclass is not None: + return subclass(*args_, **kwargs_) if PurchaseOrderType.subclass: return PurchaseOrderType.subclass(*args_, **kwargs_) else: @@ -654,18 +711,20 @@ class PurchaseOrderType(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PurchaseOrderType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='PurchaseOrderType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -685,55 +744,23 @@ class PurchaseOrderType(GeneratedsSuper): self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.items is not None: self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PurchaseOrderType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.orderDate is not None and 'orderDate' not in already_processed: - already_processed.add('orderDate') - showIndent(outfile, level) - outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate')) - def exportLiteralChildren(self, outfile, level, name_): - if self.shipTo is not None: - showIndent(outfile, level) - outfile.write('shipTo=model_.Address(\n') - self.shipTo.exportLiteral(outfile, level, name_='shipTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.billTo is not None: - showIndent(outfile, level) - outfile.write('billTo=model_.Address(\n') - self.billTo.exportLiteral(outfile, level, name_='billTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.items is not None: - showIndent(outfile, level) - outfile.write('items=model_.Items(\n') - self.items.exportLiteral(outfile, level, name_='items') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('orderDate', node) if value is not None and 'orderDate' not in already_processed: already_processed.add('orderDate') try: self.orderDate = self.gds_parse_date(value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad date attribute (orderDate): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'shipTo': @@ -741,11 +768,13 @@ class PurchaseOrderType(GeneratedsSuper): obj_ = class_obj_.factory() obj_.build(child_) self.shipTo = obj_ + obj_.original_tagname_ = 'shipTo' elif nodeName_ == 'billTo': class_obj_ = self.get_class_obj_(child_, Address) obj_ = class_obj_.factory() obj_.build(child_) self.billTo = obj_ + obj_.original_tagname_ = 'billTo' elif nodeName_ == 'comment': comment_ = child_.text comment_ = self.gds_validate_string(comment_, node, 'comment') @@ -754,21 +783,28 @@ class PurchaseOrderType(GeneratedsSuper): obj_ = Items.factory() obj_.build(child_) self.items = obj_ + obj_.original_tagname_ = 'items' # end class PurchaseOrderType class Items(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('item', 'itemType', 1), + MemberSpec_('item', 'item', 1), ] subclass = None superclass = None def __init__(self, item=None): + self.original_tagname_ = None if item is None: self.item = [] else: self.item = item def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Items) + if subclass is not None: + return subclass(*args_, **kwargs_) if Items.subclass: return Items.subclass(*args_, **kwargs_) else: @@ -777,7 +813,8 @@ class Items(GeneratedsSuper): def get_item(self): return self.item def set_item(self, item): self.item = item def add_item(self, value): self.item.append(value) - def insert_item(self, index, value): self.item[index] = value + def insert_item_at(self, index, value): self.item.insert(index, value) + def replace_item_at(self, index, value): self.item[index] = value def hasContent_(self): if ( self.item @@ -785,18 +822,20 @@ class Items(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Items') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Items', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -810,43 +849,230 @@ class Items(GeneratedsSuper): eol_ = '' for item_ in self.item: item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='Items'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('item=[\n') - level += 1 - for item_ in self.item: - showIndent(outfile, level) - outfile.write('model_.itemType(\n') - item_.exportLiteral(outfile, level, name_='itemType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'item': - obj_ = itemType.factory() + obj_ = item.factory() obj_.build(child_) self.item.append(obj_) + obj_.original_tagname_ = 'item' # end class Items +class item(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('partNum', 'ipo:SKU', 0), + MemberSpec_('productName', 'string', 0), + MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0), + MemberSpec_('USPrice', 'decimal', 0), + MemberSpec_('comment', 'string', 0), + MemberSpec_('shipDate', 'date', 0), + ] + subclass = None + superclass = None + def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): + self.original_tagname_ = None + self.partNum = _cast(None, partNum) + self.productName = productName + self.quantity = quantity + self.USPrice = USPrice + self.comment = comment + if isinstance(shipDate, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() + else: + initvalue_ = shipDate + self.shipDate = initvalue_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, item) + if subclass is not None: + return subclass(*args_, **kwargs_) + if item.subclass: + return item.subclass(*args_, **kwargs_) + else: + return item(*args_, **kwargs_) + factory = staticmethod(factory) + def get_productName(self): return self.productName + def set_productName(self, productName): self.productName = productName + def get_quantity(self): return self.quantity + def set_quantity(self, quantity): self.quantity = quantity + def get_USPrice(self): return self.USPrice + def set_USPrice(self, USPrice): self.USPrice = USPrice + def get_comment(self): return self.comment + def set_comment(self, comment): self.comment = comment + def get_shipDate(self): return self.shipDate + def set_shipDate(self, shipDate): self.shipDate = shipDate + def get_partNum(self): return self.partNum + def set_partNum(self, partNum): self.partNum = partNum + def hasContent_(self): + if ( + self.productName is not None or + self.quantity is not None or + self.USPrice is not None or + self.comment is not None or + self.shipDate is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='item') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='item', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='item'): + if self.partNum is not None and 'partNum' not in already_processed: + already_processed.add('partNum') + outfile.write(' partNum=%s' % (quote_attrib(self.partNum), )) + def exportChildren(self, outfile, level, namespace_='ipo:', name_='item', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.productName is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_)) + if self.quantity is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) + if self.USPrice is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) + if self.comment is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) + if self.shipDate is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('partNum', node) + if value is not None and 'partNum' not in already_processed: + already_processed.add('partNum') + self.partNum = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'productName': + productName_ = child_.text + productName_ = self.gds_validate_string(productName_, node, 'productName') + self.productName = productName_ + elif nodeName_ == 'quantity': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + if ival_ <= 0: + raise_parse_error(child_, 'requires positiveInteger') + ival_ = self.gds_validate_integer(ival_, node, 'quantity') + self.quantity = ival_ + elif nodeName_ == 'USPrice': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'USPrice') + self.USPrice = fval_ + elif nodeName_ == 'comment': + comment_ = child_.text + comment_ = self.gds_validate_string(comment_, node, 'comment') + self.comment = comment_ + elif nodeName_ == 'shipDate': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.shipDate = dval_ +# end class item + + +class quantity(GeneratedsSuper): + member_data_items_ = [ + ] + subclass = None + superclass = None + def __init__(self, valueOf_=None): + self.original_tagname_ = None + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, quantity) + if subclass is not None: + return subclass(*args_, **kwargs_) + if quantity.subclass: + return quantity.subclass(*args_, **kwargs_) + else: + return quantity(*args_, **kwargs_) + factory = staticmethod(factory) + def hasContent_(self): + if ( + + ): + return True + else: + return False + def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='quantity', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'): + pass + def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class quantity + + class Address(GeneratedsSuper): member_data_items_ = [ MemberSpec_('name', 'string', 0), @@ -856,11 +1082,17 @@ class Address(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, street=None, city=None, extensiontype_=None): + self.original_tagname_ = None self.name = name self.street = street self.city = city self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Address) + if subclass is not None: + return subclass(*args_, **kwargs_) if Address.subclass: return Address.subclass(*args_, **kwargs_) else: @@ -883,18 +1115,20 @@ class Address(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Address') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Address', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -912,37 +1146,20 @@ class Address(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.street is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_)) + outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_)) if self.city is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='Address'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.street is not None: - showIndent(outfile, level) - outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding)) - if self.city is not None: - showIndent(outfile, level) - outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding)) + outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -972,10 +1189,17 @@ class USAddress(Address): subclass = None superclass = Address def __init__(self, name=None, street=None, city=None, state=None, zip=None): + self.original_tagname_ = None super(USAddress, self).__init__(name, street, city, ) self.state = state + self.validate_USState(self.state) self.zip = zip def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, USAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if USAddress.subclass: return USAddress.subclass(*args_, **kwargs_) else: @@ -987,7 +1211,16 @@ class USAddress(Address): def set_zip(self, zip): self.zip = zip def validate_USState(self, value): # Validate type USState, a restriction on string. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['AK', 'AL', 'AR', 'PA'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.state is not None or @@ -997,18 +1230,20 @@ class USAddress(Address): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='USAddress') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='USAddress', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1023,32 +1258,17 @@ class USAddress(Address): eol_ = '' if self.state is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_)) + outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_)) if self.zip is not None: showIndent(outfile, level, pretty_print) outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='USAddress'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(USAddress, self).exportLiteralChildren(outfile, level, name_) - if self.state is not None: - showIndent(outfile, level) - outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding)) - if self.zip is not None: - showIndent(outfile, level) - outfile.write('zip=%d,\n' % self.zip) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(USAddress, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1056,12 +1276,13 @@ class USAddress(Address): state_ = child_.text state_ = self.gds_validate_string(state_, node, 'state') self.state = state_ - self.validate_USState(self.state) # validate type USState + # validate type USState + self.validate_USState(self.state) elif nodeName_ == 'zip': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1073,20 +1294,22 @@ class USAddress(Address): class UKAddress(Address): member_data_items_ = [ - MemberSpec_('category_attr', 'xs:string', 0), MemberSpec_('exportCode', 'positiveInteger', 0), - MemberSpec_('postcode', ['UKPostcode', 'string'], 0), - MemberSpec_('category', 'string', 0), + MemberSpec_('postcode', 'string', 0), ] subclass = None superclass = Address - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + self.original_tagname_ = None super(UKAddress, self).__init__(name, street, city, ) - self.category_attr = _cast(None, category_attr) self.exportCode = _cast(int, exportCode) self.postcode = postcode - self.category = category def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, UKAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if UKAddress.subclass: return UKAddress.subclass(*args_, **kwargs_) else: @@ -1094,45 +1317,36 @@ class UKAddress(Address): factory = staticmethod(factory) def get_postcode(self): return self.postcode def set_postcode(self, postcode): self.postcode = postcode - def get_category(self): return self.category - def set_category(self, category): self.category = category - def get_category_attr(self): return self.category_attr - def set_category_attr(self, category_attr): self.category_attr = category_attr def get_exportCode(self): return self.exportCode def set_exportCode(self, exportCode): self.exportCode = exportCode - def validate_UKPostcode(self, value): - # Validate type UKPostcode, a restriction on string. - pass def hasContent_(self): if ( self.postcode is not None or - self.category is not None or super(UKAddress, self).hasContent_() ): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='UKAddress', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'): super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - outfile.write(' category=%s' % (quote_attrib(self.category_attr), )) if self.exportCode is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode')) @@ -1144,51 +1358,21 @@ class UKAddress(Address): eol_ = '' if self.postcode is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_)) - if self.category is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='UKAddress'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - showIndent(outfile, level) - outfile.write('category_attr=%s,\n' % (self.category_attr,)) - if self.exportCode is not None and 'exportCode' not in already_processed: - already_processed.add('exportCode') - showIndent(outfile, level) - outfile.write('exportCode=%d,\n' % (self.exportCode,)) - super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(UKAddress, self).exportLiteralChildren(outfile, level, name_) - if self.postcode is not None: - showIndent(outfile, level) - outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding)) - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding)) + outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('category', node) - if value is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - self.category_attr = value value = find_attr_value_('exportCode', node) if value is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') try: self.exportCode = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.exportCode <= 0: raise_parse_error(node, 'Invalid PositiveInteger') @@ -1198,246 +1382,15 @@ class UKAddress(Address): postcode_ = child_.text postcode_ = self.gds_validate_string(postcode_, node, 'postcode') self.postcode = postcode_ - self.validate_UKPostcode(self.postcode) # validate type UKPostcode - elif nodeName_ == 'category': - category_ = child_.text - category_ = self.gds_validate_string(category_, node, 'category') - self.category = category_ super(UKAddress, self).buildChildren(child_, node, nodeName_, True) # end class UKAddress -class itemType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('partNum', 'ipo:SKU', 0), - MemberSpec_('productName', 'string', 0), - MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0), - MemberSpec_('USPrice', 'decimal', 0), - MemberSpec_('comment', 'string', 0), - MemberSpec_('shipDate', 'date', 0), - ] - subclass = None - superclass = None - def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): - self.partNum = _cast(None, partNum) - self.productName = productName - self.quantity = quantity - self.USPrice = USPrice - self.comment = comment - if isinstance(shipDate, basestring): - initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() - else: - initvalue_ = shipDate - self.shipDate = initvalue_ - def factory(*args_, **kwargs_): - if itemType.subclass: - return itemType.subclass(*args_, **kwargs_) - else: - return itemType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_productName(self): return self.productName - def set_productName(self, productName): self.productName = productName - def get_quantity(self): return self.quantity - def set_quantity(self, quantity): self.quantity = quantity - def get_USPrice(self): return self.USPrice - def set_USPrice(self, USPrice): self.USPrice = USPrice - def get_comment(self): return self.comment - def set_comment(self, comment): self.comment = comment - def get_shipDate(self): return self.shipDate - def set_shipDate(self, shipDate): self.shipDate = shipDate - def get_partNum(self): return self.partNum - def set_partNum(self, partNum): self.partNum = partNum - def hasContent_(self): - if ( - self.productName is not None or - self.quantity is not None or - self.USPrice is not None or - self.comment is not None or - self.shipDate is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='ipo:', name_='itemType', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='itemType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='itemType'): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - outfile.write(' partNum=%s' % (quote_attrib(self.partNum), )) - def exportChildren(self, outfile, level, namespace_='ipo:', name_='itemType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.productName is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_)) - if self.quantity is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) - if self.USPrice is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) - if self.comment is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) - if self.shipDate is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='itemType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - showIndent(outfile, level) - outfile.write('partNum=%s,\n' % (self.partNum,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.productName is not None: - showIndent(outfile, level) - outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding)) - if self.quantity is not None: - showIndent(outfile, level) - outfile.write('quantity=%d,\n' % self.quantity) - if self.USPrice is not None: - showIndent(outfile, level) - outfile.write('USPrice=%f,\n' % self.USPrice) - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.shipDate is not None: - showIndent(outfile, level) - outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate')) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('partNum', node) - if value is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - self.partNum = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'productName': - productName_ = child_.text - productName_ = self.gds_validate_string(productName_, node, 'productName') - self.productName = productName_ - elif nodeName_ == 'quantity': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ <= 0: - raise_parse_error(child_, 'requires positiveInteger') - ival_ = self.gds_validate_integer(ival_, node, 'quantity') - self.quantity = ival_ - elif nodeName_ == 'USPrice': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'USPrice') - self.USPrice = fval_ - elif nodeName_ == 'comment': - comment_ = child_.text - comment_ = self.gds_validate_string(comment_, node, 'comment') - self.comment = comment_ - elif nodeName_ == 'shipDate': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.shipDate = dval_ -# end class itemType - - -class quantity(GeneratedsSuper): - member_data_items_ = [ - ] - subclass = None - superclass = None - def __init__(self, valueOf_=None): - self.valueOf_ = valueOf_ - def factory(*args_, **kwargs_): - if quantity.subclass: - return quantity.subclass(*args_, **kwargs_) - else: - return quantity(*args_, **kwargs_) - factory = staticmethod(factory) - def hasContent_(self): - if ( - - ): - return True - else: - return False - def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'): - pass - def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='quantity'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - pass -# end class quantity - - GDSClassesMapping = { + 'billTo': Address, 'items': Items, 'purchaseOrder': PurchaseOrderType, 'shipTo': Address, - 'billTo': Address, - 'item': itemType, } @@ -1447,7 +1400,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1460,11 +1413,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1480,11 +1434,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1503,12 +1458,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1517,17 +1476,18 @@ def parseString(inString, silence=False): if not silence: sys.stdout.write('<?xml version="1.0" ?>\n') rootObj.export( - sys.stdout, 0, name_="purchaseOrder", + sys.stdout, 0, name_=rootTag, namespacedef_='xmlns:ipo="http://www.example.com/IPO"') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1536,7 +1496,7 @@ def parseLiteral(inFileName, silence=False): if not silence: sys.stdout.write('#from ipo2_sup import *\n\n') sys.stdout.write('import ipo2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') + sys.stdout.write('rootObj = model_.rootClass(\n') rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -1561,6 +1521,6 @@ __all__ = [ "PurchaseOrderType", "UKAddress", "USAddress", - "itemType", + "item", "quantity" ] diff --git a/tests/ipo2_out.xml b/tests/ipo2_out.xml deleted file mode 100644 index 3456bed..0000000 --- a/tests/ipo2_out.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" ?> -<ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01"> - <ipo:shipTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" category="1-a" exportCode="1"> - <ipo:name>Helen Zoe</ipo:name> - <ipo:street>47 Eden Street</ipo:street> - <ipo:city>Cambridge</ipo:city> - <ipo:postcode>CB1 1JR</ipo:postcode> - <ipo:category>oneA</ipo:category> - </ipo:shipTo> - <ipo:billTo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:USAddress"> - <ipo:name>Robert Smith</ipo:name> - <ipo:street>8 Oak Avenue</ipo:street> - <ipo:city>Old Town</ipo:city> - <ipo:state>PA</ipo:state> - <ipo:zip>95819</ipo:zip> - </ipo:billTo> - <ipo:items> - <ipo:item partNum="833-AA"> - <ipo:productName>Lapis necklace</ipo:productName> - <ipo:quantity>1</ipo:quantity> - <ipo:USPrice>99.950000000000003</ipo:USPrice> - <ipo:comment>Want this for the holidays</ipo:comment> - <ipo:shipDate>1999-12-05</ipo:shipDate> - </ipo:item> - </ipo:items> -</ipo:purchaseOrder> diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py index 5665691..01e5965 100644 --- a/tests/ipo2_sub.py +++ b/tests/ipo2_sub.py @@ -3,64 +3,36 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/ipo2_sup.py') +# ('-s', 'tests/ipo2_sub.py') +# ('--super', 'ipo2_sup') +# +# Command line arguments: +# tests/ipo.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import ipo2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -88,6 +60,13 @@ supermod.Items.subclass = ItemsSub # end class ItemsSub +class itemSub(supermod.item): + def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): + super(itemSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, ) +supermod.item.subclass = itemSub +# end class itemSub + + class AddressSub(supermod.Address): def __init__(self, name=None, street=None, city=None, extensiontype_=None): super(AddressSub, self).__init__(name, street, city, extensiontype_, ) @@ -103,19 +82,12 @@ supermod.USAddress.subclass = USAddressSub class UKAddressSub(supermod.UKAddress): - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): - super(UKAddressSub, self).__init__(name, street, city, category_attr, exportCode, postcode, category, ) + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, ) supermod.UKAddress.subclass = UKAddressSub # end class UKAddressSub -class itemTypeSub(supermod.itemType): - def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): - super(itemTypeSub, self).__init__(partNum, productName, quantity, USPrice, comment, shipDate, ) -supermod.itemType.subclass = itemTypeSub -# end class itemTypeSub - - def get_root_tag(node): tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] rootClass = None @@ -126,11 +98,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -146,11 +119,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -170,11 +144,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -189,11 +164,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PurchaseOrderType' rootClass = supermod.PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -202,8 +178,8 @@ def parseLiteral(inFilename, silence=False): if not silence: sys.stdout.write('#from ipo2_sup import *\n\n') sys.stdout.write('import ipo2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.purchaseOrder(\n') - rootObj.exportLiteral(sys.stdout, 0, name_="purchaseOrder") + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -214,7 +190,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py index 2e452f2..5a27592 100644 --- a/tests/ipo2_sup.py +++ b/tests/ipo2_sup.py @@ -4,66 +4,53 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/ipo2_sup.py') +# ('-s', 'tests/ipo2_sub.py') +# ('--super', 'ipo2_sup') +# +# Command line arguments: +# tests/ipo.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/ipo2_sup.py" -s "tests/ipo2_sub.py" --super="ipo2_sup" tests/ipo.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +62,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +78,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +147,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +202,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +213,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +236,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +260,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +292,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +362,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +410,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +428,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +513,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +554,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -619,7 +670,8 @@ class PurchaseOrderType(GeneratedsSuper): subclass = None superclass = None def __init__(self, orderDate=None, shipTo=None, billTo=None, comment=None, items=None): - if isinstance(orderDate, basestring): + self.original_tagname_ = None + if isinstance(orderDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(orderDate, '%Y-%m-%d').date() else: initvalue_ = orderDate @@ -629,6 +681,11 @@ class PurchaseOrderType(GeneratedsSuper): self.comment = comment self.items = items def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PurchaseOrderType) + if subclass is not None: + return subclass(*args_, **kwargs_) if PurchaseOrderType.subclass: return PurchaseOrderType.subclass(*args_, **kwargs_) else: @@ -654,18 +711,20 @@ class PurchaseOrderType(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='PurchaseOrderType', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PurchaseOrderType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='PurchaseOrderType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -685,55 +744,23 @@ class PurchaseOrderType(GeneratedsSuper): self.billTo.export(outfile, level, namespace_, name_='billTo', pretty_print=pretty_print) if self.comment is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) if self.items is not None: self.items.export(outfile, level, namespace_, name_='items', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='PurchaseOrderType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.orderDate is not None and 'orderDate' not in already_processed: - already_processed.add('orderDate') - showIndent(outfile, level) - outfile.write('orderDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.orderDate, input_name='orderDate')) - def exportLiteralChildren(self, outfile, level, name_): - if self.shipTo is not None: - showIndent(outfile, level) - outfile.write('shipTo=model_.Address(\n') - self.shipTo.exportLiteral(outfile, level, name_='shipTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.billTo is not None: - showIndent(outfile, level) - outfile.write('billTo=model_.Address(\n') - self.billTo.exportLiteral(outfile, level, name_='billTo') - showIndent(outfile, level) - outfile.write('),\n') - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.items is not None: - showIndent(outfile, level) - outfile.write('items=model_.Items(\n') - self.items.exportLiteral(outfile, level, name_='items') - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('orderDate', node) if value is not None and 'orderDate' not in already_processed: already_processed.add('orderDate') try: self.orderDate = self.gds_parse_date(value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad date attribute (orderDate): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'shipTo': @@ -741,11 +768,13 @@ class PurchaseOrderType(GeneratedsSuper): obj_ = class_obj_.factory() obj_.build(child_) self.shipTo = obj_ + obj_.original_tagname_ = 'shipTo' elif nodeName_ == 'billTo': class_obj_ = self.get_class_obj_(child_, Address) obj_ = class_obj_.factory() obj_.build(child_) self.billTo = obj_ + obj_.original_tagname_ = 'billTo' elif nodeName_ == 'comment': comment_ = child_.text comment_ = self.gds_validate_string(comment_, node, 'comment') @@ -754,21 +783,28 @@ class PurchaseOrderType(GeneratedsSuper): obj_ = Items.factory() obj_.build(child_) self.items = obj_ + obj_.original_tagname_ = 'items' # end class PurchaseOrderType class Items(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('item', 'itemType', 1), + MemberSpec_('item', 'item', 1), ] subclass = None superclass = None def __init__(self, item=None): + self.original_tagname_ = None if item is None: self.item = [] else: self.item = item def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Items) + if subclass is not None: + return subclass(*args_, **kwargs_) if Items.subclass: return Items.subclass(*args_, **kwargs_) else: @@ -777,7 +813,8 @@ class Items(GeneratedsSuper): def get_item(self): return self.item def set_item(self, item): self.item = item def add_item(self, value): self.item.append(value) - def insert_item(self, index, value): self.item[index] = value + def insert_item_at(self, index, value): self.item.insert(index, value) + def replace_item_at(self, index, value): self.item[index] = value def hasContent_(self): if ( self.item @@ -785,18 +822,20 @@ class Items(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='Items', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Items') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Items', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -810,43 +849,230 @@ class Items(GeneratedsSuper): eol_ = '' for item_ in self.item: item_.export(outfile, level, namespace_, name_='item', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='Items'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('item=[\n') - level += 1 - for item_ in self.item: - showIndent(outfile, level) - outfile.write('model_.itemType(\n') - item_.exportLiteral(outfile, level, name_='itemType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'item': - obj_ = itemType.factory() + obj_ = item.factory() obj_.build(child_) self.item.append(obj_) + obj_.original_tagname_ = 'item' # end class Items +class item(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('partNum', 'ipo:SKU', 0), + MemberSpec_('productName', 'string', 0), + MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0), + MemberSpec_('USPrice', 'decimal', 0), + MemberSpec_('comment', 'string', 0), + MemberSpec_('shipDate', 'date', 0), + ] + subclass = None + superclass = None + def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): + self.original_tagname_ = None + self.partNum = _cast(None, partNum) + self.productName = productName + self.quantity = quantity + self.USPrice = USPrice + self.comment = comment + if isinstance(shipDate, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() + else: + initvalue_ = shipDate + self.shipDate = initvalue_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, item) + if subclass is not None: + return subclass(*args_, **kwargs_) + if item.subclass: + return item.subclass(*args_, **kwargs_) + else: + return item(*args_, **kwargs_) + factory = staticmethod(factory) + def get_productName(self): return self.productName + def set_productName(self, productName): self.productName = productName + def get_quantity(self): return self.quantity + def set_quantity(self, quantity): self.quantity = quantity + def get_USPrice(self): return self.USPrice + def set_USPrice(self, USPrice): self.USPrice = USPrice + def get_comment(self): return self.comment + def set_comment(self, comment): self.comment = comment + def get_shipDate(self): return self.shipDate + def set_shipDate(self, shipDate): self.shipDate = shipDate + def get_partNum(self): return self.partNum + def set_partNum(self, partNum): self.partNum = partNum + def hasContent_(self): + if ( + self.productName is not None or + self.quantity is not None or + self.USPrice is not None or + self.comment is not None or + self.shipDate is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='ipo:', name_='item', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='item') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='item', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='item'): + if self.partNum is not None and 'partNum' not in already_processed: + already_processed.add('partNum') + outfile.write(' partNum=%s' % (quote_attrib(self.partNum), )) + def exportChildren(self, outfile, level, namespace_='ipo:', name_='item', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.productName is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.productName), input_name='productName')), namespace_, eol_)) + if self.quantity is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) + if self.USPrice is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) + if self.comment is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.comment), input_name='comment')), namespace_, eol_)) + if self.shipDate is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('partNum', node) + if value is not None and 'partNum' not in already_processed: + already_processed.add('partNum') + self.partNum = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'productName': + productName_ = child_.text + productName_ = self.gds_validate_string(productName_, node, 'productName') + self.productName = productName_ + elif nodeName_ == 'quantity': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + if ival_ <= 0: + raise_parse_error(child_, 'requires positiveInteger') + ival_ = self.gds_validate_integer(ival_, node, 'quantity') + self.quantity = ival_ + elif nodeName_ == 'USPrice': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'USPrice') + self.USPrice = fval_ + elif nodeName_ == 'comment': + comment_ = child_.text + comment_ = self.gds_validate_string(comment_, node, 'comment') + self.comment = comment_ + elif nodeName_ == 'shipDate': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.shipDate = dval_ +# end class item + + +class quantity(GeneratedsSuper): + member_data_items_ = [ + ] + subclass = None + superclass = None + def __init__(self, valueOf_=None): + self.original_tagname_ = None + self.valueOf_ = valueOf_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, quantity) + if subclass is not None: + return subclass(*args_, **kwargs_) + if quantity.subclass: + return quantity.subclass(*args_, **kwargs_) + else: + return quantity(*args_, **kwargs_) + factory = staticmethod(factory) + def hasContent_(self): + if ( + + ): + return True + else: + return False + def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='quantity', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'): + pass + def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class quantity + + class Address(GeneratedsSuper): member_data_items_ = [ MemberSpec_('name', 'string', 0), @@ -856,11 +1082,17 @@ class Address(GeneratedsSuper): subclass = None superclass = None def __init__(self, name=None, street=None, city=None, extensiontype_=None): + self.original_tagname_ = None self.name = name self.street = street self.city = city self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, Address) + if subclass is not None: + return subclass(*args_, **kwargs_) if Address.subclass: return Address.subclass(*args_, **kwargs_) else: @@ -883,18 +1115,20 @@ class Address(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='Address', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='Address') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='Address', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -912,37 +1146,20 @@ class Address(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) if self.street is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_format_string(quote_xml(self.street).encode(ExternalEncoding), input_name='street'), namespace_, eol_)) + outfile.write('<%sstreet>%s</%sstreet>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.street), input_name='street')), namespace_, eol_)) if self.city is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_format_string(quote_xml(self.city).encode(ExternalEncoding), input_name='city'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='Address'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - if self.street is not None: - showIndent(outfile, level) - outfile.write('street=%s,\n' % quote_python(self.street).encode(ExternalEncoding)) - if self.city is not None: - showIndent(outfile, level) - outfile.write('city=%s,\n' % quote_python(self.city).encode(ExternalEncoding)) + outfile.write('<%scity>%s</%scity>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.city), input_name='city')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -972,10 +1189,17 @@ class USAddress(Address): subclass = None superclass = Address def __init__(self, name=None, street=None, city=None, state=None, zip=None): + self.original_tagname_ = None super(USAddress, self).__init__(name, street, city, ) self.state = state + self.validate_USState(self.state) self.zip = zip def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, USAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if USAddress.subclass: return USAddress.subclass(*args_, **kwargs_) else: @@ -987,7 +1211,16 @@ class USAddress(Address): def set_zip(self, zip): self.zip = zip def validate_USState(self, value): # Validate type USState, a restriction on string. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['AK', 'AL', 'AR', 'PA'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on USState' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.state is not None or @@ -997,18 +1230,20 @@ class USAddress(Address): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='USAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='USAddress') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='USAddress', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1023,32 +1258,17 @@ class USAddress(Address): eol_ = '' if self.state is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_format_string(quote_xml(self.state).encode(ExternalEncoding), input_name='state'), namespace_, eol_)) + outfile.write('<%sstate>%s</%sstate>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.state), input_name='state')), namespace_, eol_)) if self.zip is not None: showIndent(outfile, level, pretty_print) outfile.write('<%szip>%s</%szip>%s' % (namespace_, self.gds_format_integer(self.zip, input_name='zip'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='USAddress'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(USAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(USAddress, self).exportLiteralChildren(outfile, level, name_) - if self.state is not None: - showIndent(outfile, level) - outfile.write('state=%s,\n' % quote_python(self.state).encode(ExternalEncoding)) - if self.zip is not None: - showIndent(outfile, level) - outfile.write('zip=%d,\n' % self.zip) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(USAddress, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1056,12 +1276,13 @@ class USAddress(Address): state_ = child_.text state_ = self.gds_validate_string(state_, node, 'state') self.state = state_ - self.validate_USState(self.state) # validate type USState + # validate type USState + self.validate_USState(self.state) elif nodeName_ == 'zip': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1073,20 +1294,22 @@ class USAddress(Address): class UKAddress(Address): member_data_items_ = [ - MemberSpec_('category_attr', 'xs:string', 0), MemberSpec_('exportCode', 'positiveInteger', 0), - MemberSpec_('postcode', ['UKPostcode', 'string'], 0), - MemberSpec_('category', 'string', 0), + MemberSpec_('postcode', 'string', 0), ] subclass = None superclass = Address - def __init__(self, name=None, street=None, city=None, category_attr=None, exportCode=None, postcode=None, category=None): + def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None): + self.original_tagname_ = None super(UKAddress, self).__init__(name, street, city, ) - self.category_attr = _cast(None, category_attr) self.exportCode = _cast(int, exportCode) self.postcode = postcode - self.category = category def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, UKAddress) + if subclass is not None: + return subclass(*args_, **kwargs_) if UKAddress.subclass: return UKAddress.subclass(*args_, **kwargs_) else: @@ -1094,45 +1317,36 @@ class UKAddress(Address): factory = staticmethod(factory) def get_postcode(self): return self.postcode def set_postcode(self, postcode): self.postcode = postcode - def get_category(self): return self.category - def set_category(self, category): self.category = category - def get_category_attr(self): return self.category_attr - def set_category_attr(self, category_attr): self.category_attr = category_attr def get_exportCode(self): return self.exportCode def set_exportCode(self, exportCode): self.exportCode = exportCode - def validate_UKPostcode(self, value): - # Validate type UKPostcode, a restriction on string. - pass def hasContent_(self): if ( self.postcode is not None or - self.category is not None or super(UKAddress, self).hasContent_() ): return True else: return False - def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='ipo:', name_='UKAddress', namespacedef_='xmlns:ipo="http://www.example.com/IPO"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='ipo:', name_='UKAddress', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'): super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress') - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - outfile.write(' category=%s' % (quote_attrib(self.category_attr), )) if self.exportCode is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode')) @@ -1144,51 +1358,21 @@ class UKAddress(Address): eol_ = '' if self.postcode is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_format_string(quote_xml(self.postcode).encode(ExternalEncoding), input_name='postcode'), namespace_, eol_)) - if self.category is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_string(quote_xml(self.category).encode(ExternalEncoding), input_name='category'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='UKAddress'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.category_attr is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - showIndent(outfile, level) - outfile.write('category_attr=%s,\n' % (self.category_attr,)) - if self.exportCode is not None and 'exportCode' not in already_processed: - already_processed.add('exportCode') - showIndent(outfile, level) - outfile.write('exportCode=%d,\n' % (self.exportCode,)) - super(UKAddress, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(UKAddress, self).exportLiteralChildren(outfile, level, name_) - if self.postcode is not None: - showIndent(outfile, level) - outfile.write('postcode=%s,\n' % quote_python(self.postcode).encode(ExternalEncoding)) - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%s,\n' % quote_python(self.category).encode(ExternalEncoding)) + outfile.write('<%spostcode>%s</%spostcode>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.postcode), input_name='postcode')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('category', node) - if value is not None and 'category_attr' not in already_processed: - already_processed.add('category_attr') - self.category_attr = value value = find_attr_value_('exportCode', node) if value is not None and 'exportCode' not in already_processed: already_processed.add('exportCode') try: self.exportCode = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.exportCode <= 0: raise_parse_error(node, 'Invalid PositiveInteger') @@ -1198,246 +1382,15 @@ class UKAddress(Address): postcode_ = child_.text postcode_ = self.gds_validate_string(postcode_, node, 'postcode') self.postcode = postcode_ - self.validate_UKPostcode(self.postcode) # validate type UKPostcode - elif nodeName_ == 'category': - category_ = child_.text - category_ = self.gds_validate_string(category_, node, 'category') - self.category = category_ super(UKAddress, self).buildChildren(child_, node, nodeName_, True) # end class UKAddress -class itemType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('partNum', 'ipo:SKU', 0), - MemberSpec_('productName', 'string', 0), - MemberSpec_('quantity', ['quantity', 'positiveInteger'], 0), - MemberSpec_('USPrice', 'decimal', 0), - MemberSpec_('comment', 'string', 0), - MemberSpec_('shipDate', 'date', 0), - ] - subclass = None - superclass = None - def __init__(self, partNum=None, productName=None, quantity=None, USPrice=None, comment=None, shipDate=None): - self.partNum = _cast(None, partNum) - self.productName = productName - self.quantity = quantity - self.USPrice = USPrice - self.comment = comment - if isinstance(shipDate, basestring): - initvalue_ = datetime_.datetime.strptime(shipDate, '%Y-%m-%d').date() - else: - initvalue_ = shipDate - self.shipDate = initvalue_ - def factory(*args_, **kwargs_): - if itemType.subclass: - return itemType.subclass(*args_, **kwargs_) - else: - return itemType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_productName(self): return self.productName - def set_productName(self, productName): self.productName = productName - def get_quantity(self): return self.quantity - def set_quantity(self, quantity): self.quantity = quantity - def get_USPrice(self): return self.USPrice - def set_USPrice(self, USPrice): self.USPrice = USPrice - def get_comment(self): return self.comment - def set_comment(self, comment): self.comment = comment - def get_shipDate(self): return self.shipDate - def set_shipDate(self, shipDate): self.shipDate = shipDate - def get_partNum(self): return self.partNum - def set_partNum(self, partNum): self.partNum = partNum - def hasContent_(self): - if ( - self.productName is not None or - self.quantity is not None or - self.USPrice is not None or - self.comment is not None or - self.shipDate is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='ipo:', name_='itemType', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='itemType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='itemType'): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - outfile.write(' partNum=%s' % (quote_attrib(self.partNum), )) - def exportChildren(self, outfile, level, namespace_='ipo:', name_='itemType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.productName is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sproductName>%s</%sproductName>%s' % (namespace_, self.gds_format_string(quote_xml(self.productName).encode(ExternalEncoding), input_name='productName'), namespace_, eol_)) - if self.quantity is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%squantity>%s</%squantity>%s' % (namespace_, self.gds_format_integer(self.quantity, input_name='quantity'), namespace_, eol_)) - if self.USPrice is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sUSPrice>%s</%sUSPrice>%s' % (namespace_, self.gds_format_float(self.USPrice, input_name='USPrice'), namespace_, eol_)) - if self.comment is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scomment>%s</%scomment>%s' % (namespace_, self.gds_format_string(quote_xml(self.comment).encode(ExternalEncoding), input_name='comment'), namespace_, eol_)) - if self.shipDate is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sshipDate>%s</%sshipDate>%s' % (namespace_, self.gds_format_date(self.shipDate, input_name='shipDate'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='itemType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.partNum is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - showIndent(outfile, level) - outfile.write('partNum=%s,\n' % (self.partNum,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.productName is not None: - showIndent(outfile, level) - outfile.write('productName=%s,\n' % quote_python(self.productName).encode(ExternalEncoding)) - if self.quantity is not None: - showIndent(outfile, level) - outfile.write('quantity=%d,\n' % self.quantity) - if self.USPrice is not None: - showIndent(outfile, level) - outfile.write('USPrice=%f,\n' % self.USPrice) - if self.comment is not None: - showIndent(outfile, level) - outfile.write('comment=%s,\n' % quote_python(self.comment).encode(ExternalEncoding)) - if self.shipDate is not None: - showIndent(outfile, level) - outfile.write('shipDate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.shipDate, input_name='shipDate')) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('partNum', node) - if value is not None and 'partNum' not in already_processed: - already_processed.add('partNum') - self.partNum = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'productName': - productName_ = child_.text - productName_ = self.gds_validate_string(productName_, node, 'productName') - self.productName = productName_ - elif nodeName_ == 'quantity': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ <= 0: - raise_parse_error(child_, 'requires positiveInteger') - ival_ = self.gds_validate_integer(ival_, node, 'quantity') - self.quantity = ival_ - elif nodeName_ == 'USPrice': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'USPrice') - self.USPrice = fval_ - elif nodeName_ == 'comment': - comment_ = child_.text - comment_ = self.gds_validate_string(comment_, node, 'comment') - self.comment = comment_ - elif nodeName_ == 'shipDate': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.shipDate = dval_ -# end class itemType - - -class quantity(GeneratedsSuper): - member_data_items_ = [ - ] - subclass = None - superclass = None - def __init__(self, valueOf_=None): - self.valueOf_ = valueOf_ - def factory(*args_, **kwargs_): - if quantity.subclass: - return quantity.subclass(*args_, **kwargs_) - else: - return quantity(*args_, **kwargs_) - factory = staticmethod(factory) - def hasContent_(self): - if ( - - ): - return True - else: - return False - def export(self, outfile, level, namespace_='ipo:', name_='quantity', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='quantity') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='quantity'): - pass - def exportChildren(self, outfile, level, namespace_='ipo:', name_='quantity', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='quantity'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - pass -# end class quantity - - GDSClassesMapping = { + 'billTo': Address, 'items': Items, 'purchaseOrder': PurchaseOrderType, 'shipTo': Address, - 'billTo': Address, - 'item': itemType, } @@ -1447,7 +1400,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1460,11 +1413,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1480,11 +1434,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1503,12 +1458,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1517,17 +1476,18 @@ def parseString(inString, silence=False): if not silence: sys.stdout.write('<?xml version="1.0" ?>\n') rootObj.export( - sys.stdout, 0, name_="purchaseOrder", + sys.stdout, 0, name_=rootTag, namespacedef_='xmlns:ipo="http://www.example.com/IPO"') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'purchaseOrder' + rootTag = 'PurchaseOrderType' rootClass = PurchaseOrderType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1536,7 +1496,7 @@ def parseLiteral(inFileName, silence=False): if not silence: sys.stdout.write('#from ipo2_sup import *\n\n') sys.stdout.write('import ipo2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') + sys.stdout.write('rootObj = model_.rootClass(\n') rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -1561,6 +1521,6 @@ __all__ = [ "PurchaseOrderType", "UKAddress", "USAddress", - "itemType", + "item", "quantity" ] diff --git a/tests/literal1.py b/tests/literal1.py index 6e24702..9a0fb87 100644 --- a/tests/literal1.py +++ b/tests/literal1.py @@ -2,7 +2,7 @@ import out2_sup as model_ -rootObj = model_.rootTag( +rootObj = model_.rootClass( comments=[ model_.comments( content_ = [ @@ -27,9 +27,9 @@ rootObj = model_.rootTag( ], person=[ model_.person( - ratio=3.200000, - id=1, value="abcd", + id=1, + ratio=3.200000, name='Alberta', interest=[ 'gardening', @@ -54,9 +54,9 @@ rootObj = model_.rootTag( lastname='Diddly', priority=4.500000, info=model_.info( - rating=5.330000, - type_=321, name="Albert Abasinian", + type_=321, + rating=5.330000, ), ), ], @@ -117,9 +117,9 @@ rootObj = model_.rootTag( lastname='Echo', priority=3.800000, info=model_.info( - rating=5.330000, - type_=321, name="George Gregory", + type_=321, + rating=5.330000, ), ), ], @@ -137,9 +137,9 @@ rootObj = model_.rootTag( elshort=123, ellong=13241234123412341234, elparam=model_.param( - semantic="a big semantic", - name="Davy", id="id001", + name="Davy", + semantic="a big semantic", valueOf_ = """""", ), ), @@ -149,11 +149,11 @@ rootObj = model_.rootTag( nick_name="davy", language="python", area="xml", - vegetable="tomato", - fruit="peach", - ratio=8.700000, - id=232, value="abcd", + id=232, + ratio=8.700000, + fruit="peach", + vegetable="tomato", name='Darrel Dawson', interest=[ 'hang gliding', @@ -165,9 +165,9 @@ rootObj = model_.rootTag( lastname='Hippolite', priority=5.200000, info=model_.info( - rating=6.550000, - type_=543, name="Harvey Hippolite", + type_=543, + rating=6.550000, ), ), ], @@ -183,11 +183,11 @@ rootObj = model_.rootTag( nick_name="davy", language="python", area="xml", - vegetable="tomato", - fruit="peach", - ratio=8.700000, - id=232, value="abcd", + id=232, + ratio=8.700000, + fruit="peach", + vegetable="tomato", name='Darrel Dawson', interest=[ 'hang gliding', @@ -199,9 +199,9 @@ rootObj = model_.rootTag( lastname='Hippolite', priority=5.200000, info=model_.info( - rating=6.550000, - type_=543, name="Harvey Hippolite", + type_=543, + rating=6.550000, ), ), ], diff --git a/tests/mapcleanname.xsd b/tests/mapcleanname.xsd new file mode 100644 index 0000000..7e63969 --- /dev/null +++ b/tests/mapcleanname.xsd @@ -0,0 +1,74 @@ +<?xml version="1.0"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:complexType name="complex-type01"> + <xs:sequence> + <xs:element name="string_value01" type="xs:string"/> + <xs:element name="integer_value01" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value01" type="xs:float"/> + <xs:element name="field01" type="complex-type02"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type02"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type03"> + <xs:extension base="complex-type02"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + + <xs:complexType name="type"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type04"> + <xs:extension base="type"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + + <xs:complexType name="build"> + <xs:sequence> + <xs:element name="string_value02" type="xs:string"/> + <xs:element name="integer_value02" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value02" type="xs:float"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="complex-type05"> + <xs:extension base="build"> + <xs:sequence> + <xs:element name="string_value03" type="xs:string"/> + <xs:element name="integer_value03" type="xs:integer" + minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="float_value03" type="xs:float"/> + </xs:sequence> + </xs:extension> + </xs:complexType> + +</xs:schema> diff --git a/tests/mapcleanname1_sub.py b/tests/mapcleanname1_sub.py new file mode 100644 index 0000000..fc4dbd2 --- /dev/null +++ b/tests/mapcleanname1_sub.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import mapcleanname2_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 complex_type01Sub(supermod.complex_type01): + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + super(complex_type01Sub, self).__init__(string_value01, integer_value01, float_value01, field01, ) +supermod.complex_type01.subclass = complex_type01Sub +# end class complex_type01Sub + + +class complex_type02Sub(supermod.complex_type02): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(complex_type02Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.complex_type02.subclass = complex_type02Sub +# end class complex_type02Sub + + +class complex_type03Sub(supermod.complex_type03): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type03Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type03.subclass = complex_type03Sub +# end class complex_type03Sub + + +class type_Sub(supermod.type_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(type_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.type_.subclass = type_Sub +# end class type_Sub + + +class complex_type04Sub(supermod.complex_type04): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type04Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type04.subclass = complex_type04Sub +# end class complex_type04Sub + + +class build_Sub(supermod.build_): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + super(build_Sub, self).__init__(string_value02, integer_value02, float_value02, extensiontype_, ) +supermod.build_.subclass = build_Sub +# end class build_Sub + + +class complex_type05Sub(supermod.complex_type05): + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + super(complex_type05Sub, self).__init__(string_value02, integer_value02, float_value02, string_value03, integer_value03, float_value03, ) +supermod.complex_type05.subclass = complex_type05Sub +# end class complex_type05Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = supermod.complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py new file mode 100644 index 0000000..02e1136 --- /dev/null +++ b/tests/mapcleanname1_sup.py @@ -0,0 +1,1635 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/mapcleanname2_sup.py') +# ('-s', 'tests/mapcleanname2_sub.py') +# ('--super', 'mapcleanname2_sup') +# +# Command line arguments: +# tests/mapcleanname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/mapcleanname2_sup.py" -s "tests/mapcleanname2_sub.py" --super="mapcleanname2_sup" tests/mapcleanname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class complex_type01(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value01', 'xs:string', 0), + MemberSpec_('integer_value01', 'xs:integer', 1), + MemberSpec_('float_value01', 'xs:float', 0), + MemberSpec_('field01', 'complex-type02', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value01=None, integer_value01=None, float_value01=None, field01=None): + self.original_tagname_ = None + self.string_value01 = string_value01 + if integer_value01 is None: + self.integer_value01 = [] + else: + self.integer_value01 = integer_value01 + self.float_value01 = float_value01 + self.field01 = field01 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, complex_type01) + if subclass is not None: + return subclass(*args_, **kwargs_) + if complex_type01.subclass: + return complex_type01.subclass(*args_, **kwargs_) + else: + return complex_type01(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value01(self): return self.string_value01 + def set_string_value01(self, string_value01): self.string_value01 = string_value01 + def get_integer_value01(self): return self.integer_value01 + def set_integer_value01(self, integer_value01): self.integer_value01 = integer_value01 + def add_integer_value01(self, value): self.integer_value01.append(value) + def insert_integer_value01_at(self, index, value): self.integer_value01.insert(index, value) + def replace_integer_value01_at(self, index, value): self.integer_value01[index] = value + def get_float_value01(self): return self.float_value01 + def set_float_value01(self, float_value01): self.float_value01 = float_value01 + def get_field01(self): return self.field01 + def set_field01(self, field01): self.field01 = field01 + def hasContent_(self): + if ( + self.string_value01 is not None or + self.integer_value01 or + self.float_value01 is not None or + self.field01 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type01', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type01') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type01', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type01'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type01', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value01>%s</%sstring_value01>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value01), input_name='string_value01')), namespace_, eol_)) + for integer_value01_ in self.integer_value01: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value01>%s</%sinteger_value01>%s' % (namespace_, self.gds_format_integer(integer_value01_, input_name='integer_value01'), namespace_, eol_)) + if self.float_value01 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value01>%s</%sfloat_value01>%s' % (namespace_, self.gds_format_float(self.float_value01, input_name='float_value01'), namespace_, eol_)) + if self.field01 is not None: + self.field01.export(outfile, level, namespace_, name_='field01', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value01': + string_value01_ = child_.text + string_value01_ = self.gds_validate_string(string_value01_, node, 'string_value01') + self.string_value01 = string_value01_ + elif nodeName_ == 'integer_value01': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value01') + self.integer_value01.append(ival_) + elif nodeName_ == 'float_value01': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value01') + self.float_value01 = fval_ + elif nodeName_ == 'field01': + obj_ = complex_type02.factory() + obj_.build(child_) + self.field01 = obj_ + obj_.original_tagname_ = 'field01' +# end class complex_type01 + + +class complex_type02(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, complex_type02) + if subclass is not None: + return subclass(*args_, **kwargs_) + if complex_type02.subclass: + return complex_type02.subclass(*args_, **kwargs_) + else: + return complex_type02(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value) + def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type02', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type02') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type02', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type02'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='complex-type02', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class complex_type02 + + +class complex_type03(complex_type02): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = complex_type02 + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type03, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, complex_type03) + if subclass is not None: + return subclass(*args_, **kwargs_) + if complex_type03.subclass: + return complex_type03.subclass(*args_, **kwargs_) + else: + return complex_type03(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value) + def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type03, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type03', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type03', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type03'): + super(complex_type03, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type03') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type03', fromsubclass_=False, pretty_print=True): + super(complex_type03, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type03, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type03, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type03 + + +class type_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, type_) + if subclass is not None: + return subclass(*args_, **kwargs_) + if type_.subclass: + return type_.subclass(*args_, **kwargs_) + else: + return type_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value) + def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='type', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='type') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='type', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='type'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='type', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class type_ + + +class complex_type04(type_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = type_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type04, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, complex_type04) + if subclass is not None: + return subclass(*args_, **kwargs_) + if complex_type04.subclass: + return complex_type04.subclass(*args_, **kwargs_) + else: + return complex_type04(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value) + def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type04, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type04', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type04', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type04'): + super(complex_type04, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type04') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type04', fromsubclass_=False, pretty_print=True): + super(complex_type04, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type04, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type04, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type04 + + +class build_(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('string_value02', 'xs:string', 0), + MemberSpec_('integer_value02', 'xs:integer', 1), + MemberSpec_('float_value02', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, extensiontype_=None): + self.original_tagname_ = None + self.string_value02 = string_value02 + if integer_value02 is None: + self.integer_value02 = [] + else: + self.integer_value02 = integer_value02 + self.float_value02 = float_value02 + self.extensiontype_ = extensiontype_ + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, build_) + if subclass is not None: + return subclass(*args_, **kwargs_) + if build_.subclass: + return build_.subclass(*args_, **kwargs_) + else: + return build_(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value02(self): return self.string_value02 + def set_string_value02(self, string_value02): self.string_value02 = string_value02 + def get_integer_value02(self): return self.integer_value02 + def set_integer_value02(self, integer_value02): self.integer_value02 = integer_value02 + def add_integer_value02(self, value): self.integer_value02.append(value) + def insert_integer_value02_at(self, index, value): self.integer_value02.insert(index, value) + def replace_integer_value02_at(self, index, value): self.integer_value02[index] = value + def get_float_value02(self): return self.float_value02 + def set_float_value02(self, float_value02): self.float_value02 = float_value02 + def get_extensiontype_(self): return self.extensiontype_ + def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ + def hasContent_(self): + if ( + self.string_value02 is not None or + self.integer_value02 or + self.float_value02 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='build', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='build') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='build', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='build'): + if self.extensiontype_ is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') + outfile.write(' xsi:type="%s"' % self.extensiontype_) + pass + def exportChildren(self, outfile, level, namespace_='', name_='build', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value02>%s</%sstring_value02>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value02), input_name='string_value02')), namespace_, eol_)) + for integer_value02_ in self.integer_value02: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value02>%s</%sinteger_value02>%s' % (namespace_, self.gds_format_integer(integer_value02_, input_name='integer_value02'), namespace_, eol_)) + if self.float_value02 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value02>%s</%sfloat_value02>%s' % (namespace_, self.gds_format_float(self.float_value02, input_name='float_value02'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('xsi:type', node) + if value is not None and 'xsi:type' not in already_processed: + already_processed.add('xsi:type') + self.extensiontype_ = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value02': + string_value02_ = child_.text + string_value02_ = self.gds_validate_string(string_value02_, node, 'string_value02') + self.string_value02 = string_value02_ + elif nodeName_ == 'integer_value02': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value02') + self.integer_value02.append(ival_) + elif nodeName_ == 'float_value02': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value02') + self.float_value02 = fval_ +# end class build_ + + +class complex_type05(build_): + member_data_items_ = [ + MemberSpec_('string_value03', 'xs:string', 0), + MemberSpec_('integer_value03', 'xs:integer', 1), + MemberSpec_('float_value03', 'xs:float', 0), + ] + subclass = None + superclass = build_ + def __init__(self, string_value02=None, integer_value02=None, float_value02=None, string_value03=None, integer_value03=None, float_value03=None): + self.original_tagname_ = None + super(complex_type05, self).__init__(string_value02, integer_value02, float_value02, ) + self.string_value03 = string_value03 + if integer_value03 is None: + self.integer_value03 = [] + else: + self.integer_value03 = integer_value03 + self.float_value03 = float_value03 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, complex_type05) + if subclass is not None: + return subclass(*args_, **kwargs_) + if complex_type05.subclass: + return complex_type05.subclass(*args_, **kwargs_) + else: + return complex_type05(*args_, **kwargs_) + factory = staticmethod(factory) + def get_string_value03(self): return self.string_value03 + def set_string_value03(self, string_value03): self.string_value03 = string_value03 + def get_integer_value03(self): return self.integer_value03 + def set_integer_value03(self, integer_value03): self.integer_value03 = integer_value03 + def add_integer_value03(self, value): self.integer_value03.append(value) + def insert_integer_value03_at(self, index, value): self.integer_value03.insert(index, value) + def replace_integer_value03_at(self, index, value): self.integer_value03[index] = value + def get_float_value03(self): return self.float_value03 + def set_float_value03(self, float_value03): self.float_value03 = float_value03 + def hasContent_(self): + if ( + self.string_value03 is not None or + self.integer_value03 or + self.float_value03 is not None or + super(complex_type05, self).hasContent_() + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='complex-type05', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='complex-type05', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='complex-type05'): + super(complex_type05, self).exportAttributes(outfile, level, already_processed, namespace_, name_='complex-type05') + def exportChildren(self, outfile, level, namespace_='', name_='complex-type05', fromsubclass_=False, pretty_print=True): + super(complex_type05, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.string_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sstring_value03>%s</%sstring_value03>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.string_value03), input_name='string_value03')), namespace_, eol_)) + for integer_value03_ in self.integer_value03: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_value03>%s</%sinteger_value03>%s' % (namespace_, self.gds_format_integer(integer_value03_, input_name='integer_value03'), namespace_, eol_)) + if self.float_value03 is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sfloat_value03>%s</%sfloat_value03>%s' % (namespace_, self.gds_format_float(self.float_value03, input_name='float_value03'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + super(complex_type05, self).buildAttributes(node, attrs, already_processed) + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'string_value03': + string_value03_ = child_.text + string_value03_ = self.gds_validate_string(string_value03_, node, 'string_value03') + self.string_value03 = string_value03_ + elif nodeName_ == 'integer_value03': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_value03') + self.integer_value03.append(ival_) + elif nodeName_ == 'float_value03': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'float_value03') + self.float_value03 = fval_ + super(complex_type05, self).buildChildren(child_, node, nodeName_, True) +# end class complex_type05 + + +GDSClassesMapping = { + 'field01': complex_type02, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='', +## pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) +## if not silence: +## content = etree_.tostring( +## rootElement, pretty_print=True, +## xml_declaration=True, encoding="utf-8") +## sys.stdout.write(content) +## sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('<?xml version="1.0" ?>\n') +## rootObj.export( +## sys.stdout, 0, name_=rootTag, +## namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'complex_type01' + rootClass = complex_type01 + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None +## if not silence: +## sys.stdout.write('#from mapcleanname2_sup import *\n\n') +## sys.stdout.write('import mapcleanname2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) +## sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "build_", + "complex_type01", + "complex_type02", + "complex_type03", + "complex_type04", + "complex_type05", + "type_" +] diff --git a/tests/nested_def.xml b/tests/nested_def.xml new file mode 100644 index 0000000..3582540 --- /dev/null +++ b/tests/nested_def.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<container> + <item1> + <inner attrA1="attrA1value" attrA2="attrA2value"/> + </item1> + <item2> + <inner attrB1="attrB1value" attrB2="attrB2value"/> + </item2> +</container> diff --git a/tests/nested_def.xsd b/tests/nested_def.xsd new file mode 100644 index 0000000..9ad3b50 --- /dev/null +++ b/tests/nested_def.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema + xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="container" type="containerType" /> + + <xs:complexType name="containerType"> + <xs:sequence> + <xs:element name="item1" type="classAType" /> + <xs:element name="item2" type="classBType" /> + </xs:sequence> + </xs:complexType> + + <xs:element name="classA" type="classAType" /> + <xs:complexType name="classAType"> + <xs:sequence> + <xs:element name="inner"> + <xs:complexType> + <xs:attribute name="attrA1" type="xs:string"/> + <xs:attribute name="attrA2" type="xs:string"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + + <xs:element name="classB" type="classBType" /> + <xs:complexType name="classBType"> + <xs:sequence> + <xs:element name="inner"> + <xs:complexType> + <xs:attribute name="attrB1" type="xs:string"/> + <xs:attribute name="attrB2" type="xs:string"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> +</xs:schema> diff --git a/tests/nested_def1_out.xml b/tests/nested_def1_out.xml new file mode 100644 index 0000000..692c598 --- /dev/null +++ b/tests/nested_def1_out.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" ?> +<container> + <item1> + <inner attrA1="attrA1value" attrA2="attrA2value"/> + </item1> + <item2> + <inner attrB1="attrB1value" attrB2="attrB2value"/> + </item2> +</container> diff --git a/tests/nested_def1_sub.py b/tests/nested_def1_sub.py new file mode 100644 index 0000000..14bfb18 --- /dev/null +++ b/tests/nested_def1_sub.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/nested_def2_sup.py') +# ('-s', 'tests/nested_def2_sub.py') +# ('--super', 'nested_def2_sup') +# +# Command line arguments: +# tests/nested_def.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/nested_def2_sup.py" -s "tests/nested_def2_sub.py" --super="nested_def2_sup" tests/nested_def.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import nested_def2_sup as supermod + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, item1=None, item2=None): + super(containerTypeSub, self).__init__(item1, item2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class classATypeSub(supermod.classAType): + def __init__(self, inner=None): + super(classATypeSub, self).__init__(inner, ) +supermod.classAType.subclass = classATypeSub +# end class classATypeSub + + +class classBTypeSub(supermod.classBType): + def __init__(self, inner=None): + super(classBTypeSub, self).__init__(inner, ) +supermod.classBType.subclass = classBTypeSub +# end class classBTypeSub + + +class innerTypeSub(supermod.innerType): + def __init__(self, attrA1=None, attrA2=None): + super(innerTypeSub, self).__init__(attrA1, attrA2, ) +supermod.innerType.subclass = innerTypeSub +# end class innerTypeSub + + +class innerType1Sub(supermod.innerType1): + def __init__(self, attrB1=None, attrB2=None): + super(innerType1Sub, self).__init__(attrB1, attrB2, ) +supermod.innerType1.subclass = innerType1Sub +# end class innerType1Sub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from nested_def2_sup import *\n\n') + sys.stdout.write('import nested_def2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py new file mode 100644 index 0000000..a0ca03d --- /dev/null +++ b/tests/nested_def1_sup.py @@ -0,0 +1,1193 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/nested_def2_sup.py') +# ('-s', 'tests/nested_def2_sub.py') +# ('--super', 'nested_def2_sup') +# +# Command line arguments: +# tests/nested_def.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/nested_def2_sup.py" -s "tests/nested_def2_sub.py" --super="nested_def2_sup" tests/nested_def.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('item1', 'classAType', 0), + MemberSpec_('item2', 'classBType', 0), + ] + subclass = None + superclass = None + def __init__(self, item1=None, item2=None): + self.original_tagname_ = None + self.item1 = item1 + self.item2 = item2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, containerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if containerType.subclass: + return containerType.subclass(*args_, **kwargs_) + else: + return containerType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_item1(self): return self.item1 + def set_item1(self, item1): self.item1 = item1 + def get_item2(self): return self.item2 + def set_item2(self, item2): self.item2 = item2 + def hasContent_(self): + if ( + self.item1 is not None or + self.item2 is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.item1 is not None: + self.item1.export(outfile, level, namespace_, name_='item1', pretty_print=pretty_print) + if self.item2 is not None: + self.item2.export(outfile, level, namespace_, name_='item2', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'item1': + obj_ = classAType.factory() + obj_.build(child_) + self.item1 = obj_ + obj_.original_tagname_ = 'item1' + elif nodeName_ == 'item2': + obj_ = classBType.factory() + obj_.build(child_) + self.item2 = obj_ + obj_.original_tagname_ = 'item2' +# end class containerType + + +class classAType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('inner', 'innerType', 0), + ] + subclass = None + superclass = None + def __init__(self, inner=None): + self.original_tagname_ = None + self.inner = inner + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, classAType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if classAType.subclass: + return classAType.subclass(*args_, **kwargs_) + else: + return classAType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_inner(self): return self.inner + def set_inner(self, inner): self.inner = inner + def hasContent_(self): + if ( + self.inner is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='classAType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='classAType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='classAType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='classAType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='classAType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.inner is not None: + self.inner.export(outfile, level, namespace_, name_='inner', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'inner': + obj_ = innerType.factory() + obj_.build(child_) + self.inner = obj_ + obj_.original_tagname_ = 'inner' +# end class classAType + + +class classBType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('inner', 'innerType1', 0), + ] + subclass = None + superclass = None + def __init__(self, inner=None): + self.original_tagname_ = None + self.inner = inner + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, classBType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if classBType.subclass: + return classBType.subclass(*args_, **kwargs_) + else: + return classBType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_inner(self): return self.inner + def set_inner(self, inner): self.inner = inner + def hasContent_(self): + if ( + self.inner is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='classBType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='classBType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='classBType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='classBType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='classBType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.inner is not None: + self.inner.export(outfile, level, namespace_, name_='inner', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'inner': + obj_ = innerType1.factory() + obj_.build(child_) + self.inner = obj_ + obj_.original_tagname_ = 'inner' +# end class classBType + + +class innerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('attrA1', 'xs:string', 0), + MemberSpec_('attrA2', 'xs:string', 0), + ] + subclass = None + superclass = None + def __init__(self, attrA1=None, attrA2=None): + self.original_tagname_ = None + self.attrA1 = _cast(None, attrA1) + self.attrA2 = _cast(None, attrA2) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, innerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if innerType.subclass: + return innerType.subclass(*args_, **kwargs_) + else: + return innerType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_attrA1(self): return self.attrA1 + def set_attrA1(self, attrA1): self.attrA1 = attrA1 + def get_attrA2(self): return self.attrA2 + def set_attrA2(self, attrA2): self.attrA2 = attrA2 + def hasContent_(self): + if ( + + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='innerType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='innerType', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType'): + if self.attrA1 is not None and 'attrA1' not in already_processed: + already_processed.add('attrA1') + outfile.write(' attrA1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA1), input_name='attrA1')), )) + if self.attrA2 is not None and 'attrA2' not in already_processed: + already_processed.add('attrA2') + outfile.write(' attrA2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrA2), input_name='attrA2')), )) + def exportChildren(self, outfile, level, namespace_='', name_='innerType', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('attrA1', node) + if value is not None and 'attrA1' not in already_processed: + already_processed.add('attrA1') + self.attrA1 = value + value = find_attr_value_('attrA2', node) + if value is not None and 'attrA2' not in already_processed: + already_processed.add('attrA2') + self.attrA2 = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class innerType + + +class innerType1(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('attrB1', 'xs:string', 0), + MemberSpec_('attrB2', 'xs:string', 0), + ] + subclass = None + superclass = None + def __init__(self, attrB1=None, attrB2=None): + self.original_tagname_ = None + self.attrB1 = _cast(None, attrB1) + self.attrB2 = _cast(None, attrB2) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, innerType1) + if subclass is not None: + return subclass(*args_, **kwargs_) + if innerType1.subclass: + return innerType1.subclass(*args_, **kwargs_) + else: + return innerType1(*args_, **kwargs_) + factory = staticmethod(factory) + def get_attrB1(self): return self.attrB1 + def set_attrB1(self, attrB1): self.attrB1 = attrB1 + def get_attrB2(self): return self.attrB2 + def set_attrB2(self, attrB2): self.attrB2 = attrB2 + def hasContent_(self): + if ( + + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='innerType1', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='innerType1') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='innerType1', pretty_print=pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='innerType1'): + if self.attrB1 is not None and 'attrB1' not in already_processed: + already_processed.add('attrB1') + outfile.write(' attrB1=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB1), input_name='attrB1')), )) + if self.attrB2 is not None and 'attrB2' not in already_processed: + already_processed.add('attrB2') + outfile.write(' attrB2=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrB2), input_name='attrB2')), )) + def exportChildren(self, outfile, level, namespace_='', name_='innerType1', fromsubclass_=False, pretty_print=True): + pass + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('attrB1', node) + if value is not None and 'attrB1' not in already_processed: + already_processed.add('attrB1') + self.attrB1 = value + value = find_attr_value_('attrB2', node) + if value is not None and 'attrB2' not in already_processed: + already_processed.add('attrB2') + self.attrB2 = value + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + pass +# end class innerType1 + + +GDSClassesMapping = { + 'classA': classAType, + 'classB': classBType, + 'container': containerType, + 'inner': innerType1, + 'item1': classAType, + 'item2': classBType, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from nested_def2_sup import *\n\n') + sys.stdout.write('import nested_def2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "classAType", + "classBType", + "containerType", + "innerType", + "innerType1" +] diff --git a/tests/oneper00.xsd b/tests/oneper00.xsd new file mode 100644 index 0000000..7456aef --- /dev/null +++ b/tests/oneper00.xsd @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:include schemaLocation="oneper01.xsd"/> + <xs:include schemaLocation="oneper02.xsd"/> + <xs:include schemaLocation="http://www.davekuhlman.org/oneper03.xsd"/> + + <xs:element name="root00" type="oneperType00_1" /> + + <xs:complexType name="oneperType00_1"> + <xs:sequence> + <xs:element name="inner01" type="oneperType01_1" /> + <xs:element name="inner02" type="oneperType01_2" /> + </xs:sequence> + </xs:complexType> + +</xs:schema> diff --git a/tests/oneper01.xsd b/tests/oneper01.xsd new file mode 100644 index 0000000..4817268 --- /dev/null +++ b/tests/oneper01.xsd @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="root01" type="oneperType01_1" /> + + <xs:complexType name="oneperType01_1"> + <xs:sequence> + <xs:element name="username" type="xs:string"/> + <xs:element name="inner01" type="oneperType01_2" /> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="oneperType01_2"> + <xs:sequence> + <xs:element name="userdescription" type="xs:string"/> + </xs:sequence> + </xs:complexType> + +</xs:schema> + diff --git a/tests/oneper02.xsd b/tests/oneper02.xsd new file mode 100644 index 0000000..8531e65 --- /dev/null +++ b/tests/oneper02.xsd @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + + <xs:element name="root02" type="oneperType02_1" /> + + <xs:complexType name="oneperType02_1"> + <xs:sequence> + <xs:element name="clientname" type="xs:string"/> + <xs:element name="inner01" type="oneperType02_2" /> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="oneperType02_2"> + <xs:sequence> + <xs:element name="clientdescription" type="xs:string"/> + </xs:sequence> + </xs:complexType> + +</xs:schema> + diff --git a/tests/oneper03.xsd b/tests/oneper03.xsd new file mode 100644 index 0000000..dc4f1df --- /dev/null +++ b/tests/oneper03.xsd @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + > + +<!-- During unit tests, this schema file is actually read from + http://www.davekuhlman.org. + See xs:include element in oneper00.xsd. +--> + + <xs:element name="root03" type="oneperType03_1" /> + + <xs:complexType name="oneperType03_1"> + <xs:sequence> + <xs:element name="helpername" type="xs:string"/> + <xs:element name="inner01" type="oneperType02_2" /> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="oneperType03_2"> + <xs:sequence> + <xs:element name="helperdescription" type="xs:string"/> + </xs:sequence> + </xs:complexType> + +</xs:schema> + diff --git a/tests/out1_sub.py b/tests/out1_sub.py index ad7595f..abd3ce1 100644 --- a/tests/out1_sub.py +++ b/tests/out1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('-f', '') +# ('-o', 'tests/out2_sup.py') +# ('-s', 'tests/out2_sub.py') +# ('--export', 'write literal') +# ('--super', 'out2_sup') +# ('-u', 'gends_user_methods') +# +# Command line arguments: +# tests/people.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions -f -o "tests/out2_sup.py" -s "tests/out2_sub.py" --export="write literal" --super="out2_sup" -u "gends_user_methods" tests/people.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import out2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -89,36 +62,36 @@ supermod.comments.subclass = commentsSub class personSub(supermod.person): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + super(personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) supermod.person.subclass = personSub # end class personSub class programmerSub(supermod.programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + super(programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) supermod.programmer.subclass = programmerSub # end class programmerSub class paramSub(supermod.param): - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, ) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + super(paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, ) supermod.param.subclass = paramSub # end class paramSub class python_programmerSub(supermod.python_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + super(python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) supermod.python_programmer.subclass = python_programmerSub # end class python_programmerSub class java_programmerSub(supermod.java_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + super(java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, ) supermod.java_programmer.subclass = java_programmerSub # end class java_programmerSub @@ -145,8 +118,8 @@ supermod.booster.subclass = boosterSub class infoSub(supermod.info): - def __init__(self, rating=None, type_=None, name=None): - super(infoSub, self).__init__(rating, type_, name, ) + def __init__(self, name=None, type_=None, rating=None): + super(infoSub, self).__init__(name, type_, rating, ) supermod.info.subclass = infoSub # end class infoSub @@ -168,7 +141,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -188,7 +162,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -212,7 +187,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -231,11 +207,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'people' rootClass = supermod.people rootObj = rootClass.factory() rootObj.build(rootNode) @@ -244,8 +221,8 @@ def parseLiteral(inFilename, silence=False): if not silence: sys.stdout.write('#from out2_sup import *\n\n') sys.stdout.write('import out2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.people(\n') - rootObj.exportLiteral(sys.stdout, 0, name_="people") + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -256,7 +233,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/out1_sup.py b/tests/out1_sup.py index 250b7a4..7d3900a 100644 --- a/tests/out1_sup.py +++ b/tests/out1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('-f', '') +# ('-o', 'tests/out2_sup.py') +# ('-s', 'tests/out2_sub.py') +# ('--export', 'write literal') +# ('--super', 'out2_sup') +# ('-u', 'gends_user_methods') +# +# Command line arguments: +# tests/people.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions -f -o "tests/out2_sup.py" -s "tests/out2_sub.py" --export="write literal" --super="out2_sup" -u "gends_user_methods" tests/people.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -619,6 +671,7 @@ class people(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None): + self.original_tagname_ = None if comments is None: self.comments = [] else: @@ -640,6 +693,11 @@ class people(GeneratedsSuper): else: self.java_programmer = java_programmer def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, people) + if subclass is not None: + return subclass(*args_, **kwargs_) if people.subclass: return people.subclass(*args_, **kwargs_) else: @@ -648,23 +706,28 @@ class people(GeneratedsSuper): def get_comments(self): return self.comments def set_comments(self, comments): self.comments = comments def add_comments(self, value): self.comments.append(value) - def insert_comments(self, index, value): self.comments[index] = value + def insert_comments_at(self, index, value): self.comments.insert(index, value) + def replace_comments_at(self, index, value): self.comments[index] = value def get_person(self): return self.person def set_person(self, person): self.person = person def add_person(self, value): self.person.append(value) - def insert_person(self, index, value): self.person[index] = value + def insert_person_at(self, index, value): self.person.insert(index, value) + def replace_person_at(self, index, value): self.person[index] = value def get_programmer(self): return self.programmer def set_programmer(self, programmer): self.programmer = programmer def add_programmer(self, value): self.programmer.append(value) - def insert_programmer(self, index, value): self.programmer[index] = value + def insert_programmer_at(self, index, value): self.programmer.insert(index, value) + def replace_programmer_at(self, index, value): self.programmer[index] = value def get_python_programmer(self): return self.python_programmer def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer def add_python_programmer(self, value): self.python_programmer.append(value) - def insert_python_programmer(self, index, value): self.python_programmer[index] = value + def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value) + def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value def get_java_programmer(self): return self.java_programmer def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer def add_java_programmer(self, value): self.java_programmer.append(value) - def insert_java_programmer(self, index, value): self.java_programmer[index] = value + def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value) + def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value def hasContent_(self): if ( self.comments or @@ -681,13 +744,15 @@ class people(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='people') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -784,6 +849,7 @@ class people(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -791,24 +857,29 @@ class people(GeneratedsSuper): obj_ = comments.factory() obj_.build(child_) self.comments.append(obj_) + obj_.original_tagname_ = 'comments' elif nodeName_ == 'person': class_obj_ = self.get_class_obj_(child_, person) obj_ = class_obj_.factory() obj_.build(child_) self.person.append(obj_) + obj_.original_tagname_ = 'person' elif nodeName_ == 'programmer': class_obj_ = self.get_class_obj_(child_, programmer) obj_ = class_obj_.factory() obj_.build(child_) self.programmer.append(obj_) + obj_.original_tagname_ = 'programmer' elif nodeName_ == 'python-programmer': obj_ = python_programmer.factory() obj_.build(child_) self.python_programmer.append(obj_) + obj_.original_tagname_ = 'python-programmer' elif nodeName_ == 'java-programmer': obj_ = java_programmer.factory() obj_.build(child_) self.java_programmer.append(obj_) + obj_.original_tagname_ = 'java-programmer' def walk_and_update(self): members = people._member_data_items for member in members: @@ -871,6 +942,7 @@ class comments(GeneratedsSuper): subclass = None superclass = None def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None if emp is None: self.emp = [] else: @@ -886,6 +958,11 @@ class comments(GeneratedsSuper): self.content_ = content_ self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, comments) + if subclass is not None: + return subclass(*args_, **kwargs_) if comments.subclass: return comments.subclass(*args_, **kwargs_) else: @@ -894,13 +971,14 @@ class comments(GeneratedsSuper): def get_emp(self): return self.emp def set_emp(self, emp): self.emp = emp def add_emp(self, value): self.emp.append(value) - def insert_emp(self, index, value): self.emp[index] = value + def insert_emp_at(self, index, value): self.emp.insert(index, value) + def replace_emp_at(self, index, value): self.emp[index] = value def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( self.emp or - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -910,13 +988,15 @@ class comments(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -956,6 +1036,7 @@ class comments(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1019,11 +1100,11 @@ class comments(GeneratedsSuper): class person(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('vegetable', 'xs:string', 0), - MemberSpec_('fruit', 'xs:string', 0), - MemberSpec_('ratio', 'xs:float', 0), - MemberSpec_('id', 'xs:integer', 0), MemberSpec_('value', 'xs:string', 0), + MemberSpec_('id', 'xs:integer', 0), + MemberSpec_('ratio', 'xs:float', 0), + MemberSpec_('fruit', 'xs:string', 0), + MemberSpec_('vegetable', 'xs:string', 0), MemberSpec_('name', 'xs:string', 0), MemberSpec_('interest', 'xs:string', 1), MemberSpec_('category', 'xs:integer', 0), @@ -1033,12 +1114,13 @@ class person(GeneratedsSuper): ] subclass = None superclass = None - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - self.vegetable = _cast(None, vegetable) - self.fruit = _cast(None, fruit) - self.ratio = _cast(float, ratio) - self.id = _cast(int, id) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + self.original_tagname_ = None self.value = _cast(None, value) + self.id = _cast(int, id) + self.ratio = _cast(float, ratio) + self.fruit = _cast(None, fruit) + self.vegetable = _cast(None, vegetable) self.name = name if interest is None: self.interest = [] @@ -1056,6 +1138,11 @@ class person(GeneratedsSuper): self.description = description self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, person) + if subclass is not None: + return subclass(*args_, **kwargs_) if person.subclass: return person.subclass(*args_, **kwargs_) else: @@ -1066,29 +1153,32 @@ class person(GeneratedsSuper): def get_interest(self): return self.interest def set_interest(self, interest): self.interest = interest def add_interest(self, value): self.interest.append(value) - def insert_interest(self, index, value): self.interest[index] = value + def insert_interest_at(self, index, value): self.interest.insert(index, value) + def replace_interest_at(self, index, value): self.interest[index] = value def get_category(self): return self.category def set_category(self, category): self.category = category def get_agent(self): return self.agent def set_agent(self, agent): self.agent = agent def add_agent(self, value): self.agent.append(value) - def insert_agent(self, index, value): self.agent[index] = value + def insert_agent_at(self, index, value): self.agent.insert(index, value) + def replace_agent_at(self, index, value): self.agent[index] = value def get_promoter(self): return self.promoter def set_promoter(self, promoter): self.promoter = promoter def add_promoter(self, value): self.promoter.append(value) - def insert_promoter(self, index, value): self.promoter[index] = value + def insert_promoter_at(self, index, value): self.promoter.insert(index, value) + def replace_promoter_at(self, index, value): self.promoter[index] = value def get_description(self): return self.description def set_description(self, description): self.description = description - def get_vegetable(self): return self.vegetable - def set_vegetable(self, vegetable): self.vegetable = vegetable - def get_fruit(self): return self.fruit - def set_fruit(self, fruit): self.fruit = fruit - def get_ratio(self): return self.ratio - def set_ratio(self, ratio): self.ratio = ratio - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_value(self): return self.value def set_value(self, value): self.value = value + def get_id(self): return self.id + def set_id(self, id): self.id = id + def get_ratio(self): return self.ratio + def set_ratio(self, ratio): self.ratio = ratio + def get_fruit(self): return self.fruit + def set_fruit(self, fruit): self.fruit = fruit + def get_vegetable(self): return self.vegetable + def set_vegetable(self, vegetable): self.vegetable = vegetable def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): @@ -1108,33 +1198,35 @@ class person(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='person') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), )) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), )) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.value is not None and 'value' not in already_processed: + already_processed.add('value') + outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), )) if self.id is not None and 'id' not in already_processed: already_processed.add('id') outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id')) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), )) + if self.ratio is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.fruit is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), )) + if self.vegetable is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), )) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') @@ -1146,10 +1238,10 @@ class person(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) for interest_ in self.interest: showIndent(outfile, level, pretty_print) - outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_)) + outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_)) if self.category is not None: showIndent(outfile, level, pretty_print) outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_)) @@ -1159,7 +1251,7 @@ class person(GeneratedsSuper): promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print) if self.description is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_)) + outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_)) def exportLiteral(self, outfile, level, name_='person'): level += 1 already_processed = set() @@ -1167,36 +1259,36 @@ class person(GeneratedsSuper): if self.hasContent_(): self.exportLiteralChildren(outfile, level, name_) def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') + if self.value is not None and 'value' not in already_processed: + already_processed.add('value') showIndent(outfile, level) - outfile.write('vegetable="%s",\n' % (self.vegetable,)) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') + outfile.write('value="%s",\n' % (self.value,)) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') showIndent(outfile, level) - outfile.write('fruit="%s",\n' % (self.fruit,)) + outfile.write('id=%d,\n' % (self.id,)) if self.ratio is not None and 'ratio' not in already_processed: already_processed.add('ratio') showIndent(outfile, level) outfile.write('ratio=%f,\n' % (self.ratio,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') + if self.fruit is not None and 'fruit' not in already_processed: + already_processed.add('fruit') showIndent(outfile, level) - outfile.write('id=%d,\n' % (self.id,)) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') + outfile.write('fruit="%s",\n' % (self.fruit,)) + if self.vegetable is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') showIndent(outfile, level) - outfile.write('value="%s",\n' % (self.value,)) + outfile.write('vegetable="%s",\n' % (self.vegetable,)) def exportLiteralChildren(self, outfile, level, name_): if self.name is not None: showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) + outfile.write('name=%s,\n' % self.gds_encode(quote_python(self.name))) showIndent(outfile, level) outfile.write('interest=[\n') level += 1 for interest_ in self.interest: showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding)) + outfile.write('%s,\n' % self.gds_encode(quote_python(interest_))) level -= 1 showIndent(outfile, level) outfile.write('],\n') @@ -1229,40 +1321,41 @@ class person(GeneratedsSuper): outfile.write('],\n') if self.description is not None: showIndent(outfile, level) - outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding)) + outfile.write('description=%s,\n' % self.gds_encode(quote_python(self.description))) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('vegetable', node) - if value is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - self.vegetable = value - value = find_attr_value_('fruit', node) - if value is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - self.fruit = value - value = find_attr_value_('ratio', node) - if value is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - try: - self.ratio = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('value', node) + if value is not None and 'value' not in already_processed: + already_processed.add('value') + self.value = value value = find_attr_value_('id', node) if value is not None and 'id' not in already_processed: already_processed.add('id') try: self.id = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value', node) - if value is not None and 'value' not in already_processed: - already_processed.add('value') - self.value = value + value = find_attr_value_('ratio', node) + if value is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + try: + self.ratio = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('fruit', node) + if value is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + self.fruit = value + value = find_attr_value_('vegetable', node) + if value is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + self.vegetable = value value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1280,7 +1373,7 @@ class person(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'category') self.category = ival_ @@ -1288,10 +1381,12 @@ class person(GeneratedsSuper): obj_ = agent.factory() obj_.build(child_) self.agent.append(obj_) + obj_.original_tagname_ = 'agent' elif nodeName_ == 'promoter': obj_ = booster.factory() obj_.build(child_) self.promoter.append(obj_) + obj_.original_tagname_ = 'promoter' elif nodeName_ == 'description': description_ = child_.text description_ = self.gds_validate_string(description_, node, 'description') @@ -1349,10 +1444,10 @@ class programmer(person): member_data_items_ = [ MemberSpec_('language', 'xs:string', 0), MemberSpec_('area', 'xs:string', 0), - MemberSpec_('attrnegint', 'xs:negativeInteger', 0), MemberSpec_('attrposint', 'xs:positiveInteger', 0), - MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0), + MemberSpec_('attrnegint', 'xs:negativeInteger', 0), + MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('email', 'xs:string', 0), MemberSpec_('elposint', 'xs:positiveInteger', 0), MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0), @@ -1368,25 +1463,26 @@ class programmer(person): ] subclass = None superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + self.original_tagname_ = None + super(programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) self.language = _cast(None, language) self.area = _cast(None, area) - self.attrnegint = _cast(int, attrnegint) self.attrposint = _cast(int, attrposint) - self.attrnonnegint = _cast(int, attrnonnegint) self.attrnonposint = _cast(int, attrnonposint) + self.attrnegint = _cast(int, attrnegint) + self.attrnonnegint = _cast(int, attrnonnegint) self.email = email self.elposint = elposint self.elnonposint = elnonposint self.elnegint = elnegint self.elnonnegint = elnonnegint - if isinstance(eldate, basestring): + if isinstance(eldate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date() else: initvalue_ = eldate self.eldate = initvalue_ - if isinstance(eldatetime, basestring): + if isinstance(eldatetime, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S') else: initvalue_ = eldatetime @@ -1396,8 +1492,14 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if programmer.subclass: return programmer.subclass(*args_, **kwargs_) else: @@ -1431,19 +1533,28 @@ class programmer(person): def set_language(self, language): self.language = language def get_area(self): return self.area def set_area(self, area): self.area = area - def get_attrnegint(self): return self.attrnegint - def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint def get_attrposint(self): return self.attrposint def set_attrposint(self, attrposint): self.attrposint = attrposint - def get_attrnonnegint(self): return self.attrnonnegint - def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_attrnonposint(self): return self.attrnonposint def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint + def get_attrnegint(self): return self.attrnegint + def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint + def get_attrnonnegint(self): return self.attrnonnegint + def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -1468,13 +1579,15 @@ class programmer(person): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1483,22 +1596,22 @@ class programmer(person): super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.language is not None and 'language' not in already_processed: already_processed.add('language') - outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), )) + outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), )) if self.area is not None and 'area' not in already_processed: already_processed.add('area') - outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), )) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), )) if self.attrposint is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint')) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.attrnonposint is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint')) + if self.attrnegint is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') @@ -1511,7 +1624,7 @@ class programmer(person): eol_ = '' if self.email is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_)) + outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_)) if self.elposint is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_)) @@ -1532,7 +1645,7 @@ class programmer(person): outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_)) if self.eltoken is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_)) + outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_)) if self.elshort is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_)) @@ -1543,7 +1656,7 @@ class programmer(person): self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print) if self.elarraytypes is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_)) + outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_)) def exportLiteral(self, outfile, level, name_='programmer'): level += 1 already_processed = set() @@ -1559,28 +1672,28 @@ class programmer(person): already_processed.add('area') showIndent(outfile, level) outfile.write('area="%s",\n' % (self.area,)) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - showIndent(outfile, level) - outfile.write('attrnegint=%d,\n' % (self.attrnegint,)) if self.attrposint is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') showIndent(outfile, level) outfile.write('attrposint=%d,\n' % (self.attrposint,)) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - showIndent(outfile, level) - outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,)) if self.attrnonposint is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') showIndent(outfile, level) outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,)) + if self.attrnegint is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + showIndent(outfile, level) + outfile.write('attrnegint=%d,\n' % (self.attrnegint,)) + if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + showIndent(outfile, level) + outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,)) super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) def exportLiteralChildren(self, outfile, level, name_): super(programmer, self).exportLiteralChildren(outfile, level, name_) if self.email is not None: showIndent(outfile, level) - outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding)) + outfile.write('email=%s,\n' % self.gds_encode(quote_python(self.email))) if self.elposint is not None: showIndent(outfile, level) outfile.write('elposint=%d,\n' % self.elposint) @@ -1601,7 +1714,7 @@ class programmer(person): outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime')) if self.eltoken is not None: showIndent(outfile, level) - outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding)) + outfile.write('eltoken=%s,\n' % self.gds_encode(quote_python(self.eltoken))) if self.elshort is not None: showIndent(outfile, level) outfile.write('elshort=%d,\n' % self.elshort) @@ -1616,13 +1729,14 @@ class programmer(person): outfile.write('),\n') if self.elarraytypes is not None: showIndent(outfile, level) - outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding)) + outfile.write('elarraytypes=%s,\n' % self.gds_encode(quote_python(self.elarraytypes))) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('language', node) if value is not None and 'language' not in already_processed: @@ -1632,42 +1746,42 @@ class programmer(person): if value is not None and 'area' not in already_processed: already_processed.add('area') self.area = value - value = find_attr_value_('attrnegint', node) - if value is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - try: - self.attrnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnegint >= 0: - raise_parse_error(node, 'Invalid NegativeInteger') value = find_attr_value_('attrposint', node) if value is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') try: self.attrposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrposint <= 0: raise_parse_error(node, 'Invalid PositiveInteger') - value = find_attr_value_('attrnonnegint', node) - if value is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - try: - self.attrnonnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonnegint < 0: - raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('attrnonposint', node) if value is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') try: self.attrnonposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrnonposint > 0: raise_parse_error(node, 'Invalid NonPositiveInteger') + value = find_attr_value_('attrnegint', node) + if value is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + try: + self.attrnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnegint >= 0: + raise_parse_error(node, 'Invalid NegativeInteger') + value = find_attr_value_('attrnonnegint', node) + if value is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + try: + self.attrnonnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnonnegint < 0: + raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1682,7 +1796,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1692,7 +1806,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ > 0: raise_parse_error(child_, 'requires nonPositiveInteger') @@ -1702,7 +1816,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ >= 0: raise_parse_error(child_, 'requires negativeInteger') @@ -1712,7 +1826,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ < 0: raise_parse_error(child_, 'requires nonNegativeInteger') @@ -1728,14 +1842,17 @@ class programmer(person): self.eldatetime = dval_ elif nodeName_ == 'eltoken': eltoken_ = child_.text - eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + if eltoken_: + eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + else: + eltoken_ = "" eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken') self.eltoken = eltoken_ elif nodeName_ == 'elshort': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'elshort') self.elshort = ival_ @@ -1743,7 +1860,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'ellong') self.ellong = ival_ @@ -1751,11 +1868,13 @@ class programmer(person): obj_ = param.factory() obj_.build(child_) self.elparam = obj_ + obj_.original_tagname_ = 'elparam' elif nodeName_ == 'elarraytypes': elarraytypes_ = child_.text elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes') self.elarraytypes = elarraytypes_ - self.validate_ArrayTypes(self.elarraytypes) # validate type ArrayTypes + # validate type ArrayTypes + self.validate_ArrayTypes(self.elarraytypes) super(programmer, self).buildChildren(child_, node, nodeName_, True) def walk_and_update(self): members = programmer._member_data_items @@ -1810,47 +1929,53 @@ class param(GeneratedsSuper): """Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.""" member_data_items_ = [ - MemberSpec_('semantic', 'xs:token', 0), + MemberSpec_('id', 'xs:string', 0), MemberSpec_('name', 'xs:NCName', 0), - MemberSpec_('flow', 'FlowType', 0), MemberSpec_('sid', 'xs:NCName', 0), + MemberSpec_('flow', 'FlowType', 0), + MemberSpec_('semantic', 'xs:token', 0), MemberSpec_('type', 'xs:NMTOKEN', 0), - MemberSpec_('id', 'xs:string', 0), MemberSpec_('valueOf_', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - self.semantic = _cast(None, semantic) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + self.original_tagname_ = None + self.id = _cast(None, id) self.name = _cast(None, name) - self.flow = _cast(None, flow) self.sid = _cast(None, sid) + self.flow = _cast(None, flow) + self.semantic = _cast(None, semantic) self.type_ = _cast(None, type_) - self.id = _cast(None, id) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, param) + if subclass is not None: + return subclass(*args_, **kwargs_) if param.subclass: return param.subclass(*args_, **kwargs_) else: return param(*args_, **kwargs_) factory = staticmethod(factory) - def get_semantic(self): return self.semantic - def set_semantic(self, semantic): self.semantic = semantic + def get_id(self): return self.id + def set_id(self, id): self.id = id def get_name(self): return self.name def set_name(self, name): self.name = name - def get_flow(self): return self.flow - def set_flow(self, flow): self.flow = flow def get_sid(self): return self.sid def set_sid(self, sid): self.sid = sid + def get_flow(self): return self.flow + def set_flow(self, flow): self.flow = flow + def get_semantic(self): return self.semantic + def set_semantic(self, semantic): self.semantic = semantic def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1860,36 +1985,38 @@ class param(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='param') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) if self.name is not None and 'name' not in already_processed: already_processed.add('name') outfile.write(' name=%s' % (quote_attrib(self.name), )) - if self.flow is not None and 'flow' not in already_processed: - already_processed.add('flow') - outfile.write(' flow=%s' % (quote_attrib(self.flow), )) if self.sid is not None and 'sid' not in already_processed: already_processed.add('sid') outfile.write(' sid=%s' % (quote_attrib(self.sid), )) + if self.flow is not None and 'flow' not in already_processed: + already_processed.add('flow') + outfile.write(' flow=%s' % (quote_attrib(self.flow), )) + if self.semantic is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') - outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), )) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), )) + outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), )) def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): pass def exportLiteral(self, outfile, level, name_='param'): @@ -1901,30 +2028,30 @@ class param(GeneratedsSuper): showIndent(outfile, level) outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') showIndent(outfile, level) - outfile.write('semantic="%s",\n' % (self.semantic,)) + outfile.write('id="%s",\n' % (self.id,)) if self.name is not None and 'name' not in already_processed: already_processed.add('name') showIndent(outfile, level) outfile.write('name="%s",\n' % (self.name,)) + if self.sid is not None and 'sid' not in already_processed: + already_processed.add('sid') + showIndent(outfile, level) + outfile.write('sid="%s",\n' % (self.sid,)) if self.flow is not None and 'flow' not in already_processed: already_processed.add('flow') showIndent(outfile, level) outfile.write('flow=%s,\n' % (self.flow,)) - if self.sid is not None and 'sid' not in already_processed: - already_processed.add('sid') + if self.semantic is not None and 'semantic' not in already_processed: + already_processed.add('semantic') showIndent(outfile, level) - outfile.write('sid="%s",\n' % (self.sid,)) + outfile.write('semantic="%s",\n' % (self.semantic,)) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') showIndent(outfile, level) outfile.write('type_="%s",\n' % (self.type_,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id="%s",\n' % (self.id,)) def exportLiteralChildren(self, outfile, level, name_): pass def build(self, node): @@ -1934,32 +2061,33 @@ class param(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('semantic', node) - if value is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - self.semantic = value - self.semantic = ' '.join(self.semantic.split()) + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value value = find_attr_value_('name', node) if value is not None and 'name' not in already_processed: already_processed.add('name') self.name = value - value = find_attr_value_('flow', node) - if value is not None and 'flow' not in already_processed: - already_processed.add('flow') - self.flow = value value = find_attr_value_('sid', node) if value is not None and 'sid' not in already_processed: already_processed.add('sid') self.sid = value + value = find_attr_value_('flow', node) + if value is not None and 'flow' not in already_processed: + already_processed.add('flow') + self.flow = value + value = find_attr_value_('semantic', node) + if value is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + self.semantic = value + self.semantic = ' '.join(self.semantic.split()) value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') self.type_ = value - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - self.id = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass def walk_and_update(self): @@ -2018,11 +2146,17 @@ class python_programmer(programmer): ] subclass = None superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + self.original_tagname_ = None + super(python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, python_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if python_programmer.subclass: return python_programmer.subclass(*args_, **kwargs_) else: @@ -2045,13 +2179,15 @@ class python_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2060,7 +2196,7 @@ class python_programmer(programmer): super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True): super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: @@ -2069,7 +2205,7 @@ class python_programmer(programmer): eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def exportLiteral(self, outfile, level, name_='python-programmer'): level += 1 already_processed = set() @@ -2086,13 +2222,14 @@ class python_programmer(programmer): super(python_programmer, self).exportLiteralChildren(outfile, level, name_) if self.favorite_editor is not None: showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor))) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: @@ -2156,18 +2293,24 @@ class python_programmer(programmer): class java_programmer(programmer): member_data_items_ = [ - MemberSpec_('status', 'xs:string', 0), MemberSpec_('nick-name', 'xs:string', 0), + MemberSpec_('status', 'xs:string', 0), MemberSpec_('favorite_editor', 'xs:string', 0), ] subclass = None superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.status = _cast(None, status) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + self.original_tagname_ = None + super(java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) + self.status = _cast(None, status) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, java_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if java_programmer.subclass: return java_programmer.subclass(*args_, **kwargs_) else: @@ -2175,10 +2318,10 @@ class java_programmer(programmer): factory = staticmethod(factory) def get_favorite_editor(self): return self.favorite_editor def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor - def get_status(self): return self.status - def set_status(self, status): self.status = status def get_nick_name(self): return self.nick_name def set_nick_name(self, nick_name): self.nick_name = nick_name + def get_status(self): return self.status + def set_status(self, status): self.status = status def hasContent_(self): if ( self.favorite_editor is not None or @@ -2192,25 +2335,27 @@ class java_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'): super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), )) if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) + if self.status is not None and 'status' not in already_processed: + already_processed.add('status') + outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), )) def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True): super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: @@ -2219,7 +2364,7 @@ class java_programmer(programmer): eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def exportLiteral(self, outfile, level, name_='java-programmer'): level += 1 already_processed = set() @@ -2227,35 +2372,36 @@ class java_programmer(programmer): if self.hasContent_(): self.exportLiteralChildren(outfile, level, name_) def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - showIndent(outfile, level) - outfile.write('status="%s",\n' % (self.status,)) if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') showIndent(outfile, level) outfile.write('nick_name="%s",\n' % (self.nick_name,)) + if self.status is not None and 'status' not in already_processed: + already_processed.add('status') + showIndent(outfile, level) + outfile.write('status="%s",\n' % (self.status,)) super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) def exportLiteralChildren(self, outfile, level, name_): super(java_programmer, self).exportLiteralChildren(outfile, level, name_) if self.favorite_editor is not None: showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('favorite_editor=%s,\n' % self.gds_encode(quote_python(self.favorite_editor))) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('status', node) - if value is not None and 'status' not in already_processed: - already_processed.add('status') - self.status = value value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value + value = find_attr_value_('status', node) + if value is not None and 'status' not in already_processed: + already_processed.add('status') + self.status = value super(java_programmer, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'favorite-editor': @@ -2322,11 +2468,17 @@ class agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, agent) + if subclass is not None: + return subclass(*args_, **kwargs_) if agent.subclass: return agent.subclass(*args_, **kwargs_) else: @@ -2355,13 +2507,15 @@ class agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2375,10 +2529,10 @@ class agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) @@ -2395,10 +2549,10 @@ class agent(GeneratedsSuper): def exportLiteralChildren(self, outfile, level, name_): if self.firstname is not None: showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) + outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname))) if self.lastname is not None: showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) + outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname))) if self.priority is not None: showIndent(outfile, level) outfile.write('priority=%f,\n' % self.priority) @@ -2414,6 +2568,7 @@ class agent(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2429,7 +2584,7 @@ class agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -2437,6 +2592,7 @@ class agent(GeneratedsSuper): obj_ = info.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' def walk_and_update(self): members = agent._member_data_items for member in members: @@ -2496,11 +2652,17 @@ class special_agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, special_agent) + if subclass is not None: + return subclass(*args_, **kwargs_) if special_agent.subclass: return special_agent.subclass(*args_, **kwargs_) else: @@ -2529,13 +2691,15 @@ class special_agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2549,10 +2713,10 @@ class special_agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) @@ -2569,10 +2733,10 @@ class special_agent(GeneratedsSuper): def exportLiteralChildren(self, outfile, level, name_): if self.firstname is not None: showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) + outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname))) if self.lastname is not None: showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) + outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname))) if self.priority is not None: showIndent(outfile, level) outfile.write('priority=%f,\n' % self.priority) @@ -2588,6 +2752,7 @@ class special_agent(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2603,7 +2768,7 @@ class special_agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -2611,6 +2776,7 @@ class special_agent(GeneratedsSuper): obj_ = info.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' def walk_and_update(self): members = special_agent._member_data_items for member in members: @@ -2673,6 +2839,7 @@ class booster(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.other_name = other_name @@ -2690,6 +2857,11 @@ class booster(GeneratedsSuper): else: self.client_handler = client_handler def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, booster) + if subclass is not None: + return subclass(*args_, **kwargs_) if booster.subclass: return booster.subclass(*args_, **kwargs_) else: @@ -2706,15 +2878,18 @@ class booster(GeneratedsSuper): def get_other_value(self): return self.other_value def set_other_value(self, other_value): self.other_value = other_value def add_other_value(self, value): self.other_value.append(value) - def insert_other_value(self, index, value): self.other_value[index] = value + def insert_other_value_at(self, index, value): self.other_value.insert(index, value) + def replace_other_value_at(self, index, value): self.other_value[index] = value def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ def add_type(self, value): self.type_.append(value) - def insert_type(self, index, value): self.type_[index] = value + def insert_type_at(self, index, value): self.type_.insert(index, value) + def replace_type_at(self, index, value): self.type_[index] = value def get_client_handler(self): return self.client_handler def set_client_handler(self, client_handler): self.client_handler = client_handler def add_client_handler(self, value): self.client_handler.append(value) - def insert_client_handler(self, index, value): self.client_handler[index] = value + def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value) + def replace_client_handler_at(self, index, value): self.client_handler[index] = value def hasContent_(self): if ( self.firstname is not None or @@ -2733,13 +2908,15 @@ class booster(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2753,10 +2930,10 @@ class booster(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.other_name is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_)) @@ -2782,10 +2959,10 @@ class booster(GeneratedsSuper): def exportLiteralChildren(self, outfile, level, name_): if self.firstname is not None: showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) + outfile.write('firstname=%s,\n' % self.gds_encode(quote_python(self.firstname))) if self.lastname is not None: showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) + outfile.write('lastname=%s,\n' % self.gds_encode(quote_python(self.lastname))) if self.other_name is not None: showIndent(outfile, level) outfile.write('other_name=%f,\n' % self.other_name) @@ -2828,6 +3005,7 @@ class booster(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2843,7 +3021,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_name') self.other_name = fval_ @@ -2851,7 +3029,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'class') self.class_ = fval_ @@ -2859,7 +3037,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_value') self.other_value.append(fval_) @@ -2867,7 +3045,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'type') self.type_.append(fval_) @@ -2875,6 +3053,7 @@ class booster(GeneratedsSuper): obj_ = client_handlerType.factory() obj_.build(child_) self.client_handler.append(obj_) + obj_.original_tagname_ = 'client-handler' def walk_and_update(self): members = booster._member_data_items for member in members: @@ -2926,29 +3105,34 @@ class booster(GeneratedsSuper): class info(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('rating', 'xs:float', 0), - MemberSpec_('type', 'xs:integer', 0), MemberSpec_('name', 'xs:string', 0), + MemberSpec_('type', 'xs:integer', 0), + MemberSpec_('rating', 'xs:float', 0), ] subclass = None superclass = None - def __init__(self, rating=None, type_=None, name=None): - self.rating = _cast(float, rating) - self.type_ = _cast(int, type_) + def __init__(self, name=None, type_=None, rating=None): + self.original_tagname_ = None self.name = _cast(None, name) - pass + self.type_ = _cast(int, type_) + self.rating = _cast(float, rating) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, info) + if subclass is not None: + return subclass(*args_, **kwargs_) if info.subclass: return info.subclass(*args_, **kwargs_) else: return info(*args_, **kwargs_) factory = staticmethod(factory) - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ def get_name(self): return self.name def set_name(self, name): self.name = name + def get_type(self): return self.type_ + def set_type(self, type_): self.type_ = type_ + def get_rating(self): return self.rating + def set_rating(self, rating): self.rating = rating def hasContent_(self): if ( @@ -2961,26 +3145,28 @@ class info(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='info') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') - outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type')) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), )) + if self.rating is not None and 'rating' not in already_processed: + already_processed.add('rating') + outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): pass def exportLiteral(self, outfile, level, name_='info'): @@ -2990,18 +3176,18 @@ class info(GeneratedsSuper): if self.hasContent_(): self.exportLiteralChildren(outfile, level, name_) def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') showIndent(outfile, level) - outfile.write('rating=%f,\n' % (self.rating,)) + outfile.write('name="%s",\n' % (self.name,)) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') showIndent(outfile, level) outfile.write('type_=%d,\n' % (self.type_,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') + if self.rating is not None and 'rating' not in already_processed: + already_processed.add('rating') showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) + outfile.write('rating=%f,\n' % (self.rating,)) def exportLiteralChildren(self, outfile, level, name_): pass def build(self, node): @@ -3010,25 +3196,26 @@ class info(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('rating', node) - if value is not None and 'rating' not in already_processed: - already_processed.add('rating') - try: - self.rating = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (rating): %s' % exp) + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') try: self.type_ = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value + value = find_attr_value_('rating', node) + if value is not None and 'rating' not in already_processed: + already_processed.add('rating') + try: + self.rating = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (rating): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass def walk_and_update(self): @@ -3088,9 +3275,15 @@ class client_handlerType(GeneratedsSuper): subclass = None superclass = None def __init__(self, fullname=None, refid=None): + self.original_tagname_ = None self.fullname = fullname self.refid = refid def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, client_handlerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if client_handlerType.subclass: return client_handlerType.subclass(*args_, **kwargs_) else: @@ -3113,13 +3306,15 @@ class client_handlerType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -3133,7 +3328,7 @@ class client_handlerType(GeneratedsSuper): eol_ = '' if self.fullname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_)) + outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_)) if self.refid is not None: showIndent(outfile, level, pretty_print) outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_)) @@ -3148,7 +3343,7 @@ class client_handlerType(GeneratedsSuper): def exportLiteralChildren(self, outfile, level, name_): if self.fullname is not None: showIndent(outfile, level) - outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding)) + outfile.write('fullname=%s,\n' % self.gds_encode(quote_python(self.fullname))) if self.refid is not None: showIndent(outfile, level) outfile.write('refid=%d,\n' % self.refid) @@ -3158,6 +3353,7 @@ class client_handlerType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -3169,7 +3365,7 @@ class client_handlerType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'refid') self.refid = ival_ @@ -3235,7 +3431,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -3248,7 +3444,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3268,7 +3465,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3291,12 +3489,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'people' rootClass = people rootObj = rootClass.factory() rootObj.build(rootNode) @@ -3305,13 +3507,14 @@ def parseString(inString, silence=False): if not silence: sys.stdout.write('<?xml version="1.0" ?>\n') rootObj.export( - sys.stdout, 0, name_="people", + sys.stdout, 0, name_=rootTag, namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3324,7 +3527,7 @@ def parseLiteral(inFileName, silence=False): if not silence: sys.stdout.write('#from out2_sup import *\n\n') sys.stdout.write('import out2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') + sys.stdout.write('rootObj = model_.rootClass(\n') rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj diff --git a/tests/out2_sub.py b/tests/out2_sub.py deleted file mode 100644 index ad7595f..0000000 --- a/tests/out2_sub.py +++ /dev/null @@ -1,273 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import out2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class peopleSub(supermod.people): - def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None): - super(peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, ) -supermod.people.subclass = peopleSub -# end class peopleSub - - -class commentsSub(supermod.comments): - def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None): - super(commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, ) -supermod.comments.subclass = commentsSub -# end class commentsSub - - -class personSub(supermod.person): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) -supermod.person.subclass = personSub -# end class personSub - - -class programmerSub(supermod.programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) -supermod.programmer.subclass = programmerSub -# end class programmerSub - - -class paramSub(supermod.param): - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, ) -supermod.param.subclass = paramSub -# end class paramSub - - -class python_programmerSub(supermod.python_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) -supermod.python_programmer.subclass = python_programmerSub -# end class python_programmerSub - - -class java_programmerSub(supermod.java_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, ) -supermod.java_programmer.subclass = java_programmerSub -# end class java_programmerSub - - -class agentSub(supermod.agent): - def __init__(self, firstname=None, lastname=None, priority=None, info=None): - super(agentSub, self).__init__(firstname, lastname, priority, info, ) -supermod.agent.subclass = agentSub -# end class agentSub - - -class special_agentSub(supermod.special_agent): - def __init__(self, firstname=None, lastname=None, priority=None, info=None): - super(special_agentSub, self).__init__(firstname, lastname, priority, info, ) -supermod.special_agent.subclass = special_agentSub -# end class special_agentSub - - -class boosterSub(supermod.booster): - def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): - super(boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, ) -supermod.booster.subclass = boosterSub -# end class boosterSub - - -class infoSub(supermod.info): - def __init__(self, rating=None, type_=None, name=None): - super(infoSub, self).__init__(rating, type_, name, ) -supermod.info.subclass = infoSub -# end class infoSub - - -class client_handlerTypeSub(supermod.client_handlerType): - def __init__(self, fullname=None, refid=None): - super(client_handlerTypeSub, self).__init__(fullname, refid, ) -supermod.client_handlerType.subclass = client_handlerTypeSub -# end class client_handlerTypeSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - if not silence: - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export( - sys.stdout, 0, name_=rootTag, - namespacedef_='', - pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) - if not silence: - content = etree_.tostring( - rootElement, pretty_print=True, - xml_declaration=True, encoding="utf-8") - sys.stdout.write(content) - sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - if not silence: - sys.stdout.write('<?xml version="1.0" ?>\n') - rootObj.export( - sys.stdout, 0, name_=rootTag, - namespacedef_='') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - if not silence: - sys.stdout.write('#from out2_sup import *\n\n') - sys.stdout.write('import out2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.people(\n') - rootObj.exportLiteral(sys.stdout, 0, name_="people") - sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/people_procincl1_sub.py b/tests/people_procincl1_sub.py index c3b5be6..8d3b5e7 100644 --- a/tests/people_procincl1_sub.py +++ b/tests/people_procincl1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/people_procincl2_sup.py') +# ('-s', 'tests/people_procincl2_sub.py') +# ('--super', 'people_procincl2_sup') +# +# Command line arguments: +# tests/people_procincl.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/people_procincl2_sup.py" -s "tests/people_procincl2_sub.py" --super="people_procincl2_sup" tests/people_procincl.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import people_procincl2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -89,22 +62,22 @@ supermod.comments.subclass = commentsSub class personSub(supermod.person): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + super(personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) supermod.person.subclass = personSub # end class personSub class specialpersonSub(supermod.specialperson): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): - super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): + super(specialpersonSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, ) supermod.specialperson.subclass = specialpersonSub # end class specialpersonSub class paramSub(supermod.param): - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, ) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + super(paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, ) supermod.param.subclass = paramSub # end class paramSub @@ -131,8 +104,8 @@ supermod.booster.subclass = boosterSub class infoSub(supermod.info): - def __init__(self, rating=None, type_=None, name=None): - super(infoSub, self).__init__(rating, type_, name, ) + def __init__(self, name=None, type_=None, rating=None): + super(infoSub, self).__init__(name, type_, rating, ) supermod.info.subclass = infoSub # end class infoSub @@ -159,8 +132,8 @@ supermod.airplane.subclass = airplaneSub class programmerSub(supermod.programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + super(programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) supermod.programmer.subclass = programmerSub # end class programmerSub @@ -173,15 +146,15 @@ supermod.client_handlerType.subclass = client_handlerTypeSub class java_programmerSub(supermod.java_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + super(java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, ) supermod.java_programmer.subclass = java_programmerSub # end class java_programmerSub class python_programmerSub(supermod.python_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + super(python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) supermod.python_programmer.subclass = python_programmerSub # end class python_programmerSub @@ -196,7 +169,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -216,7 +190,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -240,7 +215,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -259,11 +235,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'people' rootClass = supermod.people rootObj = rootClass.factory() rootObj.build(rootNode) @@ -272,8 +249,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from people_procincl2_sup import *\n\n') ## sys.stdout.write('import people_procincl2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.people(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="people") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -284,7 +261,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py index 397274a..dac3ff1 100644 --- a/tests/people_procincl1_sup.py +++ b/tests/people_procincl1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/people_procincl2_sup.py') +# ('-s', 'tests/people_procincl2_sub.py') +# ('--super', 'people_procincl2_sup') +# +# Command line arguments: +# tests/people_procincl.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/people_procincl2_sup.py" -s "tests/people_procincl2_sub.py" --super="people_procincl2_sup" tests/people_procincl.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -621,6 +673,7 @@ class people(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None): + self.original_tagname_ = None if comments is None: self.comments = [] else: @@ -646,6 +699,11 @@ class people(GeneratedsSuper): else: self.java_programmer = java_programmer def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, people) + if subclass is not None: + return subclass(*args_, **kwargs_) if people.subclass: return people.subclass(*args_, **kwargs_) else: @@ -654,27 +712,33 @@ class people(GeneratedsSuper): def get_comments(self): return self.comments def set_comments(self, comments): self.comments = comments def add_comments(self, value): self.comments.append(value) - def insert_comments(self, index, value): self.comments[index] = value + def insert_comments_at(self, index, value): self.comments.insert(index, value) + def replace_comments_at(self, index, value): self.comments[index] = value def get_person(self): return self.person def set_person(self, person): self.person = person def add_person(self, value): self.person.append(value) - def insert_person(self, index, value): self.person[index] = value + def insert_person_at(self, index, value): self.person.insert(index, value) + def replace_person_at(self, index, value): self.person[index] = value def get_specialperson(self): return self.specialperson def set_specialperson(self, specialperson): self.specialperson = specialperson def add_specialperson(self, value): self.specialperson.append(value) - def insert_specialperson(self, index, value): self.specialperson[index] = value + def insert_specialperson_at(self, index, value): self.specialperson.insert(index, value) + def replace_specialperson_at(self, index, value): self.specialperson[index] = value def get_programmer(self): return self.programmer def set_programmer(self, programmer): self.programmer = programmer def add_programmer(self, value): self.programmer.append(value) - def insert_programmer(self, index, value): self.programmer[index] = value + def insert_programmer_at(self, index, value): self.programmer.insert(index, value) + def replace_programmer_at(self, index, value): self.programmer[index] = value def get_python_programmer(self): return self.python_programmer def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer def add_python_programmer(self, value): self.python_programmer.append(value) - def insert_python_programmer(self, index, value): self.python_programmer[index] = value + def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value) + def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value def get_java_programmer(self): return self.java_programmer def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer def add_java_programmer(self, value): self.java_programmer.append(value) - def insert_java_programmer(self, index, value): self.java_programmer[index] = value + def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value) + def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value def hasContent_(self): if ( self.comments or @@ -692,13 +756,15 @@ class people(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='people') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -722,93 +788,13 @@ class people(GeneratedsSuper): python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print) for java_programmer_ in self.java_programmer: java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='people'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('comments=[\n') - level += 1 - for comments_ in self.comments: - showIndent(outfile, level) - outfile.write('model_.comments(\n') - comments_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('person=[\n') - level += 1 - for person_ in self.person: - showIndent(outfile, level) - outfile.write('model_.person(\n') - person_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('specialperson=[\n') - level += 1 - for specialperson_ in self.specialperson: - showIndent(outfile, level) - outfile.write('model_.specialperson(\n') - specialperson_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('programmer=[\n') - level += 1 - for programmer_ in self.programmer: - showIndent(outfile, level) - outfile.write('model_.programmer(\n') - programmer_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('python_programmer=[\n') - level += 1 - for python_programmer_ in self.python_programmer: - showIndent(outfile, level) - outfile.write('model_.python_programmer(\n') - python_programmer_.exportLiteral(outfile, level, name_='python-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('java_programmer=[\n') - level += 1 - for java_programmer_ in self.java_programmer: - showIndent(outfile, level) - outfile.write('model_.java_programmer(\n') - java_programmer_.exportLiteral(outfile, level, name_='java-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -816,28 +802,34 @@ class people(GeneratedsSuper): obj_ = comments.factory() obj_.build(child_) self.comments.append(obj_) + obj_.original_tagname_ = 'comments' elif nodeName_ == 'person': class_obj_ = self.get_class_obj_(child_, person) obj_ = class_obj_.factory() obj_.build(child_) self.person.append(obj_) + obj_.original_tagname_ = 'person' elif nodeName_ == 'specialperson': obj_ = specialperson.factory() obj_.build(child_) self.specialperson.append(obj_) + obj_.original_tagname_ = 'specialperson' elif nodeName_ == 'programmer': class_obj_ = self.get_class_obj_(child_, programmer) obj_ = class_obj_.factory() obj_.build(child_) self.programmer.append(obj_) + obj_.original_tagname_ = 'programmer' elif nodeName_ == 'python-programmer': obj_ = python_programmer.factory() obj_.build(child_) self.python_programmer.append(obj_) + obj_.original_tagname_ = 'python-programmer' elif nodeName_ == 'java-programmer': obj_ = java_programmer.factory() obj_.build(child_) self.java_programmer.append(obj_) + obj_.original_tagname_ = 'java-programmer' # end class people @@ -850,6 +842,7 @@ class comments(GeneratedsSuper): subclass = None superclass = None def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None if emp is None: self.emp = [] else: @@ -869,6 +862,11 @@ class comments(GeneratedsSuper): self.content_ = content_ self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, comments) + if subclass is not None: + return subclass(*args_, **kwargs_) if comments.subclass: return comments.subclass(*args_, **kwargs_) else: @@ -877,18 +875,20 @@ class comments(GeneratedsSuper): def get_emp(self): return self.emp def set_emp(self, emp): self.emp = emp def add_emp(self, value): self.emp.append(value) - def insert_emp(self, index, value): self.emp[index] = value + def insert_emp_at(self, index, value): self.emp.insert(index, value) + def replace_emp_at(self, index, value): self.emp[index] = value def get_bold(self): return self.bold def set_bold(self, bold): self.bold = bold def add_bold(self, value): self.bold.append(value) - def insert_bold(self, index, value): self.bold[index] = value + def insert_bold_at(self, index, value): self.bold.insert(index, value) + def replace_bold_at(self, index, value): self.bold[index] = value def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( self.emp or self.bold or - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -898,13 +898,15 @@ class comments(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -915,30 +917,6 @@ class comments(GeneratedsSuper): if not fromsubclass_: for item_ in self.content_: item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='comments'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -950,6 +928,7 @@ class comments(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -975,11 +954,11 @@ class person(GeneratedsSuper): of people. They are each an extension of this base type of person.""" member_data_items_ = [ - MemberSpec_('vegetable', 'xs:string', 0), - MemberSpec_('fruit', 'xs:string', 0), - MemberSpec_('ratio', 'xs:float', 0), - MemberSpec_('id', 'xs:integer', 0), MemberSpec_('value', 'xs:string', 0), + MemberSpec_('id', 'xs:integer', 0), + MemberSpec_('ratio', 'xs:float', 0), + MemberSpec_('fruit', 'xs:string', 0), + MemberSpec_('vegetable', 'xs:string', 0), MemberSpec_('name', 'xs:string', 0), MemberSpec_('interest', 'xs:string', 1), MemberSpec_('category', 'xs:integer', 0), @@ -989,12 +968,13 @@ class person(GeneratedsSuper): ] subclass = None superclass = None - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - self.vegetable = _cast(None, vegetable) - self.fruit = _cast(None, fruit) - self.ratio = _cast(float, ratio) - self.id = _cast(int, id) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + self.original_tagname_ = None self.value = _cast(None, value) + self.id = _cast(int, id) + self.ratio = _cast(float, ratio) + self.fruit = _cast(None, fruit) + self.vegetable = _cast(None, vegetable) self.name = name if interest is None: self.interest = [] @@ -1012,6 +992,11 @@ class person(GeneratedsSuper): self.description = description self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, person) + if subclass is not None: + return subclass(*args_, **kwargs_) if person.subclass: return person.subclass(*args_, **kwargs_) else: @@ -1022,29 +1007,32 @@ class person(GeneratedsSuper): def get_interest(self): return self.interest def set_interest(self, interest): self.interest = interest def add_interest(self, value): self.interest.append(value) - def insert_interest(self, index, value): self.interest[index] = value + def insert_interest_at(self, index, value): self.interest.insert(index, value) + def replace_interest_at(self, index, value): self.interest[index] = value def get_category(self): return self.category def set_category(self, category): self.category = category def get_agent(self): return self.agent def set_agent(self, agent): self.agent = agent def add_agent(self, value): self.agent.append(value) - def insert_agent(self, index, value): self.agent[index] = value + def insert_agent_at(self, index, value): self.agent.insert(index, value) + def replace_agent_at(self, index, value): self.agent[index] = value def get_promoter(self): return self.promoter def set_promoter(self, promoter): self.promoter = promoter def add_promoter(self, value): self.promoter.append(value) - def insert_promoter(self, index, value): self.promoter[index] = value + def insert_promoter_at(self, index, value): self.promoter.insert(index, value) + def replace_promoter_at(self, index, value): self.promoter[index] = value def get_description(self): return self.description def set_description(self, description): self.description = description - def get_vegetable(self): return self.vegetable - def set_vegetable(self, vegetable): self.vegetable = vegetable - def get_fruit(self): return self.fruit - def set_fruit(self, fruit): self.fruit = fruit - def get_ratio(self): return self.ratio - def set_ratio(self, ratio): self.ratio = ratio - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_value(self): return self.value def set_value(self, value): self.value = value + def get_id(self): return self.id + def set_id(self, id): self.id = id + def get_ratio(self): return self.ratio + def set_ratio(self, ratio): self.ratio = ratio + def get_fruit(self): return self.fruit + def set_fruit(self, fruit): self.fruit = fruit + def get_vegetable(self): return self.vegetable + def set_vegetable(self, vegetable): self.vegetable = vegetable def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): @@ -1064,33 +1052,35 @@ class person(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='person') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), )) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), )) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.value is not None and 'value' not in already_processed: + already_processed.add('value') + outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), )) if self.id is not None and 'id' not in already_processed: already_processed.add('id') outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id')) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), )) + if self.ratio is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.fruit is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), )) + if self.vegetable is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), )) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') @@ -1102,10 +1092,10 @@ class person(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) for interest_ in self.interest: showIndent(outfile, level, pretty_print) - outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_)) + outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_)) if self.category is not None: showIndent(outfile, level, pretty_print) outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_)) @@ -1115,110 +1105,41 @@ class person(GeneratedsSuper): promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print) if self.description is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='person'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - showIndent(outfile, level) - outfile.write('vegetable="%s",\n' % (self.vegetable,)) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - showIndent(outfile, level) - outfile.write('fruit="%s",\n' % (self.fruit,)) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - showIndent(outfile, level) - outfile.write('ratio=%f,\n' % (self.ratio,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id=%d,\n' % (self.id,)) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - showIndent(outfile, level) - outfile.write('value="%s",\n' % (self.value,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('interest=[\n') - level += 1 - for interest_ in self.interest: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%d,\n' % self.category) - showIndent(outfile, level) - outfile.write('agent=[\n') - level += 1 - for agent_ in self.agent: - showIndent(outfile, level) - outfile.write('model_.agent(\n') - agent_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('promoter=[\n') - level += 1 - for promoter_ in self.promoter: - showIndent(outfile, level) - outfile.write('model_.booster(\n') - promoter_.exportLiteral(outfile, level, name_='booster') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding)) + outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('vegetable', node) - if value is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - self.vegetable = value - value = find_attr_value_('fruit', node) - if value is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - self.fruit = value - value = find_attr_value_('ratio', node) - if value is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - try: - self.ratio = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('value', node) + if value is not None and 'value' not in already_processed: + already_processed.add('value') + self.value = value value = find_attr_value_('id', node) if value is not None and 'id' not in already_processed: already_processed.add('id') try: self.id = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value', node) - if value is not None and 'value' not in already_processed: - already_processed.add('value') - self.value = value + value = find_attr_value_('ratio', node) + if value is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + try: + self.ratio = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('fruit', node) + if value is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + self.fruit = value + value = find_attr_value_('vegetable', node) + if value is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + self.vegetable = value value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1236,7 +1157,7 @@ class person(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'category') self.category = ival_ @@ -1244,10 +1165,12 @@ class person(GeneratedsSuper): obj_ = agent.factory() obj_.build(child_) self.agent.append(obj_) + obj_.original_tagname_ = 'agent' elif nodeName_ == 'promoter': obj_ = booster.factory() obj_.build(child_) self.promoter.append(obj_) + obj_.original_tagname_ = 'promoter' elif nodeName_ == 'description': description_ = child_.text description_ = self.gds_validate_string(description_, node, 'description') @@ -1260,10 +1183,15 @@ class specialperson(person): ] subclass = None superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): - super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, ) - pass + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): + self.original_tagname_ = None + super(specialperson, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, ) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, specialperson) + if subclass is not None: + return subclass(*args_, **kwargs_) if specialperson.subclass: return specialperson.subclass(*args_, **kwargs_) else: @@ -1281,13 +1209,15 @@ class specialperson(person): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='specialperson', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1296,22 +1226,13 @@ class specialperson(person): super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson') def exportChildren(self, outfile, level, namespace_='', name_='specialperson', fromsubclass_=False, pretty_print=True): super(specialperson, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='specialperson'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(specialperson, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(specialperson, self).exportLiteralChildren(outfile, level, name_) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(specialperson, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1324,47 +1245,53 @@ class param(GeneratedsSuper): """Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.""" member_data_items_ = [ - MemberSpec_('semantic', 'xs:token', 0), + MemberSpec_('id', 'xs:string', 0), MemberSpec_('name', 'xs:NCName', 0), - MemberSpec_('flow', 'FlowType', 0), MemberSpec_('sid', 'xs:NCName', 0), + MemberSpec_('flow', 'FlowType', 0), + MemberSpec_('semantic', 'xs:token', 0), MemberSpec_('type', 'xs:NMTOKEN', 0), - MemberSpec_('id', 'xs:string', 0), MemberSpec_('valueOf_', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - self.semantic = _cast(None, semantic) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + self.original_tagname_ = None + self.id = _cast(None, id) self.name = _cast(None, name) - self.flow = _cast(None, flow) self.sid = _cast(None, sid) + self.flow = _cast(None, flow) + self.semantic = _cast(None, semantic) self.type_ = _cast(None, type_) - self.id = _cast(None, id) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, param) + if subclass is not None: + return subclass(*args_, **kwargs_) if param.subclass: return param.subclass(*args_, **kwargs_) else: return param(*args_, **kwargs_) factory = staticmethod(factory) - def get_semantic(self): return self.semantic - def set_semantic(self, semantic): self.semantic = semantic + def get_id(self): return self.id + def set_id(self, id): self.id = id def get_name(self): return self.name def set_name(self, name): self.name = name - def get_flow(self): return self.flow - def set_flow(self, flow): self.flow = flow def get_sid(self): return self.sid def set_sid(self, sid): self.sid = sid + def get_flow(self): return self.flow + def set_flow(self, flow): self.flow = flow + def get_semantic(self): return self.semantic + def set_semantic(self, semantic): self.semantic = semantic def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1374,72 +1301,39 @@ class param(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='param') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) if self.name is not None and 'name' not in already_processed: already_processed.add('name') outfile.write(' name=%s' % (quote_attrib(self.name), )) - if self.flow is not None and 'flow' not in already_processed: - already_processed.add('flow') - outfile.write(' flow=%s' % (quote_attrib(self.flow), )) if self.sid is not None and 'sid' not in already_processed: already_processed.add('sid') outfile.write(' sid=%s' % (quote_attrib(self.sid), )) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), )) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), )) - def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='param'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - showIndent(outfile, level) - outfile.write('semantic="%s",\n' % (self.semantic,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) if self.flow is not None and 'flow' not in already_processed: already_processed.add('flow') - showIndent(outfile, level) - outfile.write('flow=%s,\n' % (self.flow,)) - if self.sid is not None and 'sid' not in already_processed: - already_processed.add('sid') - showIndent(outfile, level) - outfile.write('sid="%s",\n' % (self.sid,)) + outfile.write(' flow=%s' % (quote_attrib(self.flow), )) + if self.semantic is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_="%s",\n' % (self.type_,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id="%s",\n' % (self.id,)) - def exportLiteralChildren(self, outfile, level, name_): + outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), )) + def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -1448,32 +1342,33 @@ class param(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('semantic', node) - if value is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - self.semantic = value - self.semantic = ' '.join(self.semantic.split()) + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value value = find_attr_value_('name', node) if value is not None and 'name' not in already_processed: already_processed.add('name') self.name = value - value = find_attr_value_('flow', node) - if value is not None and 'flow' not in already_processed: - already_processed.add('flow') - self.flow = value value = find_attr_value_('sid', node) if value is not None and 'sid' not in already_processed: already_processed.add('sid') self.sid = value + value = find_attr_value_('flow', node) + if value is not None and 'flow' not in already_processed: + already_processed.add('flow') + self.flow = value + value = find_attr_value_('semantic', node) + if value is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + self.semantic = value + self.semantic = ' '.join(self.semantic.split()) value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') self.type_ = value - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - self.id = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass # end class param @@ -1490,6 +1385,7 @@ class agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority @@ -1499,6 +1395,11 @@ class agent(GeneratedsSuper): else: self.vehicle = vehicle def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, agent) + if subclass is not None: + return subclass(*args_, **kwargs_) if agent.subclass: return agent.subclass(*args_, **kwargs_) else: @@ -1515,7 +1416,8 @@ class agent(GeneratedsSuper): def get_vehicle(self): return self.vehicle def set_vehicle(self, vehicle): self.vehicle = vehicle def add_vehicle(self, value): self.vehicle.append(value) - def insert_vehicle(self, index, value): self.vehicle[index] = value + def insert_vehicle_at(self, index, value): self.vehicle.insert(index, value) + def replace_vehicle_at(self, index, value): self.vehicle[index] = value def hasContent_(self): if ( self.firstname is not None or @@ -1532,13 +1434,15 @@ class agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1552,59 +1456,24 @@ class agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) if self.info is not None: self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) for vehicle_ in self.vehicle: - vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - showIndent(outfile, level) - outfile.write('vehicle=[\n') - level += 1 - for vehicle_ in self.vehicle: - showIndent(outfile, level) - outfile.write('model_.vehicle(\n') - vehicle_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') + vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1620,7 +1489,7 @@ class agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -1628,6 +1497,7 @@ class agent(GeneratedsSuper): obj_ = info.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' elif nodeName_ == 'vehicle': type_name_ = child_.attrib.get( '{http://www.w3.org/2001/XMLSchema-instance}type') @@ -1646,6 +1516,7 @@ class agent(GeneratedsSuper): raise NotImplementedError( 'Class not implemented for <vehicle> element') self.vehicle.append(obj_) + obj_.original_tagname_ = 'vehicle' # end class agent @@ -1661,11 +1532,17 @@ class special_agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, special_agent) + if subclass is not None: + return subclass(*args_, **kwargs_) if special_agent.subclass: return special_agent.subclass(*args_, **kwargs_) else: @@ -1694,13 +1571,15 @@ class special_agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1714,45 +1593,22 @@ class special_agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) if self.info is not None: self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='special-agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1768,7 +1624,7 @@ class special_agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -1776,6 +1632,7 @@ class special_agent(GeneratedsSuper): obj_ = info.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' # end class special_agent @@ -1793,6 +1650,7 @@ class booster(GeneratedsSuper): subclass = None superclass = None def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): + self.original_tagname_ = None self.member_id = _cast(None, member_id) self.firstname = firstname self.lastname = lastname @@ -1811,6 +1669,11 @@ class booster(GeneratedsSuper): else: self.client_handler = client_handler def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, booster) + if subclass is not None: + return subclass(*args_, **kwargs_) if booster.subclass: return booster.subclass(*args_, **kwargs_) else: @@ -1827,15 +1690,18 @@ class booster(GeneratedsSuper): def get_other_value(self): return self.other_value def set_other_value(self, other_value): self.other_value = other_value def add_other_value(self, value): self.other_value.append(value) - def insert_other_value(self, index, value): self.other_value[index] = value + def insert_other_value_at(self, index, value): self.other_value.insert(index, value) + def replace_other_value_at(self, index, value): self.other_value[index] = value def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ def add_type(self, value): self.type_.append(value) - def insert_type(self, index, value): self.type_[index] = value + def insert_type_at(self, index, value): self.type_.insert(index, value) + def replace_type_at(self, index, value): self.type_[index] = value def get_client_handler(self): return self.client_handler def set_client_handler(self, client_handler): self.client_handler = client_handler def add_client_handler(self, value): self.client_handler.append(value) - def insert_client_handler(self, index, value): self.client_handler[index] = value + def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value) + def replace_client_handler_at(self, index, value): self.client_handler[index] = value def get_member_id(self): return self.member_id def set_member_id(self, member_id): self.member_id = member_id def hasContent_(self): @@ -1856,13 +1722,15 @@ class booster(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -1870,7 +1738,7 @@ class booster(GeneratedsSuper): def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'): if self.member_id is not None and 'member_id' not in already_processed: already_processed.add('member_id') - outfile.write(' member-id=%s' % (self.gds_format_string(quote_attrib(self.member_id).encode(ExternalEncoding), input_name='member-id'), )) + outfile.write(' member-id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.member_id), input_name='member-id')), )) def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' @@ -1878,10 +1746,10 @@ class booster(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.other_name is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_)) @@ -1896,66 +1764,13 @@ class booster(GeneratedsSuper): outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_)) for client_handler_ in self.client_handler: client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='booster'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.member_id is not None and 'member_id' not in already_processed: - already_processed.add('member_id') - showIndent(outfile, level) - outfile.write('member_id="%s",\n' % (self.member_id,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.other_name is not None: - showIndent(outfile, level) - outfile.write('other_name=%f,\n' % self.other_name) - if self.class_ is not None: - showIndent(outfile, level) - outfile.write('class_=%f,\n' % self.class_) - showIndent(outfile, level) - outfile.write('other_value=[\n') - level += 1 - for other_value_ in self.other_value: - showIndent(outfile, level) - outfile.write('%f,\n' % other_value_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('type_=[\n') - level += 1 - for type_ in self.type_: - showIndent(outfile, level) - outfile.write('%f,\n' % type_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('client_handler=[\n') - level += 1 - for client_handler_ in self.client_handler: - showIndent(outfile, level) - outfile.write('model_.client_handlerType(\n') - client_handler_.exportLiteral(outfile, level, name_='client-handlerType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('member-id', node) if value is not None and 'member-id' not in already_processed: @@ -1974,7 +1789,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_name') self.other_name = fval_ @@ -1982,7 +1797,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'class') self.class_ = fval_ @@ -1990,7 +1805,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_value') self.other_value.append(fval_) @@ -1998,7 +1813,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'type') self.type_.append(fval_) @@ -2006,34 +1821,40 @@ class booster(GeneratedsSuper): obj_ = client_handlerType.factory() obj_.build(child_) self.client_handler.append(obj_) + obj_.original_tagname_ = 'client-handler' # end class booster class info(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('rating', 'xs:float', 0), - MemberSpec_('type', 'xs:integer', 0), MemberSpec_('name', 'xs:string', 0), + MemberSpec_('type', 'xs:integer', 0), + MemberSpec_('rating', 'xs:float', 0), ] subclass = None superclass = None - def __init__(self, rating=None, type_=None, name=None): - self.rating = _cast(float, rating) - self.type_ = _cast(int, type_) + def __init__(self, name=None, type_=None, rating=None): + self.original_tagname_ = None self.name = _cast(None, name) - pass + self.type_ = _cast(int, type_) + self.rating = _cast(float, rating) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, info) + if subclass is not None: + return subclass(*args_, **kwargs_) if info.subclass: return info.subclass(*args_, **kwargs_) else: return info(*args_, **kwargs_) factory = staticmethod(factory) - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ def get_name(self): return self.name def set_name(self, name): self.name = name + def get_type(self): return self.type_ + def set_type(self, type_): self.type_ = type_ + def get_rating(self): return self.rating + def set_rating(self, rating): self.rating = rating def hasContent_(self): if ( @@ -2046,48 +1867,29 @@ class info(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='info') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') - outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type')) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), )) - def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='info'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): if self.rating is not None and 'rating' not in already_processed: already_processed.add('rating') - showIndent(outfile, level) - outfile.write('rating=%f,\n' % (self.rating,)) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_=%d,\n' % (self.type_,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) - def exportLiteralChildren(self, outfile, level, name_): + outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) + def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -2095,25 +1897,26 @@ class info(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('rating', node) - if value is not None and 'rating' not in already_processed: - already_processed.add('rating') - try: - self.rating = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (rating): %s' % exp) + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') try: self.type_ = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value + value = find_attr_value_('rating', node) + if value is not None and 'rating' not in already_processed: + already_processed.add('rating') + try: + self.rating = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (rating): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass # end class info @@ -2126,9 +1929,15 @@ class vehicle(GeneratedsSuper): subclass = None superclass = None def __init__(self, wheelcount=None, extensiontype_=None): + self.original_tagname_ = None self.wheelcount = wheelcount self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, vehicle) + if subclass is not None: + return subclass(*args_, **kwargs_) if vehicle.subclass: return vehicle.subclass(*args_, **kwargs_) else: @@ -2150,13 +1959,15 @@ class vehicle(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='vehicle') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='vehicle', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2175,24 +1986,13 @@ class vehicle(GeneratedsSuper): if self.wheelcount is not None: showIndent(outfile, level, pretty_print) outfile.write('<%swheelcount>%s</%swheelcount>%s' % (namespace_, self.gds_format_integer(self.wheelcount, input_name='wheelcount'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='vehicle'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.wheelcount is not None: - showIndent(outfile, level) - outfile.write('wheelcount=%d,\n' % self.wheelcount) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -2203,7 +2003,7 @@ class vehicle(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'wheelcount') self.wheelcount = ival_ @@ -2217,9 +2017,15 @@ class automobile(vehicle): subclass = None superclass = vehicle def __init__(self, wheelcount=None, drivername=None): + self.original_tagname_ = None super(automobile, self).__init__(wheelcount, ) self.drivername = drivername def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, automobile) + if subclass is not None: + return subclass(*args_, **kwargs_) if automobile.subclass: return automobile.subclass(*args_, **kwargs_) else: @@ -2240,13 +2046,15 @@ class automobile(vehicle): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='automobile') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='automobile', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2261,26 +2069,14 @@ class automobile(vehicle): eol_ = '' if self.drivername is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_format_string(quote_xml(self.drivername).encode(ExternalEncoding), input_name='drivername'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='automobile'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(automobile, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(automobile, self).exportLiteralChildren(outfile, level, name_) - if self.drivername is not None: - showIndent(outfile, level) - outfile.write('drivername=%s,\n' % quote_python(self.drivername).encode(ExternalEncoding)) + outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.drivername), input_name='drivername')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(automobile, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2299,9 +2095,15 @@ class airplane(vehicle): subclass = None superclass = vehicle def __init__(self, wheelcount=None, pilotname=None): + self.original_tagname_ = None super(airplane, self).__init__(wheelcount, ) self.pilotname = pilotname def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, airplane) + if subclass is not None: + return subclass(*args_, **kwargs_) if airplane.subclass: return airplane.subclass(*args_, **kwargs_) else: @@ -2322,13 +2124,15 @@ class airplane(vehicle): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='airplane') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='airplane', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2343,26 +2147,14 @@ class airplane(vehicle): eol_ = '' if self.pilotname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='airplane'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(airplane, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(airplane, self).exportLiteralChildren(outfile, level, name_) - if self.pilotname is not None: - showIndent(outfile, level) - outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding)) + outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pilotname), input_name='pilotname')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(airplane, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2380,10 +2172,10 @@ class programmer(person): member_data_items_ = [ MemberSpec_('language', 'xs:string', 0), MemberSpec_('area', 'xs:string', 0), - MemberSpec_('attrnegint', 'xs:negativeInteger', 0), MemberSpec_('attrposint', 'xs:positiveInteger', 0), - MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0), + MemberSpec_('attrnegint', 'xs:negativeInteger', 0), + MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('email', 'xs:string', 0), MemberSpec_('elposint', 'xs:positiveInteger', 0), MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0), @@ -2398,20 +2190,21 @@ class programmer(person): ] subclass = None superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + self.original_tagname_ = None + super(programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) self.language = _cast(None, language) self.area = _cast(None, area) - self.attrnegint = _cast(int, attrnegint) self.attrposint = _cast(int, attrposint) - self.attrnonnegint = _cast(int, attrnonnegint) self.attrnonposint = _cast(int, attrnonposint) + self.attrnegint = _cast(int, attrnegint) + self.attrnonnegint = _cast(int, attrnonnegint) self.email = email self.elposint = elposint self.elnonposint = elnonposint self.elnegint = elnegint self.elnonnegint = elnonnegint - if isinstance(eldate, basestring): + if isinstance(eldate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date() else: initvalue_ = eldate @@ -2421,8 +2214,14 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if programmer.subclass: return programmer.subclass(*args_, **kwargs_) else: @@ -2454,19 +2253,28 @@ class programmer(person): def set_language(self, language): self.language = language def get_area(self): return self.area def set_area(self, area): self.area = area - def get_attrnegint(self): return self.attrnegint - def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint def get_attrposint(self): return self.attrposint def set_attrposint(self, attrposint): self.attrposint = attrposint - def get_attrnonnegint(self): return self.attrnonnegint - def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_attrnonposint(self): return self.attrnonposint def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint + def get_attrnegint(self): return self.attrnegint + def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint + def get_attrnonnegint(self): return self.attrnonnegint + def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -2490,13 +2298,15 @@ class programmer(person): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2505,22 +2315,22 @@ class programmer(person): super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.language is not None and 'language' not in already_processed: already_processed.add('language') - outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), )) + outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), )) if self.area is not None and 'area' not in already_processed: already_processed.add('area') - outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), )) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), )) if self.attrposint is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint')) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.attrnonposint is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint')) + if self.attrnegint is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') @@ -2533,7 +2343,7 @@ class programmer(person): eol_ = '' if self.email is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_)) + outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_)) if self.elposint is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_)) @@ -2551,7 +2361,7 @@ class programmer(person): outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_)) if self.eltoken is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_)) + outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_)) if self.elshort is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_)) @@ -2562,83 +2372,14 @@ class programmer(person): self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print) if self.elarraytypes is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.language is not None and 'language' not in already_processed: - already_processed.add('language') - showIndent(outfile, level) - outfile.write('language="%s",\n' % (self.language,)) - if self.area is not None and 'area' not in already_processed: - already_processed.add('area') - showIndent(outfile, level) - outfile.write('area="%s",\n' % (self.area,)) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - showIndent(outfile, level) - outfile.write('attrnegint=%d,\n' % (self.attrnegint,)) - if self.attrposint is not None and 'attrposint' not in already_processed: - already_processed.add('attrposint') - showIndent(outfile, level) - outfile.write('attrposint=%d,\n' % (self.attrposint,)) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - showIndent(outfile, level) - outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,)) - if self.attrnonposint is not None and 'attrnonposint' not in already_processed: - already_processed.add('attrnonposint') - showIndent(outfile, level) - outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,)) - super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(programmer, self).exportLiteralChildren(outfile, level, name_) - if self.email is not None: - showIndent(outfile, level) - outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding)) - if self.elposint is not None: - showIndent(outfile, level) - outfile.write('elposint=%d,\n' % self.elposint) - if self.elnonposint is not None: - showIndent(outfile, level) - outfile.write('elnonposint=%d,\n' % self.elnonposint) - if self.elnegint is not None: - showIndent(outfile, level) - outfile.write('elnegint=%d,\n' % self.elnegint) - if self.elnonnegint is not None: - showIndent(outfile, level) - outfile.write('elnonnegint=%d,\n' % self.elnonnegint) - if self.eldate is not None: - showIndent(outfile, level) - outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate')) - if self.eltoken is not None: - showIndent(outfile, level) - outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding)) - if self.elshort is not None: - showIndent(outfile, level) - outfile.write('elshort=%d,\n' % self.elshort) - if self.ellong is not None: - showIndent(outfile, level) - outfile.write('ellong=%d,\n' % self.ellong) - if self.elparam is not None: - showIndent(outfile, level) - outfile.write('elparam=model_.param(\n') - self.elparam.exportLiteral(outfile, level, name_='elparam') - showIndent(outfile, level) - outfile.write('),\n') - if self.elarraytypes is not None: - showIndent(outfile, level) - outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding)) + outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('language', node) if value is not None and 'language' not in already_processed: @@ -2648,42 +2389,42 @@ class programmer(person): if value is not None and 'area' not in already_processed: already_processed.add('area') self.area = value - value = find_attr_value_('attrnegint', node) - if value is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - try: - self.attrnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnegint >= 0: - raise_parse_error(node, 'Invalid NegativeInteger') value = find_attr_value_('attrposint', node) if value is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') try: self.attrposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrposint <= 0: raise_parse_error(node, 'Invalid PositiveInteger') - value = find_attr_value_('attrnonnegint', node) - if value is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - try: - self.attrnonnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonnegint < 0: - raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('attrnonposint', node) if value is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') try: self.attrnonposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrnonposint > 0: raise_parse_error(node, 'Invalid NonPositiveInteger') + value = find_attr_value_('attrnegint', node) + if value is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + try: + self.attrnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnegint >= 0: + raise_parse_error(node, 'Invalid NegativeInteger') + value = find_attr_value_('attrnonnegint', node) + if value is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + try: + self.attrnonnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnonnegint < 0: + raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -2698,7 +2439,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -2708,7 +2449,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ > 0: raise_parse_error(child_, 'requires nonPositiveInteger') @@ -2718,7 +2459,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ >= 0: raise_parse_error(child_, 'requires negativeInteger') @@ -2728,7 +2469,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ < 0: raise_parse_error(child_, 'requires nonNegativeInteger') @@ -2740,14 +2481,17 @@ class programmer(person): self.eldate = dval_ elif nodeName_ == 'eltoken': eltoken_ = child_.text - eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + if eltoken_: + eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + else: + eltoken_ = "" eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken') self.eltoken = eltoken_ elif nodeName_ == 'elshort': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'elshort') self.elshort = ival_ @@ -2755,7 +2499,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'ellong') self.ellong = ival_ @@ -2763,11 +2507,13 @@ class programmer(person): obj_ = param.factory() obj_.build(child_) self.elparam = obj_ + obj_.original_tagname_ = 'elparam' elif nodeName_ == 'elarraytypes': elarraytypes_ = child_.text elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes') self.elarraytypes = elarraytypes_ - self.validate_ArrayTypes(self.elarraytypes) # validate type ArrayTypes + # validate type ArrayTypes + self.validate_ArrayTypes(self.elarraytypes) super(programmer, self).buildChildren(child_, node, nodeName_, True) # end class programmer @@ -2780,9 +2526,15 @@ class client_handlerType(GeneratedsSuper): subclass = None superclass = None def __init__(self, fullname=None, refid=None): + self.original_tagname_ = None self.fullname = fullname self.refid = refid def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, client_handlerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if client_handlerType.subclass: return client_handlerType.subclass(*args_, **kwargs_) else: @@ -2805,13 +2557,15 @@ class client_handlerType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2825,31 +2579,17 @@ class client_handlerType(GeneratedsSuper): eol_ = '' if self.fullname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_)) + outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_)) if self.refid is not None: showIndent(outfile, level, pretty_print) outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='client-handlerType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.fullname is not None: - showIndent(outfile, level) - outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding)) - if self.refid is not None: - showIndent(outfile, level) - outfile.write('refid=%d,\n' % self.refid) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2861,7 +2601,7 @@ class client_handlerType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'refid') self.refid = ival_ @@ -2873,18 +2613,24 @@ class java_programmer(programmer): Java programmers are nice also, but not as especially wonderful as Python programmers, of course.""" member_data_items_ = [ - MemberSpec_('status', 'xs:string', 0), MemberSpec_('nick-name', 'xs:string', 0), + MemberSpec_('status', 'xs:string', 0), MemberSpec_('favorite_editor', 'xs:string', 0), ] subclass = None superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.status = _cast(None, status) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + self.original_tagname_ = None + super(java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) + self.status = _cast(None, status) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, java_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if java_programmer.subclass: return java_programmer.subclass(*args_, **kwargs_) else: @@ -2892,10 +2638,10 @@ class java_programmer(programmer): factory = staticmethod(factory) def get_favorite_editor(self): return self.favorite_editor def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor - def get_status(self): return self.status - def set_status(self, status): self.status = status def get_nick_name(self): return self.nick_name def set_nick_name(self, nick_name): self.nick_name = nick_name + def get_status(self): return self.status + def set_status(self, status): self.status = status def hasContent_(self): if ( self.favorite_editor is not None or @@ -2909,25 +2655,27 @@ class java_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'): super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), )) if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) + if self.status is not None and 'status' not in already_processed: + already_processed.add('status') + outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), )) def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True): super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: @@ -2936,43 +2684,23 @@ class java_programmer(programmer): eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='java-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - showIndent(outfile, level) - outfile.write('status="%s",\n' % (self.status,)) - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(java_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('status', node) - if value is not None and 'status' not in already_processed: - already_processed.add('status') - self.status = value value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value + value = find_attr_value_('status', node) + if value is not None and 'status' not in already_processed: + already_processed.add('status') + self.status = value super(java_programmer, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'favorite-editor': @@ -2992,11 +2720,17 @@ class python_programmer(programmer): ] subclass = None superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + self.original_tagname_ = None + super(python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, python_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) if python_programmer.subclass: return python_programmer.subclass(*args_, **kwargs_) else: @@ -3019,13 +2753,15 @@ class python_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -3034,7 +2770,7 @@ class python_programmer(programmer): super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True): super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: @@ -3043,30 +2779,14 @@ class python_programmer(programmer): eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='python-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(python_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: @@ -3095,7 +2815,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -3108,7 +2828,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3128,7 +2849,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3151,12 +2873,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'people' rootClass = people rootObj = rootClass.factory() rootObj.build(rootNode) @@ -3165,13 +2891,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="people", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -3184,7 +2911,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from people_procincl2_sup import *\n\n') ## sys.stdout.write('import people_procincl2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/people_procincl2_sub.py b/tests/people_procincl2_sub.py deleted file mode 100644 index c3b5be6..0000000 --- a/tests/people_procincl2_sub.py +++ /dev/null @@ -1,301 +0,0 @@ -#!/usr/bin/env python - -# -# Generated by generateDS.py. -# - -import sys - -import people_procincl2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# Globals -# - -ExternalEncoding = 'ascii' - -# -# Data representation classes -# - - -class peopleSub(supermod.people): - def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None): - super(peopleSub, self).__init__(comments, person, specialperson, programmer, python_programmer, java_programmer, ) -supermod.people.subclass = peopleSub -# end class peopleSub - - -class commentsSub(supermod.comments): - def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None): - super(commentsSub, self).__init__(emp, bold, valueOf_, mixedclass_, content_, ) -supermod.comments.subclass = commentsSub -# end class commentsSub - - -class personSub(supermod.person): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - super(personSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) -supermod.person.subclass = personSub -# end class personSub - - -class specialpersonSub(supermod.specialperson): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): - super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, ) -supermod.specialperson.subclass = specialpersonSub -# end class specialpersonSub - - -class paramSub(supermod.param): - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - super(paramSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, ) -supermod.param.subclass = paramSub -# end class paramSub - - -class agentSub(supermod.agent): - def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None): - super(agentSub, self).__init__(firstname, lastname, priority, info, vehicle, ) -supermod.agent.subclass = agentSub -# end class agentSub - - -class special_agentSub(supermod.special_agent): - def __init__(self, firstname=None, lastname=None, priority=None, info=None): - super(special_agentSub, self).__init__(firstname, lastname, priority, info, ) -supermod.special_agent.subclass = special_agentSub -# end class special_agentSub - - -class boosterSub(supermod.booster): - def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): - super(boosterSub, self).__init__(member_id, firstname, lastname, other_name, class_, other_value, type_, client_handler, ) -supermod.booster.subclass = boosterSub -# end class boosterSub - - -class infoSub(supermod.info): - def __init__(self, rating=None, type_=None, name=None): - super(infoSub, self).__init__(rating, type_, name, ) -supermod.info.subclass = infoSub -# end class infoSub - - -class vehicleSub(supermod.vehicle): - def __init__(self, wheelcount=None, extensiontype_=None): - super(vehicleSub, self).__init__(wheelcount, extensiontype_, ) -supermod.vehicle.subclass = vehicleSub -# end class vehicleSub - - -class automobileSub(supermod.automobile): - def __init__(self, wheelcount=None, drivername=None): - super(automobileSub, self).__init__(wheelcount, drivername, ) -supermod.automobile.subclass = automobileSub -# end class automobileSub - - -class airplaneSub(supermod.airplane): - def __init__(self, wheelcount=None, pilotname=None): - super(airplaneSub, self).__init__(wheelcount, pilotname, ) -supermod.airplane.subclass = airplaneSub -# end class airplaneSub - - -class programmerSub(supermod.programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) -supermod.programmer.subclass = programmerSub -# end class programmerSub - - -class client_handlerTypeSub(supermod.client_handlerType): - def __init__(self, fullname=None, refid=None): - super(client_handlerTypeSub, self).__init__(fullname, refid, ) -supermod.client_handlerType.subclass = client_handlerTypeSub -# end class client_handlerTypeSub - - -class java_programmerSub(supermod.java_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, ) -supermod.java_programmer.subclass = java_programmerSub -# end class java_programmerSub - - -class python_programmerSub(supermod.python_programmer): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmerSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) -supermod.python_programmer.subclass = python_programmerSub -# end class python_programmerSub - - -def get_root_tag(node): - tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] - rootClass = None - rootClass = supermod.GDSClassesMapping.get(tag) - if rootClass is None and hasattr(supermod, tag): - rootClass = getattr(supermod, tag) - return tag, rootClass - - -def parse(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='') - return rootObj - - -def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = supermod.people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from people_procincl2_sup import *\n\n') -## sys.stdout.write('import people_procincl2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.people(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="people") -## sys.stdout.write(')\n') - return rootObj - - -USAGE_TEXT = """ -Usage: python ???.py <infilename> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def main(): - args = sys.argv[1:] - if len(args) != 1: - usage() - infilename = args[0] - parse(infilename) - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() diff --git a/tests/people_procincl2_sup.py b/tests/people_procincl2_sup.py deleted file mode 100644 index 397274a..0000000 --- a/tests/people_procincl2_sup.py +++ /dev/null @@ -1,3223 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Generated by generateDS.py. -# - -import sys -import getopt -import re as re_ -import base64 -import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# User methods -# -# Calls to the methods in these classes are generated by generateDS.py. -# You can replace these methods by re-implementing the following class -# in a module named generatedssuper.py. - -try: - from generatedssuper import GeneratedsSuper -except ImportError, exp: - - class GeneratedsSuper(object): - tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') - class _FixedOffsetTZ(datetime_.tzinfo): - def __init__(self, offset, name): - self.__offset = datetime_.timedelta(minutes=offset) - self.__name = name - def utcoffset(self, dt): - return self.__offset - def tzname(self, dt): - return self.__name - def dst(self, dt): - return None - def gds_format_string(self, input_data, input_name=''): - return input_data - def gds_validate_string(self, input_data, node, input_name=''): - return input_data - def gds_format_base64(self, input_data, input_name=''): - return base64.b64encode(input_data) - def gds_validate_base64(self, input_data, node, input_name=''): - return input_data - def gds_format_integer(self, input_data, input_name=''): - return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): - return input_data - def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of integers') - return input_data - def gds_format_float(self, input_data, input_name=''): - return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): - return input_data - def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of floats') - return input_data - def gds_format_double(self, input_data, input_name=''): - return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): - return input_data - def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of doubles') - return input_data - def gds_format_boolean(self, input_data, input_name=''): - return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): - return input_data - def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - if value not in ('true', '1', 'false', '0', ): - raise_parse_error( - node, - 'Requires sequence of booleans ' - '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): - return input_data - def gds_format_datetime(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ('%f' % (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_datetime(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime( - input_data, '%Y-%m-%dT%H:%M:%S.%f') - else: - dt = datetime_.datetime.strptime( - input_data, '%Y-%m-%dT%H:%M:%S') - dt = dt.replace(tzinfo=tz) - return dt - def gds_validate_date(self, input_data, node, input_name=''): - return input_data - def gds_format_date(self, input_data, input_name=''): - _svalue = '%04d-%02d-%02d' % ( - input_data.year, - input_data.month, - input_data.day, - ) - try: - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - except AttributeError: - pass - return _svalue - @classmethod - def gds_parse_date(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') - dt = dt.replace(tzinfo=tz) - return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): - return input_data - def gds_format_time(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%02d:%02d:%02d' % ( - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%02d:%02d:%02d.%s' % ( - input_data.hour, - input_data.minute, - input_data.second, - ('%f' % (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_time(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') - else: - dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') - dt = dt.replace(tzinfo=tz) - return dt.time() - def gds_str_lower(self, instring): - return instring.lower() - def get_path_(self, node): - path_list = [] - self.get_path_list_(node, path_list) - path_list.reverse() - path = '/'.join(path_list) - return path - Tag_strip_pattern_ = re_.compile(r'\{.*\}') - def get_path_list_(self, node, path_list): - if node is None: - return - tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) - if tag: - path_list.append(tag) - self.get_path_list_(node.getparent(), path_list) - def get_class_obj_(self, node, default_class=None): - class_obj1 = default_class - if 'xsi' in node.nsmap: - classname = node.get('{%s}type' % node.nsmap['xsi']) - if classname is not None: - names = classname.split(':') - if len(names) == 2: - classname = names[1] - class_obj2 = globals().get(classname) - if class_obj2 is not None: - class_obj1 = class_obj2 - return class_obj1 - def gds_build_any(self, node, type_name=None): - return None - @classmethod - def gds_reverse_node_mapping(cls, mapping): - return dict(((v, k) for k, v in mapping.iteritems())) - - -# -# If you have installed IPython you can uncomment and use the following. -# IPython is available from http://ipython.scipy.org/. -# - -## from IPython.Shell import IPShellEmbed -## args = '' -## ipshell = IPShellEmbed(args, -## banner = 'Dropping into IPython', -## exit_msg = 'Leaving Interpreter, back to program.') - -# Then use the following line where and when you want to drop into the -# IPython shell: -# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') - -# -# Globals -# - -ExternalEncoding = 'ascii' -Tag_pattern_ = re_.compile(r'({.*})?(.*)') -String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") -Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') - -# -# Support/utility functions. -# - - -def showIndent(outfile, level, pretty_print=True): - if pretty_print: - for idx in range(level): - outfile.write(' ') - - -def quote_xml(inStr): - if not inStr: - return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - return s1 - - -def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - if '"' in s1: - if "'" in s1: - s1 = '"%s"' % s1.replace('"', """) - else: - s1 = "'%s'" % s1 - else: - s1 = '"%s"' % s1 - return s1 - - -def quote_python(inStr): - s1 = inStr - if s1.find("'") == -1: - if s1.find('\n') == -1: - return "'%s'" % s1 - else: - return "'''%s'''" % s1 - else: - if s1.find('"') != -1: - s1 = s1.replace('"', '\\"') - if s1.find('\n') == -1: - return '"%s"' % s1 - else: - return '"""%s"""' % s1 - - -def get_all_text_(node): - if node.text is not None: - text = node.text - else: - text = '' - for child in node: - if child.tail is not None: - text += child.tail - return text - - -def find_attr_value_(attr_name, node): - attrs = node.attrib - attr_parts = attr_name.split(':') - value = None - if len(attr_parts) == 1: - value = attrs.get(attr_name) - elif len(attr_parts) == 2: - prefix, name = attr_parts - namespace = node.nsmap.get(prefix) - if namespace is not None: - value = attrs.get('{%s}%s' % (namespace, name, )) - return value - - -class GDSParseError(Exception): - pass - - -def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) - raise GDSParseError(msg) - - -class MixedContainer: - # Constants for category: - CategoryNone = 0 - CategoryText = 1 - CategorySimple = 2 - CategoryComplex = 3 - # Constants for content_type: - TypeNone = 0 - TypeText = 1 - TypeString = 2 - TypeInteger = 3 - TypeFloat = 4 - TypeDecimal = 5 - TypeDouble = 6 - TypeBoolean = 7 - TypeBase64 = 8 - def __init__(self, category, content_type, name, value): - self.category = category - self.content_type = content_type - self.name = name - self.value = value - def getCategory(self): - return self.category - def getContenttype(self, content_type): - return self.content_type - def getValue(self): - return self.value - def getName(self): - return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - outfile.write(self.value) - elif self.category == MixedContainer.CategorySimple: - self.exportSimple(outfile, level, name) - else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) - def exportSimple(self, outfile, level, name): - if self.content_type == MixedContainer.TypeString: - outfile.write('<%s>%s</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeInteger or \ - self.content_type == MixedContainer.TypeBoolean: - outfile.write('<%s>%d</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeFloat or \ - self.content_type == MixedContainer.TypeDecimal: - outfile.write('<%s>%f</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeDouble: - outfile.write('<%s>%g</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeBase64: - outfile.write('<%s>%s</%s>' % ( - self.name, base64.b64encode(self.value), self.name)) - def to_etree(self, element): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - if len(element) > 0: - if element[-1].tail is None: - element[-1].tail = self.value - else: - element[-1].tail += self.value - else: - if element.text is None: - element.text = self.value - else: - element.text += self.value - elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) - subelement.text = self.to_etree_simple() - else: # category == MixedContainer.CategoryComplex - self.value.to_etree(element) - def to_etree_simple(self): - if self.content_type == MixedContainer.TypeString: - text = self.value - elif (self.content_type == MixedContainer.TypeInteger or - self.content_type == MixedContainer.TypeBoolean): - text = '%d' % self.value - elif (self.content_type == MixedContainer.TypeFloat or - self.content_type == MixedContainer.TypeDecimal): - text = '%f' % self.value - elif self.content_type == MixedContainer.TypeDouble: - text = '%g' % self.value - elif self.content_type == MixedContainer.TypeBase64: - text = '%s' % base64.b64encode(self.value) - return text - def exportLiteral(self, outfile, level, name): - if self.category == MixedContainer.CategoryText: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) - elif self.category == MixedContainer.CategorySimple: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) - else: # category == MixedContainer.CategoryComplex - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s",\n' % ( - self.category, self.content_type, self.name,)) - self.value.exportLiteral(outfile, level + 1) - showIndent(outfile, level) - outfile.write(')\n') - - -class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0): - self.name = name - self.data_type = data_type - self.container = container - def set_name(self, name): self.name = name - def get_name(self): return self.name - def set_data_type(self, data_type): self.data_type = data_type - def get_data_type_chain(self): return self.data_type - def get_data_type(self): - if isinstance(self.data_type, list): - if len(self.data_type) > 0: - return self.data_type[-1] - else: - return 'xs:string' - else: - return self.data_type - def set_container(self, container): self.container = container - def get_container(self): return self.container - - -def _cast(typ, value): - if typ is None or value is None: - return value - return typ(value) - -# -# Data representation classes. -# - - -class people(GeneratedsSuper): - """A list of people.""" - member_data_items_ = [ - MemberSpec_('comments', 'comments', 1), - MemberSpec_('person', 'person', 1), - MemberSpec_('specialperson', 'specialperson', 1), - MemberSpec_('programmer', 'programmer', 1), - MemberSpec_('python_programmer', 'python-programmer', 1), - MemberSpec_('java_programmer', 'java-programmer', 1), - ] - subclass = None - superclass = None - def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None): - if comments is None: - self.comments = [] - else: - self.comments = comments - if person is None: - self.person = [] - else: - self.person = person - if specialperson is None: - self.specialperson = [] - else: - self.specialperson = specialperson - if programmer is None: - self.programmer = [] - else: - self.programmer = programmer - if python_programmer is None: - self.python_programmer = [] - else: - self.python_programmer = python_programmer - if java_programmer is None: - self.java_programmer = [] - else: - self.java_programmer = java_programmer - def factory(*args_, **kwargs_): - if people.subclass: - return people.subclass(*args_, **kwargs_) - else: - return people(*args_, **kwargs_) - factory = staticmethod(factory) - def get_comments(self): return self.comments - def set_comments(self, comments): self.comments = comments - def add_comments(self, value): self.comments.append(value) - def insert_comments(self, index, value): self.comments[index] = value - def get_person(self): return self.person - def set_person(self, person): self.person = person - def add_person(self, value): self.person.append(value) - def insert_person(self, index, value): self.person[index] = value - def get_specialperson(self): return self.specialperson - def set_specialperson(self, specialperson): self.specialperson = specialperson - def add_specialperson(self, value): self.specialperson.append(value) - def insert_specialperson(self, index, value): self.specialperson[index] = value - def get_programmer(self): return self.programmer - def set_programmer(self, programmer): self.programmer = programmer - def add_programmer(self, value): self.programmer.append(value) - def insert_programmer(self, index, value): self.programmer[index] = value - def get_python_programmer(self): return self.python_programmer - def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer - def add_python_programmer(self, value): self.python_programmer.append(value) - def insert_python_programmer(self, index, value): self.python_programmer[index] = value - def get_java_programmer(self): return self.java_programmer - def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer - def add_java_programmer(self, value): self.java_programmer.append(value) - def insert_java_programmer(self, index, value): self.java_programmer[index] = value - def hasContent_(self): - if ( - self.comments or - self.person or - self.specialperson or - self.programmer or - self.python_programmer or - self.java_programmer - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='people', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='people') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='people'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='people', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - for comments_ in self.comments: - comments_.export(outfile, level, namespace_, name_='comments', pretty_print=pretty_print) - for person_ in self.person: - person_.export(outfile, level, namespace_, name_='person', pretty_print=pretty_print) - for specialperson_ in self.specialperson: - specialperson_.export(outfile, level, namespace_, name_='specialperson', pretty_print=pretty_print) - for programmer_ in self.programmer: - programmer_.export(outfile, level, namespace_, name_='programmer', pretty_print=pretty_print) - for python_programmer_ in self.python_programmer: - python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print) - for java_programmer_ in self.java_programmer: - java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='people'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('comments=[\n') - level += 1 - for comments_ in self.comments: - showIndent(outfile, level) - outfile.write('model_.comments(\n') - comments_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('person=[\n') - level += 1 - for person_ in self.person: - showIndent(outfile, level) - outfile.write('model_.person(\n') - person_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('specialperson=[\n') - level += 1 - for specialperson_ in self.specialperson: - showIndent(outfile, level) - outfile.write('model_.specialperson(\n') - specialperson_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('programmer=[\n') - level += 1 - for programmer_ in self.programmer: - showIndent(outfile, level) - outfile.write('model_.programmer(\n') - programmer_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('python_programmer=[\n') - level += 1 - for python_programmer_ in self.python_programmer: - showIndent(outfile, level) - outfile.write('model_.python_programmer(\n') - python_programmer_.exportLiteral(outfile, level, name_='python-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('java_programmer=[\n') - level += 1 - for java_programmer_ in self.java_programmer: - showIndent(outfile, level) - outfile.write('model_.java_programmer(\n') - java_programmer_.exportLiteral(outfile, level, name_='java-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'comments': - obj_ = comments.factory() - obj_.build(child_) - self.comments.append(obj_) - elif nodeName_ == 'person': - class_obj_ = self.get_class_obj_(child_, person) - obj_ = class_obj_.factory() - obj_.build(child_) - self.person.append(obj_) - elif nodeName_ == 'specialperson': - obj_ = specialperson.factory() - obj_.build(child_) - self.specialperson.append(obj_) - elif nodeName_ == 'programmer': - class_obj_ = self.get_class_obj_(child_, programmer) - obj_ = class_obj_.factory() - obj_.build(child_) - self.programmer.append(obj_) - elif nodeName_ == 'python-programmer': - obj_ = python_programmer.factory() - obj_.build(child_) - self.python_programmer.append(obj_) - elif nodeName_ == 'java-programmer': - obj_ = java_programmer.factory() - obj_.build(child_) - self.java_programmer.append(obj_) -# end class people - - -class comments(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('emp', 'xs:string', 1), - MemberSpec_('bold', 'xs:string', 1), - MemberSpec_('valueOf_', [], 0), - ] - subclass = None - superclass = None - def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None): - if emp is None: - self.emp = [] - else: - self.emp = emp - if bold is None: - self.bold = [] - else: - self.bold = bold - self.valueOf_ = valueOf_ - if mixedclass_ is None: - self.mixedclass_ = MixedContainer - else: - self.mixedclass_ = mixedclass_ - if content_ is None: - self.content_ = [] - else: - self.content_ = content_ - self.valueOf_ = valueOf_ - def factory(*args_, **kwargs_): - if comments.subclass: - return comments.subclass(*args_, **kwargs_) - else: - return comments(*args_, **kwargs_) - factory = staticmethod(factory) - def get_emp(self): return self.emp - def set_emp(self, emp): self.emp = emp - def add_emp(self, value): self.emp.append(value) - def insert_emp(self, index, value): self.emp[index] = value - def get_bold(self): return self.bold - def set_bold(self, bold): self.bold = bold - def add_bold(self, value): self.bold.append(value) - def insert_bold(self, index, value): self.bold[index] = value - def get_valueOf_(self): return self.valueOf_ - def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ - def hasContent_(self): - if ( - self.emp or - self.bold or - self.valueOf_ - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='comments', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='comments'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='comments', fromsubclass_=False, pretty_print=True): - if not fromsubclass_: - for item_ in self.content_: - item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='comments'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - self.valueOf_ = get_all_text_(node) - if node.text is not None: - obj_ = self.mixedclass_(MixedContainer.CategoryText, - MixedContainer.TypeNone, '', node.text) - self.content_.append(obj_) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'emp' and child_.text is not None: - valuestr_ = child_.text - obj_ = self.mixedclass_(MixedContainer.CategorySimple, - MixedContainer.TypeString, 'emp', valuestr_) - self.content_.append(obj_) - elif nodeName_ == 'bold' and child_.text is not None: - valuestr_ = child_.text - obj_ = self.mixedclass_(MixedContainer.CategorySimple, - MixedContainer.TypeString, 'bold', valuestr_) - self.content_.append(obj_) - if not fromsubclass_ and child_.tail is not None: - obj_ = self.mixedclass_(MixedContainer.CategoryText, - MixedContainer.TypeNone, '', child_.tail) - self.content_.append(obj_) -# end class comments - - -class person(GeneratedsSuper): - """A generic person. This is the base for a number of different kinds - of people. They are each an extension of this base type of - person.""" - member_data_items_ = [ - MemberSpec_('vegetable', 'xs:string', 0), - MemberSpec_('fruit', 'xs:string', 0), - MemberSpec_('ratio', 'xs:float', 0), - MemberSpec_('id', 'xs:integer', 0), - MemberSpec_('value', 'xs:string', 0), - MemberSpec_('name', 'xs:string', 0), - MemberSpec_('interest', 'xs:string', 1), - MemberSpec_('category', 'xs:integer', 0), - MemberSpec_('agent', 'agent', 1), - MemberSpec_('promoter', 'booster', 1), - MemberSpec_('description', 'xs:string', 0), - ] - subclass = None - superclass = None - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - self.vegetable = _cast(None, vegetable) - self.fruit = _cast(None, fruit) - self.ratio = _cast(float, ratio) - self.id = _cast(int, id) - self.value = _cast(None, value) - self.name = name - if interest is None: - self.interest = [] - else: - self.interest = interest - self.category = category - if agent is None: - self.agent = [] - else: - self.agent = agent - if promoter is None: - self.promoter = [] - else: - self.promoter = promoter - self.description = description - self.extensiontype_ = extensiontype_ - def factory(*args_, **kwargs_): - if person.subclass: - return person.subclass(*args_, **kwargs_) - else: - return person(*args_, **kwargs_) - factory = staticmethod(factory) - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_interest(self): return self.interest - def set_interest(self, interest): self.interest = interest - def add_interest(self, value): self.interest.append(value) - def insert_interest(self, index, value): self.interest[index] = value - def get_category(self): return self.category - def set_category(self, category): self.category = category - def get_agent(self): return self.agent - def set_agent(self, agent): self.agent = agent - def add_agent(self, value): self.agent.append(value) - def insert_agent(self, index, value): self.agent[index] = value - def get_promoter(self): return self.promoter - def set_promoter(self, promoter): self.promoter = promoter - def add_promoter(self, value): self.promoter.append(value) - def insert_promoter(self, index, value): self.promoter[index] = value - def get_description(self): return self.description - def set_description(self, description): self.description = description - def get_vegetable(self): return self.vegetable - def set_vegetable(self, vegetable): self.vegetable = vegetable - def get_fruit(self): return self.fruit - def set_fruit(self, fruit): self.fruit = fruit - def get_ratio(self): return self.ratio - def set_ratio(self, ratio): self.ratio = ratio - def get_id(self): return self.id - def set_id(self, id): self.id = id - def get_value(self): return self.value - def set_value(self, value): self.value = value - def get_extensiontype_(self): return self.extensiontype_ - def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ - def hasContent_(self): - if ( - self.name is not None or - self.interest or - self.category is not None or - self.agent or - self.promoter or - self.description is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='person', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='person') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), )) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), )) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id')) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), )) - if self.extensiontype_ is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') - outfile.write(' xsi:type="%s"' % self.extensiontype_) - def exportChildren(self, outfile, level, namespace_='', name_='person', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.name is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) - for interest_ in self.interest: - showIndent(outfile, level, pretty_print) - outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_)) - if self.category is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_)) - for agent_ in self.agent: - agent_.export(outfile, level, namespace_, name_='agent', pretty_print=pretty_print) - for promoter_ in self.promoter: - promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print) - if self.description is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='person'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - showIndent(outfile, level) - outfile.write('vegetable="%s",\n' % (self.vegetable,)) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - showIndent(outfile, level) - outfile.write('fruit="%s",\n' % (self.fruit,)) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - showIndent(outfile, level) - outfile.write('ratio=%f,\n' % (self.ratio,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id=%d,\n' % (self.id,)) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - showIndent(outfile, level) - outfile.write('value="%s",\n' % (self.value,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('interest=[\n') - level += 1 - for interest_ in self.interest: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%d,\n' % self.category) - showIndent(outfile, level) - outfile.write('agent=[\n') - level += 1 - for agent_ in self.agent: - showIndent(outfile, level) - outfile.write('model_.agent(\n') - agent_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('promoter=[\n') - level += 1 - for promoter_ in self.promoter: - showIndent(outfile, level) - outfile.write('model_.booster(\n') - promoter_.exportLiteral(outfile, level, name_='booster') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('vegetable', node) - if value is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - self.vegetable = value - value = find_attr_value_('fruit', node) - if value is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - self.fruit = value - value = find_attr_value_('ratio', node) - if value is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - try: - self.ratio = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (ratio): %s' % exp) - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - try: - self.id = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value', node) - if value is not None and 'value' not in already_processed: - already_processed.add('value') - self.value = value - value = find_attr_value_('xsi:type', node) - if value is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - self.extensiontype_ = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'name': - name_ = child_.text - name_ = self.gds_validate_string(name_, node, 'name') - self.name = name_ - elif nodeName_ == 'interest': - interest_ = child_.text - interest_ = self.gds_validate_string(interest_, node, 'interest') - self.interest.append(interest_) - elif nodeName_ == 'category': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'category') - self.category = ival_ - elif nodeName_ == 'agent': - obj_ = agent.factory() - obj_.build(child_) - self.agent.append(obj_) - elif nodeName_ == 'promoter': - obj_ = booster.factory() - obj_.build(child_) - self.promoter.append(obj_) - elif nodeName_ == 'description': - description_ = child_.text - description_ = self.gds_validate_string(description_, node, 'description') - self.description = description_ -# end class person - - -class specialperson(person): - member_data_items_ = [ - ] - subclass = None - superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None): - super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, ) - pass - def factory(*args_, **kwargs_): - if specialperson.subclass: - return specialperson.subclass(*args_, **kwargs_) - else: - return specialperson(*args_, **kwargs_) - factory = staticmethod(factory) - def hasContent_(self): - if ( - super(specialperson, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='specialperson', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='specialperson'): - super(specialperson, self).exportAttributes(outfile, level, already_processed, namespace_, name_='specialperson') - def exportChildren(self, outfile, level, namespace_='', name_='specialperson', fromsubclass_=False, pretty_print=True): - super(specialperson, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='specialperson'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(specialperson, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(specialperson, self).exportLiteralChildren(outfile, level, name_) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - super(specialperson, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - super(specialperson, self).buildChildren(child_, node, nodeName_, True) - pass -# end class specialperson - - -class param(GeneratedsSuper): - """Finding flow attribute unneccesary in practice. A unnamed parameter - is unbound/skipped.""" - member_data_items_ = [ - MemberSpec_('semantic', 'xs:token', 0), - MemberSpec_('name', 'xs:NCName', 0), - MemberSpec_('flow', 'FlowType', 0), - MemberSpec_('sid', 'xs:NCName', 0), - MemberSpec_('type', 'xs:NMTOKEN', 0), - MemberSpec_('id', 'xs:string', 0), - MemberSpec_('valueOf_', 'xs:string', 0), - ] - subclass = None - superclass = None - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - self.semantic = _cast(None, semantic) - self.name = _cast(None, name) - self.flow = _cast(None, flow) - self.sid = _cast(None, sid) - self.type_ = _cast(None, type_) - self.id = _cast(None, id) - self.valueOf_ = valueOf_ - def factory(*args_, **kwargs_): - if param.subclass: - return param.subclass(*args_, **kwargs_) - else: - return param(*args_, **kwargs_) - factory = staticmethod(factory) - def get_semantic(self): return self.semantic - def set_semantic(self, semantic): self.semantic = semantic - def get_name(self): return self.name - def set_name(self, name): self.name = name - def get_flow(self): return self.flow - def set_flow(self, flow): self.flow = flow - def get_sid(self): return self.sid - def set_sid(self, sid): self.sid = sid - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ - def get_id(self): return self.id - def set_id(self, id): self.id = id - def get_valueOf_(self): return self.valueOf_ - def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ - def hasContent_(self): - if ( - self.valueOf_ - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='param', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='param') - if self.hasContent_(): - outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), )) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - outfile.write(' name=%s' % (quote_attrib(self.name), )) - if self.flow is not None and 'flow' not in already_processed: - already_processed.add('flow') - outfile.write(' flow=%s' % (quote_attrib(self.flow), )) - if self.sid is not None and 'sid' not in already_processed: - already_processed.add('sid') - outfile.write(' sid=%s' % (quote_attrib(self.sid), )) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), )) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), )) - def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='param'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - showIndent(outfile, level) - outfile.write('semantic="%s",\n' % (self.semantic,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) - if self.flow is not None and 'flow' not in already_processed: - already_processed.add('flow') - showIndent(outfile, level) - outfile.write('flow=%s,\n' % (self.flow,)) - if self.sid is not None and 'sid' not in already_processed: - already_processed.add('sid') - showIndent(outfile, level) - outfile.write('sid="%s",\n' % (self.sid,)) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_="%s",\n' % (self.type_,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id="%s",\n' % (self.id,)) - def exportLiteralChildren(self, outfile, level, name_): - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - self.valueOf_ = get_all_text_(node) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('semantic', node) - if value is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - self.semantic = value - self.semantic = ' '.join(self.semantic.split()) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value - value = find_attr_value_('flow', node) - if value is not None and 'flow' not in already_processed: - already_processed.add('flow') - self.flow = value - value = find_attr_value_('sid', node) - if value is not None and 'sid' not in already_processed: - already_processed.add('sid') - self.sid = value - value = find_attr_value_('type', node) - if value is not None and 'type' not in already_processed: - already_processed.add('type') - self.type_ = value - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - self.id = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - pass -# end class param - - -class agent(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('firstname', 'xs:string', 0), - MemberSpec_('lastname', 'xs:string', 0), - MemberSpec_('priority', 'xs:float', 0), - MemberSpec_('info', 'info', 0), - MemberSpec_('vehicle', 'vehicle', 1), - ] - subclass = None - superclass = None - def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None): - self.firstname = firstname - self.lastname = lastname - self.priority = priority - self.info = info - if vehicle is None: - self.vehicle = [] - else: - self.vehicle = vehicle - def factory(*args_, **kwargs_): - if agent.subclass: - return agent.subclass(*args_, **kwargs_) - else: - return agent(*args_, **kwargs_) - factory = staticmethod(factory) - def get_firstname(self): return self.firstname - def set_firstname(self, firstname): self.firstname = firstname - def get_lastname(self): return self.lastname - def set_lastname(self, lastname): self.lastname = lastname - def get_priority(self): return self.priority - def set_priority(self, priority): self.priority = priority - def get_info(self): return self.info - def set_info(self, info): self.info = info - def get_vehicle(self): return self.vehicle - def set_vehicle(self, vehicle): self.vehicle = vehicle - def add_vehicle(self, value): self.vehicle.append(value) - def insert_vehicle(self, index, value): self.vehicle[index] = value - def hasContent_(self): - if ( - self.firstname is not None or - self.lastname is not None or - self.priority is not None or - self.info is not None or - self.vehicle - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='agent', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='agent'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='agent', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.firstname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) - if self.lastname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) - if self.priority is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) - if self.info is not None: - self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) - for vehicle_ in self.vehicle: - vehicle_.export(outfile, level, namespace_, name_='vehicle', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - showIndent(outfile, level) - outfile.write('vehicle=[\n') - level += 1 - for vehicle_ in self.vehicle: - showIndent(outfile, level) - outfile.write('model_.vehicle(\n') - vehicle_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'firstname': - firstname_ = child_.text - firstname_ = self.gds_validate_string(firstname_, node, 'firstname') - self.firstname = firstname_ - elif nodeName_ == 'lastname': - lastname_ = child_.text - lastname_ = self.gds_validate_string(lastname_, node, 'lastname') - self.lastname = lastname_ - elif nodeName_ == 'priority': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'priority') - self.priority = fval_ - elif nodeName_ == 'info': - obj_ = info.factory() - obj_.build(child_) - self.info = obj_ - elif nodeName_ == 'vehicle': - type_name_ = child_.attrib.get( - '{http://www.w3.org/2001/XMLSchema-instance}type') - if type_name_ is None: - type_name_ = child_.attrib.get('type') - if type_name_ is not None: - type_names_ = type_name_.split(':') - if len(type_names_) == 1: - type_name_ = type_names_[0] - else: - type_name_ = type_names_[1] - class_ = globals()[type_name_] - obj_ = class_.factory() - obj_.build(child_) - else: - raise NotImplementedError( - 'Class not implemented for <vehicle> element') - self.vehicle.append(obj_) -# end class agent - - -class special_agent(GeneratedsSuper): - """This is a good kind of agent for testing the generation of Python - bindings for an XML schema.""" - member_data_items_ = [ - MemberSpec_('firstname', 'xs:string', 0), - MemberSpec_('lastname', 'xs:string', 0), - MemberSpec_('priority', 'xs:float', 0), - MemberSpec_('info', 'info', 0), - ] - subclass = None - superclass = None - def __init__(self, firstname=None, lastname=None, priority=None, info=None): - self.firstname = firstname - self.lastname = lastname - self.priority = priority - self.info = info - def factory(*args_, **kwargs_): - if special_agent.subclass: - return special_agent.subclass(*args_, **kwargs_) - else: - return special_agent(*args_, **kwargs_) - factory = staticmethod(factory) - def get_firstname(self): return self.firstname - def set_firstname(self, firstname): self.firstname = firstname - def get_lastname(self): return self.lastname - def set_lastname(self, lastname): self.lastname = lastname - def get_priority(self): return self.priority - def set_priority(self, priority): self.priority = priority - def get_info(self): return self.info - def set_info(self, info): self.info = info - def hasContent_(self): - if ( - self.firstname is not None or - self.lastname is not None or - self.priority is not None or - self.info is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='special-agent', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='special-agent'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='special-agent', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.firstname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) - if self.lastname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) - if self.priority is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) - if self.info is not None: - self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='special-agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'firstname': - firstname_ = child_.text - firstname_ = self.gds_validate_string(firstname_, node, 'firstname') - self.firstname = firstname_ - elif nodeName_ == 'lastname': - lastname_ = child_.text - lastname_ = self.gds_validate_string(lastname_, node, 'lastname') - self.lastname = lastname_ - elif nodeName_ == 'priority': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'priority') - self.priority = fval_ - elif nodeName_ == 'info': - obj_ = info.factory() - obj_.build(child_) - self.info = obj_ -# end class special_agent - - -class booster(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('member-id', 'xs:string', 0), - MemberSpec_('firstname', 'xs:string', 0), - MemberSpec_('lastname', 'xs:string', 0), - MemberSpec_('other_name', 'xs:float', 0), - MemberSpec_('class_', 'xs:float', 0), - MemberSpec_('other_value', 'xs:float', 1), - MemberSpec_('type_', 'xs:float', 1), - MemberSpec_('client_handler', 'client-handlerType', 1), - ] - subclass = None - superclass = None - def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): - self.member_id = _cast(None, member_id) - self.firstname = firstname - self.lastname = lastname - self.other_name = other_name - self.class_ = class_ - if other_value is None: - self.other_value = [] - else: - self.other_value = other_value - if type_ is None: - self.type_ = [] - else: - self.type_ = type_ - if client_handler is None: - self.client_handler = [] - else: - self.client_handler = client_handler - def factory(*args_, **kwargs_): - if booster.subclass: - return booster.subclass(*args_, **kwargs_) - else: - return booster(*args_, **kwargs_) - factory = staticmethod(factory) - def get_firstname(self): return self.firstname - def set_firstname(self, firstname): self.firstname = firstname - def get_lastname(self): return self.lastname - def set_lastname(self, lastname): self.lastname = lastname - def get_other_name(self): return self.other_name - def set_other_name(self, other_name): self.other_name = other_name - def get_class(self): return self.class_ - def set_class(self, class_): self.class_ = class_ - def get_other_value(self): return self.other_value - def set_other_value(self, other_value): self.other_value = other_value - def add_other_value(self, value): self.other_value.append(value) - def insert_other_value(self, index, value): self.other_value[index] = value - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ - def add_type(self, value): self.type_.append(value) - def insert_type(self, index, value): self.type_[index] = value - def get_client_handler(self): return self.client_handler - def set_client_handler(self, client_handler): self.client_handler = client_handler - def add_client_handler(self, value): self.client_handler.append(value) - def insert_client_handler(self, index, value): self.client_handler[index] = value - def get_member_id(self): return self.member_id - def set_member_id(self, member_id): self.member_id = member_id - def hasContent_(self): - if ( - self.firstname is not None or - self.lastname is not None or - self.other_name is not None or - self.class_ is not None or - self.other_value or - self.type_ or - self.client_handler - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='booster', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='booster'): - if self.member_id is not None and 'member_id' not in already_processed: - already_processed.add('member_id') - outfile.write(' member-id=%s' % (self.gds_format_string(quote_attrib(self.member_id).encode(ExternalEncoding), input_name='member-id'), )) - def exportChildren(self, outfile, level, namespace_='', name_='booster', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.firstname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) - if self.lastname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) - if self.other_name is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_)) - if self.class_ is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sclass>%s</%sclass>%s' % (namespace_, self.gds_format_float(self.class_, input_name='class'), namespace_, eol_)) - for other_value_ in self.other_value: - showIndent(outfile, level, pretty_print) - outfile.write('<%sother-value>%s</%sother-value>%s' % (namespace_, self.gds_format_float(other_value_, input_name='other-value'), namespace_, eol_)) - for type_ in self.type_: - showIndent(outfile, level, pretty_print) - outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_)) - for client_handler_ in self.client_handler: - client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='booster'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.member_id is not None and 'member_id' not in already_processed: - already_processed.add('member_id') - showIndent(outfile, level) - outfile.write('member_id="%s",\n' % (self.member_id,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.other_name is not None: - showIndent(outfile, level) - outfile.write('other_name=%f,\n' % self.other_name) - if self.class_ is not None: - showIndent(outfile, level) - outfile.write('class_=%f,\n' % self.class_) - showIndent(outfile, level) - outfile.write('other_value=[\n') - level += 1 - for other_value_ in self.other_value: - showIndent(outfile, level) - outfile.write('%f,\n' % other_value_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('type_=[\n') - level += 1 - for type_ in self.type_: - showIndent(outfile, level) - outfile.write('%f,\n' % type_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('client_handler=[\n') - level += 1 - for client_handler_ in self.client_handler: - showIndent(outfile, level) - outfile.write('model_.client_handlerType(\n') - client_handler_.exportLiteral(outfile, level, name_='client-handlerType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('member-id', node) - if value is not None and 'member-id' not in already_processed: - already_processed.add('member-id') - self.member_id = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'firstname': - firstname_ = child_.text - firstname_ = self.gds_validate_string(firstname_, node, 'firstname') - self.firstname = firstname_ - elif nodeName_ == 'lastname': - lastname_ = child_.text - lastname_ = self.gds_validate_string(lastname_, node, 'lastname') - self.lastname = lastname_ - elif nodeName_ == 'other-name': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'other_name') - self.other_name = fval_ - elif nodeName_ == 'class': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'class') - self.class_ = fval_ - elif nodeName_ == 'other-value': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'other_value') - self.other_value.append(fval_) - elif nodeName_ == 'type': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'type') - self.type_.append(fval_) - elif nodeName_ == 'client-handler': - obj_ = client_handlerType.factory() - obj_.build(child_) - self.client_handler.append(obj_) -# end class booster - - -class info(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('rating', 'xs:float', 0), - MemberSpec_('type', 'xs:integer', 0), - MemberSpec_('name', 'xs:string', 0), - ] - subclass = None - superclass = None - def __init__(self, rating=None, type_=None, name=None): - self.rating = _cast(float, rating) - self.type_ = _cast(int, type_) - self.name = _cast(None, name) - pass - def factory(*args_, **kwargs_): - if info.subclass: - return info.subclass(*args_, **kwargs_) - else: - return info(*args_, **kwargs_) - factory = staticmethod(factory) - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ - def get_name(self): return self.name - def set_name(self, name): self.name = name - def hasContent_(self): - if ( - - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='info', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='info') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') - outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type')) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), )) - def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='info'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') - showIndent(outfile, level) - outfile.write('rating=%f,\n' % (self.rating,)) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_=%d,\n' % (self.type_,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) - def exportLiteralChildren(self, outfile, level, name_): - pass - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('rating', node) - if value is not None and 'rating' not in already_processed: - already_processed.add('rating') - try: - self.rating = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (rating): %s' % exp) - value = find_attr_value_('type', node) - if value is not None and 'type' not in already_processed: - already_processed.add('type') - try: - self.type_ = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - pass -# end class info - - -class vehicle(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('wheelcount', 'xs:integer', 0), - ] - subclass = None - superclass = None - def __init__(self, wheelcount=None, extensiontype_=None): - self.wheelcount = wheelcount - self.extensiontype_ = extensiontype_ - def factory(*args_, **kwargs_): - if vehicle.subclass: - return vehicle.subclass(*args_, **kwargs_) - else: - return vehicle(*args_, **kwargs_) - factory = staticmethod(factory) - def get_wheelcount(self): return self.wheelcount - def set_wheelcount(self, wheelcount): self.wheelcount = wheelcount - def get_extensiontype_(self): return self.extensiontype_ - def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ - def hasContent_(self): - if ( - self.wheelcount is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='vehicle', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='vehicle') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='vehicle'): - if self.extensiontype_ is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') - outfile.write(' xsi:type="%s"' % self.extensiontype_) - pass - def exportChildren(self, outfile, level, namespace_='', name_='vehicle', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.wheelcount is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%swheelcount>%s</%swheelcount>%s' % (namespace_, self.gds_format_integer(self.wheelcount, input_name='wheelcount'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='vehicle'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.wheelcount is not None: - showIndent(outfile, level) - outfile.write('wheelcount=%d,\n' % self.wheelcount) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('xsi:type', node) - if value is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - self.extensiontype_ = value - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'wheelcount': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'wheelcount') - self.wheelcount = ival_ -# end class vehicle - - -class automobile(vehicle): - member_data_items_ = [ - MemberSpec_('drivername', 'xs:string', 0), - ] - subclass = None - superclass = vehicle - def __init__(self, wheelcount=None, drivername=None): - super(automobile, self).__init__(wheelcount, ) - self.drivername = drivername - def factory(*args_, **kwargs_): - if automobile.subclass: - return automobile.subclass(*args_, **kwargs_) - else: - return automobile(*args_, **kwargs_) - factory = staticmethod(factory) - def get_drivername(self): return self.drivername - def set_drivername(self, drivername): self.drivername = drivername - def hasContent_(self): - if ( - self.drivername is not None or - super(automobile, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='automobile', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='automobile') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='automobile'): - super(automobile, self).exportAttributes(outfile, level, already_processed, namespace_, name_='automobile') - def exportChildren(self, outfile, level, namespace_='', name_='automobile', fromsubclass_=False, pretty_print=True): - super(automobile, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.drivername is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdrivername>%s</%sdrivername>%s' % (namespace_, self.gds_format_string(quote_xml(self.drivername).encode(ExternalEncoding), input_name='drivername'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='automobile'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(automobile, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(automobile, self).exportLiteralChildren(outfile, level, name_) - if self.drivername is not None: - showIndent(outfile, level) - outfile.write('drivername=%s,\n' % quote_python(self.drivername).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - super(automobile, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'drivername': - drivername_ = child_.text - drivername_ = self.gds_validate_string(drivername_, node, 'drivername') - self.drivername = drivername_ - super(automobile, self).buildChildren(child_, node, nodeName_, True) -# end class automobile - - -class airplane(vehicle): - member_data_items_ = [ - MemberSpec_('pilotname', 'xs:string', 0), - ] - subclass = None - superclass = vehicle - def __init__(self, wheelcount=None, pilotname=None): - super(airplane, self).__init__(wheelcount, ) - self.pilotname = pilotname - def factory(*args_, **kwargs_): - if airplane.subclass: - return airplane.subclass(*args_, **kwargs_) - else: - return airplane(*args_, **kwargs_) - factory = staticmethod(factory) - def get_pilotname(self): return self.pilotname - def set_pilotname(self, pilotname): self.pilotname = pilotname - def hasContent_(self): - if ( - self.pilotname is not None or - super(airplane, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='airplane', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='airplane') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='airplane'): - super(airplane, self).exportAttributes(outfile, level, already_processed, namespace_, name_='airplane') - def exportChildren(self, outfile, level, namespace_='', name_='airplane', fromsubclass_=False, pretty_print=True): - super(airplane, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.pilotname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%spilotname>%s</%spilotname>%s' % (namespace_, self.gds_format_string(quote_xml(self.pilotname).encode(ExternalEncoding), input_name='pilotname'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='airplane'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(airplane, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(airplane, self).exportLiteralChildren(outfile, level, name_) - if self.pilotname is not None: - showIndent(outfile, level) - outfile.write('pilotname=%s,\n' % quote_python(self.pilotname).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - super(airplane, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'pilotname': - pilotname_ = child_.text - pilotname_ = self.gds_validate_string(pilotname_, node, 'pilotname') - self.pilotname = pilotname_ - super(airplane, self).buildChildren(child_, node, nodeName_, True) -# end class airplane - - -class programmer(person): - """A programmer type of person. Programmers are very special but also a - little shy.""" - member_data_items_ = [ - MemberSpec_('language', 'xs:string', 0), - MemberSpec_('area', 'xs:string', 0), - MemberSpec_('attrnegint', 'xs:negativeInteger', 0), - MemberSpec_('attrposint', 'xs:positiveInteger', 0), - MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), - MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0), - MemberSpec_('email', 'xs:string', 0), - MemberSpec_('elposint', 'xs:positiveInteger', 0), - MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0), - MemberSpec_('elnegint', 'xs:negativeInteger', 0), - MemberSpec_('elnonnegint', 'xs:nonNegativeInteger', 0), - MemberSpec_('eldate', 'xs:date', 0), - MemberSpec_('eltoken', 'xs:token', 0), - MemberSpec_('elshort', 'xs:short', 0), - MemberSpec_('ellong', 'xs:long', 0), - MemberSpec_('elparam', 'param', 0), - MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0), - ] - subclass = None - superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) - self.language = _cast(None, language) - self.area = _cast(None, area) - self.attrnegint = _cast(int, attrnegint) - self.attrposint = _cast(int, attrposint) - self.attrnonnegint = _cast(int, attrnonnegint) - self.attrnonposint = _cast(int, attrnonposint) - self.email = email - self.elposint = elposint - self.elnonposint = elnonposint - self.elnegint = elnegint - self.elnonnegint = elnonnegint - if isinstance(eldate, basestring): - initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date() - else: - initvalue_ = eldate - self.eldate = initvalue_ - self.eltoken = eltoken - self.elshort = elshort - self.ellong = ellong - self.elparam = elparam - self.elarraytypes = elarraytypes - self.extensiontype_ = extensiontype_ - def factory(*args_, **kwargs_): - if programmer.subclass: - return programmer.subclass(*args_, **kwargs_) - else: - return programmer(*args_, **kwargs_) - factory = staticmethod(factory) - def get_email(self): return self.email - def set_email(self, email): self.email = email - def get_elposint(self): return self.elposint - def set_elposint(self, elposint): self.elposint = elposint - def get_elnonposint(self): return self.elnonposint - def set_elnonposint(self, elnonposint): self.elnonposint = elnonposint - def get_elnegint(self): return self.elnegint - def set_elnegint(self, elnegint): self.elnegint = elnegint - def get_elnonnegint(self): return self.elnonnegint - def set_elnonnegint(self, elnonnegint): self.elnonnegint = elnonnegint - def get_eldate(self): return self.eldate - def set_eldate(self, eldate): self.eldate = eldate - def get_eltoken(self): return self.eltoken - def set_eltoken(self, eltoken): self.eltoken = eltoken - def get_elshort(self): return self.elshort - def set_elshort(self, elshort): self.elshort = elshort - def get_ellong(self): return self.ellong - def set_ellong(self, ellong): self.ellong = ellong - def get_elparam(self): return self.elparam - def set_elparam(self, elparam): self.elparam = elparam - def get_elarraytypes(self): return self.elarraytypes - def set_elarraytypes(self, elarraytypes): self.elarraytypes = elarraytypes - def get_language(self): return self.language - def set_language(self, language): self.language = language - def get_area(self): return self.area - def set_area(self, area): self.area = area - def get_attrnegint(self): return self.attrnegint - def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint - def get_attrposint(self): return self.attrposint - def set_attrposint(self, attrposint): self.attrposint = attrposint - def get_attrnonnegint(self): return self.attrnonnegint - def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint - def get_attrnonposint(self): return self.attrnonposint - def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint - def get_extensiontype_(self): return self.extensiontype_ - def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ - def validate_ArrayTypes(self, value): - # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass - def hasContent_(self): - if ( - self.email is not None or - self.elposint is not None or - self.elnonposint is not None or - self.elnegint is not None or - self.elnonnegint is not None or - self.eldate is not None or - self.eltoken is not None or - self.elshort is not None or - self.ellong is not None or - self.elparam is not None or - self.elarraytypes is not None or - super(programmer, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='programmer', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'): - super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') - if self.language is not None and 'language' not in already_processed: - already_processed.add('language') - outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), )) - if self.area is not None and 'area' not in already_processed: - already_processed.add('area') - outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), )) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) - if self.attrposint is not None and 'attrposint' not in already_processed: - already_processed.add('attrposint') - outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint')) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) - if self.attrnonposint is not None and 'attrnonposint' not in already_processed: - already_processed.add('attrnonposint') - outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint')) - if self.extensiontype_ is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') - outfile.write(' xsi:type="%s"' % self.extensiontype_) - def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True): - super(programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.email is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_)) - if self.elposint is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_)) - if self.elnonposint is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selnonposint>%s</%selnonposint>%s' % (namespace_, self.gds_format_integer(self.elnonposint, input_name='elnonposint'), namespace_, eol_)) - if self.elnegint is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selnegint>%s</%selnegint>%s' % (namespace_, self.gds_format_integer(self.elnegint, input_name='elnegint'), namespace_, eol_)) - if self.elnonnegint is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selnonnegint>%s</%selnonnegint>%s' % (namespace_, self.gds_format_integer(self.elnonnegint, input_name='elnonnegint'), namespace_, eol_)) - if self.eldate is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%seldate>%s</%seldate>%s' % (namespace_, self.gds_format_date(self.eldate, input_name='eldate'), namespace_, eol_)) - if self.eltoken is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_)) - if self.elshort is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_)) - if self.ellong is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sellong>%s</%sellong>%s' % (namespace_, self.gds_format_integer(self.ellong, input_name='ellong'), namespace_, eol_)) - if self.elparam is not None: - self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print) - if self.elarraytypes is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.language is not None and 'language' not in already_processed: - already_processed.add('language') - showIndent(outfile, level) - outfile.write('language="%s",\n' % (self.language,)) - if self.area is not None and 'area' not in already_processed: - already_processed.add('area') - showIndent(outfile, level) - outfile.write('area="%s",\n' % (self.area,)) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - showIndent(outfile, level) - outfile.write('attrnegint=%d,\n' % (self.attrnegint,)) - if self.attrposint is not None and 'attrposint' not in already_processed: - already_processed.add('attrposint') - showIndent(outfile, level) - outfile.write('attrposint=%d,\n' % (self.attrposint,)) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - showIndent(outfile, level) - outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,)) - if self.attrnonposint is not None and 'attrnonposint' not in already_processed: - already_processed.add('attrnonposint') - showIndent(outfile, level) - outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,)) - super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(programmer, self).exportLiteralChildren(outfile, level, name_) - if self.email is not None: - showIndent(outfile, level) - outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding)) - if self.elposint is not None: - showIndent(outfile, level) - outfile.write('elposint=%d,\n' % self.elposint) - if self.elnonposint is not None: - showIndent(outfile, level) - outfile.write('elnonposint=%d,\n' % self.elnonposint) - if self.elnegint is not None: - showIndent(outfile, level) - outfile.write('elnegint=%d,\n' % self.elnegint) - if self.elnonnegint is not None: - showIndent(outfile, level) - outfile.write('elnonnegint=%d,\n' % self.elnonnegint) - if self.eldate is not None: - showIndent(outfile, level) - outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate')) - if self.eltoken is not None: - showIndent(outfile, level) - outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding)) - if self.elshort is not None: - showIndent(outfile, level) - outfile.write('elshort=%d,\n' % self.elshort) - if self.ellong is not None: - showIndent(outfile, level) - outfile.write('ellong=%d,\n' % self.ellong) - if self.elparam is not None: - showIndent(outfile, level) - outfile.write('elparam=model_.param(\n') - self.elparam.exportLiteral(outfile, level, name_='elparam') - showIndent(outfile, level) - outfile.write('),\n') - if self.elarraytypes is not None: - showIndent(outfile, level) - outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('language', node) - if value is not None and 'language' not in already_processed: - already_processed.add('language') - self.language = value - value = find_attr_value_('area', node) - if value is not None and 'area' not in already_processed: - already_processed.add('area') - self.area = value - value = find_attr_value_('attrnegint', node) - if value is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - try: - self.attrnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnegint >= 0: - raise_parse_error(node, 'Invalid NegativeInteger') - value = find_attr_value_('attrposint', node) - if value is not None and 'attrposint' not in already_processed: - already_processed.add('attrposint') - try: - self.attrposint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrposint <= 0: - raise_parse_error(node, 'Invalid PositiveInteger') - value = find_attr_value_('attrnonnegint', node) - if value is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - try: - self.attrnonnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonnegint < 0: - raise_parse_error(node, 'Invalid NonNegativeInteger') - value = find_attr_value_('attrnonposint', node) - if value is not None and 'attrnonposint' not in already_processed: - already_processed.add('attrnonposint') - try: - self.attrnonposint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonposint > 0: - raise_parse_error(node, 'Invalid NonPositiveInteger') - value = find_attr_value_('xsi:type', node) - if value is not None and 'xsi:type' not in already_processed: - already_processed.add('xsi:type') - self.extensiontype_ = value - super(programmer, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'email': - email_ = child_.text - email_ = self.gds_validate_string(email_, node, 'email') - self.email = email_ - elif nodeName_ == 'elposint': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ <= 0: - raise_parse_error(child_, 'requires positiveInteger') - ival_ = self.gds_validate_integer(ival_, node, 'elposint') - self.elposint = ival_ - elif nodeName_ == 'elnonposint': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ > 0: - raise_parse_error(child_, 'requires nonPositiveInteger') - ival_ = self.gds_validate_integer(ival_, node, 'elnonposint') - self.elnonposint = ival_ - elif nodeName_ == 'elnegint': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ >= 0: - raise_parse_error(child_, 'requires negativeInteger') - ival_ = self.gds_validate_integer(ival_, node, 'elnegint') - self.elnegint = ival_ - elif nodeName_ == 'elnonnegint': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - if ival_ < 0: - raise_parse_error(child_, 'requires nonNegativeInteger') - ival_ = self.gds_validate_integer(ival_, node, 'elnonnegint') - self.elnonnegint = ival_ - elif nodeName_ == 'eldate': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.eldate = dval_ - elif nodeName_ == 'eltoken': - eltoken_ = child_.text - eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() - eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken') - self.eltoken = eltoken_ - elif nodeName_ == 'elshort': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'elshort') - self.elshort = ival_ - elif nodeName_ == 'ellong': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'ellong') - self.ellong = ival_ - elif nodeName_ == 'elparam': - obj_ = param.factory() - obj_.build(child_) - self.elparam = obj_ - elif nodeName_ == 'elarraytypes': - elarraytypes_ = child_.text - elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes') - self.elarraytypes = elarraytypes_ - self.validate_ArrayTypes(self.elarraytypes) # validate type ArrayTypes - super(programmer, self).buildChildren(child_, node, nodeName_, True) -# end class programmer - - -class client_handlerType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('fullname', 'xs:string', 0), - MemberSpec_('refid', 'xs:integer', 0), - ] - subclass = None - superclass = None - def __init__(self, fullname=None, refid=None): - self.fullname = fullname - self.refid = refid - def factory(*args_, **kwargs_): - if client_handlerType.subclass: - return client_handlerType.subclass(*args_, **kwargs_) - else: - return client_handlerType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_fullname(self): return self.fullname - def set_fullname(self, fullname): self.fullname = fullname - def get_refid(self): return self.refid - def set_refid(self, refid): self.refid = refid - def hasContent_(self): - if ( - self.fullname is not None or - self.refid is not None - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='client-handlerType', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='client-handlerType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='client-handlerType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.fullname is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_)) - if self.refid is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='client-handlerType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.fullname is not None: - showIndent(outfile, level) - outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding)) - if self.refid is not None: - showIndent(outfile, level) - outfile.write('refid=%d,\n' % self.refid) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'fullname': - fullname_ = child_.text - fullname_ = self.gds_validate_string(fullname_, node, 'fullname') - self.fullname = fullname_ - elif nodeName_ == 'refid': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'refid') - self.refid = ival_ -# end class client_handlerType - - -class java_programmer(programmer): - """A Java programmer type of person. Programmers are very special and - Java programmers are nice also, but not as especially wonderful - as Python programmers, of course.""" - member_data_items_ = [ - MemberSpec_('status', 'xs:string', 0), - MemberSpec_('nick-name', 'xs:string', 0), - MemberSpec_('favorite_editor', 'xs:string', 0), - ] - subclass = None - superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.status = _cast(None, status) - self.nick_name = _cast(None, nick_name) - self.favorite_editor = favorite_editor - def factory(*args_, **kwargs_): - if java_programmer.subclass: - return java_programmer.subclass(*args_, **kwargs_) - else: - return java_programmer(*args_, **kwargs_) - factory = staticmethod(factory) - def get_favorite_editor(self): return self.favorite_editor - def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor - def get_status(self): return self.status - def set_status(self, status): self.status = status - def get_nick_name(self): return self.nick_name - def set_nick_name(self, nick_name): self.nick_name = nick_name - def hasContent_(self): - if ( - self.favorite_editor is not None or - super(java_programmer, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='java-programmer', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'): - super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), )) - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) - def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True): - super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.favorite_editor is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='java-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - showIndent(outfile, level) - outfile.write('status="%s",\n' % (self.status,)) - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(java_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('status', node) - if value is not None and 'status' not in already_processed: - already_processed.add('status') - self.status = value - value = find_attr_value_('nick-name', node) - if value is not None and 'nick-name' not in already_processed: - already_processed.add('nick-name') - self.nick_name = value - super(java_programmer, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'favorite-editor': - favorite_editor_ = child_.text - favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor') - self.favorite_editor = favorite_editor_ - super(java_programmer, self).buildChildren(child_, node, nodeName_, True) -# end class java_programmer - - -class python_programmer(programmer): - """A Python programmer type of person. Programmers are very special and - Python programmers are especially wonderful kinds of people.""" - member_data_items_ = [ - MemberSpec_('nick-name', 'xs:string', 0), - MemberSpec_('favorite_editor', 'xs:string', 0), - ] - subclass = None - superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.nick_name = _cast(None, nick_name) - self.favorite_editor = favorite_editor - def factory(*args_, **kwargs_): - if python_programmer.subclass: - return python_programmer.subclass(*args_, **kwargs_) - else: - return python_programmer(*args_, **kwargs_) - factory = staticmethod(factory) - def get_favorite_editor(self): return self.favorite_editor - def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor - def get_nick_name(self): return self.nick_name - def set_nick_name(self, nick_name): self.nick_name = nick_name - def hasContent_(self): - if ( - self.favorite_editor is not None or - super(python_programmer, self).hasContent_() - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='python-programmer', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'): - super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) - def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True): - super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.favorite_editor is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='python-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(python_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('nick-name', node) - if value is not None and 'nick-name' not in already_processed: - already_processed.add('nick-name') - self.nick_name = value - super(python_programmer, self).buildAttributes(node, attrs, already_processed) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'favorite-editor': - favorite_editor_ = child_.text - favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor') - self.favorite_editor = favorite_editor_ - super(python_programmer, self).buildChildren(child_, node, nodeName_, True) -# end class python_programmer - - -GDSClassesMapping = { - 'client-handler': client_handlerType, - 'elparam': param, - 'promoter': booster, -} - - -USAGE_TEXT = """ -Usage: python <Parser>.py [ -s ] <in_xml_file> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def get_root_tag(node): - tag = Tag_pattern_.match(node.tag).groups()[-1] - rootClass = GDSClassesMapping.get(tag) - if rootClass is None: - rootClass = globals().get(tag) - return tag, rootClass - - -def parse(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_="people", -## namespacedef_='') - return rootObj - - -def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'people' - rootClass = people - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from people_procincl2_sup import *\n\n') -## sys.stdout.write('import people_procincl2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) -## sys.stdout.write(')\n') - return rootObj - - -def main(): - args = sys.argv[1:] - if len(args) == 1: - parse(args[0]) - else: - usage() - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() - - -__all__ = [ - "agent", - "airplane", - "automobile", - "booster", - "client_handlerType", - "comments", - "info", - "java_programmer", - "param", - "people", - "person", - "programmer", - "python_programmer", - "special_agent", - "specialperson", - "vehicle" -] diff --git a/tests/people_procincl_a.xsd b/tests/people_procincl_a.xsd index 6fad497..d637f39 100644 --- a/tests/people_procincl_a.xsd +++ b/tests/people_procincl_a.xsd @@ -5,7 +5,7 @@ <xs:include schemaLocation="people_10b.xsd" /> --> - <xs:include schemaLocation="http://www.rexx.com/~dkuhlman/people_procincl_c.xsd" /> + <xs:include schemaLocation="http://www.davekuhlman.org/people_procincl_c.xsd" /> <xs:element name="comments"> <xs:complexType mixed="true"> diff --git a/tests/prefix_classname.xml b/tests/prefix_classname.xml new file mode 100644 index 0000000..322414c --- /dev/null +++ b/tests/prefix_classname.xml @@ -0,0 +1,118 @@ +<?xml version="1.0"?> +<people> + + <comments>1. This is a <emp>foolish</emp> comment. It is <emp>really</emp> important.</comments> + <comments>2. This is a <emp>silly</emp> comment. It is <emp>very</emp> significant.</comments> + + + <person id="1" value="abcd" ratio="3.2" extraattr="aaa"> + <name>Alberta</name> + <interest>gardening</interest> + <interest>reading</interest> + <category>5</category> + <hot /> + <hot.agent oneattr="bbb" twoattr="ccc"> + <firstname>Paula</firstname> + <lastname>Peterson</lastname> + <priority>4.3</priority> + </hot.agent> + </person> + + <person id="2"> + <name>Bernardo</name> + <interest>programming</interest> + <category>0</category> + <agent> + <firstname>Darren</firstname> + <lastname>Diddly</lastname> + <priority>4.5</priority> + <info name="Albert Abasinian" type="321" rating="5.33"> + Albert is a test for attributes + character content + + *no* element content. + </info> + </agent> + </person> + + <programmer id="2" language="python" area="xml"> + <name>Charles Carlson</name> + <interest>programming</interest> + <category>2233</category> + <description>A very happy programmer</description> + <email>charles@happyprogrammers.com</email> + <agent> + <firstname>Ernest</firstname> + <lastname>Echo</lastname> + <priority>3.8</priority> + <info name="George Gregory" type="321" rating="5.33" /> + </agent> + <elposint>14</elposint> + <elnegint>-12</elnegint> + <elnonnegint>4</elnonnegint> + <elnonposint>0</elnonposint> + <eldate>2005-04-26</eldate> + <eldatetime>2005-04-26T10:11:12</eldatetime> + <eltoken>aa bb cc + dd</eltoken> + <elshort>123</elshort> + <ellong>13241234123412341234</ellong> + <elparam id="id001" name="Davy" semantic="a big semantic"/> + </programmer> + + <person id="3"> + <name>Charlie</name> + <interest>people</interest> + <interest>cats</interest> + <interest>dogs</interest> + <category>8</category> + <promoter> + <firstname>David</firstname> + <lastname>Donaldson</lastname> + <client> + <fullname>Arnold Applebee</fullname> + <refid>10001</refid> + </client> + </promoter> + <promoter> + <firstname>Edward</firstname> + <lastname>Eddleberry</lastname> + <client> + <fullname>Arnold Applebee</fullname> + <refid>10001</refid> + </client> + </promoter> + </person> + + <person id="4" /> + + <python-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd"> + <favorite-editor>jed</favorite-editor> + <name>Darrel Dawson</name> + <interest>hang gliding</interest> + <category>3344</category> + <description>An object-orientated programmer</description> + <email>darrel@happyprogrammers.com</email> + <agent> + <firstname>Harvey</firstname> + <lastname>Hippolite</lastname> + <priority>5.2</priority> + <info name="Harvey Hippolite" type="543" rating="6.55" /> + </agent> + </python-programmer> + + <java-programmer vegetable="tomato" fruit="peach" language="python" area="xml" nick-name="davy" id="232" ratio="8.7" value="abcd"> + <favorite-editor>jed</favorite-editor> + <name>Darrel Dawson</name> + <interest>hang gliding</interest> + <category>3344</category> + <description>An object-orientated programmer</description> + <email>darrel@happyprogrammers.com</email> + <agent> + <firstname>Harvey</firstname> + <lastname>Hippolite</lastname> + <priority>5.2</priority> + <info name="Harvey Hippolite" type="543" rating="6.55" /> + </agent> + </java-programmer> + +</people> + diff --git a/tests/prefix_classname.xsd b/tests/prefix_classname.xsd new file mode 100644 index 0000000..a852025 --- /dev/null +++ b/tests/prefix_classname.xsd @@ -0,0 +1,203 @@ +<?xml version="1.0"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="people"> + <xs:complexType> + <xs:sequence> + <xs:element name="comments" type="comments" maxOccurs="unbounded"/> + <xs:element name="person" maxOccurs="unbounded" type="person"/> + <xs:element name="programmer" maxOccurs="unbounded" type="programmer"/> + <xs:element name="python-programmer" maxOccurs="unbounded" type="python-programmer"/> + <xs:element name="java-programmer" maxOccurs="unbounded" type="java-programmer"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="comments"> + <xs:complexType mixed="true"> + <xs:sequence> + <!-- + <xs:element name="emp" type="xs:string" /> + --> + <xs:element name="emp" type="xs:string" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="person"> + <xs:complexType mixed="0"> + <xs:sequence> + <xs:element name="name" type="xs:string"/> + <xs:element name="interest" type="xs:string" maxOccurs="unbounded" /> + <xs:element name="category" type="xs:integer"/> + <xs:element name="agent" type="agent" maxOccurs="unbounded" /> + <xs:element name="promoter" type="booster" maxOccurs="unbounded" /> + <xs:element name="description" type="xs:string"/> + </xs:sequence> + <xs:attribute name="value" type="xs:ID" /> + <xs:attribute name="id" type="xs:integer" /> + <xs:attribute name="ratio" type="xs:float" /> + <xs:attributeGroup ref="favorites" /> + </xs:complexType> + </xs:element> + + <!-- + <xs:element name="description-a" type="xs:string" substitutionGroup="description" /> + --> + + <xs:element name="programmer"> + <xs:complexType mixed="0"> + <xs:complexContent> + <xs:extension base="person"> + <xs:sequence> + <!-- + <xs:element name="description" type="xs:string"/> + --> + <xs:element name="email" type="xs:string"/> + <xs:element name="elposint" type="xs:positiveInteger"/> + <xs:element name="elnonposint" type="xs:nonPositiveInteger"/> + <xs:element name="elnegint" type="xs:negativeInteger"/> + <xs:element name="elnonnegint" type="xs:nonNegativeInteger"/> + <xs:element name="eldate" type="xs:date"/> + <xs:element name="eldatetime" type="xs:dateTime"/> + <xs:element name="eltoken" type="xs:token"/> + <xs:element name="elshort" type="xs:short"/> + <xs:element name="ellong" type="xs:long"/> + <xs:element name="elparam" type="param"/> + <xs:element name="elarraytypes" type="ArrayTypes"/> + + </xs:sequence> + <xs:attribute name="language" type="xs:string" /> + <xs:attribute name="area"/> + <xs:attribute name="attrposint" type="xs:positiveInteger"/> + <xs:attribute name="attrnonposint" type="xs:nonPositiveInteger"/> + <xs:attribute name="attrnegint" type="xs:negativeInteger"/> + <xs:attribute name="attrnonnegint" type="xs:nonNegativeInteger"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + + <xs:element name="param"> + <xs:annotation> + <xs:documentation>Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="id" type="xs:ID" /> + <xs:attribute name="name" type="xs:NCName" /> + <xs:attribute name="sid" type="xs:NCName" /> + <xs:attribute name="flow" type="FlowType" /> + <xs:attribute name="semantic" type="xs:token" /> + <xs:attribute name="type" type="xs:NMTOKEN" use="required" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + + + <xs:simpleType name="ArrayTypes"> + <xs:restriction base="xs:NMTOKEN"> + <xs:enumeration value="float" /> + <xs:enumeration value="int" /> + <xs:enumeration value="Name" /> + <xs:enumeration value="token" /> + </xs:restriction> + </xs:simpleType> + + + + <xs:element name="python-programmer"> + <xs:complexType mixed="0"> + <xs:complexContent> + <xs:extension base="programmer"> + <xs:sequence> + <xs:element name="favorite-editor" type="xs:string"/> + </xs:sequence> + <xs:attribute name="nick-name"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="java-programmer"> + <xs:complexType mixed="0"> + <xs:complexContent> + <xs:extension base="programmer"> + <xs:sequence> + <xs:element name="favorite-editor" type="xs:string"/> + </xs:sequence> + <xs:attribute name="nick-name"/> + <xs:attribute name="status"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="agent"> + <xs:complexType> + <xs:sequence> + <xs:element name="firstname" type="xs:string"/> + <xs:element name="lastname" type="xs:string"/> + <xs:element name="priority" type="xs:float"/> + <xs:element name="info" type="info"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="special-agent" substitutionGroup="agent"> + <xs:complexType> + <xs:sequence> + <xs:element name="firstname" type="xs:string"/> + <xs:element name="lastname" type="xs:string"/> + <xs:element name="priority" type="xs:float"/> + <xs:element name="info" type="info"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="booster"> + <xs:complexType> + <xs:sequence> + <xs:element name="firstname" type="xs:string"/> + <xs:element name="lastname" type="xs:string"/> + <xs:element name="other-name" type="xs:float"/> + <xs:element name="class" type="xs:float"/> + <xs:element name="other-value" type="xs:float" maxOccurs="unbounded" /> + <xs:element name="type" type="xs:float" maxOccurs="unbounded" /> + <xs:element name="client-handler" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="fullname" type="xs:string"/> + <xs:element name="refid" type="xs:integer"/> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + + <!-- Test for element with attributes but no children. + Should use valueOf. + --> + <xs:element name="info"> + <xs:complexType> + <xs:sequence> + </xs:sequence> + <xs:attribute name="name" type="xs:string" /> + <xs:attribute name="type" type="xs:integer" /> + <xs:attribute name="rating" type="xs:float" /> + </xs:complexType> + </xs:element> + + + <xs:attributeGroup name="favorites"> + <xs:attribute name="fruit" /> + <xs:attribute name="vegetable" /> + </xs:attributeGroup> + + +</xs:schema> + diff --git a/tests/prefix_classname1_out.xml b/tests/prefix_classname1_out.xml new file mode 100644 index 0000000..c9bb446 --- /dev/null +++ b/tests/prefix_classname1_out.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" ?> +<people> + <comments> +1. This is a <emp>foolish</emp> comment. It is <emp>really</emp> important. </comments> + <comments> +2. This is a <emp>silly</emp> comment. It is <emp>very</emp> significant. </comments> + <person value="abcd" id="1" ratio="3.2"> + <name>Alberta</name> + <interest>gardening</interest> + <interest>reading</interest> + <category>5</category> + </person> + <person id="2"> + <name>Bernardo</name> + <interest>programming</interest> + <category>0</category> + <agent> + <firstname>Darren</firstname> + <lastname>Diddly</lastname> + <priority>4.5</priority> + <info name="Albert Abasinian" type="321" rating="5.33"/> + </agent> + </person> + <person id="3"> + <name>Charlie</name> + <interest>people</interest> + <interest>cats</interest> + <interest>dogs</interest> + <category>8</category> + <promoter> + <firstname>David</firstname> + <lastname>Donaldson</lastname> + </promoter> + <promoter> + <firstname>Edward</firstname> + <lastname>Eddleberry</lastname> + </promoter> + </person> + <person id="4"/> + <programmer id="2" language="python" area="xml"> + <name>Charles Carlson</name> + <interest>programming</interest> + <category>2233</category> + <agent> + <firstname>Ernest</firstname> + <lastname>Echo</lastname> + <priority>3.8</priority> + <info name="George Gregory" type="321" rating="5.33"/> + </agent> + <description>A very happy programmer</description> + <email>charles@happyprogrammers.com</email> + <elposint>14</elposint> + <elnonposint>0</elnonposint> + <elnegint>-12</elnegint> + <elnonnegint>4</elnonnegint> + <eldate>2005-04-26</eldate> + <eldatetime>2005-04-26T10:11:12</eldatetime> + <eltoken>aa bb cc dd</eltoken> + <elshort>123</elshort> + <ellong>13241234123412341234</ellong> + <elparam id="id001" name="Davy" semantic="a big semantic"/> + </programmer> + <python-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy"> + <name>Darrel Dawson</name> + <interest>hang gliding</interest> + <category>3344</category> + <agent> + <firstname>Harvey</firstname> + <lastname>Hippolite</lastname> + <priority>5.2</priority> + <info name="Harvey Hippolite" type="543" rating="6.55"/> + </agent> + <description>An object-orientated programmer</description> + <email>darrel@happyprogrammers.com</email> + <favorite-editor>jed</favorite-editor> + </python-programmer> + <java-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy"> + <name>Darrel Dawson</name> + <interest>hang gliding</interest> + <category>3344</category> + <agent> + <firstname>Harvey</firstname> + <lastname>Hippolite</lastname> + <priority>5.2</priority> + <info name="Harvey Hippolite" type="543" rating="6.55"/> + </agent> + <description>An object-orientated programmer</description> + <email>darrel@happyprogrammers.com</email> + <favorite-editor>jed</favorite-editor> + </java-programmer> +</people> diff --git a/tests/prefix_classname1_sub.py b/tests/prefix_classname1_sub.py new file mode 100644 index 0000000..df7507a --- /dev/null +++ b/tests/prefix_classname1_sub.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('-p', 'tomato_') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/prefix_classname2_sup.py') +# ('-s', 'tests/prefix_classname2_sub.py') +# ('--super', 'prefix_classname2_sup') +# +# Command line arguments: +# tests/prefix_classname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import prefix_classname2_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 tomato_peopleSub(supermod.tomato_people): + def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None): + super(tomato_peopleSub, self).__init__(comments, person, programmer, python_programmer, java_programmer, ) +supermod.tomato_people.subclass = tomato_peopleSub +# end class tomato_peopleSub + + +class tomato_commentsSub(supermod.tomato_comments): + def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None): + super(tomato_commentsSub, self).__init__(emp, valueOf_, mixedclass_, content_, ) +supermod.tomato_comments.subclass = tomato_commentsSub +# end class tomato_commentsSub + + +class tomato_personSub(supermod.tomato_person): + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + super(tomato_personSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) +supermod.tomato_person.subclass = tomato_personSub +# end class tomato_personSub + + +class tomato_programmerSub(supermod.tomato_programmer): + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + super(tomato_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) +supermod.tomato_programmer.subclass = tomato_programmerSub +# end class tomato_programmerSub + + +class tomato_paramSub(supermod.tomato_param): + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + super(tomato_paramSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, ) +supermod.tomato_param.subclass = tomato_paramSub +# end class tomato_paramSub + + +class tomato_python_programmerSub(supermod.tomato_python_programmer): + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + super(tomato_python_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, favorite_editor, ) +supermod.tomato_python_programmer.subclass = tomato_python_programmerSub +# end class tomato_python_programmerSub + + +class tomato_java_programmerSub(supermod.tomato_java_programmer): + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + super(tomato_java_programmerSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, ) +supermod.tomato_java_programmer.subclass = tomato_java_programmerSub +# end class tomato_java_programmerSub + + +class tomato_agentSub(supermod.tomato_agent): + def __init__(self, firstname=None, lastname=None, priority=None, info=None): + super(tomato_agentSub, self).__init__(firstname, lastname, priority, info, ) +supermod.tomato_agent.subclass = tomato_agentSub +# end class tomato_agentSub + + +class tomato_special_agentSub(supermod.tomato_special_agent): + def __init__(self, firstname=None, lastname=None, priority=None, info=None): + super(tomato_special_agentSub, self).__init__(firstname, lastname, priority, info, ) +supermod.tomato_special_agent.subclass = tomato_special_agentSub +# end class tomato_special_agentSub + + +class tomato_boosterSub(supermod.tomato_booster): + def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): + super(tomato_boosterSub, self).__init__(firstname, lastname, other_name, class_, other_value, type_, client_handler, ) +supermod.tomato_booster.subclass = tomato_boosterSub +# end class tomato_boosterSub + + +class tomato_infoSub(supermod.tomato_info): + def __init__(self, name=None, type_=None, rating=None): + super(tomato_infoSub, self).__init__(name, type_, rating, ) +supermod.tomato_info.subclass = tomato_infoSub +# end class tomato_infoSub + + +class tomato_client_handlerTypeSub(supermod.tomato_client_handlerType): + def __init__(self, fullname=None, refid=None): + super(tomato_client_handlerTypeSub, self).__init__(fullname, refid, ) +supermod.tomato_client_handlerType.subclass = tomato_client_handlerTypeSub +# end class tomato_client_handlerTypeSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'people' + rootClass = supermod.tomato_people + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'people' + rootClass = supermod.tomato_people + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'people' + rootClass = supermod.tomato_people + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'people' + rootClass = supermod.tomato_people + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from prefix_classname2_sup import *\n\n') + sys.stdout.write('import prefix_classname2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/out2_sup.py b/tests/prefix_classname1_sup.py similarity index 59% rename from tests/out2_sup.py rename to tests/prefix_classname1_sup.py index 250b7a4..eddff87 100644 --- a/tests/out2_sup.py +++ b/tests/prefix_classname1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('-p', 'tomato_') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/prefix_classname2_sup.py') +# ('-s', 'tests/prefix_classname2_sub.py') +# ('--super', 'prefix_classname2_sup') +# +# Command line arguments: +# tests/prefix_classname.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions -p "tomato_" --member-specs="list" -f -o "tests/prefix_classname2_sup.py" -s "tests/prefix_classname2_sub.py" --super="prefix_classname2_sup" tests/prefix_classname.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,7 +660,7 @@ def _cast(typ, value): # -class people(GeneratedsSuper): +class tomato_people(GeneratedsSuper): member_data_items_ = [ MemberSpec_('comments', 'comments', 1), MemberSpec_('person', 'person', 1), @@ -619,6 +671,7 @@ class people(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, person=None, programmer=None, python_programmer=None, java_programmer=None): + self.original_tagname_ = None if comments is None: self.comments = [] else: @@ -640,31 +693,41 @@ class people(GeneratedsSuper): else: self.java_programmer = java_programmer def factory(*args_, **kwargs_): - if people.subclass: - return people.subclass(*args_, **kwargs_) - else: - return people(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_people) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_people.subclass: + return tomato_people.subclass(*args_, **kwargs_) + else: + return tomato_people(*args_, **kwargs_) factory = staticmethod(factory) def get_comments(self): return self.comments def set_comments(self, comments): self.comments = comments def add_comments(self, value): self.comments.append(value) - def insert_comments(self, index, value): self.comments[index] = value + def insert_comments_at(self, index, value): self.comments.insert(index, value) + def replace_comments_at(self, index, value): self.comments[index] = value def get_person(self): return self.person def set_person(self, person): self.person = person def add_person(self, value): self.person.append(value) - def insert_person(self, index, value): self.person[index] = value + def insert_person_at(self, index, value): self.person.insert(index, value) + def replace_person_at(self, index, value): self.person[index] = value def get_programmer(self): return self.programmer def set_programmer(self, programmer): self.programmer = programmer def add_programmer(self, value): self.programmer.append(value) - def insert_programmer(self, index, value): self.programmer[index] = value + def insert_programmer_at(self, index, value): self.programmer.insert(index, value) + def replace_programmer_at(self, index, value): self.programmer[index] = value def get_python_programmer(self): return self.python_programmer def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer def add_python_programmer(self, value): self.python_programmer.append(value) - def insert_python_programmer(self, index, value): self.python_programmer[index] = value + def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value) + def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value def get_java_programmer(self): return self.java_programmer def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer def add_java_programmer(self, value): self.java_programmer.append(value) - def insert_java_programmer(self, index, value): self.java_programmer[index] = value + def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value) + def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value def hasContent_(self): if ( self.comments or @@ -681,13 +744,15 @@ class people(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='people') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='people', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -709,161 +774,47 @@ class people(GeneratedsSuper): python_programmer_.export(outfile, level, namespace_, name_='python-programmer', pretty_print=pretty_print) for java_programmer_ in self.java_programmer: java_programmer_.export(outfile, level, namespace_, name_='java-programmer', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='people'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('comments=[\n') - level += 1 - for comments_ in self.comments: - showIndent(outfile, level) - outfile.write('model_.comments(\n') - comments_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('person=[\n') - level += 1 - for person_ in self.person: - showIndent(outfile, level) - outfile.write('model_.person(\n') - person_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('programmer=[\n') - level += 1 - for programmer_ in self.programmer: - showIndent(outfile, level) - outfile.write('model_.programmer(\n') - programmer_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('python_programmer=[\n') - level += 1 - for python_programmer_ in self.python_programmer: - showIndent(outfile, level) - outfile.write('model_.python_programmer(\n') - python_programmer_.exportLiteral(outfile, level, name_='python-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('java_programmer=[\n') - level += 1 - for java_programmer_ in self.java_programmer: - showIndent(outfile, level) - outfile.write('model_.java_programmer(\n') - java_programmer_.exportLiteral(outfile, level, name_='java-programmer') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'comments': - obj_ = comments.factory() + obj_ = tomato_comments.factory() obj_.build(child_) self.comments.append(obj_) + obj_.original_tagname_ = 'comments' elif nodeName_ == 'person': - class_obj_ = self.get_class_obj_(child_, person) + class_obj_ = self.get_class_obj_(child_, tomato_person) obj_ = class_obj_.factory() obj_.build(child_) self.person.append(obj_) + obj_.original_tagname_ = 'person' elif nodeName_ == 'programmer': - class_obj_ = self.get_class_obj_(child_, programmer) + class_obj_ = self.get_class_obj_(child_, tomato_programmer) obj_ = class_obj_.factory() obj_.build(child_) self.programmer.append(obj_) + obj_.original_tagname_ = 'programmer' elif nodeName_ == 'python-programmer': - obj_ = python_programmer.factory() + obj_ = tomato_python_programmer.factory() obj_.build(child_) self.python_programmer.append(obj_) + obj_.original_tagname_ = 'python-programmer' elif nodeName_ == 'java-programmer': - obj_ = java_programmer.factory() + obj_ = tomato_java_programmer.factory() obj_.build(child_) self.java_programmer.append(obj_) - def walk_and_update(self): - members = people._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if people.superclass != None: - people.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: people depth: %d' % (counter, depth, ) - members = people._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) - def set_up(self): - global types, counter - import types as types_module - types = types_module - counter = 0 -# end class people - - -class comments(GeneratedsSuper): + obj_.original_tagname_ = 'java-programmer' +# end class tomato_people + + +class tomato_comments(GeneratedsSuper): member_data_items_ = [ MemberSpec_('emp', 'xs:string', 1), MemberSpec_('valueOf_', [], 0), @@ -871,6 +822,7 @@ class comments(GeneratedsSuper): subclass = None superclass = None def __init__(self, emp=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None if emp is None: self.emp = [] else: @@ -886,21 +838,27 @@ class comments(GeneratedsSuper): self.content_ = content_ self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): - if comments.subclass: - return comments.subclass(*args_, **kwargs_) - else: - return comments(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_comments) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_comments.subclass: + return tomato_comments.subclass(*args_, **kwargs_) + else: + return tomato_comments(*args_, **kwargs_) factory = staticmethod(factory) def get_emp(self): return self.emp def set_emp(self, emp): self.emp = emp def add_emp(self, value): self.emp.append(value) - def insert_emp(self, index, value): self.emp[index] = value + def insert_emp_at(self, index, value): self.emp.insert(index, value) + def replace_emp_at(self, index, value): self.emp[index] = value def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( self.emp or - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -910,13 +868,15 @@ class comments(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='comments') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='comments', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -927,24 +887,6 @@ class comments(GeneratedsSuper): if not fromsubclass_: for item_ in self.content_: item_.export(outfile, level, item_.name, namespace_, pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='comments'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('content_ = [\n') - for item_ in self.content_: - item_.exportLiteral(outfile, level, name_) - showIndent(outfile, level) - outfile.write('],\n') - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -956,6 +898,7 @@ class comments(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -968,62 +911,16 @@ class comments(GeneratedsSuper): obj_ = self.mixedclass_(MixedContainer.CategoryText, MixedContainer.TypeNone, '', child_.tail) self.content_.append(obj_) - def walk_and_update(self): - members = comments._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if comments.superclass != None: - comments.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: comments depth: %d' % (counter, depth, ) - members = comments._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class comments +# end class tomato_comments -class person(GeneratedsSuper): +class tomato_person(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('vegetable', 'xs:string', 0), - MemberSpec_('fruit', 'xs:string', 0), - MemberSpec_('ratio', 'xs:float', 0), - MemberSpec_('id', 'xs:integer', 0), MemberSpec_('value', 'xs:string', 0), + MemberSpec_('id', 'xs:integer', 0), + MemberSpec_('ratio', 'xs:float', 0), + MemberSpec_('fruit', 'xs:string', 0), + MemberSpec_('vegetable', 'xs:string', 0), MemberSpec_('name', 'xs:string', 0), MemberSpec_('interest', 'xs:string', 1), MemberSpec_('category', 'xs:integer', 0), @@ -1033,12 +930,13 @@ class person(GeneratedsSuper): ] subclass = None superclass = None - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): - self.vegetable = _cast(None, vegetable) - self.fruit = _cast(None, fruit) - self.ratio = _cast(float, ratio) - self.id = _cast(int, id) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, extensiontype_=None): + self.original_tagname_ = None self.value = _cast(None, value) + self.id = _cast(int, id) + self.ratio = _cast(float, ratio) + self.fruit = _cast(None, fruit) + self.vegetable = _cast(None, vegetable) self.name = name if interest is None: self.interest = [] @@ -1056,39 +954,47 @@ class person(GeneratedsSuper): self.description = description self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): - if person.subclass: - return person.subclass(*args_, **kwargs_) - else: - return person(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_person) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_person.subclass: + return tomato_person.subclass(*args_, **kwargs_) + else: + return tomato_person(*args_, **kwargs_) factory = staticmethod(factory) def get_name(self): return self.name def set_name(self, name): self.name = name def get_interest(self): return self.interest def set_interest(self, interest): self.interest = interest def add_interest(self, value): self.interest.append(value) - def insert_interest(self, index, value): self.interest[index] = value + def insert_interest_at(self, index, value): self.interest.insert(index, value) + def replace_interest_at(self, index, value): self.interest[index] = value def get_category(self): return self.category def set_category(self, category): self.category = category def get_agent(self): return self.agent def set_agent(self, agent): self.agent = agent def add_agent(self, value): self.agent.append(value) - def insert_agent(self, index, value): self.agent[index] = value + def insert_agent_at(self, index, value): self.agent.insert(index, value) + def replace_agent_at(self, index, value): self.agent[index] = value def get_promoter(self): return self.promoter def set_promoter(self, promoter): self.promoter = promoter def add_promoter(self, value): self.promoter.append(value) - def insert_promoter(self, index, value): self.promoter[index] = value + def insert_promoter_at(self, index, value): self.promoter.insert(index, value) + def replace_promoter_at(self, index, value): self.promoter[index] = value def get_description(self): return self.description def set_description(self, description): self.description = description - def get_vegetable(self): return self.vegetable - def set_vegetable(self, vegetable): self.vegetable = vegetable - def get_fruit(self): return self.fruit - def set_fruit(self, fruit): self.fruit = fruit - def get_ratio(self): return self.ratio - def set_ratio(self, ratio): self.ratio = ratio - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_value(self): return self.value def set_value(self, value): self.value = value + def get_id(self): return self.id + def set_id(self, id): self.id = id + def get_ratio(self): return self.ratio + def set_ratio(self, ratio): self.ratio = ratio + def get_fruit(self): return self.fruit + def set_fruit(self, fruit): self.fruit = fruit + def get_vegetable(self): return self.vegetable + def set_vegetable(self, vegetable): self.vegetable = vegetable def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): @@ -1108,33 +1014,35 @@ class person(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='person') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='person', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='person'): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - outfile.write(' vegetable=%s' % (self.gds_format_string(quote_attrib(self.vegetable).encode(ExternalEncoding), input_name='vegetable'), )) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - outfile.write(' fruit=%s' % (self.gds_format_string(quote_attrib(self.fruit).encode(ExternalEncoding), input_name='fruit'), )) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.value is not None and 'value' not in already_processed: + already_processed.add('value') + outfile.write(' value=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.value), input_name='value')), )) if self.id is not None and 'id' not in already_processed: already_processed.add('id') outfile.write(' id="%s"' % self.gds_format_integer(self.id, input_name='id')) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - outfile.write(' value=%s' % (self.gds_format_string(quote_attrib(self.value).encode(ExternalEncoding), input_name='value'), )) + if self.ratio is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + outfile.write(' ratio="%s"' % self.gds_format_float(self.ratio, input_name='ratio')) + if self.fruit is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + outfile.write(' fruit=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.fruit), input_name='fruit')), )) + if self.vegetable is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + outfile.write(' vegetable=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.vegetable), input_name='vegetable')), )) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') @@ -1146,10 +1054,10 @@ class person(GeneratedsSuper): eol_ = '' if self.name is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_format_string(quote_xml(self.name).encode(ExternalEncoding), input_name='name'), namespace_, eol_)) + outfile.write('<%sname>%s</%sname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.name), input_name='name')), namespace_, eol_)) for interest_ in self.interest: showIndent(outfile, level, pretty_print) - outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_format_string(quote_xml(interest_).encode(ExternalEncoding), input_name='interest'), namespace_, eol_)) + outfile.write('<%sinterest>%s</%sinterest>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(interest_), input_name='interest')), namespace_, eol_)) if self.category is not None: showIndent(outfile, level, pretty_print) outfile.write('<%scategory>%s</%scategory>%s' % (namespace_, self.gds_format_integer(self.category, input_name='category'), namespace_, eol_)) @@ -1159,110 +1067,41 @@ class person(GeneratedsSuper): promoter_.export(outfile, level, namespace_, name_='promoter', pretty_print=pretty_print) if self.description is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_format_string(quote_xml(self.description).encode(ExternalEncoding), input_name='description'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='person'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.vegetable is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - showIndent(outfile, level) - outfile.write('vegetable="%s",\n' % (self.vegetable,)) - if self.fruit is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - showIndent(outfile, level) - outfile.write('fruit="%s",\n' % (self.fruit,)) - if self.ratio is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - showIndent(outfile, level) - outfile.write('ratio=%f,\n' % (self.ratio,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id=%d,\n' % (self.id,)) - if self.value is not None and 'value' not in already_processed: - already_processed.add('value') - showIndent(outfile, level) - outfile.write('value="%s",\n' % (self.value,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.name is not None: - showIndent(outfile, level) - outfile.write('name=%s,\n' % quote_python(self.name).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('interest=[\n') - level += 1 - for interest_ in self.interest: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(interest_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.category is not None: - showIndent(outfile, level) - outfile.write('category=%d,\n' % self.category) - showIndent(outfile, level) - outfile.write('agent=[\n') - level += 1 - for agent_ in self.agent: - showIndent(outfile, level) - outfile.write('model_.agent(\n') - agent_.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('promoter=[\n') - level += 1 - for promoter_ in self.promoter: - showIndent(outfile, level) - outfile.write('model_.booster(\n') - promoter_.exportLiteral(outfile, level, name_='booster') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.description is not None: - showIndent(outfile, level) - outfile.write('description=%s,\n' % quote_python(self.description).encode(ExternalEncoding)) + outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('vegetable', node) - if value is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - self.vegetable = value - value = find_attr_value_('fruit', node) - if value is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - self.fruit = value - value = find_attr_value_('ratio', node) - if value is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - try: - self.ratio = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('value', node) + if value is not None and 'value' not in already_processed: + already_processed.add('value') + self.value = value value = find_attr_value_('id', node) if value is not None and 'id' not in already_processed: already_processed.add('id') try: self.id = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value', node) - if value is not None and 'value' not in already_processed: - already_processed.add('value') - self.value = value + value = find_attr_value_('ratio', node) + if value is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + try: + self.ratio = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('fruit', node) + if value is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + self.fruit = value + value = find_attr_value_('vegetable', node) + if value is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + self.vegetable = value value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1280,79 +1119,35 @@ class person(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'category') self.category = ival_ elif nodeName_ == 'agent': - obj_ = agent.factory() + obj_ = tomato_agent.factory() obj_.build(child_) self.agent.append(obj_) + obj_.original_tagname_ = 'agent' elif nodeName_ == 'promoter': - obj_ = booster.factory() + obj_ = tomato_booster.factory() obj_.build(child_) self.promoter.append(obj_) + obj_.original_tagname_ = 'promoter' elif nodeName_ == 'description': description_ = child_.text description_ = self.gds_validate_string(description_, node, 'description') self.description = description_ - def walk_and_update(self): - members = person._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if person.superclass != None: - person.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: person depth: %d' % (counter, depth, ) - members = person._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class person +# end class tomato_person -class programmer(person): +class tomato_programmer(tomato_person): member_data_items_ = [ MemberSpec_('language', 'xs:string', 0), MemberSpec_('area', 'xs:string', 0), - MemberSpec_('attrnegint', 'xs:negativeInteger', 0), MemberSpec_('attrposint', 'xs:positiveInteger', 0), - MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0), + MemberSpec_('attrnegint', 'xs:negativeInteger', 0), + MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('email', 'xs:string', 0), MemberSpec_('elposint', 'xs:positiveInteger', 0), MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0), @@ -1367,26 +1162,27 @@ class programmer(person): MemberSpec_('elarraytypes', ['ArrayTypes', 'xs:NMTOKEN'], 0), ] subclass = None - superclass = person - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, extensiontype_, ) + superclass = tomato_person + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + self.original_tagname_ = None + super(tomato_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, extensiontype_, ) self.language = _cast(None, language) self.area = _cast(None, area) - self.attrnegint = _cast(int, attrnegint) self.attrposint = _cast(int, attrposint) - self.attrnonnegint = _cast(int, attrnonnegint) self.attrnonposint = _cast(int, attrnonposint) + self.attrnegint = _cast(int, attrnegint) + self.attrnonnegint = _cast(int, attrnonnegint) self.email = email self.elposint = elposint self.elnonposint = elnonposint self.elnegint = elnegint self.elnonnegint = elnonnegint - if isinstance(eldate, basestring): + if isinstance(eldate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date() else: initvalue_ = eldate self.eldate = initvalue_ - if isinstance(eldatetime, basestring): + if isinstance(eldatetime, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S') else: initvalue_ = eldatetime @@ -1396,12 +1192,18 @@ class programmer(person): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): - if programmer.subclass: - return programmer.subclass(*args_, **kwargs_) - else: - return programmer(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_programmer.subclass: + return tomato_programmer.subclass(*args_, **kwargs_) + else: + return tomato_programmer(*args_, **kwargs_) factory = staticmethod(factory) def get_email(self): return self.email def set_email(self, email): self.email = email @@ -1431,19 +1233,28 @@ class programmer(person): def set_language(self, language): self.language = language def get_area(self): return self.area def set_area(self, area): self.area = area - def get_attrnegint(self): return self.attrnegint - def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint def get_attrposint(self): return self.attrposint def set_attrposint(self, attrposint): self.attrposint = attrposint - def get_attrnonnegint(self): return self.attrnonnegint - def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_attrnonposint(self): return self.attrnonposint def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint + def get_attrnegint(self): return self.attrnegint + def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint + def get_attrnonnegint(self): return self.attrnonnegint + def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -1458,7 +1269,7 @@ class programmer(person): self.ellong is not None or self.elparam is not None or self.elarraytypes is not None or - super(programmer, self).hasContent_() + super(tomato_programmer, self).hasContent_() ): return True else: @@ -1468,50 +1279,52 @@ class programmer(person): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='programmer'): - super(programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') + super(tomato_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='programmer') if self.language is not None and 'language' not in already_processed: already_processed.add('language') - outfile.write(' language=%s' % (self.gds_format_string(quote_attrib(self.language).encode(ExternalEncoding), input_name='language'), )) + outfile.write(' language=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.language), input_name='language')), )) if self.area is not None and 'area' not in already_processed: already_processed.add('area') - outfile.write(' area=%s' % (self.gds_format_string(quote_attrib(self.area).encode(ExternalEncoding), input_name='area'), )) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + outfile.write(' area=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.area), input_name='area')), )) if self.attrposint is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') outfile.write(' attrposint="%s"' % self.gds_format_integer(self.attrposint, input_name='attrposint')) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.attrnonposint is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') outfile.write(' attrnonposint="%s"' % self.gds_format_integer(self.attrnonposint, input_name='attrnonposint')) + if self.attrnegint is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + outfile.write(' attrnegint="%s"' % self.gds_format_integer(self.attrnegint, input_name='attrnegint')) + if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + outfile.write(' attrnonnegint="%s"' % self.gds_format_integer(self.attrnonnegint, input_name='attrnonnegint')) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') outfile.write(' xsi:type="%s"' % self.extensiontype_) def exportChildren(self, outfile, level, namespace_='', name_='programmer', fromsubclass_=False, pretty_print=True): - super(programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + super(tomato_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: eol_ = '\n' else: eol_ = '' if self.email is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_format_string(quote_xml(self.email).encode(ExternalEncoding), input_name='email'), namespace_, eol_)) + outfile.write('<%semail>%s</%semail>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.email), input_name='email')), namespace_, eol_)) if self.elposint is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selposint>%s</%selposint>%s' % (namespace_, self.gds_format_integer(self.elposint, input_name='elposint'), namespace_, eol_)) @@ -1532,7 +1345,7 @@ class programmer(person): outfile.write('<%seldatetime>%s</%seldatetime>%s' % (namespace_, self.gds_format_datetime(self.eldatetime, input_name='eldatetime'), namespace_, eol_)) if self.eltoken is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_format_string(quote_xml(self.eltoken).encode(ExternalEncoding), input_name='eltoken'), namespace_, eol_)) + outfile.write('<%seltoken>%s</%seltoken>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.eltoken), input_name='eltoken')), namespace_, eol_)) if self.elshort is not None: showIndent(outfile, level, pretty_print) outfile.write('<%selshort>%s</%selshort>%s' % (namespace_, self.gds_format_integer(self.elshort, input_name='elshort'), namespace_, eol_)) @@ -1543,136 +1356,64 @@ class programmer(person): self.elparam.export(outfile, level, namespace_, name_='elparam', pretty_print=pretty_print) if self.elarraytypes is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_format_string(quote_xml(self.elarraytypes).encode(ExternalEncoding), input_name='elarraytypes'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='programmer'): - level += 1 + outfile.write('<%selarraytypes>%s</%selarraytypes>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.elarraytypes), input_name='elarraytypes')), namespace_, eol_)) + def build(self, node): already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.language is not None and 'language' not in already_processed: + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + value = find_attr_value_('language', node) + if value is not None and 'language' not in already_processed: already_processed.add('language') - showIndent(outfile, level) - outfile.write('language="%s",\n' % (self.language,)) - if self.area is not None and 'area' not in already_processed: + self.language = value + value = find_attr_value_('area', node) + if value is not None and 'area' not in already_processed: already_processed.add('area') - showIndent(outfile, level) - outfile.write('area="%s",\n' % (self.area,)) - if self.attrnegint is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - showIndent(outfile, level) - outfile.write('attrnegint=%d,\n' % (self.attrnegint,)) - if self.attrposint is not None and 'attrposint' not in already_processed: + self.area = value + value = find_attr_value_('attrposint', node) + if value is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') - showIndent(outfile, level) - outfile.write('attrposint=%d,\n' % (self.attrposint,)) - if self.attrnonnegint is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - showIndent(outfile, level) - outfile.write('attrnonnegint=%d,\n' % (self.attrnonnegint,)) - if self.attrnonposint is not None and 'attrnonposint' not in already_processed: + try: + self.attrposint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrposint <= 0: + raise_parse_error(node, 'Invalid PositiveInteger') + value = find_attr_value_('attrnonposint', node) + if value is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') - showIndent(outfile, level) - outfile.write('attrnonposint=%d,\n' % (self.attrnonposint,)) - super(programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(programmer, self).exportLiteralChildren(outfile, level, name_) - if self.email is not None: - showIndent(outfile, level) - outfile.write('email=%s,\n' % quote_python(self.email).encode(ExternalEncoding)) - if self.elposint is not None: - showIndent(outfile, level) - outfile.write('elposint=%d,\n' % self.elposint) - if self.elnonposint is not None: - showIndent(outfile, level) - outfile.write('elnonposint=%d,\n' % self.elnonposint) - if self.elnegint is not None: - showIndent(outfile, level) - outfile.write('elnegint=%d,\n' % self.elnegint) - if self.elnonnegint is not None: - showIndent(outfile, level) - outfile.write('elnonnegint=%d,\n' % self.elnonnegint) - if self.eldate is not None: - showIndent(outfile, level) - outfile.write('eldate=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.eldate, input_name='eldate')) - if self.eldatetime is not None: - showIndent(outfile, level) - outfile.write('eldatetime=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.eldatetime, input_name='eldatetime')) - if self.eltoken is not None: - showIndent(outfile, level) - outfile.write('eltoken=%s,\n' % quote_python(self.eltoken).encode(ExternalEncoding)) - if self.elshort is not None: - showIndent(outfile, level) - outfile.write('elshort=%d,\n' % self.elshort) - if self.ellong is not None: - showIndent(outfile, level) - outfile.write('ellong=%d,\n' % self.ellong) - if self.elparam is not None: - showIndent(outfile, level) - outfile.write('elparam=model_.param(\n') - self.elparam.exportLiteral(outfile, level, name_='elparam') - showIndent(outfile, level) - outfile.write('),\n') - if self.elarraytypes is not None: - showIndent(outfile, level) - outfile.write('elarraytypes=%s,\n' % quote_python(self.elarraytypes).encode(ExternalEncoding)) - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('language', node) - if value is not None and 'language' not in already_processed: - already_processed.add('language') - self.language = value - value = find_attr_value_('area', node) - if value is not None and 'area' not in already_processed: - already_processed.add('area') - self.area = value + try: + self.attrnonposint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnonposint > 0: + raise_parse_error(node, 'Invalid NonPositiveInteger') value = find_attr_value_('attrnegint', node) if value is not None and 'attrnegint' not in already_processed: already_processed.add('attrnegint') try: self.attrnegint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrnegint >= 0: raise_parse_error(node, 'Invalid NegativeInteger') - value = find_attr_value_('attrposint', node) - if value is not None and 'attrposint' not in already_processed: - already_processed.add('attrposint') - try: - self.attrposint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrposint <= 0: - raise_parse_error(node, 'Invalid PositiveInteger') value = find_attr_value_('attrnonnegint', node) if value is not None and 'attrnonnegint' not in already_processed: already_processed.add('attrnonnegint') try: self.attrnonnegint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrnonnegint < 0: raise_parse_error(node, 'Invalid NonNegativeInteger') - value = find_attr_value_('attrnonposint', node) - if value is not None and 'attrnonposint' not in already_processed: - already_processed.add('attrnonposint') - try: - self.attrnonposint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonposint > 0: - raise_parse_error(node, 'Invalid NonPositiveInteger') value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') self.extensiontype_ = value - super(programmer, self).buildAttributes(node, attrs, already_processed) + super(tomato_programmer, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'email': email_ = child_.text @@ -1682,7 +1423,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1692,7 +1433,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ > 0: raise_parse_error(child_, 'requires nonPositiveInteger') @@ -1702,7 +1443,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ >= 0: raise_parse_error(child_, 'requires negativeInteger') @@ -1712,7 +1453,7 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ < 0: raise_parse_error(child_, 'requires nonNegativeInteger') @@ -1728,14 +1469,17 @@ class programmer(person): self.eldatetime = dval_ elif nodeName_ == 'eltoken': eltoken_ = child_.text - eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + if eltoken_: + eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + else: + eltoken_ = "" eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken') self.eltoken = eltoken_ elif nodeName_ == 'elshort': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'elshort') self.elshort = ival_ @@ -1743,114 +1487,76 @@ class programmer(person): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'ellong') self.ellong = ival_ elif nodeName_ == 'elparam': - obj_ = param.factory() + obj_ = tomato_param.factory() obj_.build(child_) self.elparam = obj_ + obj_.original_tagname_ = 'elparam' elif nodeName_ == 'elarraytypes': elarraytypes_ = child_.text elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes') self.elarraytypes = elarraytypes_ - self.validate_ArrayTypes(self.elarraytypes) # validate type ArrayTypes - super(programmer, self).buildChildren(child_, node, nodeName_, True) - def walk_and_update(self): - members = programmer._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if programmer.superclass != None: - programmer.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: programmer depth: %d' % (counter, depth, ) - members = programmer._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class programmer + # validate type ArrayTypes + self.validate_ArrayTypes(self.elarraytypes) + super(tomato_programmer, self).buildChildren(child_, node, nodeName_, True) +# end class tomato_programmer -class param(GeneratedsSuper): +class tomato_param(GeneratedsSuper): """Finding flow attribute unneccesary in practice. A unnamed parameter is unbound/skipped.""" member_data_items_ = [ - MemberSpec_('semantic', 'xs:token', 0), + MemberSpec_('id', 'xs:string', 0), MemberSpec_('name', 'xs:NCName', 0), - MemberSpec_('flow', 'FlowType', 0), MemberSpec_('sid', 'xs:NCName', 0), + MemberSpec_('flow', 'FlowType', 0), + MemberSpec_('semantic', 'xs:token', 0), MemberSpec_('type', 'xs:NMTOKEN', 0), - MemberSpec_('id', 'xs:string', 0), MemberSpec_('valueOf_', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - self.semantic = _cast(None, semantic) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + self.original_tagname_ = None + self.id = _cast(None, id) self.name = _cast(None, name) - self.flow = _cast(None, flow) self.sid = _cast(None, sid) + self.flow = _cast(None, flow) + self.semantic = _cast(None, semantic) self.type_ = _cast(None, type_) - self.id = _cast(None, id) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): - if param.subclass: - return param.subclass(*args_, **kwargs_) - else: - return param(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_param) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_param.subclass: + return tomato_param.subclass(*args_, **kwargs_) + else: + return tomato_param(*args_, **kwargs_) factory = staticmethod(factory) - def get_semantic(self): return self.semantic - def set_semantic(self, semantic): self.semantic = semantic + def get_id(self): return self.id + def set_id(self, id): self.id = id def get_name(self): return self.name def set_name(self, name): self.name = name - def get_flow(self): return self.flow - def set_flow(self, flow): self.flow = flow def get_sid(self): return self.sid def set_sid(self, sid): self.sid = sid + def get_flow(self): return self.flow + def set_flow(self, flow): self.flow = flow + def get_semantic(self): return self.semantic + def set_semantic(self, semantic): self.semantic = semantic def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1860,72 +1566,39 @@ class param(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='param') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='param', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='param'): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - outfile.write(' semantic=%s' % (self.gds_format_string(quote_attrib(self.semantic).encode(ExternalEncoding), input_name='semantic'), )) + if self.id is not None and 'id' not in already_processed: + already_processed.add('id') + outfile.write(' id=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.id), input_name='id')), )) if self.name is not None and 'name' not in already_processed: already_processed.add('name') outfile.write(' name=%s' % (quote_attrib(self.name), )) - if self.flow is not None and 'flow' not in already_processed: - already_processed.add('flow') - outfile.write(' flow=%s' % (quote_attrib(self.flow), )) if self.sid is not None and 'sid' not in already_processed: already_processed.add('sid') outfile.write(' sid=%s' % (quote_attrib(self.sid), )) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - outfile.write(' type=%s' % (self.gds_format_string(quote_attrib(self.type_).encode(ExternalEncoding), input_name='type'), )) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - outfile.write(' id=%s' % (self.gds_format_string(quote_attrib(self.id).encode(ExternalEncoding), input_name='id'), )) - def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='param'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.semantic is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - showIndent(outfile, level) - outfile.write('semantic="%s",\n' % (self.semantic,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) if self.flow is not None and 'flow' not in already_processed: already_processed.add('flow') - showIndent(outfile, level) - outfile.write('flow=%s,\n' % (self.flow,)) - if self.sid is not None and 'sid' not in already_processed: - already_processed.add('sid') - showIndent(outfile, level) - outfile.write('sid="%s",\n' % (self.sid,)) + outfile.write(' flow=%s' % (quote_attrib(self.flow), )) + if self.semantic is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + outfile.write(' semantic=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.semantic), input_name='semantic')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_="%s",\n' % (self.type_,)) - if self.id is not None and 'id' not in already_processed: - already_processed.add('id') - showIndent(outfile, level) - outfile.write('id="%s",\n' % (self.id,)) - def exportLiteralChildren(self, outfile, level, name_): + outfile.write(' type=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.type_), input_name='type')), )) + def exportChildren(self, outfile, level, namespace_='', name_='param', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -1934,99 +1607,60 @@ class param(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('semantic', node) - if value is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - self.semantic = value - self.semantic = ' '.join(self.semantic.split()) + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value value = find_attr_value_('name', node) if value is not None and 'name' not in already_processed: already_processed.add('name') self.name = value - value = find_attr_value_('flow', node) - if value is not None and 'flow' not in already_processed: - already_processed.add('flow') - self.flow = value value = find_attr_value_('sid', node) if value is not None and 'sid' not in already_processed: already_processed.add('sid') self.sid = value + value = find_attr_value_('flow', node) + if value is not None and 'flow' not in already_processed: + already_processed.add('flow') + self.flow = value + value = find_attr_value_('semantic', node) + if value is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + self.semantic = value + self.semantic = ' '.join(self.semantic.split()) value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') self.type_ = value - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - self.id = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass - def walk_and_update(self): - members = param._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if param.superclass != None: - param.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: param depth: %d' % (counter, depth, ) - members = param._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class param +# end class tomato_param -class python_programmer(programmer): +class tomato_python_programmer(tomato_programmer): member_data_items_ = [ MemberSpec_('nick-name', 'xs:string', 0), MemberSpec_('favorite_editor', 'xs:string', 0), ] subclass = None - superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): - super(python_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) + superclass = tomato_programmer + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, favorite_editor=None): + self.original_tagname_ = None + super(tomato_python_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): - if python_programmer.subclass: - return python_programmer.subclass(*args_, **kwargs_) - else: - return python_programmer(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_python_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_python_programmer.subclass: + return tomato_python_programmer.subclass(*args_, **kwargs_) + else: + return tomato_python_programmer(*args_, **kwargs_) factory = staticmethod(factory) def get_favorite_editor(self): return self.favorite_editor def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor @@ -2035,7 +1669,7 @@ class python_programmer(programmer): def hasContent_(self): if ( self.favorite_editor is not None or - super(python_programmer, self).hasContent_() + super(tomato_python_programmer, self).hasContent_() ): return True else: @@ -2045,144 +1679,90 @@ class python_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='python-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='python-programmer'): - super(python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') + super(tomato_python_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='python-programmer') if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) def exportChildren(self, outfile, level, namespace_='', name_='python-programmer', fromsubclass_=False, pretty_print=True): - super(python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + super(tomato_python_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: eol_ = '\n' else: eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='python-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(python_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(python_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value - super(python_programmer, self).buildAttributes(node, attrs, already_processed) + super(tomato_python_programmer, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'favorite-editor': favorite_editor_ = child_.text favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor') self.favorite_editor = favorite_editor_ - super(python_programmer, self).buildChildren(child_, node, nodeName_, True) - def walk_and_update(self): - members = python_programmer._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if python_programmer.superclass != None: - python_programmer.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: python_programmer depth: %d' % (counter, depth, ) - members = python_programmer._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class python_programmer + super(tomato_python_programmer, self).buildChildren(child_, node, nodeName_, True) +# end class tomato_python_programmer -class java_programmer(programmer): +class tomato_java_programmer(tomato_programmer): member_data_items_ = [ - MemberSpec_('status', 'xs:string', 0), MemberSpec_('nick-name', 'xs:string', 0), + MemberSpec_('status', 'xs:string', 0), MemberSpec_('favorite_editor', 'xs:string', 0), ] subclass = None - superclass = programmer - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None): - super(java_programmer, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, agent, promoter, description, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.status = _cast(None, status) + superclass = tomato_programmer + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, agent=None, promoter=None, description=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None): + self.original_tagname_ = None + super(tomato_java_programmer, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, agent, promoter, description, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) + self.status = _cast(None, status) self.favorite_editor = favorite_editor def factory(*args_, **kwargs_): - if java_programmer.subclass: - return java_programmer.subclass(*args_, **kwargs_) - else: - return java_programmer(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_java_programmer) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_java_programmer.subclass: + return tomato_java_programmer.subclass(*args_, **kwargs_) + else: + return tomato_java_programmer(*args_, **kwargs_) factory = staticmethod(factory) def get_favorite_editor(self): return self.favorite_editor def set_favorite_editor(self, favorite_editor): self.favorite_editor = favorite_editor - def get_status(self): return self.status - def set_status(self, status): self.status = status def get_nick_name(self): return self.nick_name def set_nick_name(self, nick_name): self.nick_name = nick_name + def get_status(self): return self.status + def set_status(self, status): self.status = status def hasContent_(self): if ( self.favorite_editor is not None or - super(java_programmer, self).hasContent_() + super(tomato_java_programmer, self).hasContent_() ): return True else: @@ -2192,127 +1772,63 @@ class java_programmer(programmer): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='java-programmer', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='java-programmer'): - super(java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - outfile.write(' status=%s' % (self.gds_format_string(quote_attrib(self.status).encode(ExternalEncoding), input_name='status'), )) + super(tomato_java_programmer, self).exportAttributes(outfile, level, already_processed, namespace_, name_='java-programmer') if self.nick_name is not None and 'nick_name' not in already_processed: already_processed.add('nick_name') - outfile.write(' nick-name=%s' % (self.gds_format_string(quote_attrib(self.nick_name).encode(ExternalEncoding), input_name='nick-name'), )) + outfile.write(' nick-name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.nick_name), input_name='nick-name')), )) + if self.status is not None and 'status' not in already_processed: + already_processed.add('status') + outfile.write(' status=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.status), input_name='status')), )) def exportChildren(self, outfile, level, namespace_='', name_='java-programmer', fromsubclass_=False, pretty_print=True): - super(java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) + super(tomato_java_programmer, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) if pretty_print: eol_ = '\n' else: eol_ = '' if self.favorite_editor is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_format_string(quote_xml(self.favorite_editor).encode(ExternalEncoding), input_name='favorite-editor'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='java-programmer'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.status is not None and 'status' not in already_processed: - already_processed.add('status') - showIndent(outfile, level) - outfile.write('status="%s",\n' % (self.status,)) - if self.nick_name is not None and 'nick_name' not in already_processed: - already_processed.add('nick_name') - showIndent(outfile, level) - outfile.write('nick_name="%s",\n' % (self.nick_name,)) - super(java_programmer, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(java_programmer, self).exportLiteralChildren(outfile, level, name_) - if self.favorite_editor is not None: - showIndent(outfile, level) - outfile.write('favorite_editor=%s,\n' % quote_python(self.favorite_editor).encode(ExternalEncoding)) + outfile.write('<%sfavorite-editor>%s</%sfavorite-editor>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.favorite_editor), input_name='favorite-editor')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('status', node) - if value is not None and 'status' not in already_processed: - already_processed.add('status') - self.status = value value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value - super(java_programmer, self).buildAttributes(node, attrs, already_processed) + value = find_attr_value_('status', node) + if value is not None and 'status' not in already_processed: + already_processed.add('status') + self.status = value + super(tomato_java_programmer, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'favorite-editor': favorite_editor_ = child_.text favorite_editor_ = self.gds_validate_string(favorite_editor_, node, 'favorite_editor') self.favorite_editor = favorite_editor_ - super(java_programmer, self).buildChildren(child_, node, nodeName_, True) - def walk_and_update(self): - members = java_programmer._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if java_programmer.superclass != None: - java_programmer.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: java_programmer depth: %d' % (counter, depth, ) - members = java_programmer._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class java_programmer + super(tomato_java_programmer, self).buildChildren(child_, node, nodeName_, True) +# end class tomato_java_programmer -class agent(GeneratedsSuper): +class tomato_agent(GeneratedsSuper): member_data_items_ = [ MemberSpec_('firstname', 'xs:string', 0), MemberSpec_('lastname', 'xs:string', 0), @@ -2322,15 +1838,21 @@ class agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): - if agent.subclass: - return agent.subclass(*args_, **kwargs_) - else: - return agent(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_agent) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_agent.subclass: + return tomato_agent.subclass(*args_, **kwargs_) + else: + return tomato_agent(*args_, **kwargs_) factory = staticmethod(factory) def get_firstname(self): return self.firstname def set_firstname(self, firstname): self.firstname = firstname @@ -2355,13 +1877,15 @@ class agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2375,45 +1899,22 @@ class agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) if self.info is not None: self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2429,64 +1930,19 @@ class agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ elif nodeName_ == 'info': - obj_ = info.factory() + obj_ = tomato_info.factory() obj_.build(child_) self.info = obj_ - def walk_and_update(self): - members = agent._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if agent.superclass != None: - agent.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: agent depth: %d' % (counter, depth, ) - members = agent._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class agent + obj_.original_tagname_ = 'info' +# end class tomato_agent -class special_agent(GeneratedsSuper): +class tomato_special_agent(GeneratedsSuper): member_data_items_ = [ MemberSpec_('firstname', 'xs:string', 0), MemberSpec_('lastname', 'xs:string', 0), @@ -2496,15 +1952,21 @@ class special_agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): - if special_agent.subclass: - return special_agent.subclass(*args_, **kwargs_) - else: - return special_agent(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_special_agent) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_special_agent.subclass: + return tomato_special_agent.subclass(*args_, **kwargs_) + else: + return tomato_special_agent(*args_, **kwargs_) factory = staticmethod(factory) def get_firstname(self): return self.firstname def set_firstname(self, firstname): self.firstname = firstname @@ -2529,13 +1991,15 @@ class special_agent(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='special-agent') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='special-agent', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2549,45 +2013,22 @@ class special_agent(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.priority is not None: showIndent(outfile, level, pretty_print) outfile.write('<%spriority>%s</%spriority>%s' % (namespace_, self.gds_format_float(self.priority, input_name='priority'), namespace_, eol_)) if self.info is not None: self.info.export(outfile, level, namespace_, name_='info', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='special-agent'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.priority is not None: - showIndent(outfile, level) - outfile.write('priority=%f,\n' % self.priority) - if self.info is not None: - showIndent(outfile, level) - outfile.write('info=model_.info(\n') - self.info.exportLiteral(outfile, level) - showIndent(outfile, level) - outfile.write('),\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2603,64 +2044,19 @@ class special_agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ elif nodeName_ == 'info': - obj_ = info.factory() + obj_ = tomato_info.factory() obj_.build(child_) self.info = obj_ - def walk_and_update(self): - members = special_agent._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if special_agent.superclass != None: - special_agent.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: special_agent depth: %d' % (counter, depth, ) - members = special_agent._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class special_agent + obj_.original_tagname_ = 'info' +# end class tomato_special_agent -class booster(GeneratedsSuper): +class tomato_booster(GeneratedsSuper): member_data_items_ = [ MemberSpec_('firstname', 'xs:string', 0), MemberSpec_('lastname', 'xs:string', 0), @@ -2673,6 +2069,7 @@ class booster(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.other_name = other_name @@ -2690,10 +2087,15 @@ class booster(GeneratedsSuper): else: self.client_handler = client_handler def factory(*args_, **kwargs_): - if booster.subclass: - return booster.subclass(*args_, **kwargs_) - else: - return booster(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_booster) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_booster.subclass: + return tomato_booster.subclass(*args_, **kwargs_) + else: + return tomato_booster(*args_, **kwargs_) factory = staticmethod(factory) def get_firstname(self): return self.firstname def set_firstname(self, firstname): self.firstname = firstname @@ -2706,15 +2108,18 @@ class booster(GeneratedsSuper): def get_other_value(self): return self.other_value def set_other_value(self, other_value): self.other_value = other_value def add_other_value(self, value): self.other_value.append(value) - def insert_other_value(self, index, value): self.other_value[index] = value + def insert_other_value_at(self, index, value): self.other_value.insert(index, value) + def replace_other_value_at(self, index, value): self.other_value[index] = value def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ def add_type(self, value): self.type_.append(value) - def insert_type(self, index, value): self.type_[index] = value + def insert_type_at(self, index, value): self.type_.insert(index, value) + def replace_type_at(self, index, value): self.type_[index] = value def get_client_handler(self): return self.client_handler def set_client_handler(self, client_handler): self.client_handler = client_handler def add_client_handler(self, value): self.client_handler.append(value) - def insert_client_handler(self, index, value): self.client_handler[index] = value + def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value) + def replace_client_handler_at(self, index, value): self.client_handler[index] = value def hasContent_(self): if ( self.firstname is not None or @@ -2733,13 +2138,15 @@ class booster(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='booster') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='booster', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -2753,10 +2160,10 @@ class booster(GeneratedsSuper): eol_ = '' if self.firstname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_format_string(quote_xml(self.firstname).encode(ExternalEncoding), input_name='firstname'), namespace_, eol_)) + outfile.write('<%sfirstname>%s</%sfirstname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.firstname), input_name='firstname')), namespace_, eol_)) if self.lastname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lastname).encode(ExternalEncoding), input_name='lastname'), namespace_, eol_)) + outfile.write('<%slastname>%s</%slastname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lastname), input_name='lastname')), namespace_, eol_)) if self.other_name is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sother-name>%s</%sother-name>%s' % (namespace_, self.gds_format_float(self.other_name, input_name='other-name'), namespace_, eol_)) @@ -2771,63 +2178,13 @@ class booster(GeneratedsSuper): outfile.write('<%stype>%s</%stype>%s' % (namespace_, self.gds_format_float(type_, input_name='type'), namespace_, eol_)) for client_handler_ in self.client_handler: client_handler_.export(outfile, level, namespace_, name_='client-handler', pretty_print=pretty_print) - def exportLiteral(self, outfile, level, name_='booster'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.firstname is not None: - showIndent(outfile, level) - outfile.write('firstname=%s,\n' % quote_python(self.firstname).encode(ExternalEncoding)) - if self.lastname is not None: - showIndent(outfile, level) - outfile.write('lastname=%s,\n' % quote_python(self.lastname).encode(ExternalEncoding)) - if self.other_name is not None: - showIndent(outfile, level) - outfile.write('other_name=%f,\n' % self.other_name) - if self.class_ is not None: - showIndent(outfile, level) - outfile.write('class_=%f,\n' % self.class_) - showIndent(outfile, level) - outfile.write('other_value=[\n') - level += 1 - for other_value_ in self.other_value: - showIndent(outfile, level) - outfile.write('%f,\n' % other_value_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('type_=[\n') - level += 1 - for type_ in self.type_: - showIndent(outfile, level) - outfile.write('%f,\n' % type_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - showIndent(outfile, level) - outfile.write('client_handler=[\n') - level += 1 - for client_handler_ in self.client_handler: - showIndent(outfile, level) - outfile.write('model_.client_handlerType(\n') - client_handler_.exportLiteral(outfile, level, name_='client-handlerType') - showIndent(outfile, level) - outfile.write('),\n') - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2843,7 +2200,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_name') self.other_name = fval_ @@ -2851,7 +2208,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'class') self.class_ = fval_ @@ -2859,7 +2216,7 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_value') self.other_value.append(fval_) @@ -2867,88 +2224,48 @@ class booster(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'type') self.type_.append(fval_) elif nodeName_ == 'client-handler': - obj_ = client_handlerType.factory() + obj_ = tomato_client_handlerType.factory() obj_.build(child_) self.client_handler.append(obj_) - def walk_and_update(self): - members = booster._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if booster.superclass != None: - booster.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: booster depth: %d' % (counter, depth, ) - members = booster._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class booster + obj_.original_tagname_ = 'client-handler' +# end class tomato_booster -class info(GeneratedsSuper): +class tomato_info(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('rating', 'xs:float', 0), - MemberSpec_('type', 'xs:integer', 0), MemberSpec_('name', 'xs:string', 0), + MemberSpec_('type', 'xs:integer', 0), + MemberSpec_('rating', 'xs:float', 0), ] subclass = None superclass = None - def __init__(self, rating=None, type_=None, name=None): - self.rating = _cast(float, rating) - self.type_ = _cast(int, type_) + def __init__(self, name=None, type_=None, rating=None): + self.original_tagname_ = None self.name = _cast(None, name) - pass + self.type_ = _cast(int, type_) + self.rating = _cast(float, rating) def factory(*args_, **kwargs_): - if info.subclass: - return info.subclass(*args_, **kwargs_) - else: - return info(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_info) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_info.subclass: + return tomato_info.subclass(*args_, **kwargs_) + else: + return tomato_info(*args_, **kwargs_) factory = staticmethod(factory) - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ def get_name(self): return self.name def set_name(self, name): self.name = name + def get_type(self): return self.type_ + def set_type(self, type_): self.type_ = type_ + def get_rating(self): return self.rating + def set_rating(self, rating): self.rating = rating def hasContent_(self): if ( @@ -2961,48 +2278,29 @@ class info(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='info') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='info', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='info'): - if self.rating is not None and 'rating' not in already_processed: - already_processed.add('rating') - outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) + if self.name is not None and 'name' not in already_processed: + already_processed.add('name') + outfile.write(' name=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.name), input_name='name')), )) if self.type_ is not None and 'type_' not in already_processed: already_processed.add('type_') outfile.write(' type="%s"' % self.gds_format_integer(self.type_, input_name='type')) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - outfile.write(' name=%s' % (self.gds_format_string(quote_attrib(self.name).encode(ExternalEncoding), input_name='name'), )) - def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): - pass - def exportLiteral(self, outfile, level, name_='info'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): if self.rating is not None and 'rating' not in already_processed: already_processed.add('rating') - showIndent(outfile, level) - outfile.write('rating=%f,\n' % (self.rating,)) - if self.type_ is not None and 'type_' not in already_processed: - already_processed.add('type_') - showIndent(outfile, level) - outfile.write('type_=%d,\n' % (self.type_,)) - if self.name is not None and 'name' not in already_processed: - already_processed.add('name') - showIndent(outfile, level) - outfile.write('name="%s",\n' % (self.name,)) - def exportLiteralChildren(self, outfile, level, name_): + outfile.write(' rating="%s"' % self.gds_format_float(self.rating, input_name='rating')) + def exportChildren(self, outfile, level, namespace_='', name_='info', fromsubclass_=False, pretty_print=True): pass def build(self, node): already_processed = set() @@ -3010,77 +2308,32 @@ class info(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('rating', node) - if value is not None and 'rating' not in already_processed: - already_processed.add('rating') - try: - self.rating = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (rating): %s' % exp) + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') try: self.type_ = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value + value = find_attr_value_('rating', node) + if value is not None and 'rating' not in already_processed: + already_processed.add('rating') + try: + self.rating = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (rating): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass - def walk_and_update(self): - members = info._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if info.superclass != None: - info.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: info depth: %d' % (counter, depth, ) - members = info._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class info +# end class tomato_info -class client_handlerType(GeneratedsSuper): +class tomato_client_handlerType(GeneratedsSuper): member_data_items_ = [ MemberSpec_('fullname', 'xs:string', 0), MemberSpec_('refid', 'xs:integer', 0), @@ -3088,13 +2341,19 @@ class client_handlerType(GeneratedsSuper): subclass = None superclass = None def __init__(self, fullname=None, refid=None): + self.original_tagname_ = None self.fullname = fullname self.refid = refid def factory(*args_, **kwargs_): - if client_handlerType.subclass: - return client_handlerType.subclass(*args_, **kwargs_) - else: - return client_handlerType(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, tomato_client_handlerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if tomato_client_handlerType.subclass: + return tomato_client_handlerType.subclass(*args_, **kwargs_) + else: + return tomato_client_handlerType(*args_, **kwargs_) factory = staticmethod(factory) def get_fullname(self): return self.fullname def set_fullname(self, fullname): self.fullname = fullname @@ -3113,13 +2372,15 @@ class client_handlerType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='client-handlerType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='client-handlerType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -3133,31 +2394,17 @@ class client_handlerType(GeneratedsSuper): eol_ = '' if self.fullname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fullname).encode(ExternalEncoding), input_name='fullname'), namespace_, eol_)) + outfile.write('<%sfullname>%s</%sfullname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fullname), input_name='fullname')), namespace_, eol_)) if self.refid is not None: showIndent(outfile, level, pretty_print) outfile.write('<%srefid>%s</%srefid>%s' % (namespace_, self.gds_format_integer(self.refid, input_name='refid'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='client-handlerType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.fullname is not None: - showIndent(outfile, level) - outfile.write('fullname=%s,\n' % quote_python(self.fullname).encode(ExternalEncoding)) - if self.refid is not None: - showIndent(outfile, level) - outfile.write('refid=%d,\n' % self.refid) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -3169,73 +2416,27 @@ class client_handlerType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'refid') self.refid = ival_ - def walk_and_update(self): - members = client_handlerType._member_data_items - for member in members: - obj1 = getattr(self, member.get_name()) - if member.get_data_type() == 'xs:date': - newvalue = date_calcs.date_from_string(obj1) - setattr(self, member.get_name(), newvalue) - elif member.get_container(): - for child in obj1: - if type(child) == types.InstanceType: - child.walk_and_update() - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_update() - if client_handlerType.superclass != None: - client_handlerType.superclass.walk_and_update(self) - def walk_and_show(self, depth): - global counter - counter += 1 - depth += 1 - print '%d. class: client_handlerType depth: %d' % (counter, depth, ) - members = client_handlerType._member_data_items - for member in members: - s1 = member.get_name() - s2 = member.get_data_type() - s3 = '%d' % member.get_container() - obj1 = getattr(self, member.get_name()) - if member.get_container(): - s4 = '<container>' - else: - if type(obj1) != types.InstanceType: - s4 = '%s' % obj1 - else: - s4 = '<instance>' - s5 = '%s%s%s %s' % (s1.ljust(16), s2.ljust(16), s3.rjust(4), s4, ) - print ' ', s5 - for member in members: - if member.get_container(): - for child in getattr(self, member.get_name()): - if type(child) == types.InstanceType: - child.walk_and_show(depth) - else: - obj1 = getattr(self, member.get_name()) - if type(obj1) == types.InstanceType: - obj1.walk_and_show(depth) -# end class client_handlerType +# end class tomato_client_handlerType GDSClassesMapping = { - 'client-handler': client_handlerType, - 'elparam': param, - 'promoter': booster, + 'client-handler': tomato_client_handlerType, + 'elparam': tomato_param, + 'promoter': tomato_booster, } USAGE_TEXT = """ -Usage: python <Parser>.py [ -s ] <in_xml_file> +Usage: python <tomato_Parser>.py [ -s ] <in_xml_file> """ def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -3248,12 +2449,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: rootTag = 'people' - rootClass = people + rootClass = tomato_people rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -3268,12 +2470,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: rootTag = 'people' - rootClass = people + rootClass = tomato_people rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -3291,13 +2494,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = people + rootTag = 'people' + rootClass = tomato_people rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -3305,26 +2512,27 @@ def parseString(inString, silence=False): if not silence: sys.stdout.write('<?xml version="1.0" ?>\n') rootObj.export( - sys.stdout, 0, name_="people", + sys.stdout, 0, name_=rootTag, namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: rootTag = 'people' - rootClass = people + rootClass = tomato_people rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None if not silence: - sys.stdout.write('#from out2_sup import *\n\n') - sys.stdout.write('import out2_sup as model_\n\n') - sys.stdout.write('rootObj = model_.rootTag(\n') + sys.stdout.write('#from prefix_classname2_sup import *\n\n') + sys.stdout.write('import prefix_classname2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) sys.stdout.write(')\n') return rootObj @@ -3344,16 +2552,16 @@ if __name__ == '__main__': __all__ = [ - "agent", - "booster", - "client_handlerType", - "comments", - "info", - "java_programmer", - "param", - "people", - "person", - "programmer", - "python_programmer", - "special_agent" + "tomato_agent", + "tomato_booster", + "tomato_client_handlerType", + "tomato_comments", + "tomato_info", + "tomato_java_programmer", + "tomato_param", + "tomato_people", + "tomato_person", + "tomato_programmer", + "tomato_python_programmer", + "tomato_special_agent" ] diff --git a/tests/recursive_simpletype1_sub.py b/tests/recursive_simpletype1_sub.py index db59f2a..336b026 100644 --- a/tests/recursive_simpletype1_sub.py +++ b/tests/recursive_simpletype1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/recursive_simpletype2_sup.py') +# ('-s', 'tests/recursive_simpletype2_sub.py') +# ('--super', 'recursive_simpletype2_sup') +# +# Command line arguments: +# tests/recursive_simpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/recursive_simpletype2_sup.py" -s "tests/recursive_simpletype2_sub.py" --super="recursive_simpletype2_sup" tests/recursive_simpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import recursive_simpletype2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -91,11 +64,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = supermod.PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -111,11 +85,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = supermod.PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -135,11 +110,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = supermod.PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -154,11 +130,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PersonType' rootClass = supermod.PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -167,8 +144,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from recursive_simpletype2_sup import *\n\n') ## sys.stdout.write('import recursive_simpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.person(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="person") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -179,7 +156,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py index a675310..571ffda 100644 --- a/tests/recursive_simpletype1_sup.py +++ b/tests/recursive_simpletype1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/recursive_simpletype2_sup.py') +# ('-s', 'tests/recursive_simpletype2_sub.py') +# ('--super', 'recursive_simpletype2_sup') +# +# Command line arguments: +# tests/recursive_simpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/recursive_simpletype2_sup.py" -s "tests/recursive_simpletype2_sub.py" --super="recursive_simpletype2_sup" tests/recursive_simpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -617,10 +669,16 @@ class PersonType(GeneratedsSuper): subclass = None superclass = None def __init__(self, personId=None, fname=None, lname=None): + self.original_tagname_ = None self.personId = personId self.fname = fname self.lname = lname def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, PersonType) + if subclass is not None: + return subclass(*args_, **kwargs_) if PersonType.subclass: return PersonType.subclass(*args_, **kwargs_) else: @@ -646,13 +704,15 @@ class PersonType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='PersonType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='PersonType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -669,34 +729,17 @@ class PersonType(GeneratedsSuper): outfile.write('<%spersonId>%s</%spersonId>%s' % (namespace_, self.gds_format_integer(self.personId, input_name='personId'), namespace_, eol_)) if self.fname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_format_string(quote_xml(self.fname).encode(ExternalEncoding), input_name='fname'), namespace_, eol_)) + outfile.write('<%sfname>%s</%sfname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.fname), input_name='fname')), namespace_, eol_)) if self.lname is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_format_string(quote_xml(self.lname).encode(ExternalEncoding), input_name='lname'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='PersonType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.personId is not None: - showIndent(outfile, level) - outfile.write('personId=%d,\n' % self.personId) - if self.fname is not None: - showIndent(outfile, level) - outfile.write('fname=%s,\n' % quote_python(self.fname).encode(ExternalEncoding)) - if self.lname is not None: - showIndent(outfile, level) - outfile.write('lname=%s,\n' % quote_python(self.lname).encode(ExternalEncoding)) + outfile.write('<%slname>%s</%slname>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.lname), input_name='lname')), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -704,7 +747,7 @@ class PersonType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'personId') self.personId = ival_ @@ -730,7 +773,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -743,11 +786,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -763,11 +807,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -786,12 +831,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'PersonType' rootClass = PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -800,17 +849,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="person", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' + rootTag = 'PersonType' rootClass = PersonType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -819,7 +869,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from recursive_simpletype2_sup import *\n\n') ## sys.stdout.write('import recursive_simpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/reference_simpletype.xsd b/tests/reference_simpletype.xsd new file mode 100644 index 0000000..48727fc --- /dev/null +++ b/tests/reference_simpletype.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- edited with XMLSpy v2015 (x64) (http://www.altova.com) by Michael de Paly (FOTON Germany Construction Machines) --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1"> + <xs:element name="test_ref_element" type="xs:integer"/> + <xs:attribute name="test_ref_attr" type="xs:integer"/> + <xs:attribute name="other_ref_attr" type="xs:float"/> + <xs:element name="dummy"> + <xs:annotation> + <xs:documentation>Comment describing your root element</xs:documentation> + </xs:annotation> + <xs:complexType> + <xs:sequence> + <xs:element ref="test_ref_element"/> + <xs:element name="test_normal_element" type="xs:integer"/> + </xs:sequence> + <xs:attribute ref="test_ref_attr"/> + <xs:attribute name="test_normal_attr" type="xs:integer"/> + </xs:complexType> + </xs:element> +</xs:schema> diff --git a/tests/recursive_simpletype2_sub.py b/tests/reference_simpletype1_sub.py similarity index 50% rename from tests/recursive_simpletype2_sub.py rename to tests/reference_simpletype1_sub.py index db59f2a..9297c7a 100644 --- a/tests/recursive_simpletype2_sub.py +++ b/tests/reference_simpletype1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/reference_simpletype2_sup.py') +# ('-s', 'tests/reference_simpletype2_sub.py') +# ('--super', 'reference_simpletype2_sup') +# +# Command line arguments: +# tests/reference_simpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/reference_simpletype2_sup.py" -s "tests/reference_simpletype2_sub.py" --super="reference_simpletype2_sup" tests/reference_simpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ + +import reference_simpletype2_sup as supermod -import recursive_simpletype2_sup as supermod - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -74,11 +47,11 @@ ExternalEncoding = 'ascii' # -class PersonTypeSub(supermod.PersonType): - def __init__(self, personId=None, fname=None, lname=None): - super(PersonTypeSub, self).__init__(personId, fname, lname, ) -supermod.PersonType.subclass = PersonTypeSub -# end class PersonTypeSub +class dummySub(supermod.dummy): + def __init__(self, test_ref_attr=None, test_normal_attr=None, test_ref_element=None, test_normal_element=None): + super(dummySub, self).__init__(test_ref_attr, test_normal_attr, test_ref_element, test_normal_element, ) +supermod.dummy.subclass = dummySub +# end class dummySub def get_root_tag(node): @@ -91,12 +64,13 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = supermod.PersonType + rootTag = 'xs_integer' + rootClass = supermod.xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -111,12 +85,13 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = supermod.PersonType + rootTag = 'xs_integer' + rootClass = supermod.xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -135,12 +110,13 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'person' - rootClass = supermod.PersonType + rootTag = 'xs_integer' + rootClass = supermod.xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -154,21 +130,22 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = supermod.PersonType + rootTag = 'xs_integer' + rootClass = supermod.xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from recursive_simpletype2_sup import *\n\n') -## sys.stdout.write('import recursive_simpletype2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.person(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="person") +## sys.stdout.write('#from reference_simpletype2_sup import *\n\n') +## sys.stdout.write('import reference_simpletype2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -179,7 +156,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/attr_groups2_sup.py b/tests/reference_simpletype1_sup.py similarity index 63% rename from tests/attr_groups2_sup.py rename to tests/reference_simpletype1_sup.py index d1db370..849823a 100644 --- a/tests/attr_groups2_sup.py +++ b/tests/reference_simpletype1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/reference_simpletype2_sup.py') +# ('-s', 'tests/reference_simpletype2_sub.py') +# ('--super', 'reference_simpletype2_sup') +# +# Command line arguments: +# tests/reference_simpletype.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/reference_simpletype2_sup.py" -s "tests/reference_simpletype2_sub.py" --super="reference_simpletype2_sup" tests/reference_simpletype.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -608,217 +660,128 @@ def _cast(typ, value): # -class GetUserReq(GeneratedsSuper): +class dummy(GeneratedsSuper): + """Comment describing your root element""" member_data_items_ = [ - MemberSpec_('value04', 'xsd:integer', 0), - MemberSpec_('value05', 'xsd:string', 0), - MemberSpec_('value06', 'xsd:integer', 0), - MemberSpec_('value07', 'xsd:integer', 0), - MemberSpec_('value01', 'xsd:string', 0), - MemberSpec_('value02', 'xsd:integer', 0), - MemberSpec_('value03', 'xsd:string', 0), - MemberSpec_('sequence', 'xsd:unsignedLong', 0), - MemberSpec_('returnedTags', 'xsd:string', 0), + MemberSpec_('test_ref_attr', 'xs:integer', 0), + MemberSpec_('test_normal_attr', 'xs:integer', 0), + MemberSpec_('test_ref_element', 'xs:integer', 0), + MemberSpec_('test_normal_element', 'xs:integer', 0), ] subclass = None superclass = None - def __init__(self, value04=None, value05=None, value06=None, value07=None, value01=None, value02=None, value03=None, sequence=None, returnedTags=None): - self.value04 = _cast(int, value04) - self.value05 = _cast(None, value05) - self.value06 = _cast(int, value06) - self.value07 = _cast(int, value07) - self.value01 = _cast(None, value01) - self.value02 = _cast(int, value02) - self.value03 = _cast(None, value03) - self.sequence = _cast(int, sequence) - self.returnedTags = returnedTags + def __init__(self, test_ref_attr=None, test_normal_attr=None, test_ref_element=None, test_normal_element=None): + self.original_tagname_ = None + self.test_ref_attr = _cast(int, test_ref_attr) + self.test_normal_attr = _cast(int, test_normal_attr) + self.test_ref_element = test_ref_element + self.test_normal_element = test_normal_element def factory(*args_, **kwargs_): - if GetUserReq.subclass: - return GetUserReq.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, dummy) + if subclass is not None: + return subclass(*args_, **kwargs_) + if dummy.subclass: + return dummy.subclass(*args_, **kwargs_) else: - return GetUserReq(*args_, **kwargs_) + return dummy(*args_, **kwargs_) factory = staticmethod(factory) - def get_returnedTags(self): return self.returnedTags - def set_returnedTags(self, returnedTags): self.returnedTags = returnedTags - def get_value04(self): return self.value04 - def set_value04(self, value04): self.value04 = value04 - def get_value05(self): return self.value05 - def set_value05(self, value05): self.value05 = value05 - def get_value06(self): return self.value06 - def set_value06(self, value06): self.value06 = value06 - def get_value07(self): return self.value07 - def set_value07(self, value07): self.value07 = value07 - def get_value01(self): return self.value01 - def set_value01(self, value01): self.value01 = value01 - def get_value02(self): return self.value02 - def set_value02(self, value02): self.value02 = value02 - def get_value03(self): return self.value03 - def set_value03(self, value03): self.value03 = value03 - def get_sequence(self): return self.sequence - def set_sequence(self, sequence): self.sequence = sequence + def get_test_ref_element(self): return self.test_ref_element + def set_test_ref_element(self, test_ref_element): self.test_ref_element = test_ref_element + def get_test_normal_element(self): return self.test_normal_element + def set_test_normal_element(self, test_normal_element): self.test_normal_element = test_normal_element + def get_test_ref_attr(self): return self.test_ref_attr + def set_test_ref_attr(self, test_ref_attr): self.test_ref_attr = test_ref_attr + def get_test_normal_attr(self): return self.test_normal_attr + def set_test_normal_attr(self, test_normal_attr): self.test_normal_attr = test_normal_attr def hasContent_(self): if ( - self.returnedTags is not None + self.test_ref_element is not None or + self.test_normal_element is not None ): return True else: return False - def export(self, outfile, level, namespace_='', name_='GetUserReq', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='dummy', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='GetUserReq') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='dummy') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='dummy', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='GetUserReq'): - if self.value04 is not None and 'value04' not in already_processed: - already_processed.add('value04') - outfile.write(' value04="%s"' % self.gds_format_integer(self.value04, input_name='value04')) - if self.value05 is not None and 'value05' not in already_processed: - already_processed.add('value05') - outfile.write(' value05=%s' % (self.gds_format_string(quote_attrib(self.value05).encode(ExternalEncoding), input_name='value05'), )) - if self.value06 is not None and 'value06' not in already_processed: - already_processed.add('value06') - outfile.write(' value06="%s"' % self.gds_format_integer(self.value06, input_name='value06')) - if self.value07 is not None and 'value07' not in already_processed: - already_processed.add('value07') - outfile.write(' value07="%s"' % self.gds_format_integer(self.value07, input_name='value07')) - if self.value01 is not None and 'value01' not in already_processed: - already_processed.add('value01') - outfile.write(' value01=%s' % (self.gds_format_string(quote_attrib(self.value01).encode(ExternalEncoding), input_name='value01'), )) - if self.value02 is not None and 'value02' not in already_processed: - already_processed.add('value02') - outfile.write(' value02="%s"' % self.gds_format_integer(self.value02, input_name='value02')) - if self.value03 is not None and 'value03' not in already_processed: - already_processed.add('value03') - outfile.write(' value03=%s' % (self.gds_format_string(quote_attrib(self.value03).encode(ExternalEncoding), input_name='value03'), )) - if self.sequence is not None and 'sequence' not in already_processed: - already_processed.add('sequence') - outfile.write(' sequence="%s"' % self.gds_format_integer(self.sequence, input_name='sequence')) - def exportChildren(self, outfile, level, namespace_='', name_='GetUserReq', fromsubclass_=False, pretty_print=True): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='dummy'): + if self.test_ref_attr is not None and 'test_ref_attr' not in already_processed: + already_processed.add('test_ref_attr') + outfile.write(' test_ref_attr="%s"' % self.gds_format_integer(self.test_ref_attr, input_name='test_ref_attr')) + if self.test_normal_attr is not None and 'test_normal_attr' not in already_processed: + already_processed.add('test_normal_attr') + outfile.write(' test_normal_attr="%s"' % self.gds_format_integer(self.test_normal_attr, input_name='test_normal_attr')) + def exportChildren(self, outfile, level, namespace_='', name_='dummy', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' - if self.returnedTags is not None: + if self.test_ref_element is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sreturnedTags>%s</%sreturnedTags>%s' % (namespace_, self.gds_format_string(quote_xml(self.returnedTags).encode(ExternalEncoding), input_name='returnedTags'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='GetUserReq'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.value04 is not None and 'value04' not in already_processed: - already_processed.add('value04') - showIndent(outfile, level) - outfile.write('value04=%d,\n' % (self.value04,)) - if self.value05 is not None and 'value05' not in already_processed: - already_processed.add('value05') - showIndent(outfile, level) - outfile.write('value05="%s",\n' % (self.value05,)) - if self.value06 is not None and 'value06' not in already_processed: - already_processed.add('value06') - showIndent(outfile, level) - outfile.write('value06=%d,\n' % (self.value06,)) - if self.value07 is not None and 'value07' not in already_processed: - already_processed.add('value07') - showIndent(outfile, level) - outfile.write('value07=%d,\n' % (self.value07,)) - if self.value01 is not None and 'value01' not in already_processed: - already_processed.add('value01') - showIndent(outfile, level) - outfile.write('value01="%s",\n' % (self.value01,)) - if self.value02 is not None and 'value02' not in already_processed: - already_processed.add('value02') - showIndent(outfile, level) - outfile.write('value02=%d,\n' % (self.value02,)) - if self.value03 is not None and 'value03' not in already_processed: - already_processed.add('value03') - showIndent(outfile, level) - outfile.write('value03="%s",\n' % (self.value03,)) - if self.sequence is not None and 'sequence' not in already_processed: - already_processed.add('sequence') - showIndent(outfile, level) - outfile.write('sequence=%d,\n' % (self.sequence,)) - def exportLiteralChildren(self, outfile, level, name_): - if self.returnedTags is not None: - showIndent(outfile, level) - outfile.write('returnedTags=%s,\n' % quote_python(self.returnedTags).encode(ExternalEncoding)) + outfile.write('<%stest_ref_element>%s</%stest_ref_element>%s' % (namespace_, self.gds_format_integer(self.test_ref_element, input_name='test_ref_element'), namespace_, eol_)) + if self.test_normal_element is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stest_normal_element>%s</%stest_normal_element>%s' % (namespace_, self.gds_format_integer(self.test_normal_element, input_name='test_normal_element'), namespace_, eol_)) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('value04', node) - if value is not None and 'value04' not in already_processed: - already_processed.add('value04') + value = find_attr_value_('test_ref_attr', node) + if value is not None and 'test_ref_attr' not in already_processed: + already_processed.add('test_ref_attr') try: - self.value04 = int(value) - except ValueError, exp: + self.test_ref_attr = int(value) + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value05', node) - if value is not None and 'value05' not in already_processed: - already_processed.add('value05') - self.value05 = value - value = find_attr_value_('value06', node) - if value is not None and 'value06' not in already_processed: - already_processed.add('value06') + value = find_attr_value_('test_normal_attr', node) + if value is not None and 'test_normal_attr' not in already_processed: + already_processed.add('test_normal_attr') try: - self.value06 = int(value) - except ValueError, exp: + self.test_normal_attr = int(value) + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value07', node) - if value is not None and 'value07' not in already_processed: - already_processed.add('value07') - try: - self.value07 = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value01', node) - if value is not None and 'value01' not in already_processed: - already_processed.add('value01') - self.value01 = value - value = find_attr_value_('value02', node) - if value is not None and 'value02' not in already_processed: - already_processed.add('value02') + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'test_ref_element': + sval_ = child_.text try: - self.value02 = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value03', node) - if value is not None and 'value03' not in already_processed: - already_processed.add('value03') - self.value03 = value - value = find_attr_value_('sequence', node) - if value is not None and 'sequence' not in already_processed: - already_processed.add('sequence') + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'test_ref_element') + self.test_ref_element = ival_ + elif nodeName_ == 'test_normal_element': + sval_ = child_.text try: - self.sequence = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'returnedTags': - returnedTags_ = child_.text - returnedTags_ = self.gds_validate_string(returnedTags_, node, 'returnedTags') - self.returnedTags = returnedTags_ -# end class GetUserReq + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'test_normal_element') + self.test_normal_element = ival_ +# end class dummy GDSClassesMapping = { - 'getUser': GetUserReq, } @@ -828,7 +791,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -841,12 +804,13 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' - rootClass = GetUserReq + rootTag = 'xs_integer' + rootClass = xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -861,12 +825,13 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' - rootClass = GetUserReq + rootTag = 'xs_integer' + rootClass = xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -884,13 +849,17 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootClass = GetUserReq + rootTag = 'xs_integer' + rootClass = xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. @@ -898,26 +867,27 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="getUser", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'getUser' - rootClass = GetUserReq + rootTag = 'xs_integer' + rootClass = xs_integer rootObj = rootClass.factory() rootObj.build(rootNode) # Enable Python to collect the space used by the DOM. doc = None ## if not silence: -## sys.stdout.write('#from attr_groups2_sup import *\n\n') -## sys.stdout.write('import attr_groups2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('#from reference_simpletype2_sup import *\n\n') +## sys.stdout.write('import reference_simpletype2_sup as model_\n\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -937,5 +907,5 @@ if __name__ == '__main__': __all__ = [ - "GetUserReq" + "dummy" ] diff --git a/tests/rem_dup_elems.xml b/tests/rem_dup_elems.xml new file mode 100644 index 0000000..6db5379 --- /dev/null +++ b/tests/rem_dup_elems.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" ?> +<authors> + <author> + <description>description one</description> + </author> + <author> + <description>description two</description> + </author> + <cooperation>sample cooperation one</cooperation> + <author> + <description>description three</description> + </author> + <cooperation>sample cooperation two</cooperation> + <author> + <description>description four</description> + </author> + <cooperation>sample cooperation three</cooperation> +</authors> diff --git a/tests/rem_dup_elems.xsd b/tests/rem_dup_elems.xsd new file mode 100644 index 0000000..5cb3ed3 --- /dev/null +++ b/tests/rem_dup_elems.xsd @@ -0,0 +1,22 @@ +<xsd:schema + xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" + > + + <xsd:element name="authors" type="authorsType" /> + <xsd:complexType name="authorsType"> + <xsd:sequence> + <xsd:element ref="author"/> + <xsd:choice maxOccurs="unbounded" minOccurs="0"> + <xsd:element ref="author"/> + <xsd:element name="cooperation" type="xsd:string"/> + </xsd:choice> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="author"> + <xsd:sequence> + <xsd:element name="description" type="xsd:string"/> + </xsd:sequence> + </xsd:complexType> + +</xsd:schema> diff --git a/tests/rem_dup_elems1_out.xml b/tests/rem_dup_elems1_out.xml new file mode 100644 index 0000000..69b44af --- /dev/null +++ b/tests/rem_dup_elems1_out.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" ?> +<authors> + <author> + <description>description one</description> + </author> + <author> + <description>description two</description> + </author> + <author> + <description>description three</description> + </author> + <author> + <description>description four</description> + </author> + <cooperation>sample cooperation one</cooperation> + <cooperation>sample cooperation two</cooperation> + <cooperation>sample cooperation three</cooperation> +</authors> diff --git a/tests/rem_dup_elems1_sub.py b/tests/rem_dup_elems1_sub.py new file mode 100644 index 0000000..c9f7ba4 --- /dev/null +++ b/tests/rem_dup_elems1_sub.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-a', 'xsd:') +# ('-o', 'tests/rem_dup_elems2_sup.py') +# ('-s', 'tests/rem_dup_elems2_sub.py') +# ('--super', 'rem_dup_elems2_sup') +# ('--no-warnings', '') +# +# Command line arguments: +# tests/rem_dup_elems.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -a "xsd:" -o "tests/rem_dup_elems2_sup.py" -s "tests/rem_dup_elems2_sub.py" --super="rem_dup_elems2_sup" --no-warnings tests/rem_dup_elems.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import rem_dup_elems2_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 authorsTypeSub(supermod.authorsType): + def __init__(self, author=None, cooperation=None): + super(authorsTypeSub, self).__init__(author, cooperation, ) +supermod.authorsType.subclass = authorsTypeSub +# end class authorsTypeSub + + +class authorSub(supermod.author): + def __init__(self, description=None): + super(authorSub, self).__init__(description, ) +supermod.author.subclass = authorSub +# end class authorSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = supermod.authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = supermod.authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = supermod.authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = supermod.authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from rem_dup_elems2_sup import *\n\n') + sys.stdout.write('import rem_dup_elems2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py new file mode 100644 index 0000000..ee67fd2 --- /dev/null +++ b/tests/rem_dup_elems1_sup.py @@ -0,0 +1,965 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-a', 'xsd:') +# ('-o', 'tests/rem_dup_elems2_sup.py') +# ('-s', 'tests/rem_dup_elems2_sub.py') +# ('--super', 'rem_dup_elems2_sup') +# ('--no-warnings', '') +# +# Command line arguments: +# tests/rem_dup_elems.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -a "xsd:" -o "tests/rem_dup_elems2_sup.py" -s "tests/rem_dup_elems2_sub.py" --super="rem_dup_elems2_sup" --no-warnings tests/rem_dup_elems.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class authorsType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('author', 'author', 1), + MemberSpec_('cooperation', 'xsd:string', 1), + ] + subclass = None + superclass = None + def __init__(self, author=None, cooperation=None): + self.original_tagname_ = None + if author is None: + self.author = [] + else: + self.author = author + if cooperation is None: + self.cooperation = [] + else: + self.cooperation = cooperation + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, authorsType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if authorsType.subclass: + return authorsType.subclass(*args_, **kwargs_) + else: + return authorsType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_author(self): return self.author + def set_author(self, author): self.author = author + def add_author(self, value): self.author.append(value) + def insert_author_at(self, index, value): self.author.insert(index, value) + def replace_author_at(self, index, value): self.author[index] = value + def get_cooperation(self): return self.cooperation + def set_cooperation(self, cooperation): self.cooperation = cooperation + def add_cooperation(self, value): self.cooperation.append(value) + def insert_cooperation_at(self, index, value): self.cooperation.insert(index, value) + def replace_cooperation_at(self, index, value): self.cooperation[index] = value + def hasContent_(self): + if ( + self.author or + self.cooperation + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='authorsType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='authorsType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='authorsType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='authorsType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='authorsType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for author_ in self.author: + author_.export(outfile, level, namespace_, name_='author', pretty_print=pretty_print) + for cooperation_ in self.cooperation: + showIndent(outfile, level, pretty_print) + outfile.write('<%scooperation>%s</%scooperation>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(cooperation_), input_name='cooperation')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'author': + obj_ = author.factory() + obj_.build(child_) + self.author.append(obj_) + obj_.original_tagname_ = 'author' + elif nodeName_ == 'cooperation': + cooperation_ = child_.text + cooperation_ = self.gds_validate_string(cooperation_, node, 'cooperation') + self.cooperation.append(cooperation_) +# end class authorsType + + +class author(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('description', 'xsd:string', 0), + ] + subclass = None + superclass = None + def __init__(self, description=None): + self.original_tagname_ = None + self.description = description + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, author) + if subclass is not None: + return subclass(*args_, **kwargs_) + if author.subclass: + return author.subclass(*args_, **kwargs_) + else: + return author(*args_, **kwargs_) + factory = staticmethod(factory) + def get_description(self): return self.description + def set_description(self, description): self.description = description + def hasContent_(self): + if ( + self.description is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='author', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='author') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='author', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='author'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='author', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.description is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdescription>%s</%sdescription>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.description), input_name='description')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'description': + description_ = child_.text + description_ = self.gds_validate_string(description_, node, 'description') + self.description = description_ +# end class author + + +GDSClassesMapping = { + 'authors': authorsType, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'authorsType' + rootClass = authorsType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from rem_dup_elems2_sup import *\n\n') + sys.stdout.write('import rem_dup_elems2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "author", + "authorsType" +] diff --git a/tests/simplecontent_restriction1_sub.py b/tests/simplecontent_restriction1_sub.py index f986e75..8ed52f9 100644 --- a/tests/simplecontent_restriction1_sub.py +++ b/tests/simplecontent_restriction1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simplecontent_restriction2_sup.py') +# ('-s', 'tests/simplecontent_restriction2_sub.py') +# ('--super', 'simplecontent_restriction2_sup') +# +# Command line arguments: +# tests/simplecontent_restriction.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simplecontent_restriction2_sup.py" -s "tests/simplecontent_restriction2_sub.py" --super="simplecontent_restriction2_sup" tests/simplecontent_restriction.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import simplecontent_restriction2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,22 +48,22 @@ ExternalEncoding = 'ascii' class IdentifierTypeSub(supermod.IdentifierType): - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None): - super(IdentifierTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, extensiontype_, ) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None, extensiontype_=None): + super(IdentifierTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, extensiontype_, ) supermod.IdentifierType.subclass = IdentifierTypeSub # end class IdentifierTypeSub class BillOfResourcesIDTypeSub(supermod.BillOfResourcesIDType): - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None): - super(BillOfResourcesIDTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, ) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None): + super(BillOfResourcesIDTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, ) supermod.BillOfResourcesIDType.subclass = BillOfResourcesIDTypeSub # end class BillOfResourcesIDTypeSub class BillOfMaterialIDTypeSub(supermod.BillOfMaterialIDType): - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None): - super(BillOfMaterialIDTypeSub, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, ) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None): + super(BillOfMaterialIDTypeSub, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, ) supermod.BillOfMaterialIDType.subclass = BillOfMaterialIDTypeSub # end class BillOfMaterialIDTypeSub @@ -105,7 +78,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -125,7 +99,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -149,7 +124,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -168,11 +144,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'IdentifierType' rootClass = supermod.IdentifierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -181,8 +158,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n') ## sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.IdentifierType(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="IdentifierType") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -193,7 +170,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py index 330b45e..155013f 100644 --- a/tests/simplecontent_restriction1_sup.py +++ b/tests/simplecontent_restriction1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simplecontent_restriction2_sup.py') +# ('-s', 'tests/simplecontent_restriction2_sub.py') +# ('--super', 'simplecontent_restriction2_sup') +# +# Command line arguments: +# tests/simplecontent_restriction.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simplecontent_restriction2_sup.py" -s "tests/simplecontent_restriction2_sub.py" --super="simplecontent_restriction2_sup" tests/simplecontent_restriction.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -610,45 +662,51 @@ def _cast(typ, value): class IdentifierType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('schemeDataURI', 'xsd:anyURI', 0), MemberSpec_('schemeID', 'xsd:normalizedString', 0), - MemberSpec_('schemeAgencyName', 'xsd:string', 0), - MemberSpec_('schemeAgencyID', 'xsd:normalizedString', 0), MemberSpec_('schemeName', 'xsd:string', 0), + MemberSpec_('schemeAgencyID', 'xsd:normalizedString', 0), + MemberSpec_('schemeAgencyName', 'xsd:string', 0), MemberSpec_('schemeVersionID', 'xsd:normalizedString', 0), + MemberSpec_('schemeDataURI', 'xsd:anyURI', 0), MemberSpec_('schemeURI', 'xsd:anyURI', 0), MemberSpec_('valueOf_', 'xsd:normalizedString', 0), ] subclass = None superclass = None - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None, extensiontype_=None): - self.schemeDataURI = _cast(None, schemeDataURI) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None, extensiontype_=None): + self.original_tagname_ = None self.schemeID = _cast(None, schemeID) - self.schemeAgencyName = _cast(None, schemeAgencyName) - self.schemeAgencyID = _cast(None, schemeAgencyID) self.schemeName = _cast(None, schemeName) + self.schemeAgencyID = _cast(None, schemeAgencyID) + self.schemeAgencyName = _cast(None, schemeAgencyName) self.schemeVersionID = _cast(None, schemeVersionID) + self.schemeDataURI = _cast(None, schemeDataURI) self.schemeURI = _cast(None, schemeURI) self.valueOf_ = valueOf_ self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, IdentifierType) + if subclass is not None: + return subclass(*args_, **kwargs_) if IdentifierType.subclass: return IdentifierType.subclass(*args_, **kwargs_) else: return IdentifierType(*args_, **kwargs_) factory = staticmethod(factory) - def get_schemeDataURI(self): return self.schemeDataURI - def set_schemeDataURI(self, schemeDataURI): self.schemeDataURI = schemeDataURI def get_schemeID(self): return self.schemeID def set_schemeID(self, schemeID): self.schemeID = schemeID - def get_schemeAgencyName(self): return self.schemeAgencyName - def set_schemeAgencyName(self, schemeAgencyName): self.schemeAgencyName = schemeAgencyName - def get_schemeAgencyID(self): return self.schemeAgencyID - def set_schemeAgencyID(self, schemeAgencyID): self.schemeAgencyID = schemeAgencyID def get_schemeName(self): return self.schemeName def set_schemeName(self, schemeName): self.schemeName = schemeName + def get_schemeAgencyID(self): return self.schemeAgencyID + def set_schemeAgencyID(self, schemeAgencyID): self.schemeAgencyID = schemeAgencyID + def get_schemeAgencyName(self): return self.schemeAgencyName + def set_schemeAgencyName(self, schemeAgencyName): self.schemeAgencyName = schemeAgencyName def get_schemeVersionID(self): return self.schemeVersionID def set_schemeVersionID(self, schemeVersionID): self.schemeVersionID = schemeVersionID + def get_schemeDataURI(self): return self.schemeDataURI + def set_schemeDataURI(self, schemeDataURI): self.schemeDataURI = schemeDataURI def get_schemeURI(self): return self.schemeURI def set_schemeURI(self, schemeURI): self.schemeURI = schemeURI def get_valueOf_(self): return self.valueOf_ @@ -657,7 +715,7 @@ class IdentifierType(GeneratedsSuper): def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -667,84 +725,47 @@ class IdentifierType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='IdentifierType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='IdentifierType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='IdentifierType'): - if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed: - already_processed.add('schemeDataURI') - outfile.write(' schemeDataURI=%s' % (self.gds_format_string(quote_attrib(self.schemeDataURI).encode(ExternalEncoding), input_name='schemeDataURI'), )) if self.schemeID is not None and 'schemeID' not in already_processed: already_processed.add('schemeID') - outfile.write(' schemeID=%s' % (self.gds_format_string(quote_attrib(self.schemeID).encode(ExternalEncoding), input_name='schemeID'), )) - if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed: - already_processed.add('schemeAgencyName') - outfile.write(' schemeAgencyName=%s' % (self.gds_format_string(quote_attrib(self.schemeAgencyName).encode(ExternalEncoding), input_name='schemeAgencyName'), )) - if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed: - already_processed.add('schemeAgencyID') - outfile.write(' schemeAgencyID=%s' % (self.gds_format_string(quote_attrib(self.schemeAgencyID).encode(ExternalEncoding), input_name='schemeAgencyID'), )) + outfile.write(' schemeID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeID), input_name='schemeID')), )) if self.schemeName is not None and 'schemeName' not in already_processed: already_processed.add('schemeName') - outfile.write(' schemeName=%s' % (self.gds_format_string(quote_attrib(self.schemeName).encode(ExternalEncoding), input_name='schemeName'), )) + outfile.write(' schemeName=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeName), input_name='schemeName')), )) + if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed: + already_processed.add('schemeAgencyID') + outfile.write(' schemeAgencyID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeAgencyID), input_name='schemeAgencyID')), )) + if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed: + already_processed.add('schemeAgencyName') + outfile.write(' schemeAgencyName=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeAgencyName), input_name='schemeAgencyName')), )) if self.schemeVersionID is not None and 'schemeVersionID' not in already_processed: already_processed.add('schemeVersionID') - outfile.write(' schemeVersionID=%s' % (self.gds_format_string(quote_attrib(self.schemeVersionID).encode(ExternalEncoding), input_name='schemeVersionID'), )) + outfile.write(' schemeVersionID=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeVersionID), input_name='schemeVersionID')), )) + if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed: + already_processed.add('schemeDataURI') + outfile.write(' schemeDataURI=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeDataURI), input_name='schemeDataURI')), )) if self.schemeURI is not None and 'schemeURI' not in already_processed: already_processed.add('schemeURI') - outfile.write(' schemeURI=%s' % (self.gds_format_string(quote_attrib(self.schemeURI).encode(ExternalEncoding), input_name='schemeURI'), )) + outfile.write(' schemeURI=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.schemeURI), input_name='schemeURI')), )) if self.extensiontype_ is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') outfile.write(' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') outfile.write(' xsi:type="%s"' % self.extensiontype_) def exportChildren(self, outfile, level, namespace_='', name_='IdentifierType', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='IdentifierType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.schemeDataURI is not None and 'schemeDataURI' not in already_processed: - already_processed.add('schemeDataURI') - showIndent(outfile, level) - outfile.write('schemeDataURI="%s",\n' % (self.schemeDataURI,)) - if self.schemeID is not None and 'schemeID' not in already_processed: - already_processed.add('schemeID') - showIndent(outfile, level) - outfile.write('schemeID="%s",\n' % (self.schemeID,)) - if self.schemeAgencyName is not None and 'schemeAgencyName' not in already_processed: - already_processed.add('schemeAgencyName') - showIndent(outfile, level) - outfile.write('schemeAgencyName="%s",\n' % (self.schemeAgencyName,)) - if self.schemeAgencyID is not None and 'schemeAgencyID' not in already_processed: - already_processed.add('schemeAgencyID') - showIndent(outfile, level) - outfile.write('schemeAgencyID="%s",\n' % (self.schemeAgencyID,)) - if self.schemeName is not None and 'schemeName' not in already_processed: - already_processed.add('schemeName') - showIndent(outfile, level) - outfile.write('schemeName="%s",\n' % (self.schemeName,)) - if self.schemeVersionID is not None and 'schemeVersionID' not in already_processed: - already_processed.add('schemeVersionID') - showIndent(outfile, level) - outfile.write('schemeVersionID="%s",\n' % (self.schemeVersionID,)) - if self.schemeURI is not None and 'schemeURI' not in already_processed: - already_processed.add('schemeURI') - showIndent(outfile, level) - outfile.write('schemeURI="%s",\n' % (self.schemeURI,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -752,31 +773,32 @@ class IdentifierType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('schemeDataURI', node) - if value is not None and 'schemeDataURI' not in already_processed: - already_processed.add('schemeDataURI') - self.schemeDataURI = value value = find_attr_value_('schemeID', node) if value is not None and 'schemeID' not in already_processed: already_processed.add('schemeID') self.schemeID = value - value = find_attr_value_('schemeAgencyName', node) - if value is not None and 'schemeAgencyName' not in already_processed: - already_processed.add('schemeAgencyName') - self.schemeAgencyName = value - value = find_attr_value_('schemeAgencyID', node) - if value is not None and 'schemeAgencyID' not in already_processed: - already_processed.add('schemeAgencyID') - self.schemeAgencyID = value value = find_attr_value_('schemeName', node) if value is not None and 'schemeName' not in already_processed: already_processed.add('schemeName') self.schemeName = value + value = find_attr_value_('schemeAgencyID', node) + if value is not None and 'schemeAgencyID' not in already_processed: + already_processed.add('schemeAgencyID') + self.schemeAgencyID = value + value = find_attr_value_('schemeAgencyName', node) + if value is not None and 'schemeAgencyName' not in already_processed: + already_processed.add('schemeAgencyName') + self.schemeAgencyName = value value = find_attr_value_('schemeVersionID', node) if value is not None and 'schemeVersionID' not in already_processed: already_processed.add('schemeVersionID') self.schemeVersionID = value + value = find_attr_value_('schemeDataURI', node) + if value is not None and 'schemeDataURI' not in already_processed: + already_processed.add('schemeDataURI') + self.schemeDataURI = value value = find_attr_value_('schemeURI', node) if value is not None and 'schemeURI' not in already_processed: already_processed.add('schemeURI') @@ -796,10 +818,16 @@ class BillOfResourcesIDType(IdentifierType): ] subclass = None superclass = IdentifierType - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None): - super(BillOfResourcesIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, ) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None): + self.original_tagname_ = None + super(BillOfResourcesIDType, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, ) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, BillOfResourcesIDType) + if subclass is not None: + return subclass(*args_, **kwargs_) if BillOfResourcesIDType.subclass: return BillOfResourcesIDType.subclass(*args_, **kwargs_) else: @@ -809,7 +837,7 @@ class BillOfResourcesIDType(IdentifierType): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ or + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ or super(BillOfResourcesIDType, self).hasContent_() ): return True @@ -820,14 +848,16 @@ class BillOfResourcesIDType(IdentifierType): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfResourcesIDType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='BillOfResourcesIDType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -836,19 +866,6 @@ class BillOfResourcesIDType(IdentifierType): def exportChildren(self, outfile, level, namespace_='', name_='BillOfResourcesIDType', fromsubclass_=False, pretty_print=True): super(BillOfResourcesIDType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) pass - def exportLiteral(self, outfile, level, name_='BillOfResourcesIDType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(BillOfResourcesIDType, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(BillOfResourcesIDType, self).exportLiteralChildren(outfile, level, name_) - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -856,6 +873,7 @@ class BillOfResourcesIDType(IdentifierType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(BillOfResourcesIDType, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -869,10 +887,16 @@ class BillOfMaterialIDType(IdentifierType): ] subclass = None superclass = IdentifierType - def __init__(self, schemeDataURI=None, schemeID=None, schemeAgencyName=None, schemeAgencyID=None, schemeName=None, schemeVersionID=None, schemeURI=None, valueOf_=None): - super(BillOfMaterialIDType, self).__init__(schemeDataURI, schemeID, schemeAgencyName, schemeAgencyID, schemeName, schemeVersionID, schemeURI, valueOf_, ) + def __init__(self, schemeID=None, schemeName=None, schemeAgencyID=None, schemeAgencyName=None, schemeVersionID=None, schemeDataURI=None, schemeURI=None, valueOf_=None): + self.original_tagname_ = None + super(BillOfMaterialIDType, self).__init__(schemeID, schemeName, schemeAgencyID, schemeAgencyName, schemeVersionID, schemeDataURI, schemeURI, valueOf_, ) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, BillOfMaterialIDType) + if subclass is not None: + return subclass(*args_, **kwargs_) if BillOfMaterialIDType.subclass: return BillOfMaterialIDType.subclass(*args_, **kwargs_) else: @@ -882,7 +906,7 @@ class BillOfMaterialIDType(IdentifierType): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ or + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ or super(BillOfMaterialIDType, self).hasContent_() ): return True @@ -893,14 +917,16 @@ class BillOfMaterialIDType(IdentifierType): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='BillOfMaterialIDType') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='', name_='BillOfMaterialIDType', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) @@ -909,19 +935,6 @@ class BillOfMaterialIDType(IdentifierType): def exportChildren(self, outfile, level, namespace_='', name_='BillOfMaterialIDType', fromsubclass_=False, pretty_print=True): super(BillOfMaterialIDType, self).exportChildren(outfile, level, namespace_, name_, True, pretty_print=pretty_print) pass - def exportLiteral(self, outfile, level, name_='BillOfMaterialIDType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - super(BillOfMaterialIDType, self).exportLiteralAttributes(outfile, level, already_processed, name_) - def exportLiteralChildren(self, outfile, level, name_): - super(BillOfMaterialIDType, self).exportLiteralChildren(outfile, level, name_) - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -929,6 +942,7 @@ class BillOfMaterialIDType(IdentifierType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(BillOfMaterialIDType, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -946,7 +960,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -959,7 +973,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -979,7 +994,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1002,12 +1018,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'IdentifierType' rootClass = IdentifierType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1016,13 +1036,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="IdentifierType", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -1035,7 +1056,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from simplecontent_restriction2_sup import *\n\n') ## sys.stdout.write('import simplecontent_restriction2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/simpletype_memberspecs1_sub.py b/tests/simpletype_memberspecs1_sub.py index f917d7b..908d5c4 100644 --- a/tests/simpletype_memberspecs1_sub.py +++ b/tests/simpletype_memberspecs1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simpletype_memberspecs2_sup.py') +# ('-s', 'tests/simpletype_memberspecs2_sub.py') +# ('--super', 'simpletype_memberspecs2_sup') +# +# Command line arguments: +# tests/simpletype_memberspecs.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletype_memberspecs2_sup.py" -s "tests/simpletype_memberspecs2_sub.py" --super="simpletype_memberspecs2_sup" tests/simpletype_memberspecs.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import simpletype_memberspecs2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -98,7 +71,8 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -118,7 +92,8 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -142,7 +117,8 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -161,11 +137,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'SpecialDate' rootClass = supermod.SpecialDate rootObj = rootClass.factory() rootObj.build(rootNode) @@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n') ## sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.SpecialDate(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="SpecialDate") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -186,7 +163,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py index 555820d..7531654 100644 --- a/tests/simpletype_memberspecs1_sup.py +++ b/tests/simpletype_memberspecs1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simpletype_memberspecs2_sup.py') +# ('-s', 'tests/simpletype_memberspecs2_sub.py') +# ('--super', 'simpletype_memberspecs2_sup') +# +# Command line arguments: +# tests/simpletype_memberspecs.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletype_memberspecs2_sup.py" -s "tests/simpletype_memberspecs2_sub.py" --super="simpletype_memberspecs2_sup" tests/simpletype_memberspecs.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -616,9 +668,15 @@ class SpecialDate(GeneratedsSuper): subclass = None superclass = None def __init__(self, SpecialProperty=None, valueOf_=None): + self.original_tagname_ = None self.SpecialProperty = _cast(None, SpecialProperty) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, SpecialDate) + if subclass is not None: + return subclass(*args_, **kwargs_) if SpecialDate.subclass: return SpecialDate.subclass(*args_, **kwargs_) else: @@ -630,48 +688,35 @@ class SpecialDate(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: return False - def export(self, outfile, level, namespace_='pl:', name_='SpecialDate', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='pl:', name_='SpecialDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='SpecialDate') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='pl:', name_='SpecialDate', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='pl:', name_='SpecialDate'): if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed: already_processed.add('SpecialProperty') - outfile.write(' SpecialProperty=%s' % (self.gds_format_string(quote_attrib(self.SpecialProperty).encode(ExternalEncoding), input_name='SpecialProperty'), )) + outfile.write(' SpecialProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.SpecialProperty), input_name='SpecialProperty')), )) def exportChildren(self, outfile, level, namespace_='pl:', name_='SpecialDate', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='SpecialDate'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.SpecialProperty is not None and 'SpecialProperty' not in already_processed: - already_processed.add('SpecialProperty') - showIndent(outfile, level) - outfile.write('SpecialProperty="%s",\n' % (self.SpecialProperty,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -679,6 +724,7 @@ class SpecialDate(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('SpecialProperty', node) if value is not None and 'SpecialProperty' not in already_processed: @@ -697,9 +743,15 @@ class ExtremeDate(GeneratedsSuper): subclass = None superclass = None def __init__(self, ExtremeProperty=None, valueOf_=None): + self.original_tagname_ = None self.ExtremeProperty = _cast(None, ExtremeProperty) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, ExtremeDate) + if subclass is not None: + return subclass(*args_, **kwargs_) if ExtremeDate.subclass: return ExtremeDate.subclass(*args_, **kwargs_) else: @@ -711,48 +763,35 @@ class ExtremeDate(GeneratedsSuper): def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: return False - def export(self, outfile, level, namespace_='pl:', name_='ExtremeDate', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='pl:', name_='ExtremeDate', namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='ExtremeDate') if self.hasContent_(): outfile.write('>') - outfile.write(str(self.valueOf_).encode(ExternalEncoding)) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + outfile.write(self.convert_unicode(self.valueOf_)) + self.exportChildren(outfile, level + 1, namespace_='pl:', name_='ExtremeDate', pretty_print=pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) def exportAttributes(self, outfile, level, already_processed, namespace_='pl:', name_='ExtremeDate'): if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: already_processed.add('ExtremeProperty') - outfile.write(' ExtremeProperty=%s' % (self.gds_format_string(quote_attrib(self.ExtremeProperty).encode(ExternalEncoding), input_name='ExtremeProperty'), )) + outfile.write(' ExtremeProperty=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.ExtremeProperty), input_name='ExtremeProperty')), )) def exportChildren(self, outfile, level, namespace_='pl:', name_='ExtremeDate', fromsubclass_=False, pretty_print=True): pass - def exportLiteral(self, outfile, level, name_='ExtremeDate'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - showIndent(outfile, level) - outfile.write('valueOf_ = """%s""",\n' % (self.valueOf_,)) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - if self.ExtremeProperty is not None and 'ExtremeProperty' not in already_processed: - already_processed.add('ExtremeProperty') - showIndent(outfile, level) - outfile.write('ExtremeProperty="%s",\n' % (self.ExtremeProperty,)) - def exportLiteralChildren(self, outfile, level, name_): - pass def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) @@ -760,6 +799,7 @@ class ExtremeDate(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('ExtremeProperty', node) if value is not None and 'ExtremeProperty' not in already_processed: @@ -780,7 +820,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -793,7 +833,8 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -813,7 +854,8 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -836,12 +878,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'SpecialDate' rootClass = SpecialDate rootObj = rootClass.factory() rootObj.build(rootNode) @@ -850,13 +896,14 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="SpecialDate", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='xmlns:pl="http://kuhlman.com/people.xsd"') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: @@ -869,7 +916,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from simpletype_memberspecs2_sup import *\n\n') ## sys.stdout.write('import simpletype_memberspecs2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/simpletypes_other.xml b/tests/simpletypes_other.xml new file mode 100644 index 0000000..779a6e2 --- /dev/null +++ b/tests/simpletypes_other.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<simpleTypeTests + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +> + + <simpleTypeTest> + <datetime1>2021</datetime1> + <datetime2>2022-06</datetime2> + <datetime3>08</datetime3> + <datetime4>09-14</datetime4> + <datetime5>24</datetime5> + </simpleTypeTest> + +</simpleTypeTests> + diff --git a/tests/simpletypes_other.xsd b/tests/simpletypes_other.xsd index 95eadb5..5be7d4c 100644 --- a/tests/simpletypes_other.xsd +++ b/tests/simpletypes_other.xsd @@ -8,12 +8,14 @@ </xs:element> <xs:complexType name="simpleTypeTestsType"> <xs:sequence> - <xs:element name="simpleTypeTest" maxOccurs="unbounded" type="simpleTypeTestType"/> + <xs:element + name="simpleTypeTest" + maxOccurs="unbounded" + type="simpleTypeTestDefs"/> </xs:sequence> </xs:complexType> - <xs:element name="simpleTypeTest" type="simpleTypeTestType"/> - <xs:complexType mixed="0" name="simpleTypeTest"> + <xs:complexType mixed="0" name="simpleTypeTestDefs"> <xs:complexContent> <xs:sequence> <xs:element name="datetime1" type="xs:gYear"/> diff --git a/tests/simpletypes_other2_sub.py b/tests/simpletypes_other1_sub.py similarity index 58% rename from tests/simpletypes_other2_sub.py rename to tests/simpletypes_other1_sub.py index 81260f7..4792c10 100644 --- a/tests/simpletypes_other2_sub.py +++ b/tests/simpletypes_other1_sub.py @@ -3,64 +3,37 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simpletypes_other2_sup.py') +# ('-s', 'tests/simpletypes_other2_sub.py') +# ('--super', 'simpletypes_other2_sup') +# +# Command line arguments: +# tests/simpletypes_other.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletypes_other2_sup.py" -s "tests/simpletypes_other2_sub.py" --super="simpletypes_other2_sup" tests/simpletypes_other.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import simpletypes_other2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -81,11 +54,11 @@ supermod.simpleTypeTestsType.subclass = simpleTypeTestsTypeSub # end class simpleTypeTestsTypeSub -class simpleTypeTestSub(supermod.simpleTypeTest): +class simpleTypeTestDefsSub(supermod.simpleTypeTestDefs): def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None): - super(simpleTypeTestSub, self).__init__(datetime1, datetime2, datetime3, datetime4, datetime5, integerVal1, integerVal2, stringVal1, stringVal2, booleanVal1, booleanVal2, decimalVal1, decimalVal2, doubleVal1, doubleVal2, floatVal1, floatVal2, dateVal1, dateVal2, dateTimeVal1, dateTimeVal2, ) -supermod.simpleTypeTest.subclass = simpleTypeTestSub -# end class simpleTypeTestSub + super(simpleTypeTestDefsSub, self).__init__(datetime1, datetime2, datetime3, datetime4, datetime5, integerVal1, integerVal2, stringVal1, stringVal2, booleanVal1, booleanVal2, decimalVal1, decimalVal2, doubleVal1, doubleVal2, floatVal1, floatVal2, dateVal1, dateVal2, dateTimeVal1, dateTimeVal2, ) +supermod.simpleTypeTestDefs.subclass = simpleTypeTestDefsSub +# end class simpleTypeTestDefsSub def get_root_tag(node): @@ -98,11 +71,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = supermod.simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -118,11 +92,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = supermod.simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -142,11 +117,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = supermod.simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -161,11 +137,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'simpleTypeTestsType' rootClass = supermod.simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -174,8 +151,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from simpletypes_other2_sup import *\n\n') ## sys.stdout.write('import simpletypes_other2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.simpleTypeTests(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="simpleTypeTests") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -186,7 +163,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py index a8bb2c8..7efca4b 100644 --- a/tests/simpletypes_other1_sup.py +++ b/tests/simpletypes_other1_sup.py @@ -4,66 +4,54 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/simpletypes_other2_sup.py') +# ('-s', 'tests/simpletypes_other2_sub.py') +# ('--super', 'simpletypes_other2_sup') +# +# Command line arguments: +# tests/simpletypes_other.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/simpletypes_other2_sup.py" -s "tests/simpletypes_other2_sub.py" --super="simpletypes_other2_sup" tests/simpletypes_other.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +63,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +79,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +148,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +203,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +214,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +237,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +261,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +293,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +363,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +411,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +429,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +514,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +555,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -610,16 +662,22 @@ def _cast(typ, value): class simpleTypeTestsType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('simpleTypeTest', 'simpleTypeTest', 1), + MemberSpec_('simpleTypeTest', 'simpleTypeTestDefs', 1), ] subclass = None superclass = None def __init__(self, simpleTypeTest=None): + self.original_tagname_ = None if simpleTypeTest is None: self.simpleTypeTest = [] else: self.simpleTypeTest = simpleTypeTest def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTypeTestsType) + if subclass is not None: + return subclass(*args_, **kwargs_) if simpleTypeTestsType.subclass: return simpleTypeTestsType.subclass(*args_, **kwargs_) else: @@ -628,7 +686,8 @@ class simpleTypeTestsType(GeneratedsSuper): def get_simpleTypeTest(self): return self.simpleTypeTest def set_simpleTypeTest(self, simpleTypeTest): self.simpleTypeTest = simpleTypeTest def add_simpleTypeTest(self, value): self.simpleTypeTest.append(value) - def insert_simpleTypeTest(self, index, value): self.simpleTypeTest[index] = value + def insert_simpleTypeTest_at(self, index, value): self.simpleTypeTest.insert(index, value) + def replace_simpleTypeTest_at(self, index, value): self.simpleTypeTest[index] = value def hasContent_(self): if ( self.simpleTypeTest @@ -641,13 +700,15 @@ class simpleTypeTestsType(GeneratedsSuper): eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestsType') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTypeTestsType', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: @@ -660,43 +721,26 @@ class simpleTypeTestsType(GeneratedsSuper): else: eol_ = '' for simpleTypeTest_ in self.simpleTypeTest: - showIndent(outfile, level, pretty_print) - outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_format_string(quote_xml(simpleTypeTest_).encode(ExternalEncoding), input_name='simpleTypeTest'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='simpleTypeTestsType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('simpleTypeTest=[\n') - level += 1 - for simpleTypeTest_ in self.simpleTypeTest: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(simpleTypeTest_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') + simpleTypeTest_.export(outfile, level, namespace_, name_='simpleTypeTest', pretty_print=pretty_print) def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'simpleTypeTest': - simpleTypeTest_ = child_.text - simpleTypeTest_ = self.gds_validate_string(simpleTypeTest_, node, 'simpleTypeTest') - self.simpleTypeTest.append(simpleTypeTest_) + obj_ = simpleTypeTestDefs.factory() + obj_.build(child_) + self.simpleTypeTest.append(obj_) + obj_.original_tagname_ = 'simpleTypeTest' # end class simpleTypeTestsType -class simpleTypeTest(GeneratedsSuper): +class simpleTypeTestDefs(GeneratedsSuper): member_data_items_ = [ MemberSpec_('datetime1', 'xs:gYear', 0), MemberSpec_('datetime2', 'xs:gYearMonth', 0), @@ -723,6 +767,7 @@ class simpleTypeTest(GeneratedsSuper): subclass = None superclass = None def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None): + self.original_tagname_ = None self.datetime1 = datetime1 self.datetime2 = datetime2 self.datetime3 = datetime3 @@ -758,7 +803,7 @@ class simpleTypeTest(GeneratedsSuper): self.floatVal2 = [] else: self.floatVal2 = floatVal2 - if isinstance(dateVal1, basestring): + if isinstance(dateVal1, BaseStrType_): initvalue_ = datetime_.datetime.strptime(dateVal1, '%Y-%m-%d').date() else: initvalue_ = dateVal1 @@ -767,7 +812,7 @@ class simpleTypeTest(GeneratedsSuper): self.dateVal2 = [] else: self.dateVal2 = dateVal2 - if isinstance(dateTimeVal1, basestring): + if isinstance(dateTimeVal1, BaseStrType_): initvalue_ = datetime_.datetime.strptime(dateTimeVal1, '%Y-%m-%dT%H:%M:%S') else: initvalue_ = dateTimeVal1 @@ -777,10 +822,15 @@ class simpleTypeTest(GeneratedsSuper): else: self.dateTimeVal2 = dateTimeVal2 def factory(*args_, **kwargs_): - if simpleTypeTest.subclass: - return simpleTypeTest.subclass(*args_, **kwargs_) + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTypeTestDefs) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTypeTestDefs.subclass: + return simpleTypeTestDefs.subclass(*args_, **kwargs_) else: - return simpleTypeTest(*args_, **kwargs_) + return simpleTypeTestDefs(*args_, **kwargs_) factory = staticmethod(factory) def get_datetime1(self): return self.datetime1 def set_datetime1(self, datetime1): self.datetime1 = datetime1 @@ -797,49 +847,57 @@ class simpleTypeTest(GeneratedsSuper): def get_integerVal2(self): return self.integerVal2 def set_integerVal2(self, integerVal2): self.integerVal2 = integerVal2 def add_integerVal2(self, value): self.integerVal2.append(value) - def insert_integerVal2(self, index, value): self.integerVal2[index] = value + def insert_integerVal2_at(self, index, value): self.integerVal2.insert(index, value) + def replace_integerVal2_at(self, index, value): self.integerVal2[index] = value def get_stringVal1(self): return self.stringVal1 def set_stringVal1(self, stringVal1): self.stringVal1 = stringVal1 def get_stringVal2(self): return self.stringVal2 def set_stringVal2(self, stringVal2): self.stringVal2 = stringVal2 def add_stringVal2(self, value): self.stringVal2.append(value) - def insert_stringVal2(self, index, value): self.stringVal2[index] = value + def insert_stringVal2_at(self, index, value): self.stringVal2.insert(index, value) + def replace_stringVal2_at(self, index, value): self.stringVal2[index] = value def get_booleanVal1(self): return self.booleanVal1 def set_booleanVal1(self, booleanVal1): self.booleanVal1 = booleanVal1 def get_booleanVal2(self): return self.booleanVal2 def set_booleanVal2(self, booleanVal2): self.booleanVal2 = booleanVal2 def add_booleanVal2(self, value): self.booleanVal2.append(value) - def insert_booleanVal2(self, index, value): self.booleanVal2[index] = value + def insert_booleanVal2_at(self, index, value): self.booleanVal2.insert(index, value) + def replace_booleanVal2_at(self, index, value): self.booleanVal2[index] = value def get_decimalVal1(self): return self.decimalVal1 def set_decimalVal1(self, decimalVal1): self.decimalVal1 = decimalVal1 def get_decimalVal2(self): return self.decimalVal2 def set_decimalVal2(self, decimalVal2): self.decimalVal2 = decimalVal2 def add_decimalVal2(self, value): self.decimalVal2.append(value) - def insert_decimalVal2(self, index, value): self.decimalVal2[index] = value + def insert_decimalVal2_at(self, index, value): self.decimalVal2.insert(index, value) + def replace_decimalVal2_at(self, index, value): self.decimalVal2[index] = value def get_doubleVal1(self): return self.doubleVal1 def set_doubleVal1(self, doubleVal1): self.doubleVal1 = doubleVal1 def get_doubleVal2(self): return self.doubleVal2 def set_doubleVal2(self, doubleVal2): self.doubleVal2 = doubleVal2 def add_doubleVal2(self, value): self.doubleVal2.append(value) - def insert_doubleVal2(self, index, value): self.doubleVal2[index] = value + def insert_doubleVal2_at(self, index, value): self.doubleVal2.insert(index, value) + def replace_doubleVal2_at(self, index, value): self.doubleVal2[index] = value def get_floatVal1(self): return self.floatVal1 def set_floatVal1(self, floatVal1): self.floatVal1 = floatVal1 def get_floatVal2(self): return self.floatVal2 def set_floatVal2(self, floatVal2): self.floatVal2 = floatVal2 def add_floatVal2(self, value): self.floatVal2.append(value) - def insert_floatVal2(self, index, value): self.floatVal2[index] = value + def insert_floatVal2_at(self, index, value): self.floatVal2.insert(index, value) + def replace_floatVal2_at(self, index, value): self.floatVal2[index] = value def get_dateVal1(self): return self.dateVal1 def set_dateVal1(self, dateVal1): self.dateVal1 = dateVal1 def get_dateVal2(self): return self.dateVal2 def set_dateVal2(self, dateVal2): self.dateVal2 = dateVal2 def add_dateVal2(self, value): self.dateVal2.append(value) - def insert_dateVal2(self, index, value): self.dateVal2[index] = value + def insert_dateVal2_at(self, index, value): self.dateVal2.insert(index, value) + def replace_dateVal2_at(self, index, value): self.dateVal2[index] = value def get_dateTimeVal1(self): return self.dateTimeVal1 def set_dateTimeVal1(self, dateTimeVal1): self.dateTimeVal1 = dateTimeVal1 def get_dateTimeVal2(self): return self.dateTimeVal2 def set_dateTimeVal2(self, dateTimeVal2): self.dateTimeVal2 = dateTimeVal2 def add_dateTimeVal2(self, value): self.dateTimeVal2.append(value) - def insert_dateTimeVal2(self, index, value): self.dateTimeVal2[index] = value + def insert_dateTimeVal2_at(self, index, value): self.dateTimeVal2.insert(index, value) + def replace_dateTimeVal2_at(self, index, value): self.dateTimeVal2[index] = value def hasContent_(self): if ( self.datetime1 is not None or @@ -867,44 +925,46 @@ class simpleTypeTest(GeneratedsSuper): return True else: return False - def export(self, outfile, level, namespace_='', name_='simpleTypeTest', namespacedef_='', pretty_print=True): + def export(self, outfile, level, namespace_='', name_='simpleTypeTestDefs', namespacedef_='', pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ showIndent(outfile, level, pretty_print) outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTest') + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestDefs') if self.hasContent_(): outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTypeTestDefs', pretty_print=pretty_print) showIndent(outfile, level, pretty_print) outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) else: outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTest'): + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTestDefs'): pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTest', fromsubclass_=False, pretty_print=True): + def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTestDefs', fromsubclass_=False, pretty_print=True): if pretty_print: eol_ = '\n' else: eol_ = '' if self.datetime1 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime1).encode(ExternalEncoding), input_name='datetime1'), namespace_, eol_)) + outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime1), input_name='datetime1')), namespace_, eol_)) if self.datetime2 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime2).encode(ExternalEncoding), input_name='datetime2'), namespace_, eol_)) + outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime2), input_name='datetime2')), namespace_, eol_)) if self.datetime3 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime3).encode(ExternalEncoding), input_name='datetime3'), namespace_, eol_)) + outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime3), input_name='datetime3')), namespace_, eol_)) if self.datetime4 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime4).encode(ExternalEncoding), input_name='datetime4'), namespace_, eol_)) + outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime4), input_name='datetime4')), namespace_, eol_)) if self.datetime5 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime5).encode(ExternalEncoding), input_name='datetime5'), namespace_, eol_)) + outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.datetime5), input_name='datetime5')), namespace_, eol_)) if self.integerVal1 is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sintegerVal1>%s</%sintegerVal1>%s' % (namespace_, self.gds_format_integer(self.integerVal1, input_name='integerVal1'), namespace_, eol_)) @@ -913,10 +973,10 @@ class simpleTypeTest(GeneratedsSuper): outfile.write('<%sintegerVal2>%s</%sintegerVal2>%s' % (namespace_, self.gds_format_integer(integerVal2_, input_name='integerVal2'), namespace_, eol_)) if self.stringVal1 is not None: showIndent(outfile, level, pretty_print) - outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_format_string(quote_xml(self.stringVal1).encode(ExternalEncoding), input_name='stringVal1'), namespace_, eol_)) + outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.stringVal1), input_name='stringVal1')), namespace_, eol_)) for stringVal2_ in self.stringVal2: showIndent(outfile, level, pretty_print) - outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_format_string(quote_xml(stringVal2_).encode(ExternalEncoding), input_name='stringVal2'), namespace_, eol_)) + outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(stringVal2_), input_name='stringVal2')), namespace_, eol_)) if self.booleanVal1 is not None: showIndent(outfile, level, pretty_print) outfile.write('<%sbooleanVal1>%s</%sbooleanVal1>%s' % (namespace_, self.gds_format_boolean(self.booleanVal1, input_name='booleanVal1'), namespace_, eol_)) @@ -953,132 +1013,13 @@ class simpleTypeTest(GeneratedsSuper): for dateTimeVal2_ in self.dateTimeVal2: showIndent(outfile, level, pretty_print) outfile.write('<%sdateTimeVal2>%s</%sdateTimeVal2>%s' % (namespace_, self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='simpleTypeTest'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.datetime1 is not None: - showIndent(outfile, level) - outfile.write('datetime1=%s,\n' % quote_python(self.datetime1).encode(ExternalEncoding)) - if self.datetime2 is not None: - showIndent(outfile, level) - outfile.write('datetime2=%s,\n' % quote_python(self.datetime2).encode(ExternalEncoding)) - if self.datetime3 is not None: - showIndent(outfile, level) - outfile.write('datetime3=%s,\n' % quote_python(self.datetime3).encode(ExternalEncoding)) - if self.datetime4 is not None: - showIndent(outfile, level) - outfile.write('datetime4=%s,\n' % quote_python(self.datetime4).encode(ExternalEncoding)) - if self.datetime5 is not None: - showIndent(outfile, level) - outfile.write('datetime5=%s,\n' % quote_python(self.datetime5).encode(ExternalEncoding)) - if self.integerVal1 is not None: - showIndent(outfile, level) - outfile.write('integerVal1=%d,\n' % self.integerVal1) - showIndent(outfile, level) - outfile.write('integerVal2=[\n') - level += 1 - for integerVal2_ in self.integerVal2: - showIndent(outfile, level) - outfile.write('%d,\n' % integerVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.stringVal1 is not None: - showIndent(outfile, level) - outfile.write('stringVal1=%s,\n' % quote_python(self.stringVal1).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('stringVal2=[\n') - level += 1 - for stringVal2_ in self.stringVal2: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(stringVal2_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.booleanVal1 is not None: - showIndent(outfile, level) - outfile.write('booleanVal1=%s,\n' % self.booleanVal1) - showIndent(outfile, level) - outfile.write('booleanVal2=[\n') - level += 1 - for booleanVal2_ in self.booleanVal2: - showIndent(outfile, level) - outfile.write('%s,\n' % booleanVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.decimalVal1 is not None: - showIndent(outfile, level) - outfile.write('decimalVal1=%f,\n' % self.decimalVal1) - showIndent(outfile, level) - outfile.write('decimalVal2=[\n') - level += 1 - for decimalVal2_ in self.decimalVal2: - showIndent(outfile, level) - outfile.write('%f,\n' % decimalVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.doubleVal1 is not None: - showIndent(outfile, level) - outfile.write('doubleVal1=%e,\n' % self.doubleVal1) - showIndent(outfile, level) - outfile.write('doubleVal2=[\n') - level += 1 - for doubleVal2_ in self.doubleVal2: - showIndent(outfile, level) - outfile.write('%e,\n' % doubleVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.floatVal1 is not None: - showIndent(outfile, level) - outfile.write('floatVal1=%f,\n' % self.floatVal1) - showIndent(outfile, level) - outfile.write('floatVal2=[\n') - level += 1 - for floatVal2_ in self.floatVal2: - showIndent(outfile, level) - outfile.write('%f,\n' % floatVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.dateVal1 is not None: - showIndent(outfile, level) - outfile.write('dateVal1=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.dateVal1, input_name='dateVal1')) - showIndent(outfile, level) - outfile.write('dateVal2=[\n') - level += 1 - for dateVal2_ in self.dateVal2: - showIndent(outfile, level) - outfile.write('model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(dateVal2_, input_name='dateVal2')) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.dateTimeVal1 is not None: - showIndent(outfile, level) - outfile.write('dateTimeVal1=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1')) - showIndent(outfile, level) - outfile.write('dateTimeVal2=[\n') - level += 1 - for dateTimeVal2_ in self.dateTimeVal2: - showIndent(outfile, level) - outfile.write('model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2')) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') def build(self, node): already_processed = set() self.buildAttributes(node, node.attrib, already_processed) for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1106,7 +1047,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'integerVal1') self.integerVal1 = ival_ @@ -1114,7 +1055,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'integerVal2') self.integerVal2.append(ival_) @@ -1150,7 +1091,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'decimalVal1') self.decimalVal1 = fval_ @@ -1158,7 +1099,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'decimalVal2') self.decimalVal2.append(fval_) @@ -1166,7 +1107,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'doubleVal1') self.doubleVal1 = fval_ @@ -1174,7 +1115,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'doubleVal2') self.doubleVal2.append(fval_) @@ -1182,7 +1123,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'floatVal1') self.floatVal1 = fval_ @@ -1190,7 +1131,7 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'floatVal2') self.floatVal2.append(fval_) @@ -1210,10 +1151,11 @@ class simpleTypeTest(GeneratedsSuper): sval_ = child_.text dval_ = self.gds_parse_datetime(sval_) self.dateTimeVal2.append(dval_) -# end class simpleTypeTest +# end class simpleTypeTestDefs GDSClassesMapping = { + 'simpleTypeTest': simpleTypeTestDefs, 'simpleTypeTests': simpleTypeTestsType, } @@ -1224,7 +1166,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -1237,11 +1179,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1257,11 +1200,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1280,12 +1224,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'simpleTypeTestsType' rootClass = simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1294,17 +1242,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="simpleTypeTests", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'simpleTypeTests' + rootTag = 'simpleTypeTestsType' rootClass = simpleTypeTestsType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -1313,7 +1262,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from simpletypes_other2_sup import *\n\n') ## sys.stdout.write('import simpletypes_other2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -1333,6 +1282,6 @@ if __name__ == '__main__': __all__ = [ - "simpleTypeTest", + "simpleTypeTestDefs", "simpleTypeTestsType" ] diff --git a/tests/simpletypes_other2_sup.py b/tests/simpletypes_other2_sup.py deleted file mode 100644 index a8bb2c8..0000000 --- a/tests/simpletypes_other2_sup.py +++ /dev/null @@ -1,1338 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Generated by generateDS.py. -# - -import sys -import getopt -import re as re_ -import base64 -import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): - # Use the lxml ElementTree compatible parser so that, e.g., - # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) - return doc - -# -# User methods -# -# Calls to the methods in these classes are generated by generateDS.py. -# You can replace these methods by re-implementing the following class -# in a module named generatedssuper.py. - -try: - from generatedssuper import GeneratedsSuper -except ImportError, exp: - - class GeneratedsSuper(object): - tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') - class _FixedOffsetTZ(datetime_.tzinfo): - def __init__(self, offset, name): - self.__offset = datetime_.timedelta(minutes=offset) - self.__name = name - def utcoffset(self, dt): - return self.__offset - def tzname(self, dt): - return self.__name - def dst(self, dt): - return None - def gds_format_string(self, input_data, input_name=''): - return input_data - def gds_validate_string(self, input_data, node, input_name=''): - return input_data - def gds_format_base64(self, input_data, input_name=''): - return base64.b64encode(input_data) - def gds_validate_base64(self, input_data, node, input_name=''): - return input_data - def gds_format_integer(self, input_data, input_name=''): - return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): - return input_data - def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of integers') - return input_data - def gds_format_float(self, input_data, input_name=''): - return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): - return input_data - def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of floats') - return input_data - def gds_format_double(self, input_data, input_name=''): - return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): - return input_data - def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - try: - float(value) - except (TypeError, ValueError): - raise_parse_error(node, 'Requires sequence of doubles') - return input_data - def gds_format_boolean(self, input_data, input_name=''): - return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): - return input_data - def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): - values = input_data.split() - for value in values: - if value not in ('true', '1', 'false', '0', ): - raise_parse_error( - node, - 'Requires sequence of booleans ' - '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): - return input_data - def gds_format_datetime(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( - input_data.year, - input_data.month, - input_data.day, - input_data.hour, - input_data.minute, - input_data.second, - ('%f' % (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_datetime(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime( - input_data, '%Y-%m-%dT%H:%M:%S.%f') - else: - dt = datetime_.datetime.strptime( - input_data, '%Y-%m-%dT%H:%M:%S') - dt = dt.replace(tzinfo=tz) - return dt - def gds_validate_date(self, input_data, node, input_name=''): - return input_data - def gds_format_date(self, input_data, input_name=''): - _svalue = '%04d-%02d-%02d' % ( - input_data.year, - input_data.month, - input_data.day, - ) - try: - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - except AttributeError: - pass - return _svalue - @classmethod - def gds_parse_date(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') - dt = dt.replace(tzinfo=tz) - return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): - return input_data - def gds_format_time(self, input_data, input_name=''): - if input_data.microsecond == 0: - _svalue = '%02d:%02d:%02d' % ( - input_data.hour, - input_data.minute, - input_data.second, - ) - else: - _svalue = '%02d:%02d:%02d.%s' % ( - input_data.hour, - input_data.minute, - input_data.second, - ('%f' % (float(input_data.microsecond) / 1000000))[2:], - ) - if input_data.tzinfo is not None: - tzoff = input_data.tzinfo.utcoffset(input_data) - if tzoff is not None: - total_seconds = tzoff.seconds + (86400 * tzoff.days) - if total_seconds == 0: - _svalue += 'Z' - else: - if total_seconds < 0: - _svalue += '-' - total_seconds *= -1 - else: - _svalue += '+' - hours = total_seconds // 3600 - minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) - return _svalue - @classmethod - def gds_parse_time(cls, input_data): - tz = None - if input_data[-1] == 'Z': - tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') - input_data = input_data[:-1] - else: - results = GeneratedsSuper.tzoff_pattern.search(input_data) - if results is not None: - tzoff_parts = results.group(2).split(':') - tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) - if results.group(1) == '-': - tzoff *= -1 - tz = GeneratedsSuper._FixedOffsetTZ( - tzoff, results.group(0)) - input_data = input_data[:-6] - if len(input_data.split('.')) > 1: - dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') - else: - dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') - dt = dt.replace(tzinfo=tz) - return dt.time() - def gds_str_lower(self, instring): - return instring.lower() - def get_path_(self, node): - path_list = [] - self.get_path_list_(node, path_list) - path_list.reverse() - path = '/'.join(path_list) - return path - Tag_strip_pattern_ = re_.compile(r'\{.*\}') - def get_path_list_(self, node, path_list): - if node is None: - return - tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) - if tag: - path_list.append(tag) - self.get_path_list_(node.getparent(), path_list) - def get_class_obj_(self, node, default_class=None): - class_obj1 = default_class - if 'xsi' in node.nsmap: - classname = node.get('{%s}type' % node.nsmap['xsi']) - if classname is not None: - names = classname.split(':') - if len(names) == 2: - classname = names[1] - class_obj2 = globals().get(classname) - if class_obj2 is not None: - class_obj1 = class_obj2 - return class_obj1 - def gds_build_any(self, node, type_name=None): - return None - @classmethod - def gds_reverse_node_mapping(cls, mapping): - return dict(((v, k) for k, v in mapping.iteritems())) - - -# -# If you have installed IPython you can uncomment and use the following. -# IPython is available from http://ipython.scipy.org/. -# - -## from IPython.Shell import IPShellEmbed -## args = '' -## ipshell = IPShellEmbed(args, -## banner = 'Dropping into IPython', -## exit_msg = 'Leaving Interpreter, back to program.') - -# Then use the following line where and when you want to drop into the -# IPython shell: -# ipshell('<some message> -- Entering ipshell.\nHit Ctrl-D to exit') - -# -# Globals -# - -ExternalEncoding = 'ascii' -Tag_pattern_ = re_.compile(r'({.*})?(.*)') -String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") -Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') - -# -# Support/utility functions. -# - - -def showIndent(outfile, level, pretty_print=True): - if pretty_print: - for idx in range(level): - outfile.write(' ') - - -def quote_xml(inStr): - if not inStr: - return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - return s1 - - -def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') - s1 = s1.replace('<', '<') - s1 = s1.replace('>', '>') - if '"' in s1: - if "'" in s1: - s1 = '"%s"' % s1.replace('"', """) - else: - s1 = "'%s'" % s1 - else: - s1 = '"%s"' % s1 - return s1 - - -def quote_python(inStr): - s1 = inStr - if s1.find("'") == -1: - if s1.find('\n') == -1: - return "'%s'" % s1 - else: - return "'''%s'''" % s1 - else: - if s1.find('"') != -1: - s1 = s1.replace('"', '\\"') - if s1.find('\n') == -1: - return '"%s"' % s1 - else: - return '"""%s"""' % s1 - - -def get_all_text_(node): - if node.text is not None: - text = node.text - else: - text = '' - for child in node: - if child.tail is not None: - text += child.tail - return text - - -def find_attr_value_(attr_name, node): - attrs = node.attrib - attr_parts = attr_name.split(':') - value = None - if len(attr_parts) == 1: - value = attrs.get(attr_name) - elif len(attr_parts) == 2: - prefix, name = attr_parts - namespace = node.nsmap.get(prefix) - if namespace is not None: - value = attrs.get('{%s}%s' % (namespace, name, )) - return value - - -class GDSParseError(Exception): - pass - - -def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) - raise GDSParseError(msg) - - -class MixedContainer: - # Constants for category: - CategoryNone = 0 - CategoryText = 1 - CategorySimple = 2 - CategoryComplex = 3 - # Constants for content_type: - TypeNone = 0 - TypeText = 1 - TypeString = 2 - TypeInteger = 3 - TypeFloat = 4 - TypeDecimal = 5 - TypeDouble = 6 - TypeBoolean = 7 - TypeBase64 = 8 - def __init__(self, category, content_type, name, value): - self.category = category - self.content_type = content_type - self.name = name - self.value = value - def getCategory(self): - return self.category - def getContenttype(self, content_type): - return self.content_type - def getValue(self): - return self.value - def getName(self): - return self.name - def export(self, outfile, level, name, namespace, pretty_print=True): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - outfile.write(self.value) - elif self.category == MixedContainer.CategorySimple: - self.exportSimple(outfile, level, name) - else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) - def exportSimple(self, outfile, level, name): - if self.content_type == MixedContainer.TypeString: - outfile.write('<%s>%s</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeInteger or \ - self.content_type == MixedContainer.TypeBoolean: - outfile.write('<%s>%d</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeFloat or \ - self.content_type == MixedContainer.TypeDecimal: - outfile.write('<%s>%f</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeDouble: - outfile.write('<%s>%g</%s>' % ( - self.name, self.value, self.name)) - elif self.content_type == MixedContainer.TypeBase64: - outfile.write('<%s>%s</%s>' % ( - self.name, base64.b64encode(self.value), self.name)) - def to_etree(self, element): - if self.category == MixedContainer.CategoryText: - # Prevent exporting empty content as empty lines. - if self.value.strip(): - if len(element) > 0: - if element[-1].tail is None: - element[-1].tail = self.value - else: - element[-1].tail += self.value - else: - if element.text is None: - element.text = self.value - else: - element.text += self.value - elif self.category == MixedContainer.CategorySimple: - subelement = etree_.SubElement(element, '%s' % self.name) - subelement.text = self.to_etree_simple() - else: # category == MixedContainer.CategoryComplex - self.value.to_etree(element) - def to_etree_simple(self): - if self.content_type == MixedContainer.TypeString: - text = self.value - elif (self.content_type == MixedContainer.TypeInteger or - self.content_type == MixedContainer.TypeBoolean): - text = '%d' % self.value - elif (self.content_type == MixedContainer.TypeFloat or - self.content_type == MixedContainer.TypeDecimal): - text = '%f' % self.value - elif self.content_type == MixedContainer.TypeDouble: - text = '%g' % self.value - elif self.content_type == MixedContainer.TypeBase64: - text = '%s' % base64.b64encode(self.value) - return text - def exportLiteral(self, outfile, level, name): - if self.category == MixedContainer.CategoryText: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) - elif self.category == MixedContainer.CategorySimple: - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s", "%s"),\n' % ( - self.category, self.content_type, self.name, self.value)) - else: # category == MixedContainer.CategoryComplex - showIndent(outfile, level) - outfile.write( - 'model_.MixedContainer(%d, %d, "%s",\n' % ( - self.category, self.content_type, self.name,)) - self.value.exportLiteral(outfile, level + 1) - showIndent(outfile, level) - outfile.write(')\n') - - -class MemberSpec_(object): - def __init__(self, name='', data_type='', container=0): - self.name = name - self.data_type = data_type - self.container = container - def set_name(self, name): self.name = name - def get_name(self): return self.name - def set_data_type(self, data_type): self.data_type = data_type - def get_data_type_chain(self): return self.data_type - def get_data_type(self): - if isinstance(self.data_type, list): - if len(self.data_type) > 0: - return self.data_type[-1] - else: - return 'xs:string' - else: - return self.data_type - def set_container(self, container): self.container = container - def get_container(self): return self.container - - -def _cast(typ, value): - if typ is None or value is None: - return value - return typ(value) - -# -# Data representation classes. -# - - -class simpleTypeTestsType(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('simpleTypeTest', 'simpleTypeTest', 1), - ] - subclass = None - superclass = None - def __init__(self, simpleTypeTest=None): - if simpleTypeTest is None: - self.simpleTypeTest = [] - else: - self.simpleTypeTest = simpleTypeTest - def factory(*args_, **kwargs_): - if simpleTypeTestsType.subclass: - return simpleTypeTestsType.subclass(*args_, **kwargs_) - else: - return simpleTypeTestsType(*args_, **kwargs_) - factory = staticmethod(factory) - def get_simpleTypeTest(self): return self.simpleTypeTest - def set_simpleTypeTest(self, simpleTypeTest): self.simpleTypeTest = simpleTypeTest - def add_simpleTypeTest(self, value): self.simpleTypeTest.append(value) - def insert_simpleTypeTest(self, index, value): self.simpleTypeTest[index] = value - def hasContent_(self): - if ( - self.simpleTypeTest - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='simpleTypeTestsType', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTestsType') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTestsType'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTestsType', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - for simpleTypeTest_ in self.simpleTypeTest: - showIndent(outfile, level, pretty_print) - outfile.write('<%ssimpleTypeTest>%s</%ssimpleTypeTest>%s' % (namespace_, self.gds_format_string(quote_xml(simpleTypeTest_).encode(ExternalEncoding), input_name='simpleTypeTest'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='simpleTypeTestsType'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - showIndent(outfile, level) - outfile.write('simpleTypeTest=[\n') - level += 1 - for simpleTypeTest_ in self.simpleTypeTest: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(simpleTypeTest_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'simpleTypeTest': - simpleTypeTest_ = child_.text - simpleTypeTest_ = self.gds_validate_string(simpleTypeTest_, node, 'simpleTypeTest') - self.simpleTypeTest.append(simpleTypeTest_) -# end class simpleTypeTestsType - - -class simpleTypeTest(GeneratedsSuper): - member_data_items_ = [ - MemberSpec_('datetime1', 'xs:gYear', 0), - MemberSpec_('datetime2', 'xs:gYearMonth', 0), - MemberSpec_('datetime3', 'xs:gMonth', 0), - MemberSpec_('datetime4', 'xs:gMonthDay', 0), - MemberSpec_('datetime5', 'xs:gDay', 0), - MemberSpec_('integerVal1', 'xs:integer', 0), - MemberSpec_('integerVal2', 'xs:integer', 1), - MemberSpec_('stringVal1', 'xs:string', 0), - MemberSpec_('stringVal2', 'xs:string', 1), - MemberSpec_('booleanVal1', 'xs:boolean', 0), - MemberSpec_('booleanVal2', 'xs:boolean', 1), - MemberSpec_('decimalVal1', 'xs:decimal', 0), - MemberSpec_('decimalVal2', 'xs:decimal', 1), - MemberSpec_('doubleVal1', 'xs:double', 0), - MemberSpec_('doubleVal2', 'xs:double', 1), - MemberSpec_('floatVal1', 'xs:float', 0), - MemberSpec_('floatVal2', 'xs:float', 1), - MemberSpec_('dateVal1', 'xs:date', 0), - MemberSpec_('dateVal2', 'xs:date', 1), - MemberSpec_('dateTimeVal1', 'xs:dateTime', 0), - MemberSpec_('dateTimeVal2', 'xs:dateTime', 1), - ] - subclass = None - superclass = None - def __init__(self, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None, integerVal1=None, integerVal2=None, stringVal1=None, stringVal2=None, booleanVal1=None, booleanVal2=None, decimalVal1=None, decimalVal2=None, doubleVal1=None, doubleVal2=None, floatVal1=None, floatVal2=None, dateVal1=None, dateVal2=None, dateTimeVal1=None, dateTimeVal2=None): - self.datetime1 = datetime1 - self.datetime2 = datetime2 - self.datetime3 = datetime3 - self.datetime4 = datetime4 - self.datetime5 = datetime5 - self.integerVal1 = integerVal1 - if integerVal2 is None: - self.integerVal2 = [] - else: - self.integerVal2 = integerVal2 - self.stringVal1 = stringVal1 - if stringVal2 is None: - self.stringVal2 = [] - else: - self.stringVal2 = stringVal2 - self.booleanVal1 = booleanVal1 - if booleanVal2 is None: - self.booleanVal2 = [] - else: - self.booleanVal2 = booleanVal2 - self.decimalVal1 = decimalVal1 - if decimalVal2 is None: - self.decimalVal2 = [] - else: - self.decimalVal2 = decimalVal2 - self.doubleVal1 = doubleVal1 - if doubleVal2 is None: - self.doubleVal2 = [] - else: - self.doubleVal2 = doubleVal2 - self.floatVal1 = floatVal1 - if floatVal2 is None: - self.floatVal2 = [] - else: - self.floatVal2 = floatVal2 - if isinstance(dateVal1, basestring): - initvalue_ = datetime_.datetime.strptime(dateVal1, '%Y-%m-%d').date() - else: - initvalue_ = dateVal1 - self.dateVal1 = initvalue_ - if dateVal2 is None: - self.dateVal2 = [] - else: - self.dateVal2 = dateVal2 - if isinstance(dateTimeVal1, basestring): - initvalue_ = datetime_.datetime.strptime(dateTimeVal1, '%Y-%m-%dT%H:%M:%S') - else: - initvalue_ = dateTimeVal1 - self.dateTimeVal1 = initvalue_ - if dateTimeVal2 is None: - self.dateTimeVal2 = [] - else: - self.dateTimeVal2 = dateTimeVal2 - def factory(*args_, **kwargs_): - if simpleTypeTest.subclass: - return simpleTypeTest.subclass(*args_, **kwargs_) - else: - return simpleTypeTest(*args_, **kwargs_) - factory = staticmethod(factory) - def get_datetime1(self): return self.datetime1 - def set_datetime1(self, datetime1): self.datetime1 = datetime1 - def get_datetime2(self): return self.datetime2 - def set_datetime2(self, datetime2): self.datetime2 = datetime2 - def get_datetime3(self): return self.datetime3 - def set_datetime3(self, datetime3): self.datetime3 = datetime3 - def get_datetime4(self): return self.datetime4 - def set_datetime4(self, datetime4): self.datetime4 = datetime4 - def get_datetime5(self): return self.datetime5 - def set_datetime5(self, datetime5): self.datetime5 = datetime5 - def get_integerVal1(self): return self.integerVal1 - def set_integerVal1(self, integerVal1): self.integerVal1 = integerVal1 - def get_integerVal2(self): return self.integerVal2 - def set_integerVal2(self, integerVal2): self.integerVal2 = integerVal2 - def add_integerVal2(self, value): self.integerVal2.append(value) - def insert_integerVal2(self, index, value): self.integerVal2[index] = value - def get_stringVal1(self): return self.stringVal1 - def set_stringVal1(self, stringVal1): self.stringVal1 = stringVal1 - def get_stringVal2(self): return self.stringVal2 - def set_stringVal2(self, stringVal2): self.stringVal2 = stringVal2 - def add_stringVal2(self, value): self.stringVal2.append(value) - def insert_stringVal2(self, index, value): self.stringVal2[index] = value - def get_booleanVal1(self): return self.booleanVal1 - def set_booleanVal1(self, booleanVal1): self.booleanVal1 = booleanVal1 - def get_booleanVal2(self): return self.booleanVal2 - def set_booleanVal2(self, booleanVal2): self.booleanVal2 = booleanVal2 - def add_booleanVal2(self, value): self.booleanVal2.append(value) - def insert_booleanVal2(self, index, value): self.booleanVal2[index] = value - def get_decimalVal1(self): return self.decimalVal1 - def set_decimalVal1(self, decimalVal1): self.decimalVal1 = decimalVal1 - def get_decimalVal2(self): return self.decimalVal2 - def set_decimalVal2(self, decimalVal2): self.decimalVal2 = decimalVal2 - def add_decimalVal2(self, value): self.decimalVal2.append(value) - def insert_decimalVal2(self, index, value): self.decimalVal2[index] = value - def get_doubleVal1(self): return self.doubleVal1 - def set_doubleVal1(self, doubleVal1): self.doubleVal1 = doubleVal1 - def get_doubleVal2(self): return self.doubleVal2 - def set_doubleVal2(self, doubleVal2): self.doubleVal2 = doubleVal2 - def add_doubleVal2(self, value): self.doubleVal2.append(value) - def insert_doubleVal2(self, index, value): self.doubleVal2[index] = value - def get_floatVal1(self): return self.floatVal1 - def set_floatVal1(self, floatVal1): self.floatVal1 = floatVal1 - def get_floatVal2(self): return self.floatVal2 - def set_floatVal2(self, floatVal2): self.floatVal2 = floatVal2 - def add_floatVal2(self, value): self.floatVal2.append(value) - def insert_floatVal2(self, index, value): self.floatVal2[index] = value - def get_dateVal1(self): return self.dateVal1 - def set_dateVal1(self, dateVal1): self.dateVal1 = dateVal1 - def get_dateVal2(self): return self.dateVal2 - def set_dateVal2(self, dateVal2): self.dateVal2 = dateVal2 - def add_dateVal2(self, value): self.dateVal2.append(value) - def insert_dateVal2(self, index, value): self.dateVal2[index] = value - def get_dateTimeVal1(self): return self.dateTimeVal1 - def set_dateTimeVal1(self, dateTimeVal1): self.dateTimeVal1 = dateTimeVal1 - def get_dateTimeVal2(self): return self.dateTimeVal2 - def set_dateTimeVal2(self, dateTimeVal2): self.dateTimeVal2 = dateTimeVal2 - def add_dateTimeVal2(self, value): self.dateTimeVal2.append(value) - def insert_dateTimeVal2(self, index, value): self.dateTimeVal2[index] = value - def hasContent_(self): - if ( - self.datetime1 is not None or - self.datetime2 is not None or - self.datetime3 is not None or - self.datetime4 is not None or - self.datetime5 is not None or - self.integerVal1 is not None or - self.integerVal2 or - self.stringVal1 is not None or - self.stringVal2 or - self.booleanVal1 is not None or - self.booleanVal2 or - self.decimalVal1 is not None or - self.decimalVal2 or - self.doubleVal1 is not None or - self.doubleVal2 or - self.floatVal1 is not None or - self.floatVal2 or - self.dateVal1 is not None or - self.dateVal2 or - self.dateTimeVal1 is not None or - self.dateTimeVal2 - ): - return True - else: - return False - def export(self, outfile, level, namespace_='', name_='simpleTypeTest', namespacedef_='', pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - showIndent(outfile, level, pretty_print) - outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) - already_processed = set() - self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTypeTest') - if self.hasContent_(): - outfile.write('>%s' % (eol_, )) - self.exportChildren(outfile, level + 1, namespace_, name_, pretty_print=pretty_print) - showIndent(outfile, level, pretty_print) - outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) - else: - outfile.write('/>%s' % (eol_, )) - def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTypeTest'): - pass - def exportChildren(self, outfile, level, namespace_='', name_='simpleTypeTest', fromsubclass_=False, pretty_print=True): - if pretty_print: - eol_ = '\n' - else: - eol_ = '' - if self.datetime1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime1>%s</%sdatetime1>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime1).encode(ExternalEncoding), input_name='datetime1'), namespace_, eol_)) - if self.datetime2 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime2>%s</%sdatetime2>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime2).encode(ExternalEncoding), input_name='datetime2'), namespace_, eol_)) - if self.datetime3 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime3>%s</%sdatetime3>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime3).encode(ExternalEncoding), input_name='datetime3'), namespace_, eol_)) - if self.datetime4 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime4>%s</%sdatetime4>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime4).encode(ExternalEncoding), input_name='datetime4'), namespace_, eol_)) - if self.datetime5 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdatetime5>%s</%sdatetime5>%s' % (namespace_, self.gds_format_string(quote_xml(self.datetime5).encode(ExternalEncoding), input_name='datetime5'), namespace_, eol_)) - if self.integerVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sintegerVal1>%s</%sintegerVal1>%s' % (namespace_, self.gds_format_integer(self.integerVal1, input_name='integerVal1'), namespace_, eol_)) - for integerVal2_ in self.integerVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sintegerVal2>%s</%sintegerVal2>%s' % (namespace_, self.gds_format_integer(integerVal2_, input_name='integerVal2'), namespace_, eol_)) - if self.stringVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sstringVal1>%s</%sstringVal1>%s' % (namespace_, self.gds_format_string(quote_xml(self.stringVal1).encode(ExternalEncoding), input_name='stringVal1'), namespace_, eol_)) - for stringVal2_ in self.stringVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sstringVal2>%s</%sstringVal2>%s' % (namespace_, self.gds_format_string(quote_xml(stringVal2_).encode(ExternalEncoding), input_name='stringVal2'), namespace_, eol_)) - if self.booleanVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sbooleanVal1>%s</%sbooleanVal1>%s' % (namespace_, self.gds_format_boolean(self.booleanVal1, input_name='booleanVal1'), namespace_, eol_)) - for booleanVal2_ in self.booleanVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sbooleanVal2>%s</%sbooleanVal2>%s' % (namespace_, self.gds_format_boolean(booleanVal2_, input_name='booleanVal2'), namespace_, eol_)) - if self.decimalVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdecimalVal1>%s</%sdecimalVal1>%s' % (namespace_, self.gds_format_float(self.decimalVal1, input_name='decimalVal1'), namespace_, eol_)) - for decimalVal2_ in self.decimalVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdecimalVal2>%s</%sdecimalVal2>%s' % (namespace_, self.gds_format_float(decimalVal2_, input_name='decimalVal2'), namespace_, eol_)) - if self.doubleVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdoubleVal1>%s</%sdoubleVal1>%s' % (namespace_, self.gds_format_double(self.doubleVal1, input_name='doubleVal1'), namespace_, eol_)) - for doubleVal2_ in self.doubleVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdoubleVal2>%s</%sdoubleVal2>%s' % (namespace_, self.gds_format_double(doubleVal2_, input_name='doubleVal2'), namespace_, eol_)) - if self.floatVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfloatVal1>%s</%sfloatVal1>%s' % (namespace_, self.gds_format_float(self.floatVal1, input_name='floatVal1'), namespace_, eol_)) - for floatVal2_ in self.floatVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sfloatVal2>%s</%sfloatVal2>%s' % (namespace_, self.gds_format_float(floatVal2_, input_name='floatVal2'), namespace_, eol_)) - if self.dateVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdateVal1>%s</%sdateVal1>%s' % (namespace_, self.gds_format_date(self.dateVal1, input_name='dateVal1'), namespace_, eol_)) - for dateVal2_ in self.dateVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdateVal2>%s</%sdateVal2>%s' % (namespace_, self.gds_format_date(dateVal2_, input_name='dateVal2'), namespace_, eol_)) - if self.dateTimeVal1 is not None: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdateTimeVal1>%s</%sdateTimeVal1>%s' % (namespace_, self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1'), namespace_, eol_)) - for dateTimeVal2_ in self.dateTimeVal2: - showIndent(outfile, level, pretty_print) - outfile.write('<%sdateTimeVal2>%s</%sdateTimeVal2>%s' % (namespace_, self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2'), namespace_, eol_)) - def exportLiteral(self, outfile, level, name_='simpleTypeTest'): - level += 1 - already_processed = set() - self.exportLiteralAttributes(outfile, level, already_processed, name_) - if self.hasContent_(): - self.exportLiteralChildren(outfile, level, name_) - def exportLiteralAttributes(self, outfile, level, already_processed, name_): - pass - def exportLiteralChildren(self, outfile, level, name_): - if self.datetime1 is not None: - showIndent(outfile, level) - outfile.write('datetime1=%s,\n' % quote_python(self.datetime1).encode(ExternalEncoding)) - if self.datetime2 is not None: - showIndent(outfile, level) - outfile.write('datetime2=%s,\n' % quote_python(self.datetime2).encode(ExternalEncoding)) - if self.datetime3 is not None: - showIndent(outfile, level) - outfile.write('datetime3=%s,\n' % quote_python(self.datetime3).encode(ExternalEncoding)) - if self.datetime4 is not None: - showIndent(outfile, level) - outfile.write('datetime4=%s,\n' % quote_python(self.datetime4).encode(ExternalEncoding)) - if self.datetime5 is not None: - showIndent(outfile, level) - outfile.write('datetime5=%s,\n' % quote_python(self.datetime5).encode(ExternalEncoding)) - if self.integerVal1 is not None: - showIndent(outfile, level) - outfile.write('integerVal1=%d,\n' % self.integerVal1) - showIndent(outfile, level) - outfile.write('integerVal2=[\n') - level += 1 - for integerVal2_ in self.integerVal2: - showIndent(outfile, level) - outfile.write('%d,\n' % integerVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.stringVal1 is not None: - showIndent(outfile, level) - outfile.write('stringVal1=%s,\n' % quote_python(self.stringVal1).encode(ExternalEncoding)) - showIndent(outfile, level) - outfile.write('stringVal2=[\n') - level += 1 - for stringVal2_ in self.stringVal2: - showIndent(outfile, level) - outfile.write('%s,\n' % quote_python(stringVal2_).encode(ExternalEncoding)) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.booleanVal1 is not None: - showIndent(outfile, level) - outfile.write('booleanVal1=%s,\n' % self.booleanVal1) - showIndent(outfile, level) - outfile.write('booleanVal2=[\n') - level += 1 - for booleanVal2_ in self.booleanVal2: - showIndent(outfile, level) - outfile.write('%s,\n' % booleanVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.decimalVal1 is not None: - showIndent(outfile, level) - outfile.write('decimalVal1=%f,\n' % self.decimalVal1) - showIndent(outfile, level) - outfile.write('decimalVal2=[\n') - level += 1 - for decimalVal2_ in self.decimalVal2: - showIndent(outfile, level) - outfile.write('%f,\n' % decimalVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.doubleVal1 is not None: - showIndent(outfile, level) - outfile.write('doubleVal1=%e,\n' % self.doubleVal1) - showIndent(outfile, level) - outfile.write('doubleVal2=[\n') - level += 1 - for doubleVal2_ in self.doubleVal2: - showIndent(outfile, level) - outfile.write('%e,\n' % doubleVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.floatVal1 is not None: - showIndent(outfile, level) - outfile.write('floatVal1=%f,\n' % self.floatVal1) - showIndent(outfile, level) - outfile.write('floatVal2=[\n') - level += 1 - for floatVal2_ in self.floatVal2: - showIndent(outfile, level) - outfile.write('%f,\n' % floatVal2_) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.dateVal1 is not None: - showIndent(outfile, level) - outfile.write('dateVal1=model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(self.dateVal1, input_name='dateVal1')) - showIndent(outfile, level) - outfile.write('dateVal2=[\n') - level += 1 - for dateVal2_ in self.dateVal2: - showIndent(outfile, level) - outfile.write('model_.GeneratedsSuper.gds_parse_date("%s"),\n' % self.gds_format_date(dateVal2_, input_name='dateVal2')) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - if self.dateTimeVal1 is not None: - showIndent(outfile, level) - outfile.write('dateTimeVal1=model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(self.dateTimeVal1, input_name='dateTimeVal1')) - showIndent(outfile, level) - outfile.write('dateTimeVal2=[\n') - level += 1 - for dateTimeVal2_ in self.dateTimeVal2: - showIndent(outfile, level) - outfile.write('model_.GeneratedsSuper.gds_parse_datetime("%s"),\n' % self.gds_format_datetime(dateTimeVal2_, input_name='dateTimeVal2')) - level -= 1 - showIndent(outfile, level) - outfile.write('],\n') - def build(self, node): - already_processed = set() - self.buildAttributes(node, node.attrib, already_processed) - for child in node: - nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] - self.buildChildren(child, node, nodeName_) - def buildAttributes(self, node, attrs, already_processed): - pass - def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): - if nodeName_ == 'datetime1': - datetime1_ = child_.text - datetime1_ = self.gds_validate_string(datetime1_, node, 'datetime1') - self.datetime1 = datetime1_ - elif nodeName_ == 'datetime2': - datetime2_ = child_.text - datetime2_ = self.gds_validate_string(datetime2_, node, 'datetime2') - self.datetime2 = datetime2_ - elif nodeName_ == 'datetime3': - datetime3_ = child_.text - datetime3_ = self.gds_validate_string(datetime3_, node, 'datetime3') - self.datetime3 = datetime3_ - elif nodeName_ == 'datetime4': - datetime4_ = child_.text - datetime4_ = self.gds_validate_string(datetime4_, node, 'datetime4') - self.datetime4 = datetime4_ - elif nodeName_ == 'datetime5': - datetime5_ = child_.text - datetime5_ = self.gds_validate_string(datetime5_, node, 'datetime5') - self.datetime5 = datetime5_ - elif nodeName_ == 'integerVal1': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'integerVal1') - self.integerVal1 = ival_ - elif nodeName_ == 'integerVal2': - sval_ = child_.text - try: - ival_ = int(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires integer: %s' % exp) - ival_ = self.gds_validate_integer(ival_, node, 'integerVal2') - self.integerVal2.append(ival_) - elif nodeName_ == 'stringVal1': - stringVal1_ = child_.text - stringVal1_ = self.gds_validate_string(stringVal1_, node, 'stringVal1') - self.stringVal1 = stringVal1_ - elif nodeName_ == 'stringVal2': - stringVal2_ = child_.text - stringVal2_ = self.gds_validate_string(stringVal2_, node, 'stringVal2') - self.stringVal2.append(stringVal2_) - elif nodeName_ == 'booleanVal1': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - ival_ = self.gds_validate_boolean(ival_, node, 'booleanVal1') - self.booleanVal1 = ival_ - elif nodeName_ == 'booleanVal2': - sval_ = child_.text - if sval_ in ('true', '1'): - ival_ = True - elif sval_ in ('false', '0'): - ival_ = False - else: - raise_parse_error(child_, 'requires boolean') - ival_ = self.gds_validate_boolean(ival_, node, 'booleanVal2') - self.booleanVal2.append(ival_) - elif nodeName_ == 'decimalVal1': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'decimalVal1') - self.decimalVal1 = fval_ - elif nodeName_ == 'decimalVal2': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'decimalVal2') - self.decimalVal2.append(fval_) - elif nodeName_ == 'doubleVal1': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'doubleVal1') - self.doubleVal1 = fval_ - elif nodeName_ == 'doubleVal2': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'doubleVal2') - self.doubleVal2.append(fval_) - elif nodeName_ == 'floatVal1': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'floatVal1') - self.floatVal1 = fval_ - elif nodeName_ == 'floatVal2': - sval_ = child_.text - try: - fval_ = float(sval_) - except (TypeError, ValueError), exp: - raise_parse_error(child_, 'requires float or double: %s' % exp) - fval_ = self.gds_validate_float(fval_, node, 'floatVal2') - self.floatVal2.append(fval_) - elif nodeName_ == 'dateVal1': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.dateVal1 = dval_ - elif nodeName_ == 'dateVal2': - sval_ = child_.text - dval_ = self.gds_parse_date(sval_) - self.dateVal2.append(dval_) - elif nodeName_ == 'dateTimeVal1': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.dateTimeVal1 = dval_ - elif nodeName_ == 'dateTimeVal2': - sval_ = child_.text - dval_ = self.gds_parse_datetime(sval_) - self.dateTimeVal2.append(dval_) -# end class simpleTypeTest - - -GDSClassesMapping = { - 'simpleTypeTests': simpleTypeTestsType, -} - - -USAGE_TEXT = """ -Usage: python <Parser>.py [ -s ] <in_xml_file> -""" - - -def usage(): - print USAGE_TEXT - sys.exit(1) - - -def get_root_tag(node): - tag = Tag_pattern_.match(node.tag).groups()[-1] - rootClass = GDSClassesMapping.get(tag) - if rootClass is None: - rootClass = globals().get(tag) - return tag, rootClass - - -def parse(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'simpleTypeTests' - rootClass = simpleTypeTestsType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_=rootTag, -## namespacedef_='', -## pretty_print=True) - return rootObj - - -def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'simpleTypeTests' - rootClass = simpleTypeTestsType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None - mapping = {} - rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) - reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) -## if not silence: -## content = etree_.tostring( -## rootElement, pretty_print=True, -## xml_declaration=True, encoding="utf-8") -## sys.stdout.write(content) -## sys.stdout.write('\n') - return rootObj, rootElement, mapping, reverse_mapping - - -def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) - rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] - if rootClass is None: - rootClass = simpleTypeTestsType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('<?xml version="1.0" ?>\n') -## rootObj.export( -## sys.stdout, 0, name_="simpleTypeTests", -## namespacedef_='') - return rootObj - - -def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) - rootNode = doc.getroot() - rootTag, rootClass = get_root_tag(rootNode) - if rootClass is None: - rootTag = 'simpleTypeTests' - rootClass = simpleTypeTestsType - rootObj = rootClass.factory() - rootObj.build(rootNode) - # Enable Python to collect the space used by the DOM. - doc = None -## if not silence: -## sys.stdout.write('#from simpletypes_other2_sup import *\n\n') -## sys.stdout.write('import simpletypes_other2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) -## sys.stdout.write(')\n') - return rootObj - - -def main(): - args = sys.argv[1:] - if len(args) == 1: - parse(args[0]) - else: - usage() - - -if __name__ == '__main__': - #import pdb; pdb.set_trace() - main() - - -__all__ = [ - "simpleTypeTest", - "simpleTypeTestsType" -] diff --git a/tests/test.py b/tests/test.py index 7b13b39..d76e266 100755 --- a/tests/test.py +++ b/tests/test.py @@ -1,30 +1,48 @@ #!/usr/bin/env python +from __future__ import print_function + +import difflib import sys +import os import subprocess import getopt import unittest + from lxml import etree +#import generateDS + class GenTest(unittest.TestCase): - def execute(self, cmd, cwd=None): + def execute(self, cmd, cwd=None, env=None): p = subprocess.Popen( cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, - shell=True) + shell=True, + env=env) stdout, stderr = p.communicate() return stdout, stderr - def setUp(self): - cmd = ( - 'python generateDS.py --no-dates --no-versions -f ' - '-o tests/out2_sup.py -s tests/out2_sub.py ' - '--super=out2_sup -u gends_user_methods tests/people.xsd' - ) - stdout, stderr = self.execute(cmd, cwd='..') - self.failUnlessEqual(len(stdout), 0) - self.failUnlessEqual(len(stderr), 0) + def executeClean(self, cmd, cwd=None, env=None): + if env is None: + env = os.environ + stdout, stderr = self.execute(cmd, cwd, env) + self.assertEqual( + len(stdout), 0, "stdout was not empty:\n{}".format(stdout)) + self.assertEqual( + len(stderr), 0, "stderr was not empty:\n{}".format(stderr)) + +## def setUp(self): +## print('running setUp') +## cmd = ( +## 'python generateDS.py --no-dates --no-versions -f ' +## '-o tests/out2_sup.py -s tests/out2_sub.py ' +## '--super=out2_sup -u gends_user_methods tests/people.xsd' +## ) +## stdout, stderr = self.execute(cmd, cwd='..') +## self.failUnlessEqual(len(stdout), 0) +## self.failUnlessEqual(len(stderr), 0) ## def tearDown(self): ## for f in [ "out2_sub.py", "out2_sup.py" ]: @@ -34,19 +52,18 @@ class GenTest(unittest.TestCase): ## pass def test_001_compare_superclasses(self): - cmd = 'diff out1_sup.py out2_sup.py' - result, err = self.execute(cmd) - #print 'len(result):', len(result) - # Ignore the differing lines containing the date/time. - #self.failUnless(len(result) < 130 and result.find('Generated') > -1) - self.check_result(result, err, ()) - - def test_002_compare_subclasses(self): - cmd = 'diff out1_sub.py out2_sub.py' - result, err = self.execute(cmd) - # Ignore the differing lines containing the date/time. - #self.failUnless(len(result) < 130 and result.find('Generated') > -1) - self.check_result(result, err, ()) + cmd = ( + 'python generateDS.py --no-dates --no-versions -f ' + '-o tests/out2_sup.py -s tests/out2_sub.py ' + '--export="write literal" ' + '--super=out2_sup -u gends_user_methods tests/people.xsd' + ) + self.executeClean(cmd, cwd='..') + self.compareFiles('out1_sup.py', 'out2_sup.py', ignore=()) + self.compareFiles('out1_sub.py', 'out2_sub.py') + # cleanup generated files + #self.remove('out2_sup.py') + self.remove('out2_sub.py') def test_003_element_groups(self): cmdTempl = ( @@ -57,7 +74,7 @@ class GenTest(unittest.TestCase): ) t_ = 'groups' cmd = cmdTempl % (t_, t_, t_, t_) - result, err = self.execute(cmd, cwd='..') + self.executeClean(cmd, cwd='..') # Verify the structure cmdTempl = ( 'python -c "import %s_sub; print ' @@ -85,6 +102,9 @@ class GenTest(unittest.TestCase): ['value 1 1', 'group1 1', 'group2 1', 'value 1 2'] ['value 2 1', 'group1 2', 'group2 2', 'value 2 2'] """) + # cleanup generated files + self.remove('{}_sup.py'.format(t_)) + self.remove('{}_sub.py'.format(t_)) def test_004_valueof(self): cmdTempl = ( @@ -95,7 +115,7 @@ class GenTest(unittest.TestCase): ) t_ = 'valueof' cmd = cmdTempl % (t_, t_, t_, t_) - result, err = self.execute(cmd, cwd='..') + self.executeClean(cmd, cwd='..') # load the XML, and verify the proper data was loaded # Run these commands:: # import valueof_sub @@ -134,6 +154,9 @@ class GenTest(unittest.TestCase): self.failUnlessEqual(result, """\ ('child1', 'value1') """) + # cleanup generated files + self.remove('{}_sup.py'.format(t_)) + self.remove('{}_sub.py'.format(t_)) ns_for_import_xml1 = """\ <root xmlns="http://a" xmlns:bl="http://blah"> @@ -182,13 +205,15 @@ class GenTest(unittest.TestCase): ) t_ = 'anysimpletype' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, err = self.execute(cmd, cwd='..') - cmd = 'diff anysimpletype1_sup.py anysimpletype2_sup.py' - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff anysimpletype1_sub.py anysimpletype2_sub.py' - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + 'anysimpletype1_sup.py', + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('anysimpletype1_sub.py', '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_007_simpletype_memberspecs(self): cmdTempl = ( @@ -199,13 +224,15 @@ class GenTest(unittest.TestCase): ) t_ = 'simpletype_memberspecs' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_008_extensions(self): cmdTempl = ( @@ -216,15 +243,24 @@ class GenTest(unittest.TestCase): ) t_ = 'extensions' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_009_literal(self): + cmd = ( + 'python generateDS.py --no-dates --no-versions -f ' + '-o tests/out2_sup.py -s tests/out2_sub.py ' + '--export="write literal" ' + '--super=out2_sup -u gends_user_methods tests/people.xsd' + ) + self.executeClean(cmd, cwd='..') import out2_sup save_stdout = sys.stdout sys.stdout = open('literal2.py', 'w') @@ -238,6 +274,10 @@ class GenTest(unittest.TestCase): content2 = infile.read() infile.close() self.failUnlessEqual(content1, content2) + # cleanup generated files + self.remove('literal2.py') + #self.remove('out2_sup.py') + self.remove('out2_sub.py') def test_010_simplecontent_restriction(self): cmdTempl = ( @@ -248,13 +288,15 @@ class GenTest(unittest.TestCase): ) t_ = 'simplecontent_restriction' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_011_annotations(self): cmdTempl = ( @@ -265,15 +307,17 @@ class GenTest(unittest.TestCase): ) t_ = 'annotations' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) - - def test_012_abstracttype(self): + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_012_abstract_type(self): cmdTempl = ( 'python generateDS.py --no-dates --no-versions ' '--silence --member-specs=list -f ' @@ -282,15 +326,17 @@ class GenTest(unittest.TestCase): ) t_ = 'abstract_type' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) - - def test_013_procincl(self): + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_013_people_procincl(self): cmdTempl = ( 'python generateDS.py --no-dates --no-versions ' '--silence --member-specs=list -f ' @@ -300,15 +346,17 @@ class GenTest(unittest.TestCase): ) t_ = 'people_procincl' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) - - def test_014_xsi_type(self): + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_014_ipo(self): cmdTempl = ( 'python generateDS.py --no-dates --no-versions ' '--member-specs=list -f ' @@ -317,19 +365,18 @@ class GenTest(unittest.TestCase): ) t_ = 'ipo' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) - cmdTempl = 'python tests/%s2_sup.py tests/ipo.xml > tests/%s2_out.xml' - cmd = cmdTempl % (t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_out.xml %s2_out.xml' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + 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_)) + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + # cleanup generated files + self.remove('{}2_out.xml'.format(t_)) def test_015_recursive_simpletype(self): cmdTempl = ( @@ -341,13 +388,15 @@ class GenTest(unittest.TestCase): ) t_ = 'recursive_simpletype' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_016_anywildcard(self): cmdTempl = ( @@ -359,13 +408,15 @@ class GenTest(unittest.TestCase): ) t_ = 'anywildcard' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_017_attr_groups(self): cmdTempl = ( @@ -377,13 +428,15 @@ class GenTest(unittest.TestCase): ) t_ = 'attr_groups' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_018_simpletypes_other(self): cmdTempl = ( @@ -395,13 +448,15 @@ class GenTest(unittest.TestCase): ) t_ = 'simpletypes_other' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_019_to_etree(self): cmdTempl = ( @@ -414,13 +469,12 @@ class GenTest(unittest.TestCase): ) t_ = 'to_etree' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + 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_)) import to_etree2_sup rootObj, rootElement, mapping, reverse_mapping = \ to_etree2_sup.parseEtree('to_etree.xml') @@ -430,9 +484,11 @@ class GenTest(unittest.TestCase): outfile = open('to_etree2.xml', 'w') outfile.write(content) outfile.close() - cmd = 'diff %s1.xml %s2.xml' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.compareFiles('{}1.xml'.format(t_), '{}2.xml'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + self.remove('{}2.xml'.format(t_)) def test_020_catalogtest(self): cmdTempl = ( @@ -445,13 +501,15 @@ class GenTest(unittest.TestCase): ) t_ = 'catalogtest' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) def test_021_anonymous_type(self): cmdTempl = ( @@ -463,41 +521,327 @@ class GenTest(unittest.TestCase): ) t_ = 'anonymous_type' cmd = cmdTempl % (t_, t_, t_, t_, ) - result, _ = self.execute(cmd, cwd='..') - cmd = 'diff %s1_sup.py %s2_sup.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ('sys.stdout.write',)) - cmd = 'diff %s1_sub.py %s2_sub.py' % (t_, t_, ) - result, err = self.execute(cmd) - self.check_result(result, err, ()) - - def check_result(self, result, err, ignore_strings): - self.failUnlessEqual(len(result), 0) - self.failUnlessEqual(len(err), 0) - return True -## if len(err) > 0: -## return False -## lines = result.split('\n') -## len1 = len(lines) -## if len1 > 5: -## return False -## elif len1 > 1 and len1 <= 5: -## s1 = '\n'.join(lines[:4]) -## found = False -## for s2 in ignore_strings: -## if s1.find(s2) > -1: -## found = True -## break -## if not found: -## return False -## return True + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_022_one_per(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '--one-file-per-xsd --output-directory="tests/OnePer" ' + '--module-suffix="One" ' + '--super=%s2_sup ' + 'tests/%s00.xsd' + ) + t_ = 'oneper' + cmd = cmdTempl % (t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + 'OnePer{}{}Type00_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type00_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type01_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type01_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type02_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type02_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + self.compareFiles( + 'OnePer{}{}Type03_1One.py'.format(os.sep, t_), + 'OnePer{}{}Type03_2One.py'.format(os.sep, t_), + ('sys.stdout.write',)) + # cleanup generated files + self.remove('OnePer{}{}Type00_1One.py'.format(os.sep, t_)) + self.remove('OnePer{}{}Type01_1One.py'.format(os.sep, t_)) + self.remove('OnePer{}{}Type02_1One.py'.format(os.sep, t_)) + self.remove('OnePer{}{}Type03_1One.py'.format(os.sep, t_)) + + def test_023_mapcleanname(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'mapcleanname' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_024_prefix_classname(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '-p tomato_ ' + '--member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'prefix_classname' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + # 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 test_025_validate_simpletypes(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'validate_simpletypes' + cmd = cmdTempl % (t_, t_, t_, t_, ) + 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_)) + cmdTempl = ( + 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml ' + '2> tests/%s2_warnings.txt' + ) + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + self.compareFiles( + '{}1_warnings.txt'.format(t_), '{}2_warnings.txt'.format(t_)) + # cleanup generated files + self.remove('{}2_out.xml'.format(t_)) + self.remove('{}2_warnings.txt'.format(t_)) + + def test_026_reference_simpletype(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'reference_simpletype' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_027_cdata(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--silence ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'cdata' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + + import cdata2_sup as cdatalib + cdatalist = cdatalib.cdataListType() + cdata1 = cdatalib.cdataType() + cdata1.set_script("<![CDATA[ccc < ddd & eee]]>") + cdatalist.add_cdatalist(cdata1) + cdata2 = cdatalib.cdataType() + cdata2.set_script( + "aaa < bbb <![CDATA[ccc < ddd]]> eee < & fff" + + "<<![CDATA[ggg < & hhh]]>& iii < jjj" + ) + cdatalist.add_cdatalist(cdata2) + with open('%s2.xml' % t_, 'w') as outfile: + cdatalist.export(outfile, 0) + self.compareFiles('{}1.xml'.format(t_), '{}2.xml'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + self.remove('{}2.xml'.format(t_)) + + def test_028_defaults_coverage(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'defaults_coverage' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_029_defaults_cases(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'defaults_cases' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + # 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 test_030_nested_def(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + 'tests/%s.xsd' + ) + t_ = 'nested_def' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # Need to preserve generated files for next command, cleanup at end + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + self.remove('{}2_out.xml'.format(t_)) + + # + # Test enhancements to cleanupName function. + def test_031_cleanupname(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--silence --member-specs=list -f ' + '-o tests/%s2_sup.py -s tests/%s2_sub.py ' + '--super=%s2_sup ' + "--cleanup-name-list=\"[('[-:.]', '_'), " + "('^Type', 'Class'), " + "('Type$', 'Kind'), " + "('[ABC]', 'M'), " + "('[XYZ]', 'N'), " + "]\" " + 'tests/%s.xsd' + ) + t_ = 'cleanupname' + cmd = cmdTempl % (t_, t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles( + '{}1_sup.py'.format(t_), + '{}2_sup.py'.format(t_), + ('sys.stdout.write',)) + self.compareFiles('{}1_sub.py'.format(t_), '{}2_sub.py'.format(t_)) + # cleanup generated files + self.remove('{}2_sup.py'.format(t_)) + self.remove('{}2_sub.py'.format(t_)) + + def test_032_rem_dup_elems(self): + cmdTempl = ( + 'python generateDS.py --no-dates --no-versions ' + '--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_ = 'rem_dup_elems' + 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 + cmdTempl = 'python tests/%s2_sup.py tests/%s.xml > tests/%s2_out.xml' + cmd = cmdTempl % (t_, t_, t_, ) + self.executeClean(cmd, cwd='..') + self.compareFiles('{}1_out.xml'.format(t_), '{}2_out.xml'.format(t_)) + # 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: + diffs = difflib.unified_diff( + left_file.readlines(), right_file.readlines()) + diffs = list(diffs) + if diffs: + diffs = ''.join(diffs[2:12]) + self.fail("Files differed:\n{}".format(diffs)) + + def remove(self, filename): + os.remove(filename) # Make the test suite. def suite(): # The following is obsolete. See Lib/unittest.py. #return unittest.makeSuite(GenTest) - loader = unittest.TestLoader() + loader = unittest.defaultTestLoader testsuite = loader.loadTestsFromTestCase(GenTest) return testsuite @@ -520,7 +864,7 @@ Example: def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(-1) diff --git a/tests/to_etree.xsd b/tests/to_etree.xsd index 71d2860..1324971 100644 --- a/tests/to_etree.xsd +++ b/tests/to_etree.xsd @@ -337,4 +337,3 @@ </xs:complexType> </xs:schema> - diff --git a/tests/to_etree1.xml b/tests/to_etree1.xml index c82a500..05566ba 100644 --- a/tests/to_etree1.xml +++ b/tests/to_etree1.xml @@ -3,7 +3,7 @@ <comments>1. This is a <emp>foolish</emp> comment. <bold>It</bold> is <emp>really</emp> important.</comments> <comments>2. This is a <emp>silly</emp> comment. It is <emp>very</emp> significant.</comments> <comments><emp>3.</emp> This is a empty comment. </comments> - <person ratio="3.2" id="1" value="abcd"> + <person value="abcd" id="1" ratio="3.2"> <name>Alberta</name> <interest>gardening</interest> <interest>reading</interest> @@ -22,7 +22,7 @@ <firstname>Darren</firstname> <lastname>Diddly</lastname> <priority>4.5</priority> - <info rating="5.33" type="321" name="Albert Abasinian"/> + <info name="Albert Abasinian" type="321" rating="5.33"/> <vehicle xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="airplane"> <wheelcount>36</wheelcount> <pilotname>Felicity Flygirl</pilotname> @@ -75,7 +75,7 @@ <firstname>Harry</firstname> <lastname>Hapton</lastname> <priority>4.5</priority> - <info rating="5.33" type="321" name="Harry Hapton"/> + <info name="Harry Hapton" type="321" rating="5.33"/> </agent> <range>35</range> </specialperson> @@ -87,7 +87,7 @@ <firstname>Ernest</firstname> <lastname>Echo</lastname> <priority>3.8</priority> - <info rating="5.33" type="321" name="George Gregory"/> + <info name="George Gregory" type="321" rating="5.33"/> </agent> <description>A very happy programmer</description> <range>45</range> @@ -102,9 +102,9 @@ <eltoken>aa bb cc dd ee</eltoken> <elshort>123</elshort> <ellong>13241234123412341234</ellong> - <elparam semantic="a big semantic" name="Davy" id="id001"/> + <elparam id="id001" name="Davy" semantic="a big semantic"/> </programmer> - <python-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" drcs_attr="git" nick-name="davy" gui_developer="true"> + <python-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy" drcs_attr="git" gui_developer="true"> <name>Darrel Dawson</name> <interest>hang gliding</interest> <category>3344</category> @@ -112,7 +112,7 @@ <firstname>Harvey</firstname> <lastname>Hippolite</lastname> <priority>5.2</priority> - <info rating="6.55" type="543" name="Harvey Hippolite"/> + <info name="Harvey Hippolite" type="543" rating="6.55"/> </agent> <description>An object-orientated programmer</description> <range>27</range> @@ -120,7 +120,7 @@ <favorite-editor>jed</favorite-editor> <drcs>mercurial</drcs> </python-programmer> - <java-programmer vegetable="tomato" fruit="peach" ratio="8.699999999999999" id="232" value="abcd" language="python" area="xml" nick-name="davy"> + <java-programmer value="abcd" id="232" ratio="8.699999999999999" fruit="peach" vegetable="tomato" language="python" area="xml" nick-name="davy"> <name>Darrel Dawson</name> <interest>hang gliding</interest> <category>3344</category> @@ -128,7 +128,7 @@ <firstname>Harvey</firstname> <lastname>Hippolite</lastname> <priority>5.2</priority> - <info rating="6.55" type="543" name="Harvey Hippolite"/> + <info name="Harvey Hippolite" type="543" rating="6.55"/> </agent> <description>An <object-orientated> programmer & stuff.</description> <range>28</range> diff --git a/tests/to_etree1_sub.py b/tests/to_etree1_sub.py index 1771174..de64934 100644 --- a/tests/to_etree1_sub.py +++ b/tests/to_etree1_sub.py @@ -3,64 +3,39 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/to_etree2_sup.py') +# ('-s', 'tests/to_etree2_sub.py') +# ('--export', 'etree') +# ('--silence', '') +# ('--super', 'to_etree2_sup') +# +# Command line arguments: +# tests/to_etree.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/to_etree2_sup.py" -s "tests/to_etree2_sub.py" --export="etree" --silence --super="to_etree2_sup" tests/to_etree.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys +from lxml import etree as etree_ import to_etree2_sup as supermod -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None -try: - # lxml - from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") -except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -89,43 +64,43 @@ supermod.commentsType.subclass = commentsTypeSub class personTypeSub(supermod.personType): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None): - super(personTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None): + super(personTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, ) supermod.personType.subclass = personTypeSub # end class personTypeSub class specialpersonSub(supermod.specialperson): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None): - super(specialpersonSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None): + super(specialpersonSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, ) supermod.specialperson.subclass = specialpersonSub # end class specialpersonSub class programmerTypeSub(supermod.programmerType): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + super(programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, extensiontype_, ) supermod.programmerType.subclass = programmerTypeSub # end class programmerTypeSub class paramTypeSub(supermod.paramType): - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - super(paramTypeSub, self).__init__(semantic, name, flow, sid, type_, id, valueOf_, ) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + super(paramTypeSub, self).__init__(id, name, sid, flow, semantic, type_, valueOf_, ) supermod.paramType.subclass = paramTypeSub # end class paramTypeSub class python_programmerTypeSub(supermod.python_programmerType): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None): - super(python_programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, drcs_attr, nick_name, gui_developer, favorite_editor, flowvalue, drcs, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None): + super(python_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, drcs_attr, gui_developer, favorite_editor, flowvalue, drcs, ) supermod.python_programmerType.subclass = python_programmerTypeSub # end class python_programmerTypeSub class java_programmerTypeSub(supermod.java_programmerType): - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None): - super(java_programmerTypeSub, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, status, nick_name, favorite_editor, datetime1, datetime2, datetime3, datetime4, datetime5, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None): + super(java_programmerTypeSub, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, nick_name, status, favorite_editor, datetime1, datetime2, datetime3, datetime4, datetime5, ) supermod.java_programmerType.subclass = java_programmerTypeSub # end class java_programmerTypeSub @@ -159,8 +134,8 @@ supermod.boosterType.subclass = boosterTypeSub class infoTypeSub(supermod.infoType): - def __init__(self, rating=None, type_=None, name=None): - super(infoTypeSub, self).__init__(rating, type_, name, ) + def __init__(self, name=None, type_=None, rating=None): + super(infoTypeSub, self).__init__(name, type_, rating, ) supermod.infoType.subclass = infoTypeSub # end class infoTypeSub @@ -210,11 +185,12 @@ def get_root_tag(node): def parse(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = supermod.peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -230,11 +206,12 @@ def parse(inFilename, silence=False): def parseEtree(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = supermod.peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -254,11 +231,12 @@ def parseEtree(inFilename, silence=False): def parseString(inString, silence=False): from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + parser = None + doc = parsexml_(StringIO(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = supermod.peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -273,11 +251,12 @@ def parseString(inString, silence=False): def parseLiteral(inFilename, silence=False): - doc = parsexml_(inFilename) + parser = None + doc = parsexml_(inFilename, parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'peopleType' rootClass = supermod.peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -286,8 +265,8 @@ def parseLiteral(inFilename, silence=False): ## if not silence: ## sys.stdout.write('#from to_etree2_sup import *\n\n') ## sys.stdout.write('import to_etree2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.people(\n') -## rootObj.exportLiteral(sys.stdout, 0, name_="people") +## sys.stdout.write('rootObj = model_.rootClass(\n') +## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj @@ -298,7 +277,7 @@ Usage: python ???.py <infilename> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py index 4e8bfd1..a91bf21 100644 --- a/tests/to_etree1_sup.py +++ b/tests/to_etree1_sup.py @@ -4,66 +4,56 @@ # # Generated by generateDS.py. # +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--silence', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/to_etree2_sup.py') +# ('-s', 'tests/to_etree2_sub.py') +# ('--export', 'etree') +# ('--silence', '') +# ('--super', 'to_etree2_sup') +# +# Command line arguments: +# tests/to_etree.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --silence --member-specs="list" -f -o "tests/to_etree2_sup.py" -s "tests/to_etree2_sub.py" --export="etree" --silence --super="to_etree2_sup" tests/to_etree.xsd +# +# Current working directory (os.getcwd()): +# generateds +# import sys -import getopt import re as re_ import base64 import datetime as datetime_ - -etree_ = None -Verbose_import_ = False -( - XMLParser_import_none, XMLParser_import_lxml, - XMLParser_import_elementtree -) = range(3) -XMLParser_import_library = None +import warnings as warnings_ try: - # lxml from lxml import etree as etree_ - XMLParser_import_library = XMLParser_import_lxml - if Verbose_import_: - print("running with lxml.etree") except ImportError: - try: - # cElementTree from Python 2.5+ - import xml.etree.cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree on Python 2.5+") - except ImportError: - try: - # ElementTree from Python 2.5+ - import xml.etree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree on Python 2.5+") - except ImportError: - try: - # normal cElementTree install - import cElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with cElementTree") - except ImportError: - try: - # normal ElementTree install - import elementtree.ElementTree as etree_ - XMLParser_import_library = XMLParser_import_elementtree - if Verbose_import_: - print("running with ElementTree") - except ImportError: - raise ImportError( - "Failed to import ElementTree from any known place") - - -def parsexml_(*args, **kwargs): - if (XMLParser_import_library == XMLParser_import_lxml and - 'parser' not in kwargs): + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: # Use the lxml ElementTree compatible parser so that, e.g., # we ignore comments. - kwargs['parser'] = etree_.ETCompatXMLParser() - doc = etree_.parse(*args, **kwargs) + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) return doc # @@ -75,7 +65,7 @@ def parsexml_(*args, **kwargs): try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: class GeneratedsSuper(object): tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') @@ -91,61 +81,68 @@ except ImportError, exp: return None def gds_format_string(self, input_data, input_name=''): return input_data - def gds_validate_string(self, input_data, node, input_name=''): - 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, input_name=''): + def gds_validate_base64(self, input_data, node=None, input_name=''): return input_data def gds_format_integer(self, input_data, input_name=''): return '%d' % input_data - def gds_validate_integer(self, input_data, node, input_name=''): + def gds_validate_integer(self, input_data, node=None, input_name=''): return input_data def gds_format_integer_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_integer_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: - float(value) + int(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of integers') - return input_data + return values def gds_format_float(self, input_data, input_name=''): return ('%.15f' % input_data).rstrip('0') - def gds_validate_float(self, input_data, node, input_name=''): + def gds_validate_float(self, input_data, node=None, input_name=''): return input_data def gds_format_float_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_float_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of floats') - return input_data + return values def gds_format_double(self, input_data, input_name=''): return '%e' % input_data - def gds_validate_double(self, input_data, node, input_name=''): + def gds_validate_double(self, input_data, node=None, input_name=''): return input_data def gds_format_double_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_double_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: try: float(value) except (TypeError, ValueError): raise_parse_error(node, 'Requires sequence of doubles') - return input_data + return values def gds_format_boolean(self, input_data, input_name=''): return ('%s' % input_data).lower() - def gds_validate_boolean(self, input_data, node, input_name=''): + def gds_validate_boolean(self, input_data, node=None, input_name=''): return input_data def gds_format_boolean_list(self, input_data, input_name=''): - return '%s' % input_data - def gds_validate_boolean_list(self, input_data, node, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): values = input_data.split() for value in values: if value not in ('true', '1', 'false', '0', ): @@ -153,8 +150,8 @@ except ImportError, exp: node, 'Requires sequence of booleans ' '("true", "1", "false", "0")') - return input_data - def gds_validate_datetime(self, input_data, node, input_name=''): + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): return input_data def gds_format_datetime(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -208,7 +205,10 @@ except ImportError, exp: tz = GeneratedsSuper._FixedOffsetTZ( tzoff, results.group(0)) input_data = input_data[:-6] - if len(input_data.split('.')) > 1: + 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: @@ -216,7 +216,7 @@ except ImportError, exp: input_data, '%Y-%m-%dT%H:%M:%S') dt = dt.replace(tzinfo=tz) return dt - def gds_validate_date(self, input_data, node, input_name=''): + def gds_validate_date(self, input_data, node=None, input_name=''): return input_data def gds_format_date(self, input_data, input_name=''): _svalue = '%04d-%02d-%02d' % ( @@ -239,7 +239,8 @@ except ImportError, exp: _svalue += '+' hours = total_seconds // 3600 minutes = (total_seconds - (hours * 3600)) // 60 - _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) except AttributeError: pass return _svalue @@ -262,7 +263,7 @@ except ImportError, exp: dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') dt = dt.replace(tzinfo=tz) return dt.date() - def gds_validate_time(self, input_data, node, input_name=''): + def gds_validate_time(self, input_data, node=None, input_name=''): return input_data def gds_format_time(self, input_data, input_name=''): if input_data.microsecond == 0: @@ -294,6 +295,21 @@ except ImportError, exp: minutes = (total_seconds - (hours * 3600)) // 60 _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 @classmethod def gds_parse_time(cls, input_data): tz = None @@ -349,6 +365,29 @@ except ImportError, exp: @classmethod def gds_reverse_node_mapping(cls, mapping): return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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 # @@ -374,6 +413,11 @@ ExternalEncoding = 'ascii' Tag_pattern_ = re_.compile(r'({.*})?(.*)') String_cleanup_pat_ = re_.compile(r"[\n\r\s]+") Namespace_extract_pat_ = re_.compile(r'{(.*)}(.*)') +CDATA_pattern_ = re_.compile(r"<!\[CDATA\[.*?\]\]>", re_.DOTALL) + +# Change this to redirect the generated superclass module to use a +# specific subclass module. +CurrentSubclassModule_ = None # # Support/utility functions. @@ -387,19 +431,32 @@ def showIndent(outfile, level, pretty_print=True): def quote_xml(inStr): + "Escape markup chars, but do not modify CDATA sections." if not inStr: return '' - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) - s1 = s1.replace('&', '&') + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) + s2 = '' + pos = 0 + matchobjects = CDATA_pattern_.finditer(s1) + for mo in matchobjects: + s3 = s1[pos:mo.start()] + s2 += quote_xml_aux(s3) + s2 += s1[mo.start():mo.end()] + pos = mo.end() + s3 = s1[pos:] + s2 += quote_xml_aux(s3) + return s2 + + +def quote_xml_aux(inStr): + s1 = inStr.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or - '%s' % inStr) + s1 = (isinstance(inStr, BaseStrType_) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') s1 = s1.replace('>', '>') @@ -459,11 +516,7 @@ class GDSParseError(Exception): def raise_parse_error(node, msg): - if XMLParser_import_library == XMLParser_import_lxml: - msg = '%s (element %s/line %d)' % ( - msg, node.tag, node.sourceline, ) - else: - msg = '%s (element %s)' % (msg, node.tag, ) + msg = '%s (element %s/line %d)' % (msg, node.tag, node.sourceline, ) raise GDSParseError(msg) @@ -504,7 +557,8 @@ class MixedContainer: elif self.category == MixedContainer.CategorySimple: self.exportSimple(outfile, level, name) else: # category == MixedContainer.CategoryComplex - self.value.export(outfile, level, namespace, name, pretty_print) + 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>' % ( @@ -620,6 +674,7 @@ class peopleType(GeneratedsSuper): subclass = None superclass = None def __init__(self, comments=None, person=None, specialperson=None, programmer=None, python_programmer=None, java_programmer=None): + self.original_tagname_ = None if comments is None: self.comments = [] else: @@ -645,6 +700,11 @@ class peopleType(GeneratedsSuper): else: self.java_programmer = java_programmer def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, peopleType) + if subclass is not None: + return subclass(*args_, **kwargs_) if peopleType.subclass: return peopleType.subclass(*args_, **kwargs_) else: @@ -653,27 +713,33 @@ class peopleType(GeneratedsSuper): def get_comments(self): return self.comments def set_comments(self, comments): self.comments = comments def add_comments(self, value): self.comments.append(value) - def insert_comments(self, index, value): self.comments[index] = value + def insert_comments_at(self, index, value): self.comments.insert(index, value) + def replace_comments_at(self, index, value): self.comments[index] = value def get_person(self): return self.person def set_person(self, person): self.person = person def add_person(self, value): self.person.append(value) - def insert_person(self, index, value): self.person[index] = value + def insert_person_at(self, index, value): self.person.insert(index, value) + def replace_person_at(self, index, value): self.person[index] = value def get_specialperson(self): return self.specialperson def set_specialperson(self, specialperson): self.specialperson = specialperson def add_specialperson(self, value): self.specialperson.append(value) - def insert_specialperson(self, index, value): self.specialperson[index] = value + def insert_specialperson_at(self, index, value): self.specialperson.insert(index, value) + def replace_specialperson_at(self, index, value): self.specialperson[index] = value def get_programmer(self): return self.programmer def set_programmer(self, programmer): self.programmer = programmer def add_programmer(self, value): self.programmer.append(value) - def insert_programmer(self, index, value): self.programmer[index] = value + def insert_programmer_at(self, index, value): self.programmer.insert(index, value) + def replace_programmer_at(self, index, value): self.programmer[index] = value def get_python_programmer(self): return self.python_programmer def set_python_programmer(self, python_programmer): self.python_programmer = python_programmer def add_python_programmer(self, value): self.python_programmer.append(value) - def insert_python_programmer(self, index, value): self.python_programmer[index] = value + def insert_python_programmer_at(self, index, value): self.python_programmer.insert(index, value) + def replace_python_programmer_at(self, index, value): self.python_programmer[index] = value def get_java_programmer(self): return self.java_programmer def set_java_programmer(self, java_programmer): self.java_programmer = java_programmer def add_java_programmer(self, value): self.java_programmer.append(value) - def insert_java_programmer(self, index, value): self.java_programmer[index] = value + def insert_java_programmer_at(self, index, value): self.java_programmer.insert(index, value) + def replace_java_programmer_at(self, index, value): self.java_programmer[index] = value def hasContent_(self): if ( self.comments or @@ -712,6 +778,7 @@ class peopleType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -719,28 +786,34 @@ class peopleType(GeneratedsSuper): obj_ = commentsType.factory() obj_.build(child_) self.comments.append(obj_) + obj_.original_tagname_ = 'comments' elif nodeName_ == 'person': class_obj_ = self.get_class_obj_(child_, personType) obj_ = class_obj_.factory() obj_.build(child_) self.person.append(obj_) + obj_.original_tagname_ = 'person' elif nodeName_ == 'specialperson': obj_ = specialperson.factory() obj_.build(child_) self.specialperson.append(obj_) + obj_.original_tagname_ = 'specialperson' elif nodeName_ == 'programmer': class_obj_ = self.get_class_obj_(child_, programmerType) obj_ = class_obj_.factory() obj_.build(child_) self.programmer.append(obj_) + obj_.original_tagname_ = 'programmer' elif nodeName_ == 'python-programmer': obj_ = python_programmerType.factory() obj_.build(child_) self.python_programmer.append(obj_) + obj_.original_tagname_ = 'python-programmer' elif nodeName_ == 'java-programmer': obj_ = java_programmerType.factory() obj_.build(child_) self.java_programmer.append(obj_) + obj_.original_tagname_ = 'java-programmer' # end class peopleType @@ -753,6 +826,7 @@ class commentsType(GeneratedsSuper): subclass = None superclass = None def __init__(self, emp=None, bold=None, valueOf_=None, mixedclass_=None, content_=None): + self.original_tagname_ = None if emp is None: self.emp = [] else: @@ -772,6 +846,11 @@ class commentsType(GeneratedsSuper): self.content_ = content_ self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, commentsType) + if subclass is not None: + return subclass(*args_, **kwargs_) if commentsType.subclass: return commentsType.subclass(*args_, **kwargs_) else: @@ -780,18 +859,20 @@ class commentsType(GeneratedsSuper): def get_emp(self): return self.emp def set_emp(self, emp): self.emp = emp def add_emp(self, value): self.emp.append(value) - def insert_emp(self, index, value): self.emp[index] = value + def insert_emp_at(self, index, value): self.emp.insert(index, value) + def replace_emp_at(self, index, value): self.emp[index] = value def get_bold(self): return self.bold def set_bold(self, bold): self.bold = bold def add_bold(self, value): self.bold.append(value) - def insert_bold(self, index, value): self.bold[index] = value + def insert_bold_at(self, index, value): self.bold.insert(index, value) + def replace_bold_at(self, index, value): self.bold[index] = value def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def hasContent_(self): if ( self.emp or self.bold or - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -817,6 +898,7 @@ class commentsType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -839,11 +921,11 @@ class commentsType(GeneratedsSuper): class personType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('vegetable', 'xs:string', 0), - MemberSpec_('fruit', 'xs:string', 0), - MemberSpec_('ratio', 'xs:float', 0), - MemberSpec_('id', 'xs:integer', 0), MemberSpec_('value', 'xs:string', 0), + MemberSpec_('id', 'xs:integer', 0), + MemberSpec_('ratio', 'xs:float', 0), + MemberSpec_('fruit', 'xs:string', 0), + MemberSpec_('vegetable', 'xs:string', 0), MemberSpec_('name', 'xs:string', 0), MemberSpec_('interest', 'xs:string', 1), MemberSpec_('category', 'xs:integer', 0), @@ -855,12 +937,13 @@ class personType(GeneratedsSuper): ] subclass = None superclass = None - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None): - self.vegetable = _cast(None, vegetable) - self.fruit = _cast(None, fruit) - self.ratio = _cast(float, ratio) - self.id = _cast(int, id) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, extensiontype_=None): + self.original_tagname_ = None self.value = _cast(None, value) + self.id = _cast(int, id) + self.ratio = _cast(float, ratio) + self.fruit = _cast(None, fruit) + self.vegetable = _cast(None, vegetable) self.name = name if interest is None: self.interest = [] @@ -878,8 +961,14 @@ class personType(GeneratedsSuper): self.promoter = promoter self.description = description self.range_ = range_ + self.validate_RangeType(self.range_) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, personType) + if subclass is not None: + return subclass(*args_, **kwargs_) if personType.subclass: return personType.subclass(*args_, **kwargs_) else: @@ -890,7 +979,8 @@ class personType(GeneratedsSuper): def get_interest(self): return self.interest def set_interest(self, interest): self.interest = interest def add_interest(self, value): self.interest.append(value) - def insert_interest(self, index, value): self.interest[index] = value + def insert_interest_at(self, index, value): self.interest.insert(index, value) + def replace_interest_at(self, index, value): self.interest[index] = value def get_category(self): return self.category def set_category(self, category): self.category = category def get_hot_agent(self): return self.hot_agent @@ -898,30 +988,33 @@ class personType(GeneratedsSuper): def get_agent(self): return self.agent def set_agent(self, agent): self.agent = agent def add_agent(self, value): self.agent.append(value) - def insert_agent(self, index, value): self.agent[index] = value + def insert_agent_at(self, index, value): self.agent.insert(index, value) + def replace_agent_at(self, index, value): self.agent[index] = value def get_promoter(self): return self.promoter def set_promoter(self, promoter): self.promoter = promoter def add_promoter(self, value): self.promoter.append(value) - def insert_promoter(self, index, value): self.promoter[index] = value + def insert_promoter_at(self, index, value): self.promoter.insert(index, value) + def replace_promoter_at(self, index, value): self.promoter[index] = value def get_description(self): return self.description def set_description(self, description): self.description = description def get_range(self): return self.range_ def set_range(self, range_): self.range_ = range_ - def get_vegetable(self): return self.vegetable - def set_vegetable(self, vegetable): self.vegetable = vegetable - def get_fruit(self): return self.fruit - def set_fruit(self, fruit): self.fruit = fruit - def get_ratio(self): return self.ratio - def set_ratio(self, ratio): self.ratio = ratio - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_value(self): return self.value def set_value(self, value): self.value = value + def get_id(self): return self.id + def set_id(self, id): self.id = id + def get_ratio(self): return self.ratio + def set_ratio(self, ratio): self.ratio = ratio + def get_fruit(self): return self.fruit + def set_fruit(self, fruit): self.fruit = fruit + def get_vegetable(self): return self.vegetable + def set_vegetable(self, vegetable): self.vegetable = vegetable def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_RangeType(self, value): # Validate type RangeType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.name is not None or @@ -943,16 +1036,16 @@ class personType(GeneratedsSuper): element = etree_.SubElement(parent_element, '{}' + name_) if self.extensiontype_ is not None: element.set('{http://www.w3.org/2001/XMLSchema-instance}type', self.extensiontype_) - if self.vegetable is not None: - element.set('vegetable', self.gds_format_string(self.vegetable)) - if self.fruit is not None: - element.set('fruit', self.gds_format_string(self.fruit)) - if self.ratio is not None: - element.set('ratio', self.gds_format_float(self.ratio)) - if self.id is not None: - element.set('id', self.gds_format_integer(self.id)) if self.value is not None: element.set('value', self.gds_format_string(self.value)) + if self.id is not None: + element.set('id', self.gds_format_integer(self.id)) + if self.ratio is not None: + element.set('ratio', self.gds_format_float(self.ratio)) + if self.fruit is not None: + element.set('fruit', self.gds_format_string(self.fruit)) + if self.vegetable is not None: + element.set('vegetable', self.gds_format_string(self.vegetable)) if self.name is not None: name_ = self.name etree_.SubElement(element, '{}name').text = self.gds_format_string(name_) @@ -983,33 +1076,34 @@ class personType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('vegetable', node) - if value is not None and 'vegetable' not in already_processed: - already_processed.add('vegetable') - self.vegetable = value - value = find_attr_value_('fruit', node) - if value is not None and 'fruit' not in already_processed: - already_processed.add('fruit') - self.fruit = value - value = find_attr_value_('ratio', node) - if value is not None and 'ratio' not in already_processed: - already_processed.add('ratio') - try: - self.ratio = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('value', node) + if value is not None and 'value' not in already_processed: + already_processed.add('value') + self.value = value value = find_attr_value_('id', node) if value is not None and 'id' not in already_processed: already_processed.add('id') try: self.id = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('value', node) - if value is not None and 'value' not in already_processed: - already_processed.add('value') - self.value = value + value = find_attr_value_('ratio', node) + if value is not None and 'ratio' not in already_processed: + already_processed.add('ratio') + try: + self.ratio = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (ratio): %s' % exp) + value = find_attr_value_('fruit', node) + if value is not None and 'fruit' not in already_processed: + already_processed.add('fruit') + self.fruit = value + value = find_attr_value_('vegetable', node) + if value is not None and 'vegetable' not in already_processed: + already_processed.add('vegetable') + self.vegetable = value value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1027,7 +1121,7 @@ class personType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'category') self.category = ival_ @@ -1035,15 +1129,18 @@ class personType(GeneratedsSuper): obj_ = hot_agent.factory() obj_.build(child_) self.hot_agent = obj_ + obj_.original_tagname_ = 'hot.agent' elif nodeName_ == 'agent': class_obj_ = self.get_class_obj_(child_, agentType) obj_ = class_obj_.factory() obj_.build(child_) self.agent.append(obj_) + obj_.original_tagname_ = 'agent' elif nodeName_ == 'promoter': obj_ = boosterType.factory() obj_.build(child_) self.promoter.append(obj_) + obj_.original_tagname_ = 'promoter' elif nodeName_ == 'description': description_ = child_.text description_ = self.gds_validate_string(description_, node, 'description') @@ -1052,11 +1149,12 @@ class personType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'range') self.range_ = ival_ - self.validate_RangeType(self.range_) # validate type RangeType + # validate type RangeType + self.validate_RangeType(self.range_) # end class personType @@ -1065,10 +1163,15 @@ class specialperson(personType): ] subclass = None superclass = personType - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None): - super(specialperson, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, ) - pass + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None): + self.original_tagname_ = None + super(specialperson, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, ) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, specialperson) + if subclass is not None: + return subclass(*args_, **kwargs_) if specialperson.subclass: return specialperson.subclass(*args_, **kwargs_) else: @@ -1092,6 +1195,7 @@ class specialperson(personType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(specialperson, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1104,10 +1208,10 @@ class programmerType(personType): member_data_items_ = [ MemberSpec_('language', 'xs:string', 0), MemberSpec_('area', 'xs:string', 0), - MemberSpec_('attrnegint', 'xs:negativeInteger', 0), MemberSpec_('attrposint', 'xs:positiveInteger', 0), - MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('attrnonposint', 'xs:nonPositiveInteger', 0), + MemberSpec_('attrnegint', 'xs:negativeInteger', 0), + MemberSpec_('attrnonnegint', 'xs:nonNegativeInteger', 0), MemberSpec_('email', 'xs:string', 0), MemberSpec_('elposint', 'xs:positiveInteger', 0), MemberSpec_('elnonposint', 'xs:nonPositiveInteger', 0), @@ -1124,30 +1228,31 @@ class programmerType(personType): ] subclass = None superclass = personType - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): - super(programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, ) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, extensiontype_=None): + self.original_tagname_ = None + super(programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, extensiontype_, ) self.language = _cast(None, language) self.area = _cast(None, area) - self.attrnegint = _cast(int, attrnegint) self.attrposint = _cast(int, attrposint) - self.attrnonnegint = _cast(int, attrnonnegint) self.attrnonposint = _cast(int, attrnonposint) + self.attrnegint = _cast(int, attrnegint) + self.attrnonnegint = _cast(int, attrnonnegint) self.email = email self.elposint = elposint self.elnonposint = elnonposint self.elnegint = elnegint self.elnonnegint = elnonnegint - if isinstance(eldate, basestring): + if isinstance(eldate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldate, '%Y-%m-%d').date() else: initvalue_ = eldate self.eldate = initvalue_ - if isinstance(eldatetime, basestring): + if isinstance(eldatetime, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldatetime, '%Y-%m-%dT%H:%M:%S') else: initvalue_ = eldatetime self.eldatetime = initvalue_ - if isinstance(eldatetime1, basestring): + if isinstance(eldatetime1, BaseStrType_): initvalue_ = datetime_.datetime.strptime(eldatetime1, '%Y-%m-%dT%H:%M:%S') else: initvalue_ = eldatetime1 @@ -1157,8 +1262,14 @@ class programmerType(personType): self.ellong = ellong self.elparam = elparam self.elarraytypes = elarraytypes + self.validate_ArrayTypes(self.elarraytypes) self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, programmerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if programmerType.subclass: return programmerType.subclass(*args_, **kwargs_) else: @@ -1194,19 +1305,28 @@ class programmerType(personType): def set_language(self, language): self.language = language def get_area(self): return self.area def set_area(self, area): self.area = area - def get_attrnegint(self): return self.attrnegint - def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint def get_attrposint(self): return self.attrposint def set_attrposint(self, attrposint): self.attrposint = attrposint - def get_attrnonnegint(self): return self.attrnonnegint - def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_attrnonposint(self): return self.attrnonposint def set_attrnonposint(self, attrnonposint): self.attrnonposint = attrnonposint + def get_attrnegint(self): return self.attrnegint + def set_attrnegint(self, attrnegint): self.attrnegint = attrnegint + def get_attrnonnegint(self): return self.attrnonnegint + def set_attrnonnegint(self, attrnonnegint): self.attrnonnegint = attrnonnegint def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def validate_ArrayTypes(self, value): # Validate type ArrayTypes, a restriction on xs:NMTOKEN. - pass + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on ArrayTypes' % {"value" : value.encode("utf-8")} ) def hasContent_(self): if ( self.email is not None or @@ -1235,14 +1355,14 @@ class programmerType(personType): element.set('language', self.gds_format_string(self.language)) if self.area is not None: element.set('area', self.gds_format_string(self.area)) - if self.attrnegint is not None: - element.set('attrnegint', self.gds_format_integer(self.attrnegint)) if self.attrposint is not None: element.set('attrposint', self.gds_format_integer(self.attrposint)) - if self.attrnonnegint is not None: - element.set('attrnonnegint', self.gds_format_integer(self.attrnonnegint)) if self.attrnonposint is not None: element.set('attrnonposint', self.gds_format_integer(self.attrnonposint)) + if self.attrnegint is not None: + element.set('attrnegint', self.gds_format_integer(self.attrnegint)) + if self.attrnonnegint is not None: + element.set('attrnonnegint', self.gds_format_integer(self.attrnonnegint)) if self.email is not None: email_ = self.email etree_.SubElement(element, '{}email').text = self.gds_format_string(email_) @@ -1291,6 +1411,7 @@ class programmerType(personType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('language', node) if value is not None and 'language' not in already_processed: @@ -1300,42 +1421,42 @@ class programmerType(personType): if value is not None and 'area' not in already_processed: already_processed.add('area') self.area = value - value = find_attr_value_('attrnegint', node) - if value is not None and 'attrnegint' not in already_processed: - already_processed.add('attrnegint') - try: - self.attrnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnegint >= 0: - raise_parse_error(node, 'Invalid NegativeInteger') value = find_attr_value_('attrposint', node) if value is not None and 'attrposint' not in already_processed: already_processed.add('attrposint') try: self.attrposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrposint <= 0: raise_parse_error(node, 'Invalid PositiveInteger') - value = find_attr_value_('attrnonnegint', node) - if value is not None and 'attrnonnegint' not in already_processed: - already_processed.add('attrnonnegint') - try: - self.attrnonnegint = int(value) - except ValueError, exp: - raise_parse_error(node, 'Bad integer attribute: %s' % exp) - if self.attrnonnegint < 0: - raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('attrnonposint', node) if value is not None and 'attrnonposint' not in already_processed: already_processed.add('attrnonposint') try: self.attrnonposint = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) if self.attrnonposint > 0: raise_parse_error(node, 'Invalid NonPositiveInteger') + value = find_attr_value_('attrnegint', node) + if value is not None and 'attrnegint' not in already_processed: + already_processed.add('attrnegint') + try: + self.attrnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnegint >= 0: + raise_parse_error(node, 'Invalid NegativeInteger') + value = find_attr_value_('attrnonnegint', node) + if value is not None and 'attrnonnegint' not in already_processed: + already_processed.add('attrnonnegint') + try: + self.attrnonnegint = int(value) + except ValueError as exp: + raise_parse_error(node, 'Bad integer attribute: %s' % exp) + if self.attrnonnegint < 0: + raise_parse_error(node, 'Invalid NonNegativeInteger') value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: already_processed.add('xsi:type') @@ -1350,7 +1471,7 @@ class programmerType(personType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ <= 0: raise_parse_error(child_, 'requires positiveInteger') @@ -1360,7 +1481,7 @@ class programmerType(personType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ > 0: raise_parse_error(child_, 'requires nonPositiveInteger') @@ -1370,7 +1491,7 @@ class programmerType(personType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ >= 0: raise_parse_error(child_, 'requires negativeInteger') @@ -1380,7 +1501,7 @@ class programmerType(personType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) if ival_ < 0: raise_parse_error(child_, 'requires nonNegativeInteger') @@ -1400,14 +1521,17 @@ class programmerType(personType): self.eldatetime1 = dval_ elif nodeName_ == 'eltoken': eltoken_ = child_.text - eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + if eltoken_: + eltoken_ = re_.sub(String_cleanup_pat_, " ", eltoken_).strip() + else: + eltoken_ = "" eltoken_ = self.gds_validate_string(eltoken_, node, 'eltoken') self.eltoken = eltoken_ elif nodeName_ == 'elshort': sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'elshort') self.elshort = ival_ @@ -1415,7 +1539,7 @@ class programmerType(personType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'ellong') self.ellong = ival_ @@ -1423,61 +1547,70 @@ class programmerType(personType): obj_ = paramType.factory() obj_.build(child_) self.elparam = obj_ + obj_.original_tagname_ = 'elparam' elif nodeName_ == 'elarraytypes': elarraytypes_ = child_.text elarraytypes_ = self.gds_validate_string(elarraytypes_, node, 'elarraytypes') self.elarraytypes = elarraytypes_ - self.validate_ArrayTypes(self.elarraytypes) # validate type ArrayTypes + # validate type ArrayTypes + self.validate_ArrayTypes(self.elarraytypes) super(programmerType, self).buildChildren(child_, node, nodeName_, True) # end class programmerType class paramType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('semantic', 'xs:token', 0), + MemberSpec_('id', 'xs:string', 0), MemberSpec_('name', 'xs:NCName', 0), - MemberSpec_('flow', 'FlowType', 0), MemberSpec_('sid', 'xs:NCName', 0), + MemberSpec_('flow', 'FlowType', 0), + MemberSpec_('semantic', 'xs:token', 0), MemberSpec_('type', 'xs:NMTOKEN', 0), - MemberSpec_('id', 'xs:string', 0), MemberSpec_('valueOf_', 'xs:string', 0), ] subclass = None superclass = None - def __init__(self, semantic=None, name=None, flow=None, sid=None, type_=None, id=None, valueOf_=None): - self.semantic = _cast(None, semantic) + def __init__(self, id=None, name=None, sid=None, flow=None, semantic=None, type_=None, valueOf_=None): + self.original_tagname_ = None + self.id = _cast(None, id) self.name = _cast(None, name) - self.flow = _cast(None, flow) self.sid = _cast(None, sid) + self.flow = _cast(None, flow) + self.semantic = _cast(None, semantic) self.type_ = _cast(None, type_) - self.id = _cast(None, id) self.valueOf_ = valueOf_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, paramType) + if subclass is not None: + return subclass(*args_, **kwargs_) if paramType.subclass: return paramType.subclass(*args_, **kwargs_) else: return paramType(*args_, **kwargs_) factory = staticmethod(factory) - def get_semantic(self): return self.semantic - def set_semantic(self, semantic): self.semantic = semantic + def get_id(self): return self.id + def set_id(self, id): self.id = id def get_name(self): return self.name def set_name(self, name): self.name = name - def get_flow(self): return self.flow - def set_flow(self, flow): self.flow = flow def get_sid(self): return self.sid def set_sid(self, sid): self.sid = sid + def get_flow(self): return self.flow + def set_flow(self, flow): self.flow = flow + def get_semantic(self): return self.semantic + def set_semantic(self, semantic): self.semantic = semantic def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ - def get_id(self): return self.id - def set_id(self, id): self.id = id def get_valueOf_(self): return self.valueOf_ def set_valueOf_(self, valueOf_): self.valueOf_ = valueOf_ def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( - self.valueOf_ + 1 if type(self.valueOf_) in [int,float] else self.valueOf_ ): return True else: @@ -1487,18 +1620,20 @@ class paramType(GeneratedsSuper): element = etree_.Element('{}' + name_) else: element = etree_.SubElement(parent_element, '{}' + name_) - if self.semantic is not None: - element.set('semantic', self.gds_format_string(self.semantic)) + if self.id is not None: + element.set('id', self.gds_format_string(self.id)) if self.name is not None: element.set('name', self.name) - if self.flow is not None: - element.set('flow', self.flow) if self.sid is not None: element.set('sid', self.sid) + if self.flow is not None: + element.set('flow', self.flow) + if self.semantic is not None: + element.set('semantic', self.gds_format_string(self.semantic)) if self.type_ is not None: element.set('type', self.gds_format_string(self.type_)) - if self.id is not None: - element.set('id', self.gds_format_string(self.id)) + if self.hasContent_(): + element.text = self.gds_format_string(self.get_valueOf_()) if mapping_ is not None: mapping_[self] = element return element @@ -1509,36 +1644,37 @@ class paramType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('semantic', node) - if value is not None and 'semantic' not in already_processed: - already_processed.add('semantic') - self.semantic = value - self.semantic = ' '.join(self.semantic.split()) + value = find_attr_value_('id', node) + if value is not None and 'id' not in already_processed: + already_processed.add('id') + self.id = value value = find_attr_value_('name', node) if value is not None and 'name' not in already_processed: already_processed.add('name') self.name = value + value = find_attr_value_('sid', node) + if value is not None and 'sid' not in already_processed: + already_processed.add('sid') + self.sid = value value = find_attr_value_('flow', node) if value is not None and 'flow' not in already_processed: already_processed.add('flow') try: self.flow = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) self.validate_FlowType(self.flow) # validate type FlowType - value = find_attr_value_('sid', node) - if value is not None and 'sid' not in already_processed: - already_processed.add('sid') - self.sid = value + value = find_attr_value_('semantic', node) + if value is not None and 'semantic' not in already_processed: + already_processed.add('semantic') + self.semantic = value + self.semantic = ' '.join(self.semantic.split()) value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') self.type_ = value - value = find_attr_value_('id', node) - if value is not None and 'id' not in already_processed: - already_processed.add('id') - self.id = value def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass # end class paramType @@ -1546,8 +1682,8 @@ class paramType(GeneratedsSuper): class python_programmerType(programmerType): member_data_items_ = [ - MemberSpec_('drcs_attr', 'xs:string', 0), MemberSpec_('nick-name', 'xs:string', 0), + MemberSpec_('drcs_attr', 'xs:string', 0), MemberSpec_('gui_developer', 'xs:boolean', 0), MemberSpec_('favorite_editor', 'xs:string', 0), MemberSpec_('flowvalue', ['FlowType', 'xs:integer'], 0), @@ -1555,15 +1691,22 @@ class python_programmerType(programmerType): ] subclass = None superclass = programmerType - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, drcs_attr=None, nick_name=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None): - super(python_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.drcs_attr = _cast(None, drcs_attr) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, drcs_attr=None, gui_developer=None, favorite_editor=None, flowvalue=None, drcs=None): + self.original_tagname_ = None + super(python_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) + self.drcs_attr = _cast(None, drcs_attr) self.gui_developer = _cast(bool, gui_developer) self.favorite_editor = favorite_editor self.flowvalue = flowvalue + self.validate_FlowType(self.flowvalue) self.drcs = drcs def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, python_programmerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if python_programmerType.subclass: return python_programmerType.subclass(*args_, **kwargs_) else: @@ -1575,15 +1718,16 @@ class python_programmerType(programmerType): def set_flowvalue(self, flowvalue): self.flowvalue = flowvalue def get_drcs(self): return self.drcs def set_drcs(self, drcs): self.drcs = drcs - def get_drcs_attr(self): return self.drcs_attr - def set_drcs_attr(self, drcs_attr): self.drcs_attr = drcs_attr def get_nick_name(self): return self.nick_name def set_nick_name(self, nick_name): self.nick_name = nick_name + def get_drcs_attr(self): return self.drcs_attr + def set_drcs_attr(self, drcs_attr): self.drcs_attr = drcs_attr def get_gui_developer(self): return self.gui_developer def set_gui_developer(self, gui_developer): self.gui_developer = gui_developer def validate_FlowType(self, value): # Validate type FlowType, a restriction on xs:integer. - pass + if value is not None and Validate_simpletypes_: + pass def hasContent_(self): if ( self.favorite_editor is not None or @@ -1596,10 +1740,10 @@ class python_programmerType(programmerType): return False def to_etree(self, parent_element=None, name_='python-programmerType', mapping_=None): element = super(python_programmerType, self).to_etree(parent_element, name_, mapping_) - if self.drcs_attr is not None: - element.set('drcs_attr', self.gds_format_string(self.drcs_attr)) if self.nick_name is not None: element.set('nick-name', self.gds_format_string(self.nick_name)) + if self.drcs_attr is not None: + element.set('drcs_attr', self.gds_format_string(self.drcs_attr)) if self.gui_developer is not None: element.set('gui_developer', self.gds_format_boolean(self.gui_developer)) if self.favorite_editor is not None: @@ -1620,15 +1764,16 @@ class python_programmerType(programmerType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('drcs', node) - if value is not None and 'drcs_attr' not in already_processed: - already_processed.add('drcs_attr') - self.drcs_attr = value value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value + value = find_attr_value_('drcs', node) + if value is not None and 'drcs_attr' not in already_processed: + already_processed.add('drcs_attr') + self.drcs_attr = value value = find_attr_value_('gui_developer', node) if value is not None and 'gui_developer' not in already_processed: already_processed.add('gui_developer') @@ -1648,11 +1793,12 @@ class python_programmerType(programmerType): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'flowvalue') self.flowvalue = ival_ - self.validate_FlowType(self.flowvalue) # validate type FlowType + # validate type FlowType + self.validate_FlowType(self.flowvalue) elif nodeName_ == 'drcs': drcs_ = child_.text drcs_ = self.gds_validate_string(drcs_, node, 'drcs') @@ -1663,8 +1809,8 @@ class python_programmerType(programmerType): class java_programmerType(programmerType): member_data_items_ = [ - MemberSpec_('status', 'xs:string', 0), MemberSpec_('nick-name', 'xs:string', 0), + MemberSpec_('status', 'xs:string', 0), MemberSpec_('favorite_editor', 'xs:string', 0), MemberSpec_('datetime1', 'xs:gYear', 0), MemberSpec_('datetime2', 'xs:gYearMonth', 0), @@ -1674,10 +1820,11 @@ class java_programmerType(programmerType): ] subclass = None superclass = programmerType - def __init__(self, vegetable=None, fruit=None, ratio=None, id=None, value=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrnegint=None, attrposint=None, attrnonnegint=None, attrnonposint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, status=None, nick_name=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None): - super(java_programmerType, self).__init__(vegetable, fruit, ratio, id, value, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrnegint, attrposint, attrnonnegint, attrnonposint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, ) - self.status = _cast(None, status) + def __init__(self, value=None, id=None, ratio=None, fruit=None, vegetable=None, name=None, interest=None, category=None, hot_agent=None, agent=None, promoter=None, description=None, range_=None, language=None, area=None, attrposint=None, attrnonposint=None, attrnegint=None, attrnonnegint=None, email=None, elposint=None, elnonposint=None, elnegint=None, elnonnegint=None, eldate=None, eldatetime=None, eldatetime1=None, eltoken=None, elshort=None, ellong=None, elparam=None, elarraytypes=None, nick_name=None, status=None, favorite_editor=None, datetime1=None, datetime2=None, datetime3=None, datetime4=None, datetime5=None): + self.original_tagname_ = None + super(java_programmerType, self).__init__(value, id, ratio, fruit, vegetable, name, interest, category, hot_agent, agent, promoter, description, range_, language, area, attrposint, attrnonposint, attrnegint, attrnonnegint, email, elposint, elnonposint, elnegint, elnonnegint, eldate, eldatetime, eldatetime1, eltoken, elshort, ellong, elparam, elarraytypes, ) self.nick_name = _cast(None, nick_name) + self.status = _cast(None, status) self.favorite_editor = favorite_editor self.datetime1 = datetime1 self.datetime2 = datetime2 @@ -1685,6 +1832,11 @@ class java_programmerType(programmerType): self.datetime4 = datetime4 self.datetime5 = datetime5 def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, java_programmerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if java_programmerType.subclass: return java_programmerType.subclass(*args_, **kwargs_) else: @@ -1702,10 +1854,10 @@ class java_programmerType(programmerType): def set_datetime4(self, datetime4): self.datetime4 = datetime4 def get_datetime5(self): return self.datetime5 def set_datetime5(self, datetime5): self.datetime5 = datetime5 - def get_status(self): return self.status - def set_status(self, status): self.status = status def get_nick_name(self): return self.nick_name def set_nick_name(self, nick_name): self.nick_name = nick_name + def get_status(self): return self.status + def set_status(self, status): self.status = status def hasContent_(self): if ( self.favorite_editor is not None or @@ -1721,10 +1873,10 @@ class java_programmerType(programmerType): return False def to_etree(self, parent_element=None, name_='java-programmerType', mapping_=None): element = super(java_programmerType, self).to_etree(parent_element, name_, mapping_) - if self.status is not None: - element.set('status', self.gds_format_string(self.status)) if self.nick_name is not None: element.set('nick-name', self.gds_format_string(self.nick_name)) + if self.status is not None: + element.set('status', self.gds_format_string(self.status)) if self.favorite_editor is not None: favorite_editor_ = self.favorite_editor etree_.SubElement(element, '{}favorite-editor').text = self.gds_format_string(favorite_editor_) @@ -1752,15 +1904,16 @@ class java_programmerType(programmerType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('status', node) - if value is not None and 'status' not in already_processed: - already_processed.add('status') - self.status = value value = find_attr_value_('nick-name', node) if value is not None and 'nick-name' not in already_processed: already_processed.add('nick-name') self.nick_name = value + value = find_attr_value_('status', node) + if value is not None and 'status' not in already_processed: + already_processed.add('status') + self.status = value super(java_programmerType, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): if nodeName_ == 'favorite-editor': @@ -1802,6 +1955,7 @@ class agentType(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None, extensiontype_=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority @@ -1812,6 +1966,11 @@ class agentType(GeneratedsSuper): self.vehicle = vehicle self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, agentType) + if subclass is not None: + return subclass(*args_, **kwargs_) if agentType.subclass: return agentType.subclass(*args_, **kwargs_) else: @@ -1828,7 +1987,8 @@ class agentType(GeneratedsSuper): def get_vehicle(self): return self.vehicle def set_vehicle(self, vehicle): self.vehicle = vehicle def add_vehicle(self, value): self.vehicle.append(value) - def insert_vehicle(self, index, value): self.vehicle[index] = value + def insert_vehicle_at(self, index, value): self.vehicle.insert(index, value) + def replace_vehicle_at(self, index, value): self.vehicle[index] = value def get_extensiontype_(self): return self.extensiontype_ def set_extensiontype_(self, extensiontype_): self.extensiontype_ = extensiontype_ def hasContent_(self): @@ -1872,6 +2032,7 @@ class agentType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -1890,7 +2051,7 @@ class agentType(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -1898,11 +2059,13 @@ class agentType(GeneratedsSuper): obj_ = infoType.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' elif nodeName_ == 'vehicle': class_obj_ = self.get_class_obj_(child_, vehicleType) obj_ = class_obj_.factory() obj_.build(child_) self.vehicle.append(obj_) + obj_.original_tagname_ = 'vehicle' # end class agentType @@ -1918,12 +2081,18 @@ class special_agentType(agentType): subclass = None superclass = agentType def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None): + self.original_tagname_ = None super(special_agentType, self).__init__(firstname, lastname, priority, info, vehicle, ) self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, special_agentType) + if subclass is not None: + return subclass(*args_, **kwargs_) if special_agentType.subclass: return special_agentType.subclass(*args_, **kwargs_) else: @@ -1971,6 +2140,7 @@ class special_agentType(agentType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(special_agentType, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -1986,7 +2156,7 @@ class special_agentType(agentType): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -1994,6 +2164,7 @@ class special_agentType(agentType): obj_ = infoType.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' super(special_agentType, self).buildChildren(child_, node, nodeName_, True) # end class special_agentType @@ -2010,12 +2181,18 @@ class weird_agentType(agentType): subclass = None superclass = agentType def __init__(self, firstname=None, lastname=None, priority=None, info=None, vehicle=None): + self.original_tagname_ = None super(weird_agentType, self).__init__(firstname, lastname, priority, info, vehicle, ) self.firstname = firstname self.lastname = lastname self.priority = priority self.info = info def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, weird_agentType) + if subclass is not None: + return subclass(*args_, **kwargs_) if weird_agentType.subclass: return weird_agentType.subclass(*args_, **kwargs_) else: @@ -2063,6 +2240,7 @@ class weird_agentType(agentType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(weird_agentType, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2078,7 +2256,7 @@ class weird_agentType(agentType): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -2086,6 +2264,7 @@ class weird_agentType(agentType): obj_ = infoType.factory() obj_.build(child_) self.info = obj_ + obj_.original_tagname_ = 'info' super(weird_agentType, self).buildChildren(child_, node, nodeName_, True) # end class weird_agentType @@ -2104,6 +2283,7 @@ class boosterType(GeneratedsSuper): subclass = None superclass = None def __init__(self, member_id=None, firstname=None, lastname=None, other_name=None, class_=None, other_value=None, type_=None, client_handler=None): + self.original_tagname_ = None self.member_id = _cast(None, member_id) self.firstname = firstname self.lastname = lastname @@ -2122,6 +2302,11 @@ class boosterType(GeneratedsSuper): else: self.client_handler = client_handler def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, boosterType) + if subclass is not None: + return subclass(*args_, **kwargs_) if boosterType.subclass: return boosterType.subclass(*args_, **kwargs_) else: @@ -2138,15 +2323,18 @@ class boosterType(GeneratedsSuper): def get_other_value(self): return self.other_value def set_other_value(self, other_value): self.other_value = other_value def add_other_value(self, value): self.other_value.append(value) - def insert_other_value(self, index, value): self.other_value[index] = value + def insert_other_value_at(self, index, value): self.other_value.insert(index, value) + def replace_other_value_at(self, index, value): self.other_value[index] = value def get_type(self): return self.type_ def set_type(self, type_): self.type_ = type_ def add_type(self, value): self.type_.append(value) - def insert_type(self, index, value): self.type_[index] = value + def insert_type_at(self, index, value): self.type_.insert(index, value) + def replace_type_at(self, index, value): self.type_[index] = value def get_client_handler(self): return self.client_handler def set_client_handler(self, client_handler): self.client_handler = client_handler def add_client_handler(self, value): self.client_handler.append(value) - def insert_client_handler(self, index, value): self.client_handler[index] = value + def insert_client_handler_at(self, index, value): self.client_handler.insert(index, value) + def replace_client_handler_at(self, index, value): self.client_handler[index] = value def get_member_id(self): return self.member_id def set_member_id(self, member_id): self.member_id = member_id def hasContent_(self): @@ -2196,6 +2384,7 @@ class boosterType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('member-id', node) if value is not None and 'member-id' not in already_processed: @@ -2214,7 +2403,7 @@ class boosterType(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_name') self.other_name = fval_ @@ -2222,7 +2411,7 @@ class boosterType(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'class') self.class_ = fval_ @@ -2230,7 +2419,7 @@ class boosterType(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'other_value') self.other_value.append(fval_) @@ -2238,7 +2427,7 @@ class boosterType(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'type') self.type_.append(fval_) @@ -2246,34 +2435,40 @@ class boosterType(GeneratedsSuper): obj_ = client_handlerType.factory() obj_.build(child_) self.client_handler.append(obj_) + obj_.original_tagname_ = 'client-handler' # end class boosterType class infoType(GeneratedsSuper): member_data_items_ = [ - MemberSpec_('rating', 'xs:float', 0), - MemberSpec_('type', 'xs:integer', 0), MemberSpec_('name', 'xs:string', 0), + MemberSpec_('type', 'xs:integer', 0), + MemberSpec_('rating', 'xs:float', 0), ] subclass = None superclass = None - def __init__(self, rating=None, type_=None, name=None): - self.rating = _cast(float, rating) - self.type_ = _cast(int, type_) + def __init__(self, name=None, type_=None, rating=None): + self.original_tagname_ = None self.name = _cast(None, name) - pass + self.type_ = _cast(int, type_) + self.rating = _cast(float, rating) def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, infoType) + if subclass is not None: + return subclass(*args_, **kwargs_) if infoType.subclass: return infoType.subclass(*args_, **kwargs_) else: return infoType(*args_, **kwargs_) factory = staticmethod(factory) - def get_rating(self): return self.rating - def set_rating(self, rating): self.rating = rating - def get_type(self): return self.type_ - def set_type(self, type_): self.type_ = type_ def get_name(self): return self.name def set_name(self, name): self.name = name + def get_type(self): return self.type_ + def set_type(self, type_): self.type_ = type_ + def get_rating(self): return self.rating + def set_rating(self, rating): self.rating = rating def hasContent_(self): if ( @@ -2286,12 +2481,12 @@ class infoType(GeneratedsSuper): element = etree_.Element('{}' + name_) else: element = etree_.SubElement(parent_element, '{}' + name_) - if self.rating is not None: - element.set('rating', self.gds_format_float(self.rating)) - if self.type_ is not None: - element.set('type', self.gds_format_integer(self.type_)) if self.name is not None: element.set('name', self.gds_format_string(self.name)) + if self.type_ is not None: + element.set('type', self.gds_format_integer(self.type_)) + if self.rating is not None: + element.set('rating', self.gds_format_float(self.rating)) if mapping_ is not None: mapping_[self] = element return element @@ -2301,25 +2496,26 @@ class infoType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): - value = find_attr_value_('rating', node) - if value is not None and 'rating' not in already_processed: - already_processed.add('rating') - try: - self.rating = float(value) - except ValueError, exp: - raise ValueError('Bad float/double attribute (rating): %s' % exp) + value = find_attr_value_('name', node) + if value is not None and 'name' not in already_processed: + already_processed.add('name') + self.name = value value = find_attr_value_('type', node) if value is not None and 'type' not in already_processed: already_processed.add('type') try: self.type_ = int(value) - except ValueError, exp: + except ValueError as exp: raise_parse_error(node, 'Bad integer attribute: %s' % exp) - value = find_attr_value_('name', node) - if value is not None and 'name' not in already_processed: - already_processed.add('name') - self.name = value + value = find_attr_value_('rating', node) + if value is not None and 'rating' not in already_processed: + already_processed.add('rating') + try: + self.rating = float(value) + except ValueError as exp: + raise ValueError('Bad float/double attribute (rating): %s' % exp) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): pass # end class infoType @@ -2332,9 +2528,15 @@ class vehicleType(GeneratedsSuper): subclass = None superclass = None def __init__(self, wheelcount=None, extensiontype_=None): + self.original_tagname_ = None self.wheelcount = wheelcount self.extensiontype_ = extensiontype_ def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, vehicleType) + if subclass is not None: + return subclass(*args_, **kwargs_) if vehicleType.subclass: return vehicleType.subclass(*args_, **kwargs_) else: @@ -2370,6 +2572,7 @@ class vehicleType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): value = find_attr_value_('xsi:type', node) if value is not None and 'xsi:type' not in already_processed: @@ -2380,7 +2583,7 @@ class vehicleType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'wheelcount') self.wheelcount = ival_ @@ -2394,9 +2597,15 @@ class automobile(vehicleType): subclass = None superclass = vehicleType def __init__(self, wheelcount=None, drivername=None): + self.original_tagname_ = None super(automobile, self).__init__(wheelcount, ) self.drivername = drivername def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, automobile) + if subclass is not None: + return subclass(*args_, **kwargs_) if automobile.subclass: return automobile.subclass(*args_, **kwargs_) else: @@ -2426,6 +2635,7 @@ class automobile(vehicleType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(automobile, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2444,9 +2654,15 @@ class airplane(vehicleType): subclass = None superclass = vehicleType def __init__(self, wheelcount=None, pilotname=None): + self.original_tagname_ = None super(airplane, self).__init__(wheelcount, ) self.pilotname = pilotname def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, airplane) + if subclass is not None: + return subclass(*args_, **kwargs_) if airplane.subclass: return airplane.subclass(*args_, **kwargs_) else: @@ -2476,6 +2692,7 @@ class airplane(vehicleType): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): super(airplane, self).buildAttributes(node, attrs, already_processed) def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2497,16 +2714,22 @@ class hot_agent(GeneratedsSuper): subclass = None superclass = None def __init__(self, firstname='empty\\name', lastname='no \'last\' name', priority=None, startDate=None): + self.original_tagname_ = None self.firstname = firstname self.lastname = lastname self.priority = priority - if isinstance(startDate, basestring): + if isinstance(startDate, BaseStrType_): initvalue_ = datetime_.datetime.strptime(startDate, '%Y-%m-%d').date() else: initvalue_ = startDate self.startDate = initvalue_ self.anyAttributes_ = {} def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, hot_agent) + if subclass is not None: + return subclass(*args_, **kwargs_) if hot_agent.subclass: return hot_agent.subclass(*args_, **kwargs_) else: @@ -2524,8 +2747,8 @@ class hot_agent(GeneratedsSuper): def set_anyAttributes_(self, anyAttributes_): self.anyAttributes_ = anyAttributes_ def hasContent_(self): if ( - self.firstname is not None or - self.lastname is not None or + self.firstname != "empty\name" or + self.lastname != "no 'last' name" or self.priority is not None or self.startDate is not None ): @@ -2558,6 +2781,7 @@ class hot_agent(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): self.anyAttributes_ = {} for name, value in attrs.items(): @@ -2576,7 +2800,7 @@ class hot_agent(GeneratedsSuper): sval_ = child_.text try: fval_ = float(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires float or double: %s' % exp) fval_ = self.gds_validate_float(fval_, node, 'priority') self.priority = fval_ @@ -2595,9 +2819,15 @@ class client_handlerType(GeneratedsSuper): subclass = None superclass = None def __init__(self, fullname=None, refid=None): + self.original_tagname_ = None self.fullname = fullname self.refid = refid def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, client_handlerType) + if subclass is not None: + return subclass(*args_, **kwargs_) if client_handlerType.subclass: return client_handlerType.subclass(*args_, **kwargs_) else: @@ -2635,6 +2865,7 @@ class client_handlerType(GeneratedsSuper): for child in node: nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] self.buildChildren(child, node, nodeName_) + return self def buildAttributes(self, node, attrs, already_processed): pass def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): @@ -2646,7 +2877,7 @@ class client_handlerType(GeneratedsSuper): sval_ = child_.text try: ival_ = int(sval_) - except (TypeError, ValueError), exp: + except (TypeError, ValueError) as exp: raise_parse_error(child_, 'requires integer: %s' % exp) ival_ = self.gds_validate_integer(ival_, node, 'refid') self.refid = ival_ @@ -2654,22 +2885,22 @@ class client_handlerType(GeneratedsSuper): GDSClassesMapping = { - 'info': infoType, - 'promoter': boosterType, - 'special-agent': special_agentType, - 'elparam': paramType, - 'python-programmer': python_programmerType, - 'people': peopleType, + 'agent': agentType, + 'booster': boosterType, 'client-handler': client_handlerType, 'comments': commentsType, - 'weird-agent': weird_agentType, - 'person': personType, - 'agent': agentType, + 'elparam': paramType, + 'info': infoType, 'java-programmer': java_programmerType, - 'vehicle': vehicleType, - 'programmer': programmerType, 'param': paramType, - 'booster': boosterType, + 'people': peopleType, + 'person': personType, + 'programmer': programmerType, + 'promoter': boosterType, + 'python-programmer': python_programmerType, + 'special-agent': special_agentType, + 'vehicle': vehicleType, + 'weird-agent': weird_agentType, } @@ -2679,7 +2910,7 @@ Usage: python <Parser>.py [ -s ] <in_xml_file> def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -2692,11 +2923,12 @@ def get_root_tag(node): def parse(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -2712,11 +2944,12 @@ def parse(inFileName, silence=False): def parseEtree(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -2735,12 +2968,16 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO - doc = parsexml_(StringIO(inString)) + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() - roots = get_root_tag(rootNode) - rootClass = roots[1] + rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: + rootTag = 'peopleType' rootClass = peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -2749,17 +2986,18 @@ def parseString(inString, silence=False): ## if not silence: ## sys.stdout.write('<?xml version="1.0" ?>\n') ## rootObj.export( -## sys.stdout, 0, name_="people", +## sys.stdout, 0, name_=rootTag, ## namespacedef_='') return rootObj def parseLiteral(inFileName, silence=False): - doc = parsexml_(inFileName) + parser = None + doc = parsexml_(inFileName, parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: - rootTag = 'people' + rootTag = 'peopleType' rootClass = peopleType rootObj = rootClass.factory() rootObj.build(rootNode) @@ -2768,7 +3006,7 @@ def parseLiteral(inFileName, silence=False): ## if not silence: ## sys.stdout.write('#from to_etree2_sup import *\n\n') ## sys.stdout.write('import to_etree2_sup as model_\n\n') -## sys.stdout.write('rootObj = model_.rootTag(\n') +## sys.stdout.write('rootObj = model_.rootClass(\n') ## rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) ## sys.stdout.write(')\n') return rootObj diff --git a/tests/validate_simpletypes.xml b/tests/validate_simpletypes.xml new file mode 100644 index 0000000..ba85927 --- /dev/null +++ b/tests/validate_simpletypes.xml @@ -0,0 +1,84 @@ +<?xml version="1.0"?> +<container> + <sample1> + <integer_range_1_value>5</integer_range_1_value> + <pattern_value>aaa1234mnopzzz</pattern_value> + <pattern_value>bbbmn456opxxx</pattern_value> + <token_enum_value>float</token_enum_value> + <integer_range_incl_value>2</integer_range_incl_value> + <integer_range_excl_value>7</integer_range_excl_value> + <min_max_length_value>abc def ghi</min_max_length_value> + <length_value>0123456789</length_value> + <totaldigits_value>12.456</totaldigits_value> + + <date_minincl_value>2015-07-01</date_minincl_value> + <date_maxincl_value>2015-07-01</date_maxincl_value> + <date_minexcl_value>2015-07-01</date_minexcl_value> + <date_maxexcl_value>2015-07-01</date_maxexcl_value> + + <time_minincl_value>15:20:10</time_minincl_value> + <time_maxincl_value>15:20:10</time_maxincl_value> + <time_minexcl_value>15:20:10</time_minexcl_value> + <time_maxexcl_value>15:20:10</time_maxexcl_value> + + <datetime_minincl_value>2015-07-01T14:20:10</datetime_minincl_value> + <datetime_maxincl_value>2015-05-01T14:20:10</datetime_maxincl_value> + <datetime_minexcl_value>2015-07-01T14:20:10</datetime_minexcl_value> + <datetime_maxexcl_value>2015-05-01T14:20:10</datetime_maxexcl_value> + + <anonymous_float_value>2.2</anonymous_float_value> + <primative_integer>765</primative_integer> + <primative_float>54.321</primative_float> + <vbar_pattern_value>abcd</vbar_pattern_value> + </sample1> + <sample2_bad> + <integer_range_1_value>2</integer_range_1_value> + <pattern_value>mmaaa1234mnopzzz</pattern_value> + <token_enum_value>floatxx</token_enum_value> + <integer_range_incl_value>22</integer_range_incl_value> + <integer_range_excl_value>-40</integer_range_excl_value> + <min_max_length_value>mno pqr</min_max_length_value> + <length_value>012345</length_value> + <totaldigits_value>12.456789</totaldigits_value> + <anonymous_float_value>0.2</anonymous_float_value> + <vbar_pattern_value>efgh</vbar_pattern_value> + </sample2_bad> + <sample3_bad> + <integer_range_1_value>9</integer_range_1_value> + <pattern_value>aaa1234mnopzzzbcd</pattern_value> + <integer_range_incl_value>-50</integer_range_incl_value> + <min_max_length_value>asdf asdf asdf asdf asdf asdf</min_max_length_value> + <length_value>01234567890</length_value> + <totaldigits_value>12345678.45678901</totaldigits_value> + + <date_minincl_value>2015-05-01</date_minincl_value> + <date_maxincl_value>2015-11-01</date_maxincl_value> + <date_minexcl_value>2015-05-01</date_minexcl_value> + <date_maxexcl_value>2015-11-01</date_maxexcl_value> + + <time_minincl_value>13:30:00</time_minincl_value> + <time_maxincl_value>17:00:00</time_maxincl_value> + <time_minexcl_value>13:30:00</time_minexcl_value> + <time_maxexcl_value>17:00:00</time_maxexcl_value> + + <datetime_minincl_value>2015-06-01T13:20:10</datetime_minincl_value> + <datetime_maxincl_value>2015-11-01T14:20:10</datetime_maxincl_value> + <datetime_minexcl_value>2015-06-01T13:20:10</datetime_minexcl_value> + <datetime_maxexcl_value>2015-11-01T14:20:10</datetime_maxexcl_value> + + <anonymous_float_value>6.6</anonymous_float_value> + </sample3_bad> + <sample4_bad> + <pattern_value>aaa12zzz</pattern_value> + </sample4_bad> + <sample2> + <simpleTwoElementOne> + <simpleTwoElementTwo>abcdefghijklmno</simpleTwoElementTwo> + </simpleTwoElementOne> + </sample2> + <sample2> + <simpleTwoElementOne> + <simpleTwoElementTwo>pqrst</simpleTwoElementTwo> + </simpleTwoElementOne> + </sample2> +</container> diff --git a/tests/validate_simpletypes.xsd b/tests/validate_simpletypes.xsd new file mode 100644 index 0000000..2493ac3 --- /dev/null +++ b/tests/validate_simpletypes.xsd @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="container" type="containerType"/> + + <xs:complexType name="containerType"> + <xs:sequence> + <xs:element name="sample1" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample2_bad" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample3_bad" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample4_bad" type="simpleOneType" maxOccurs="unbounded"/> + <xs:element name="sample2" type="simpleTwoType" maxOccurs="unbounded"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="simpleOneType" mixed="0"> + <xs:sequence> + <xs:element name="integer_range_1_value" type="integer_range_1_st"/> + <xs:element name="pattern_value" type="pattern_st"/> + <xs:element name="token_enum_value" type="token_enum_st"/> + <xs:element name="integer_range_incl_value" type="integer_range_incl_st"/> + <xs:element name="integer_range_excl_value" type="integer_range_excl_st"/> + <xs:element name="min_max_length_value" type="min_max_length_st"/> + <xs:element name="length_value" type="length_st"/> + <xs:element name="totalDigits_value" type="totalDigits_st"/> + + <xs:element name="date_minincl_value" type="date_minincl_st"/> + <xs:element name="date_maxincl_value" type="date_maxincl_st"/> + <xs:element name="date_minexcl_value" type="date_minexcl_st"/> + <xs:element name="date_maxexcl_value" type="date_maxexcl_st"/> + <xs:element name="time_minincl_value" type="time_minincl_st"/> + <xs:element name="time_maxincl_value" type="time_maxincl_st"/> + <xs:element name="time_minexcl_value" type="time_minexcl_st"/> + <xs:element name="time_maxexcl_value" type="time_maxexcl_st"/> + <xs:element name="datetime_minincl_value" type="datetime_minincl_st"/> + <xs:element name="datetime_maxincl_value" type="datetime_maxincl_st"/> + <xs:element name="datetime_minexcl_value" type="datetime_minexcl_st"/> + <xs:element name="datetime_maxexcl_value" type="datetime_maxexcl_st"/> + <xs:element name="vbar_pattern_value" type="vbar_pattern_st"/> + + <!-- Test for use of anonymous simple type. --> + <xs:element name="anonymous_float_value"> + <xs:simpleType> + <xs:restriction base="xs:float"> + <xs:minInclusive value="1.1"/> + <xs:maxInclusive value="4.4"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + <xs:element name="primative_integer" type="xs:integer"/> + <xs:element name="primative_float" type="xs:float"/> + </xs:sequence> + </xs:complexType> + <!-- Test for use of an anonymous simple type inside an anonymous complexType. --> + <xs:element name="simpleTypeData" type="simpleTwoType"/> + <xs:complexType name="simpleTwoType"> + <xs:sequence> + <xs:element name="simpleTwoElementOne"> + <xs:complexType> + <xs:sequence> + <xs:element name="simpleTwoElementTwo"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:minLength value="12"/> + <xs:maxLength value="24"/> + </xs:restriction> + </xs:simpleType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="integer_range_1_st"> + <xs:restriction base="integer_range_2_st"> + <xs:minExclusive value="4"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="integer_range_2_st"> + <xs:restriction base="xs:integer"> + <xs:maxExclusive value="8"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="pattern_st"> + <xs:restriction base="pattern_1_st"> + <xs:pattern value="aaa.*zzz"/> + <xs:pattern value="bbb.*xxx"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="pattern_1_st"> + <xs:restriction base="min_length_st"> + <xs:pattern value=".*123.*"/> + <xs:pattern value=".*456.*"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="min_length_st"> + <xs:restriction base="xs:string"> + <xs:minLength value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="token_enum_st"> + <xs:restriction base="xs:NMTOKEN"> + <xs:enumeration value="float"/> + <xs:enumeration value="int"/> + <xs:enumeration value="Name"/> + <xs:enumeration value="token"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="integer_range_incl_st"> + <xs:restriction base="xs:integer"> + <xs:minInclusive value="-5"/> + <xs:maxInclusive value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="integer_range_excl_st"> + <xs:restriction base="xs:integer"> + <xs:minExclusive value="-5"/> + <xs:maxExclusive value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="min_max_length_st"> + <xs:restriction base="xs:string"> + <xs:minLength value="10"/> + <xs:maxLength value="20"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="length_st"> + <xs:restriction base="xs:string"> + <xs:length value="10"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="totalDigits_st"> + <xs:restriction base="xs:decimal"> + <xs:totalDigits value="15"/> + <xs:fractionDigits value="5"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="date_minincl_st"> + <xs:restriction base="xs:date"> + <xs:minInclusive value="2015-06-01"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="date_maxincl_st"> + <xs:restriction base="xs:date"> + <xs:maxInclusive value="2015-10-31"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="date_minexcl_st"> + <xs:restriction base="xs:date"> + <xs:minExclusive value="2015-06-01"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="date_maxexcl_st"> + <xs:restriction base="xs:date"> + <xs:maxExclusive value="2015-10-31"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="time_minincl_st"> + <xs:restriction base="xs:time"> + <xs:minInclusive value="14:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="time_maxincl_st"> + <xs:restriction base="xs:time"> + <xs:maxInclusive value="16:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="time_minexcl_st"> + <xs:restriction base="xs:time"> + <xs:minExclusive value="14:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="time_maxexcl_st"> + <xs:restriction base="xs:time"> + <xs:maxExclusive value="16:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="datetime_minincl_st"> + <xs:restriction base="xs:dateTime"> + <xs:minInclusive value="2015-06-01T14:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="datetime_maxincl_st"> + <xs:restriction base="xs:dateTime"> + <xs:maxInclusive value="2015-10-31T16:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="datetime_minexcl_st"> + <xs:restriction base="xs:dateTime"> + <xs:minExclusive value="2015-06-01T14:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="datetime_maxexcl_st"> + <xs:restriction base="xs:dateTime"> + <xs:maxExclusive value="2015-10-31T16:20:10"/> + </xs:restriction> + </xs:simpleType> + + <xs:simpleType name="vbar_pattern_st"> + <xs:restriction base="xs:string"> + <xs:pattern value="abcd|ef\|gh" /> + </xs:restriction> + </xs:simpleType> + +</xs:schema> diff --git a/tests/validate_simpletypes1_out.xml b/tests/validate_simpletypes1_out.xml new file mode 100644 index 0000000..b6d8392 --- /dev/null +++ b/tests/validate_simpletypes1_out.xml @@ -0,0 +1,72 @@ +<?xml version="1.0" ?> +<container> + <sample1> + <integer_range_1_value>5</integer_range_1_value> + <pattern_value>bbbmn456opxxx</pattern_value> + <token_enum_value>float</token_enum_value> + <integer_range_incl_value>2</integer_range_incl_value> + <integer_range_excl_value>7</integer_range_excl_value> + <min_max_length_value>abc def ghi</min_max_length_value> + <length_value>0123456789</length_value> + <date_minincl_value>2015-07-01</date_minincl_value> + <date_maxincl_value>2015-07-01</date_maxincl_value> + <date_minexcl_value>2015-07-01</date_minexcl_value> + <date_maxexcl_value>2015-07-01</date_maxexcl_value> + <time_minincl_value>15:20:10</time_minincl_value> + <time_maxincl_value>15:20:10</time_maxincl_value> + <time_minexcl_value>15:20:10</time_minexcl_value> + <time_maxexcl_value>15:20:10</time_maxexcl_value> + <datetime_minincl_value>2015-07-01T14:20:10</datetime_minincl_value> + <datetime_maxincl_value>2015-05-01T14:20:10</datetime_maxincl_value> + <datetime_minexcl_value>2015-07-01T14:20:10</datetime_minexcl_value> + <datetime_maxexcl_value>2015-05-01T14:20:10</datetime_maxexcl_value> + <vbar_pattern_value>abcd</vbar_pattern_value> + <anonymous_float_value>2.2</anonymous_float_value> + <primative_integer>765</primative_integer> + <primative_float>54.320999999999998</primative_float> + </sample1> + <sample2_bad> + <integer_range_1_value>2</integer_range_1_value> + <pattern_value>mmaaa1234mnopzzz</pattern_value> + <token_enum_value>floatxx</token_enum_value> + <integer_range_incl_value>22</integer_range_incl_value> + <integer_range_excl_value>-40</integer_range_excl_value> + <min_max_length_value>mno pqr</min_max_length_value> + <length_value>012345</length_value> + <vbar_pattern_value>efgh</vbar_pattern_value> + <anonymous_float_value>0.2</anonymous_float_value> + </sample2_bad> + <sample3_bad> + <integer_range_1_value>9</integer_range_1_value> + <pattern_value>aaa1234mnopzzzbcd</pattern_value> + <integer_range_incl_value>-50</integer_range_incl_value> + <min_max_length_value>asdf asdf asdf asdf asdf asdf</min_max_length_value> + <length_value>01234567890</length_value> + <date_minincl_value>2015-05-01</date_minincl_value> + <date_maxincl_value>2015-11-01</date_maxincl_value> + <date_minexcl_value>2015-05-01</date_minexcl_value> + <date_maxexcl_value>2015-11-01</date_maxexcl_value> + <time_minincl_value>13:30:00</time_minincl_value> + <time_maxincl_value>17:00:00</time_maxincl_value> + <time_minexcl_value>13:30:00</time_minexcl_value> + <time_maxexcl_value>17:00:00</time_maxexcl_value> + <datetime_minincl_value>2015-06-01T13:20:10</datetime_minincl_value> + <datetime_maxincl_value>2015-11-01T14:20:10</datetime_maxincl_value> + <datetime_minexcl_value>2015-06-01T13:20:10</datetime_minexcl_value> + <datetime_maxexcl_value>2015-11-01T14:20:10</datetime_maxexcl_value> + <anonymous_float_value>6.6</anonymous_float_value> + </sample3_bad> + <sample4_bad> + <pattern_value>aaa12zzz</pattern_value> + </sample4_bad> + <sample2> + <simpleTwoElementOne> + <simpleTwoElementTwo>abcdefghijklmno</simpleTwoElementTwo> + </simpleTwoElementOne> + </sample2> + <sample2> + <simpleTwoElementOne> + <simpleTwoElementTwo>pqrst</simpleTwoElementTwo> + </simpleTwoElementOne> + </sample2> +</container> diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py new file mode 100644 index 0000000..e0f4a98 --- /dev/null +++ b/tests/validate_simpletypes1_sub.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import validate_simpletypes2_sup as supermod + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class simpleOneTypeSub(supermod.simpleOneType): + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, vbar_pattern_value, anonymous_float_value, primative_integer, primative_float, ) +supermod.simpleOneType.subclass = simpleOneTypeSub +# end class simpleOneTypeSub + + +class simpleTwoTypeSub(supermod.simpleTwoType): + def __init__(self, simpleTwoElementOne=None): + super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, ) +supermod.simpleTwoType.subclass = simpleTwoTypeSub +# end class simpleTwoTypeSub + + +class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType): + def __init__(self, simpleTwoElementTwo=None): + super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, ) +supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub +# end class simpleTwoElementOneTypeSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py new file mode 100644 index 0000000..7e21557 --- /dev/null +++ b/tests/validate_simpletypes1_sup.py @@ -0,0 +1,1723 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('sample1', 'simpleOneType', 1), + MemberSpec_('sample2_bad', 'simpleOneType', 1), + MemberSpec_('sample3_bad', 'simpleOneType', 1), + MemberSpec_('sample4_bad', 'simpleOneType', 1), + MemberSpec_('sample2', 'simpleTwoType', 1), + ] + subclass = None + superclass = None + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + self.original_tagname_ = None + if sample1 is None: + self.sample1 = [] + else: + self.sample1 = sample1 + if sample2_bad is None: + self.sample2_bad = [] + else: + self.sample2_bad = sample2_bad + if sample3_bad is None: + self.sample3_bad = [] + else: + self.sample3_bad = sample3_bad + if sample4_bad is None: + self.sample4_bad = [] + else: + self.sample4_bad = sample4_bad + if sample2 is None: + self.sample2 = [] + else: + self.sample2 = sample2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, containerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if containerType.subclass: + return containerType.subclass(*args_, **kwargs_) + else: + return containerType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_sample1(self): return self.sample1 + def set_sample1(self, sample1): self.sample1 = sample1 + def add_sample1(self, value): self.sample1.append(value) + def insert_sample1_at(self, index, value): self.sample1.insert(index, value) + def replace_sample1_at(self, index, value): self.sample1[index] = value + def get_sample2_bad(self): return self.sample2_bad + def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad + def add_sample2_bad(self, value): self.sample2_bad.append(value) + def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value) + def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value + def get_sample3_bad(self): return self.sample3_bad + def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad + def add_sample3_bad(self, value): self.sample3_bad.append(value) + def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value) + def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value + def get_sample4_bad(self): return self.sample4_bad + def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad + def add_sample4_bad(self, value): self.sample4_bad.append(value) + def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value) + def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value + def get_sample2(self): return self.sample2 + def set_sample2(self, sample2): self.sample2 = sample2 + def add_sample2(self, value): self.sample2.append(value) + def insert_sample2_at(self, index, value): self.sample2.insert(index, value) + def replace_sample2_at(self, index, value): self.sample2[index] = value + def hasContent_(self): + if ( + self.sample1 or + self.sample2_bad or + self.sample3_bad or + self.sample4_bad or + self.sample2 + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for sample1_ in self.sample1: + sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print) + for sample2_bad_ in self.sample2_bad: + sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print) + for sample3_bad_ in self.sample3_bad: + sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print) + for sample4_bad_ in self.sample4_bad: + sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print) + for sample2_ in self.sample2: + sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'sample1': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample1.append(obj_) + obj_.original_tagname_ = 'sample1' + elif nodeName_ == 'sample2_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample2_bad.append(obj_) + obj_.original_tagname_ = 'sample2_bad' + elif nodeName_ == 'sample3_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample3_bad.append(obj_) + obj_.original_tagname_ = 'sample3_bad' + elif nodeName_ == 'sample4_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample4_bad.append(obj_) + obj_.original_tagname_ = 'sample4_bad' + elif nodeName_ == 'sample2': + obj_ = simpleTwoType.factory() + obj_.build(child_) + self.sample2.append(obj_) + obj_.original_tagname_ = 'sample2' +# end class containerType + + +class simpleOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0), + MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0), + MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), + MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0), + MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0), + MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0), + MemberSpec_('length_value', ['length_st', 'xs:string'], 0), + MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0), + MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0), + MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0), + MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0), + MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0), + MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0), + MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0), + MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0), + MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0), + MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0), + MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0), + MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), + MemberSpec_('primative_integer', 'xs:integer', 0), + MemberSpec_('primative_float', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + self.original_tagname_ = None + self.integer_range_1_value = integer_range_1_value + self.validate_integer_range_1_st(self.integer_range_1_value) + self.pattern_value = pattern_value + self.validate_pattern_st(self.pattern_value) + self.token_enum_value = token_enum_value + self.validate_token_enum_st(self.token_enum_value) + self.integer_range_incl_value = integer_range_incl_value + self.validate_integer_range_incl_st(self.integer_range_incl_value) + self.integer_range_excl_value = integer_range_excl_value + self.validate_integer_range_excl_st(self.integer_range_excl_value) + self.min_max_length_value = min_max_length_value + self.validate_min_max_length_st(self.min_max_length_value) + self.length_value = length_value + self.validate_length_st(self.length_value) + self.totalDigits_value = totalDigits_value + self.validate_totalDigits_st(self.totalDigits_value) + if isinstance(date_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minincl_value + self.date_minincl_value = initvalue_ + if isinstance(date_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxincl_value + self.date_maxincl_value = initvalue_ + if isinstance(date_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minexcl_value + self.date_minexcl_value = initvalue_ + if isinstance(date_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxexcl_value + self.date_maxexcl_value = initvalue_ + if isinstance(time_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minincl_value + self.time_minincl_value = initvalue_ + if isinstance(time_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxincl_value + self.time_maxincl_value = initvalue_ + if isinstance(time_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minexcl_value + self.time_minexcl_value = initvalue_ + if isinstance(time_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxexcl_value + self.time_maxexcl_value = initvalue_ + if isinstance(datetime_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minincl_value + self.datetime_minincl_value = initvalue_ + if isinstance(datetime_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxincl_value + self.datetime_maxincl_value = initvalue_ + if isinstance(datetime_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minexcl_value + self.datetime_minexcl_value = initvalue_ + if isinstance(datetime_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxexcl_value + self.datetime_maxexcl_value = initvalue_ + self.vbar_pattern_value = vbar_pattern_value + self.validate_vbar_pattern_st(self.vbar_pattern_value) + self.anonymous_float_value = anonymous_float_value + self.validate_anonymous_float_valueType(self.anonymous_float_value) + self.primative_integer = primative_integer + self.primative_float = primative_float + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleOneType.subclass: + return simpleOneType.subclass(*args_, **kwargs_) + else: + return simpleOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_integer_range_1_value(self): return self.integer_range_1_value + def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value + def get_pattern_value(self): return self.pattern_value + def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value + def get_token_enum_value(self): return self.token_enum_value + def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value + def get_integer_range_incl_value(self): return self.integer_range_incl_value + def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value + def get_integer_range_excl_value(self): return self.integer_range_excl_value + def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value + def get_min_max_length_value(self): return self.min_max_length_value + def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value + def get_length_value(self): return self.length_value + def set_length_value(self, length_value): self.length_value = length_value + def get_totalDigits_value(self): return self.totalDigits_value + def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value + def get_date_minincl_value(self): return self.date_minincl_value + def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value + def get_date_maxincl_value(self): return self.date_maxincl_value + def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value + def get_date_minexcl_value(self): return self.date_minexcl_value + def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value + def get_date_maxexcl_value(self): return self.date_maxexcl_value + def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value + def get_time_minincl_value(self): return self.time_minincl_value + def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value + def get_time_maxincl_value(self): return self.time_maxincl_value + def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value + def get_time_minexcl_value(self): return self.time_minexcl_value + def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value + def get_time_maxexcl_value(self): return self.time_maxexcl_value + def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value + def get_datetime_minincl_value(self): return self.datetime_minincl_value + def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value + def get_datetime_maxincl_value(self): return self.datetime_maxincl_value + def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value + def get_datetime_minexcl_value(self): return self.datetime_minexcl_value + def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value + def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value + def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value + def get_vbar_pattern_value(self): return self.vbar_pattern_value + def set_vbar_pattern_value(self, vbar_pattern_value): self.vbar_pattern_value = vbar_pattern_value + def get_anonymous_float_value(self): return self.anonymous_float_value + def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value + def get_primative_integer(self): return self.primative_integer + def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer + def get_primative_float(self): return self.primative_float + def set_primative_float(self, primative_float): self.primative_float = primative_float + def validate_integer_range_1_st(self, value): + # Validate type integer_range_1_st, a restriction on integer_range_2_st. + if value is not None and Validate_simpletypes_: + if value <= 4: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} ) + if value >= 8: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} ) + def validate_pattern_st(self, value): + # Validate type pattern_st, a restriction on pattern_1_st. + if value is not None and Validate_simpletypes_: + if len(str(value)) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} ) + if not self.gds_validate_simple_patterns( + self.validate_pattern_st_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) + validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] + def validate_token_enum_st(self, value): + # Validate type token_enum_st, a restriction on xs:NMTOKEN. + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) + def validate_integer_range_incl_st(self, value): + # Validate type integer_range_incl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value < -5: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) + if value > 10: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) + def validate_integer_range_excl_st(self, value): + # Validate type integer_range_excl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value <= -5: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) + if value >= 10: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} ) + def validate_min_max_length_st(self, value): + # Validate type min_max_length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 20: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + if len(value) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + def validate_length_st(self, value): + # Validate type length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) != 10: + warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) + def validate_totalDigits_st(self, value): + # Validate type totalDigits_st, a restriction on xs:decimal. + if value is not None and Validate_simpletypes_: + if len(str(value)) >= 15: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} ) + def validate_date_minincl_st(self, value): + # Validate type date_minincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} ) + def validate_date_maxincl_st(self, value): + # Validate type date_maxincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} ) + def validate_date_minexcl_st(self, value): + # Validate type date_minexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} ) + def validate_date_maxexcl_st(self, value): + # Validate type date_maxexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} ) + def validate_time_minincl_st(self, value): + # Validate type time_minincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} ) + def validate_time_maxincl_st(self, value): + # Validate type time_maxincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} ) + def validate_time_minexcl_st(self, value): + # Validate type time_minexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} ) + def validate_time_maxexcl_st(self, value): + # Validate type time_maxexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} ) + def validate_datetime_minincl_st(self, value): + # Validate type datetime_minincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} ) + def validate_datetime_maxincl_st(self, value): + # Validate type datetime_maxincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} ) + def validate_datetime_minexcl_st(self, value): + # Validate type datetime_minexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} ) + def validate_datetime_maxexcl_st(self, value): + # Validate type datetime_maxexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} ) + def validate_vbar_pattern_st(self, value): + # Validate type vbar_pattern_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if not self.gds_validate_simple_patterns( + self.validate_vbar_pattern_st_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, )) + validate_vbar_pattern_st_patterns_ = [['^abcd$|^ef\\|gh$']] + def validate_anonymous_float_valueType(self, value): + # Validate type anonymous_float_valueType, a restriction on xs:float. + if value is not None and Validate_simpletypes_: + if value < 1.1: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + if value > 4.4: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + def hasContent_(self): + if ( + self.integer_range_1_value is not None or + self.pattern_value is not None or + self.token_enum_value is not None or + self.integer_range_incl_value is not None or + self.integer_range_excl_value is not None or + self.min_max_length_value is not None or + self.length_value is not None or + self.totalDigits_value is not None or + self.date_minincl_value is not None or + self.date_maxincl_value is not None or + self.date_minexcl_value is not None or + self.date_maxexcl_value is not None or + self.time_minincl_value is not None or + self.time_maxincl_value is not None or + self.time_minexcl_value is not None or + self.time_maxexcl_value is not None or + self.datetime_minincl_value is not None or + self.datetime_maxincl_value is not None or + self.datetime_minexcl_value is not None or + self.datetime_maxexcl_value is not None or + self.vbar_pattern_value is not None or + self.anonymous_float_value is not None or + self.primative_integer is not None or + self.primative_float is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.integer_range_1_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_)) + if self.pattern_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_)) + if self.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) + if self.integer_range_incl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_)) + if self.integer_range_excl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_)) + if self.min_max_length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_)) + if self.length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_)) + if self.totalDigits_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_)) + if self.date_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_)) + if self.date_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_)) + if self.date_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_)) + if self.date_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_)) + if self.time_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_)) + if self.time_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_)) + if self.time_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_)) + if self.time_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_)) + if self.datetime_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_)) + if self.datetime_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_)) + if self.datetime_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_)) + if self.datetime_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_)) + if self.vbar_pattern_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%svbar_pattern_value>%s</%svbar_pattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.vbar_pattern_value), input_name='vbar_pattern_value')), namespace_, eol_)) + if self.anonymous_float_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_)) + if self.primative_integer is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_)) + if self.primative_float is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'integer_range_1_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value') + self.integer_range_1_value = ival_ + # validate type integer_range_1_st + self.validate_integer_range_1_st(self.integer_range_1_value) + elif nodeName_ == 'pattern_value': + pattern_value_ = child_.text + pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value') + self.pattern_value = pattern_value_ + # validate type pattern_st + self.validate_pattern_st(self.pattern_value) + elif nodeName_ == 'token_enum_value': + token_enum_value_ = child_.text + token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') + self.token_enum_value = token_enum_value_ + # validate type token_enum_st + self.validate_token_enum_st(self.token_enum_value) + elif nodeName_ == 'integer_range_incl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') + self.integer_range_incl_value = ival_ + # validate type integer_range_incl_st + self.validate_integer_range_incl_st(self.integer_range_incl_value) + elif nodeName_ == 'integer_range_excl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') + self.integer_range_excl_value = ival_ + # validate type integer_range_excl_st + self.validate_integer_range_excl_st(self.integer_range_excl_value) + elif nodeName_ == 'min_max_length_value': + min_max_length_value_ = child_.text + min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value') + self.min_max_length_value = min_max_length_value_ + # validate type min_max_length_st + self.validate_min_max_length_st(self.min_max_length_value) + elif nodeName_ == 'length_value': + length_value_ = child_.text + length_value_ = self.gds_validate_string(length_value_, node, 'length_value') + self.length_value = length_value_ + # validate type length_st + self.validate_length_st(self.length_value) + elif nodeName_ == 'totalDigits_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value') + self.totalDigits_value = fval_ + # validate type totalDigits_st + self.validate_totalDigits_st(self.totalDigits_value) + elif nodeName_ == 'date_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minincl_value = dval_ + # validate type date_minincl_st + self.validate_date_minincl_st(self.date_minincl_value) + elif nodeName_ == 'date_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxincl_value = dval_ + # validate type date_maxincl_st + self.validate_date_maxincl_st(self.date_maxincl_value) + elif nodeName_ == 'date_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minexcl_value = dval_ + # validate type date_minexcl_st + self.validate_date_minexcl_st(self.date_minexcl_value) + elif nodeName_ == 'date_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxexcl_value = dval_ + # validate type date_maxexcl_st + self.validate_date_maxexcl_st(self.date_maxexcl_value) + elif nodeName_ == 'time_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minincl_value = dval_ + # validate type time_minincl_st + self.validate_time_minincl_st(self.time_minincl_value) + elif nodeName_ == 'time_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxincl_value = dval_ + # validate type time_maxincl_st + self.validate_time_maxincl_st(self.time_maxincl_value) + elif nodeName_ == 'time_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minexcl_value = dval_ + # validate type time_minexcl_st + self.validate_time_minexcl_st(self.time_minexcl_value) + elif nodeName_ == 'time_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxexcl_value = dval_ + # validate type time_maxexcl_st + self.validate_time_maxexcl_st(self.time_maxexcl_value) + elif nodeName_ == 'datetime_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minincl_value = dval_ + # validate type datetime_minincl_st + self.validate_datetime_minincl_st(self.datetime_minincl_value) + elif nodeName_ == 'datetime_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxincl_value = dval_ + # validate type datetime_maxincl_st + self.validate_datetime_maxincl_st(self.datetime_maxincl_value) + elif nodeName_ == 'datetime_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minexcl_value = dval_ + # validate type datetime_minexcl_st + self.validate_datetime_minexcl_st(self.datetime_minexcl_value) + elif nodeName_ == 'datetime_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxexcl_value = dval_ + # validate type datetime_maxexcl_st + self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value) + elif nodeName_ == 'vbar_pattern_value': + vbar_pattern_value_ = child_.text + vbar_pattern_value_ = self.gds_validate_string(vbar_pattern_value_, node, 'vbar_pattern_value') + self.vbar_pattern_value = vbar_pattern_value_ + # validate type vbar_pattern_st + self.validate_vbar_pattern_st(self.vbar_pattern_value) + elif nodeName_ == 'anonymous_float_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') + self.anonymous_float_value = fval_ + # validate type anonymous_float_valueType + self.validate_anonymous_float_valueType(self.anonymous_float_value) + elif nodeName_ == 'primative_integer': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'primative_integer') + self.primative_integer = ival_ + elif nodeName_ == 'primative_float': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'primative_float') + self.primative_float = fval_ +# end class simpleOneType + + +class simpleTwoType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementOne=None): + self.original_tagname_ = None + self.simpleTwoElementOne = simpleTwoElementOne + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoType.subclass: + return simpleTwoType.subclass(*args_, **kwargs_) + else: + return simpleTwoType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementOne(self): return self.simpleTwoElementOne + def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne + def hasContent_(self): + if ( + self.simpleTwoElementOne is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementOne is not None: + self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'simpleTwoElementOne': + obj_ = simpleTwoElementOneType.factory() + obj_.build(child_) + self.simpleTwoElementOne = obj_ + obj_.original_tagname_ = 'simpleTwoElementOne' +# end class simpleTwoType + + +class simpleTwoElementOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementTwo=None): + self.original_tagname_ = None + self.simpleTwoElementTwo = simpleTwoElementTwo + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoElementOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoElementOneType.subclass: + return simpleTwoElementOneType.subclass(*args_, **kwargs_) + else: + return simpleTwoElementOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo + def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo + def validate_simpleTwoElementTwoType(self, value): + # Validate type simpleTwoElementTwoType, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 24: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + if len(value) < 12: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + def hasContent_(self): + if ( + self.simpleTwoElementTwo is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoElementOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoElementOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementTwo is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'simpleTwoElementTwo': + simpleTwoElementTwo_ = child_.text + simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo') + self.simpleTwoElementTwo = simpleTwoElementTwo_ + # validate type simpleTwoElementTwoType + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) +# end class simpleTwoElementOneType + + +GDSClassesMapping = { + 'container': containerType, + 'sample1': simpleOneType, + 'sample2': simpleTwoType, + 'sample2_bad': simpleOneType, + 'sample3_bad': simpleOneType, + 'sample4_bad': simpleOneType, + 'simpleTwoElementOne': simpleTwoElementOneType, + 'simpleTypeData': simpleTwoType, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "containerType", + "simpleOneType", + "simpleTwoElementOneType", + "simpleTwoType" +] diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt new file mode 100644 index 0000000..0c0f475 --- /dev/null +++ b/tests/validate_simpletypes1_warnings.txt @@ -0,0 +1,60 @@ +tests/validate_simpletypes2_sup.py:990: 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:1000: 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:1013: 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:1020: 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:1025: 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:1034: 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:1039: 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:1116: 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:1110: 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:992: 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:1000: 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:1018: 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:1032: 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:1039: 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:1049: 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:1054: 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:1059: 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:1064: 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:1069: 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:1074: 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:1079: 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:1084: 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:1089: 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:1094: 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:1099: 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:1104: 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:1118: 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:997: 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:1000: 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:1530: 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_sub.py b/tests/validate_simpletypes2_sub.py new file mode 100644 index 0000000..e0f4a98 --- /dev/null +++ b/tests/validate_simpletypes2_sub.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +from lxml import etree as etree_ + +import validate_simpletypes2_sup as supermod + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + parser = etree_.ETCompatXMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# Globals +# + +ExternalEncoding = 'ascii' + +# +# Data representation classes +# + + +class containerTypeSub(supermod.containerType): + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + super(containerTypeSub, self).__init__(sample1, sample2_bad, sample3_bad, sample4_bad, sample2, ) +supermod.containerType.subclass = containerTypeSub +# end class containerTypeSub + + +class simpleOneTypeSub(supermod.simpleOneType): + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + super(simpleOneTypeSub, self).__init__(integer_range_1_value, pattern_value, token_enum_value, integer_range_incl_value, integer_range_excl_value, min_max_length_value, length_value, totalDigits_value, date_minincl_value, date_maxincl_value, date_minexcl_value, date_maxexcl_value, time_minincl_value, time_maxincl_value, time_minexcl_value, time_maxexcl_value, datetime_minincl_value, datetime_maxincl_value, datetime_minexcl_value, datetime_maxexcl_value, vbar_pattern_value, anonymous_float_value, primative_integer, primative_float, ) +supermod.simpleOneType.subclass = simpleOneTypeSub +# end class simpleOneTypeSub + + +class simpleTwoTypeSub(supermod.simpleTwoType): + def __init__(self, simpleTwoElementOne=None): + super(simpleTwoTypeSub, self).__init__(simpleTwoElementOne, ) +supermod.simpleTwoType.subclass = simpleTwoTypeSub +# end class simpleTwoTypeSub + + +class simpleTwoElementOneTypeSub(supermod.simpleTwoElementOneType): + def __init__(self, simpleTwoElementTwo=None): + super(simpleTwoElementOneTypeSub, self).__init__(simpleTwoElementTwo, ) +supermod.simpleTwoElementOneType.subclass = simpleTwoElementOneTypeSub +# end class simpleTwoElementOneTypeSub + + +def get_root_tag(node): + tag = supermod.Tag_pattern_.match(node.tag).groups()[-1] + rootClass = None + rootClass = supermod.GDSClassesMapping.get(tag) + if rootClass is None and hasattr(supermod, tag): + rootClass = getattr(supermod, tag) + return tag, rootClass + + +def parse(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + from StringIO import StringIO + parser = None + doc = parsexml_(StringIO(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFilename, silence=False): + parser = None + doc = parsexml_(inFilename, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = supermod.containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +USAGE_TEXT = """ +Usage: python ???.py <infilename> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def main(): + args = sys.argv[1:] + if len(args) != 1: + usage() + infilename = args[0] + parse(infilename) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py new file mode 100644 index 0000000..7e21557 --- /dev/null +++ b/tests/validate_simpletypes2_sup.py @@ -0,0 +1,1723 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Generated by generateDS.py. +# +# Command line options: +# ('--no-dates', '') +# ('--no-versions', '') +# ('--member-specs', 'list') +# ('-f', '') +# ('-o', 'tests/validate_simpletypes2_sup.py') +# ('-s', 'tests/validate_simpletypes2_sub.py') +# ('--super', 'validate_simpletypes2_sup') +# +# Command line arguments: +# tests/validate_simpletypes.xsd +# +# Command line: +# generateDS.py --no-dates --no-versions --member-specs="list" -f -o "tests/validate_simpletypes2_sup.py" -s "tests/validate_simpletypes2_sub.py" --super="validate_simpletypes2_sup" tests/validate_simpletypes.xsd +# +# Current working directory (os.getcwd()): +# generateds +# + +import sys +import re as re_ +import base64 +import datetime as datetime_ +import warnings as warnings_ +try: + from lxml import etree as etree_ +except ImportError: + from xml.etree import ElementTree as etree_ + + +Validate_simpletypes_ = True +if sys.version_info.major == 2: + BaseStrType_ = basestring +else: + BaseStrType_ = str + + +def parsexml_(infile, parser=None, **kwargs): + if parser is None: + # Use the lxml ElementTree compatible parser so that, e.g., + # we ignore comments. + try: + parser = etree_.ETCompatXMLParser() + except AttributeError: + # fallback to xml.etree + parser = etree_.XMLParser() + doc = etree_.parse(infile, parser=parser, **kwargs) + return doc + +# +# User methods +# +# Calls to the methods in these classes are generated by generateDS.py. +# You can replace these methods by re-implementing the following class +# in a module named generatedssuper.py. + +try: + from generatedssuper import GeneratedsSuper +except ImportError as exp: + + class GeneratedsSuper(object): + tzoff_pattern = re_.compile(r'(\+|-)((0\d|1[0-3]):[0-5]\d|14:00)$') + class _FixedOffsetTZ(datetime_.tzinfo): + def __init__(self, offset, name): + self.__offset = datetime_.timedelta(minutes=offset) + self.__name = name + def utcoffset(self, dt): + return self.__offset + def tzname(self, dt): + return self.__name + def dst(self, dt): + return None + def gds_format_string(self, input_data, input_name=''): + return input_data + def gds_validate_string(self, input_data, node=None, input_name=''): + if not input_data: + return '' + else: + return input_data + def gds_format_base64(self, input_data, input_name=''): + return base64.b64encode(input_data) + def gds_validate_base64(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer(self, input_data, input_name=''): + return '%d' % input_data + def gds_validate_integer(self, input_data, node=None, input_name=''): + return input_data + def gds_format_integer_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_integer_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + int(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of integers') + return values + def gds_format_float(self, input_data, input_name=''): + return ('%.15f' % input_data).rstrip('0') + def gds_validate_float(self, input_data, node=None, input_name=''): + return input_data + def gds_format_float_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_float_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of floats') + return values + def gds_format_double(self, input_data, input_name=''): + return '%e' % input_data + def gds_validate_double(self, input_data, node=None, input_name=''): + return input_data + def gds_format_double_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_double_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + try: + float(value) + except (TypeError, ValueError): + raise_parse_error(node, 'Requires sequence of doubles') + return values + def gds_format_boolean(self, input_data, input_name=''): + return ('%s' % input_data).lower() + def gds_validate_boolean(self, input_data, node=None, input_name=''): + return input_data + def gds_format_boolean_list(self, input_data, input_name=''): + return '%s' % ' '.join(input_data) + def gds_validate_boolean_list( + self, input_data, node=None, input_name=''): + values = input_data.split() + for value in values: + if value not in ('true', '1', 'false', '0', ): + raise_parse_error( + node, + 'Requires sequence of booleans ' + '("true", "1", "false", "0")') + return values + def gds_validate_datetime(self, input_data, node=None, input_name=''): + return input_data + def gds_format_datetime(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%04d-%02d-%02dT%02d:%02d:%02d.%s' % ( + input_data.year, + input_data.month, + input_data.day, + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + @classmethod + def gds_parse_datetime(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + time_parts = input_data.split('.') + if len(time_parts) > 1: + micro_seconds = int(float('0.' + time_parts[1]) * 1000000) + input_data = '%s.%s' % (time_parts[0], micro_seconds, ) + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime( + input_data, '%Y-%m-%dT%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt + def gds_validate_date(self, input_data, node=None, input_name=''): + return input_data + def gds_format_date(self, input_data, input_name=''): + _svalue = '%04d-%02d-%02d' % ( + input_data.year, + input_data.month, + input_data.day, + ) + try: + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format( + hours, minutes) + except AttributeError: + pass + return _svalue + @classmethod + def gds_parse_date(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + dt = datetime_.datetime.strptime(input_data, '%Y-%m-%d') + dt = dt.replace(tzinfo=tz) + return dt.date() + def gds_validate_time(self, input_data, node=None, input_name=''): + return input_data + def gds_format_time(self, input_data, input_name=''): + if input_data.microsecond == 0: + _svalue = '%02d:%02d:%02d' % ( + input_data.hour, + input_data.minute, + input_data.second, + ) + else: + _svalue = '%02d:%02d:%02d.%s' % ( + input_data.hour, + input_data.minute, + input_data.second, + ('%f' % (float(input_data.microsecond) / 1000000))[2:], + ) + if input_data.tzinfo is not None: + tzoff = input_data.tzinfo.utcoffset(input_data) + if tzoff is not None: + total_seconds = tzoff.seconds + (86400 * tzoff.days) + if total_seconds == 0: + _svalue += 'Z' + else: + if total_seconds < 0: + _svalue += '-' + total_seconds *= -1 + else: + _svalue += '+' + hours = total_seconds // 3600 + minutes = (total_seconds - (hours * 3600)) // 60 + _svalue += '{0:02d}:{1:02d}'.format(hours, minutes) + return _svalue + def gds_validate_simple_patterns(self, patterns, target): + # pat is a list of lists of strings/patterns. We should: + # - AND the outer elements + # - OR the inner elements + found1 = True + for patterns1 in patterns: + found2 = False + for patterns2 in patterns1: + if re_.search(patterns2, target) is not None: + found2 = True + break + if not found2: + found1 = False + break + return found1 + @classmethod + def gds_parse_time(cls, input_data): + tz = None + if input_data[-1] == 'Z': + tz = GeneratedsSuper._FixedOffsetTZ(0, 'UTC') + input_data = input_data[:-1] + else: + results = GeneratedsSuper.tzoff_pattern.search(input_data) + if results is not None: + tzoff_parts = results.group(2).split(':') + tzoff = int(tzoff_parts[0]) * 60 + int(tzoff_parts[1]) + if results.group(1) == '-': + tzoff *= -1 + tz = GeneratedsSuper._FixedOffsetTZ( + tzoff, results.group(0)) + input_data = input_data[:-6] + if len(input_data.split('.')) > 1: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S.%f') + else: + dt = datetime_.datetime.strptime(input_data, '%H:%M:%S') + dt = dt.replace(tzinfo=tz) + return dt.time() + def gds_str_lower(self, instring): + return instring.lower() + def get_path_(self, node): + path_list = [] + self.get_path_list_(node, path_list) + path_list.reverse() + path = '/'.join(path_list) + return path + Tag_strip_pattern_ = re_.compile(r'\{.*\}') + def get_path_list_(self, node, path_list): + if node is None: + return + tag = GeneratedsSuper.Tag_strip_pattern_.sub('', node.tag) + if tag: + path_list.append(tag) + self.get_path_list_(node.getparent(), path_list) + def get_class_obj_(self, node, default_class=None): + class_obj1 = default_class + if 'xsi' in node.nsmap: + classname = node.get('{%s}type' % node.nsmap['xsi']) + if classname is not None: + names = classname.split(':') + if len(names) == 2: + classname = names[1] + class_obj2 = globals().get(classname) + if class_obj2 is not None: + class_obj1 = class_obj2 + return class_obj1 + def gds_build_any(self, node, type_name=None): + return None + @classmethod + def gds_reverse_node_mapping(cls, mapping): + return dict(((v, k) for k, v in mapping.iteritems())) + @staticmethod + def gds_encode(instring): + if sys.version_info.major == 2: + return instring.encode(ExternalEncoding) + else: + return instring + @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 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): + self.name = name + self.data_type = data_type + self.container = container + def set_name(self, name): self.name = name + def get_name(self): return self.name + def set_data_type(self, data_type): self.data_type = data_type + def get_data_type_chain(self): return self.data_type + def get_data_type(self): + if isinstance(self.data_type, list): + if len(self.data_type) > 0: + return self.data_type[-1] + else: + return 'xs:string' + else: + return self.data_type + def set_container(self, container): self.container = container + def get_container(self): return self.container + + +def _cast(typ, value): + if typ is None or value is None: + return value + return typ(value) + +# +# Data representation classes. +# + + +class containerType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('sample1', 'simpleOneType', 1), + MemberSpec_('sample2_bad', 'simpleOneType', 1), + MemberSpec_('sample3_bad', 'simpleOneType', 1), + MemberSpec_('sample4_bad', 'simpleOneType', 1), + MemberSpec_('sample2', 'simpleTwoType', 1), + ] + subclass = None + superclass = None + def __init__(self, sample1=None, sample2_bad=None, sample3_bad=None, sample4_bad=None, sample2=None): + self.original_tagname_ = None + if sample1 is None: + self.sample1 = [] + else: + self.sample1 = sample1 + if sample2_bad is None: + self.sample2_bad = [] + else: + self.sample2_bad = sample2_bad + if sample3_bad is None: + self.sample3_bad = [] + else: + self.sample3_bad = sample3_bad + if sample4_bad is None: + self.sample4_bad = [] + else: + self.sample4_bad = sample4_bad + if sample2 is None: + self.sample2 = [] + else: + self.sample2 = sample2 + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, containerType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if containerType.subclass: + return containerType.subclass(*args_, **kwargs_) + else: + return containerType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_sample1(self): return self.sample1 + def set_sample1(self, sample1): self.sample1 = sample1 + def add_sample1(self, value): self.sample1.append(value) + def insert_sample1_at(self, index, value): self.sample1.insert(index, value) + def replace_sample1_at(self, index, value): self.sample1[index] = value + def get_sample2_bad(self): return self.sample2_bad + def set_sample2_bad(self, sample2_bad): self.sample2_bad = sample2_bad + def add_sample2_bad(self, value): self.sample2_bad.append(value) + def insert_sample2_bad_at(self, index, value): self.sample2_bad.insert(index, value) + def replace_sample2_bad_at(self, index, value): self.sample2_bad[index] = value + def get_sample3_bad(self): return self.sample3_bad + def set_sample3_bad(self, sample3_bad): self.sample3_bad = sample3_bad + def add_sample3_bad(self, value): self.sample3_bad.append(value) + def insert_sample3_bad_at(self, index, value): self.sample3_bad.insert(index, value) + def replace_sample3_bad_at(self, index, value): self.sample3_bad[index] = value + def get_sample4_bad(self): return self.sample4_bad + def set_sample4_bad(self, sample4_bad): self.sample4_bad = sample4_bad + def add_sample4_bad(self, value): self.sample4_bad.append(value) + def insert_sample4_bad_at(self, index, value): self.sample4_bad.insert(index, value) + def replace_sample4_bad_at(self, index, value): self.sample4_bad[index] = value + def get_sample2(self): return self.sample2 + def set_sample2(self, sample2): self.sample2 = sample2 + def add_sample2(self, value): self.sample2.append(value) + def insert_sample2_at(self, index, value): self.sample2.insert(index, value) + def replace_sample2_at(self, index, value): self.sample2[index] = value + def hasContent_(self): + if ( + self.sample1 or + self.sample2_bad or + self.sample3_bad or + self.sample4_bad or + self.sample2 + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='containerType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='containerType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='containerType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='containerType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='containerType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + for sample1_ in self.sample1: + sample1_.export(outfile, level, namespace_, name_='sample1', pretty_print=pretty_print) + for sample2_bad_ in self.sample2_bad: + sample2_bad_.export(outfile, level, namespace_, name_='sample2_bad', pretty_print=pretty_print) + for sample3_bad_ in self.sample3_bad: + sample3_bad_.export(outfile, level, namespace_, name_='sample3_bad', pretty_print=pretty_print) + for sample4_bad_ in self.sample4_bad: + sample4_bad_.export(outfile, level, namespace_, name_='sample4_bad', pretty_print=pretty_print) + for sample2_ in self.sample2: + sample2_.export(outfile, level, namespace_, name_='sample2', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'sample1': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample1.append(obj_) + obj_.original_tagname_ = 'sample1' + elif nodeName_ == 'sample2_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample2_bad.append(obj_) + obj_.original_tagname_ = 'sample2_bad' + elif nodeName_ == 'sample3_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample3_bad.append(obj_) + obj_.original_tagname_ = 'sample3_bad' + elif nodeName_ == 'sample4_bad': + obj_ = simpleOneType.factory() + obj_.build(child_) + self.sample4_bad.append(obj_) + obj_.original_tagname_ = 'sample4_bad' + elif nodeName_ == 'sample2': + obj_ = simpleTwoType.factory() + obj_.build(child_) + self.sample2.append(obj_) + obj_.original_tagname_ = 'sample2' +# end class containerType + + +class simpleOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('integer_range_1_value', ['integer_range_1_st', 'integer_range_2_st', 'xs:integer'], 0), + MemberSpec_('pattern_value', ['pattern_st', 'pattern_1_st', 'min_length_st', 'xs:string'], 0), + MemberSpec_('token_enum_value', ['token_enum_st', 'xs:NMTOKEN'], 0), + MemberSpec_('integer_range_incl_value', ['integer_range_incl_st', 'xs:integer'], 0), + MemberSpec_('integer_range_excl_value', ['integer_range_excl_st', 'xs:integer'], 0), + MemberSpec_('min_max_length_value', ['min_max_length_st', 'xs:string'], 0), + MemberSpec_('length_value', ['length_st', 'xs:string'], 0), + MemberSpec_('totalDigits_value', ['totalDigits_st', 'xs:decimal'], 0), + MemberSpec_('date_minincl_value', ['date_minincl_st', 'xs:date'], 0), + MemberSpec_('date_maxincl_value', ['date_maxincl_st', 'xs:date'], 0), + MemberSpec_('date_minexcl_value', ['date_minexcl_st', 'xs:date'], 0), + MemberSpec_('date_maxexcl_value', ['date_maxexcl_st', 'xs:date'], 0), + MemberSpec_('time_minincl_value', ['time_minincl_st', 'xs:time'], 0), + MemberSpec_('time_maxincl_value', ['time_maxincl_st', 'xs:time'], 0), + MemberSpec_('time_minexcl_value', ['time_minexcl_st', 'xs:time'], 0), + MemberSpec_('time_maxexcl_value', ['time_maxexcl_st', 'xs:time'], 0), + MemberSpec_('datetime_minincl_value', ['datetime_minincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxincl_value', ['datetime_maxincl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_minexcl_value', ['datetime_minexcl_st', 'xs:dateTime'], 0), + MemberSpec_('datetime_maxexcl_value', ['datetime_maxexcl_st', 'xs:dateTime'], 0), + MemberSpec_('vbar_pattern_value', ['vbar_pattern_st', 'xs:string'], 0), + MemberSpec_('anonymous_float_value', ['anonymous_float_valueType', 'xs:float'], 0), + MemberSpec_('primative_integer', 'xs:integer', 0), + MemberSpec_('primative_float', 'xs:float', 0), + ] + subclass = None + superclass = None + def __init__(self, integer_range_1_value=None, pattern_value=None, token_enum_value=None, integer_range_incl_value=None, integer_range_excl_value=None, min_max_length_value=None, length_value=None, totalDigits_value=None, date_minincl_value=None, date_maxincl_value=None, date_minexcl_value=None, date_maxexcl_value=None, time_minincl_value=None, time_maxincl_value=None, time_minexcl_value=None, time_maxexcl_value=None, datetime_minincl_value=None, datetime_maxincl_value=None, datetime_minexcl_value=None, datetime_maxexcl_value=None, vbar_pattern_value=None, anonymous_float_value=None, primative_integer=None, primative_float=None): + self.original_tagname_ = None + self.integer_range_1_value = integer_range_1_value + self.validate_integer_range_1_st(self.integer_range_1_value) + self.pattern_value = pattern_value + self.validate_pattern_st(self.pattern_value) + self.token_enum_value = token_enum_value + self.validate_token_enum_st(self.token_enum_value) + self.integer_range_incl_value = integer_range_incl_value + self.validate_integer_range_incl_st(self.integer_range_incl_value) + self.integer_range_excl_value = integer_range_excl_value + self.validate_integer_range_excl_st(self.integer_range_excl_value) + self.min_max_length_value = min_max_length_value + self.validate_min_max_length_st(self.min_max_length_value) + self.length_value = length_value + self.validate_length_st(self.length_value) + self.totalDigits_value = totalDigits_value + self.validate_totalDigits_st(self.totalDigits_value) + if isinstance(date_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minincl_value + self.date_minincl_value = initvalue_ + if isinstance(date_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxincl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxincl_value + self.date_maxincl_value = initvalue_ + if isinstance(date_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_minexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_minexcl_value + self.date_minexcl_value = initvalue_ + if isinstance(date_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(date_maxexcl_value, '%Y-%m-%d').date() + else: + initvalue_ = date_maxexcl_value + self.date_maxexcl_value = initvalue_ + if isinstance(time_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minincl_value + self.time_minincl_value = initvalue_ + if isinstance(time_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxincl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxincl_value + self.time_maxincl_value = initvalue_ + if isinstance(time_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_minexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_minexcl_value + self.time_minexcl_value = initvalue_ + if isinstance(time_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(time_maxexcl_value, '%H:%M:%S').time() + else: + initvalue_ = time_maxexcl_value + self.time_maxexcl_value = initvalue_ + if isinstance(datetime_minincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minincl_value + self.datetime_minincl_value = initvalue_ + if isinstance(datetime_maxincl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxincl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxincl_value + self.datetime_maxincl_value = initvalue_ + if isinstance(datetime_minexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_minexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_minexcl_value + self.datetime_minexcl_value = initvalue_ + if isinstance(datetime_maxexcl_value, BaseStrType_): + initvalue_ = datetime_.datetime.strptime(datetime_maxexcl_value, '%Y-%m-%dT%H:%M:%S') + else: + initvalue_ = datetime_maxexcl_value + self.datetime_maxexcl_value = initvalue_ + self.vbar_pattern_value = vbar_pattern_value + self.validate_vbar_pattern_st(self.vbar_pattern_value) + self.anonymous_float_value = anonymous_float_value + self.validate_anonymous_float_valueType(self.anonymous_float_value) + self.primative_integer = primative_integer + self.primative_float = primative_float + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleOneType.subclass: + return simpleOneType.subclass(*args_, **kwargs_) + else: + return simpleOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_integer_range_1_value(self): return self.integer_range_1_value + def set_integer_range_1_value(self, integer_range_1_value): self.integer_range_1_value = integer_range_1_value + def get_pattern_value(self): return self.pattern_value + def set_pattern_value(self, pattern_value): self.pattern_value = pattern_value + def get_token_enum_value(self): return self.token_enum_value + def set_token_enum_value(self, token_enum_value): self.token_enum_value = token_enum_value + def get_integer_range_incl_value(self): return self.integer_range_incl_value + def set_integer_range_incl_value(self, integer_range_incl_value): self.integer_range_incl_value = integer_range_incl_value + def get_integer_range_excl_value(self): return self.integer_range_excl_value + def set_integer_range_excl_value(self, integer_range_excl_value): self.integer_range_excl_value = integer_range_excl_value + def get_min_max_length_value(self): return self.min_max_length_value + def set_min_max_length_value(self, min_max_length_value): self.min_max_length_value = min_max_length_value + def get_length_value(self): return self.length_value + def set_length_value(self, length_value): self.length_value = length_value + def get_totalDigits_value(self): return self.totalDigits_value + def set_totalDigits_value(self, totalDigits_value): self.totalDigits_value = totalDigits_value + def get_date_minincl_value(self): return self.date_minincl_value + def set_date_minincl_value(self, date_minincl_value): self.date_minincl_value = date_minincl_value + def get_date_maxincl_value(self): return self.date_maxincl_value + def set_date_maxincl_value(self, date_maxincl_value): self.date_maxincl_value = date_maxincl_value + def get_date_minexcl_value(self): return self.date_minexcl_value + def set_date_minexcl_value(self, date_minexcl_value): self.date_minexcl_value = date_minexcl_value + def get_date_maxexcl_value(self): return self.date_maxexcl_value + def set_date_maxexcl_value(self, date_maxexcl_value): self.date_maxexcl_value = date_maxexcl_value + def get_time_minincl_value(self): return self.time_minincl_value + def set_time_minincl_value(self, time_minincl_value): self.time_minincl_value = time_minincl_value + def get_time_maxincl_value(self): return self.time_maxincl_value + def set_time_maxincl_value(self, time_maxincl_value): self.time_maxincl_value = time_maxincl_value + def get_time_minexcl_value(self): return self.time_minexcl_value + def set_time_minexcl_value(self, time_minexcl_value): self.time_minexcl_value = time_minexcl_value + def get_time_maxexcl_value(self): return self.time_maxexcl_value + def set_time_maxexcl_value(self, time_maxexcl_value): self.time_maxexcl_value = time_maxexcl_value + def get_datetime_minincl_value(self): return self.datetime_minincl_value + def set_datetime_minincl_value(self, datetime_minincl_value): self.datetime_minincl_value = datetime_minincl_value + def get_datetime_maxincl_value(self): return self.datetime_maxincl_value + def set_datetime_maxincl_value(self, datetime_maxincl_value): self.datetime_maxincl_value = datetime_maxincl_value + def get_datetime_minexcl_value(self): return self.datetime_minexcl_value + def set_datetime_minexcl_value(self, datetime_minexcl_value): self.datetime_minexcl_value = datetime_minexcl_value + def get_datetime_maxexcl_value(self): return self.datetime_maxexcl_value + def set_datetime_maxexcl_value(self, datetime_maxexcl_value): self.datetime_maxexcl_value = datetime_maxexcl_value + def get_vbar_pattern_value(self): return self.vbar_pattern_value + def set_vbar_pattern_value(self, vbar_pattern_value): self.vbar_pattern_value = vbar_pattern_value + def get_anonymous_float_value(self): return self.anonymous_float_value + def set_anonymous_float_value(self, anonymous_float_value): self.anonymous_float_value = anonymous_float_value + def get_primative_integer(self): return self.primative_integer + def set_primative_integer(self, primative_integer): self.primative_integer = primative_integer + def get_primative_float(self): return self.primative_float + def set_primative_float(self, primative_float): self.primative_float = primative_float + def validate_integer_range_1_st(self, value): + # Validate type integer_range_1_st, a restriction on integer_range_2_st. + if value is not None and Validate_simpletypes_: + if value <= 4: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} ) + if value >= 8: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} ) + def validate_pattern_st(self, value): + # Validate type pattern_st, a restriction on pattern_1_st. + if value is not None and Validate_simpletypes_: + if len(str(value)) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} ) + if not self.gds_validate_simple_patterns( + self.validate_pattern_st_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, )) + validate_pattern_st_patterns_ = [['^aaa.*zzz$', '^bbb.*xxx$'], ['^.*123.*$', '^.*456.*$']] + def validate_token_enum_st(self, value): + # Validate type token_enum_st, a restriction on xs:NMTOKEN. + if value is not None and Validate_simpletypes_: + value = str(value) + enumerations = ['float', 'int', 'Name', 'token'] + enumeration_respectee = False + for enum in enumerations: + if value == enum: + enumeration_respectee = True + break + if not enumeration_respectee: + warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} ) + def validate_integer_range_incl_st(self, value): + # Validate type integer_range_incl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value < -5: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} ) + if value > 10: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} ) + def validate_integer_range_excl_st(self, value): + # Validate type integer_range_excl_st, a restriction on xs:integer. + if value is not None and Validate_simpletypes_: + if value <= -5: + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} ) + if value >= 10: + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_excl_st' % {"value" : value} ) + def validate_min_max_length_st(self, value): + # Validate type min_max_length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 20: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + if len(value) < 10: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} ) + def validate_length_st(self, value): + # Validate type length_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) != 10: + warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} ) + def validate_totalDigits_st(self, value): + # Validate type totalDigits_st, a restriction on xs:decimal. + if value is not None and Validate_simpletypes_: + if len(str(value)) >= 15: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on totalDigits_st' % {"value" : value} ) + def validate_date_minincl_st(self, value): + # Validate type date_minincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} ) + def validate_date_maxincl_st(self, value): + # Validate type date_maxincl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} ) + def validate_date_minexcl_st(self, value): + # Validate type date_minexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_date('2015-06-01'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} ) + def validate_date_maxexcl_st(self, value): + # Validate type date_maxexcl_st, a restriction on xs:date. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_date('2015-10-31'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} ) + def validate_time_minincl_st(self, value): + # Validate type time_minincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} ) + def validate_time_maxincl_st(self, value): + # Validate type time_maxincl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} ) + def validate_time_minexcl_st(self, value): + # Validate type time_minexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_time('14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} ) + def validate_time_maxexcl_st(self, value): + # Validate type time_maxexcl_st, a restriction on xs:time. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_time('16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} ) + def validate_datetime_minincl_st(self, value): + # Validate type datetime_minincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value < self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} ) + def validate_datetime_maxincl_st(self, value): + # Validate type datetime_maxincl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value > self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} ) + def validate_datetime_minexcl_st(self, value): + # Validate type datetime_minexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value <= self.gds_parse_datetime('2015-06-01T14:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} ) + def validate_datetime_maxexcl_st(self, value): + # Validate type datetime_maxexcl_st, a restriction on xs:dateTime. + if value is not None and Validate_simpletypes_: + if value >= self.gds_parse_datetime('2015-10-31T16:20:10'): + warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} ) + def validate_vbar_pattern_st(self, value): + # Validate type vbar_pattern_st, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if not self.gds_validate_simple_patterns( + self.validate_vbar_pattern_st_patterns_, value): + warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, )) + validate_vbar_pattern_st_patterns_ = [['^abcd$|^ef\\|gh$']] + def validate_anonymous_float_valueType(self, value): + # Validate type anonymous_float_valueType, a restriction on xs:float. + if value is not None and Validate_simpletypes_: + if value < 1.1: + warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + if value > 4.4: + warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} ) + def hasContent_(self): + if ( + self.integer_range_1_value is not None or + self.pattern_value is not None or + self.token_enum_value is not None or + self.integer_range_incl_value is not None or + self.integer_range_excl_value is not None or + self.min_max_length_value is not None or + self.length_value is not None or + self.totalDigits_value is not None or + self.date_minincl_value is not None or + self.date_maxincl_value is not None or + self.date_minexcl_value is not None or + self.date_maxexcl_value is not None or + self.time_minincl_value is not None or + self.time_maxincl_value is not None or + self.time_minexcl_value is not None or + self.time_maxexcl_value is not None or + self.datetime_minincl_value is not None or + self.datetime_maxincl_value is not None or + self.datetime_minexcl_value is not None or + self.datetime_maxexcl_value is not None or + self.vbar_pattern_value is not None or + self.anonymous_float_value is not None or + self.primative_integer is not None or + self.primative_float is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleOneType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleOneType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.integer_range_1_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_1_value>%s</%sinteger_range_1_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_1_value, input_name='integer_range_1_value'), namespace_, eol_)) + if self.pattern_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%spattern_value>%s</%spattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.pattern_value), input_name='pattern_value')), namespace_, eol_)) + if self.token_enum_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stoken_enum_value>%s</%stoken_enum_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.token_enum_value), input_name='token_enum_value')), namespace_, eol_)) + if self.integer_range_incl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_incl_value>%s</%sinteger_range_incl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_incl_value, input_name='integer_range_incl_value'), namespace_, eol_)) + if self.integer_range_excl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sinteger_range_excl_value>%s</%sinteger_range_excl_value>%s' % (namespace_, self.gds_format_integer(self.integer_range_excl_value, input_name='integer_range_excl_value'), namespace_, eol_)) + if self.min_max_length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%smin_max_length_value>%s</%smin_max_length_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.min_max_length_value), input_name='min_max_length_value')), namespace_, eol_)) + if self.length_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%slength_value>%s</%slength_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.length_value), input_name='length_value')), namespace_, eol_)) + if self.totalDigits_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stotalDigits_value>%s</%stotalDigits_value>%s' % (namespace_, self.gds_format_float(self.totalDigits_value, input_name='totalDigits_value'), namespace_, eol_)) + if self.date_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minincl_value>%s</%sdate_minincl_value>%s' % (namespace_, self.gds_format_date(self.date_minincl_value, input_name='date_minincl_value'), namespace_, eol_)) + if self.date_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxincl_value>%s</%sdate_maxincl_value>%s' % (namespace_, self.gds_format_date(self.date_maxincl_value, input_name='date_maxincl_value'), namespace_, eol_)) + if self.date_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_minexcl_value>%s</%sdate_minexcl_value>%s' % (namespace_, self.gds_format_date(self.date_minexcl_value, input_name='date_minexcl_value'), namespace_, eol_)) + if self.date_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdate_maxexcl_value>%s</%sdate_maxexcl_value>%s' % (namespace_, self.gds_format_date(self.date_maxexcl_value, input_name='date_maxexcl_value'), namespace_, eol_)) + if self.time_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minincl_value>%s</%stime_minincl_value>%s' % (namespace_, self.gds_format_time(self.time_minincl_value, input_name='time_minincl_value'), namespace_, eol_)) + if self.time_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxincl_value>%s</%stime_maxincl_value>%s' % (namespace_, self.gds_format_time(self.time_maxincl_value, input_name='time_maxincl_value'), namespace_, eol_)) + if self.time_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_minexcl_value>%s</%stime_minexcl_value>%s' % (namespace_, self.gds_format_time(self.time_minexcl_value, input_name='time_minexcl_value'), namespace_, eol_)) + if self.time_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%stime_maxexcl_value>%s</%stime_maxexcl_value>%s' % (namespace_, self.gds_format_time(self.time_maxexcl_value, input_name='time_maxexcl_value'), namespace_, eol_)) + if self.datetime_minincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minincl_value>%s</%sdatetime_minincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minincl_value, input_name='datetime_minincl_value'), namespace_, eol_)) + if self.datetime_maxincl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxincl_value>%s</%sdatetime_maxincl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxincl_value, input_name='datetime_maxincl_value'), namespace_, eol_)) + if self.datetime_minexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_minexcl_value>%s</%sdatetime_minexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_minexcl_value, input_name='datetime_minexcl_value'), namespace_, eol_)) + if self.datetime_maxexcl_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sdatetime_maxexcl_value>%s</%sdatetime_maxexcl_value>%s' % (namespace_, self.gds_format_datetime(self.datetime_maxexcl_value, input_name='datetime_maxexcl_value'), namespace_, eol_)) + if self.vbar_pattern_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%svbar_pattern_value>%s</%svbar_pattern_value>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.vbar_pattern_value), input_name='vbar_pattern_value')), namespace_, eol_)) + if self.anonymous_float_value is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sanonymous_float_value>%s</%sanonymous_float_value>%s' % (namespace_, self.gds_format_float(self.anonymous_float_value, input_name='anonymous_float_value'), namespace_, eol_)) + if self.primative_integer is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_integer>%s</%sprimative_integer>%s' % (namespace_, self.gds_format_integer(self.primative_integer, input_name='primative_integer'), namespace_, eol_)) + if self.primative_float is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%sprimative_float>%s</%sprimative_float>%s' % (namespace_, self.gds_format_float(self.primative_float, input_name='primative_float'), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'integer_range_1_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_1_value') + self.integer_range_1_value = ival_ + # validate type integer_range_1_st + self.validate_integer_range_1_st(self.integer_range_1_value) + elif nodeName_ == 'pattern_value': + pattern_value_ = child_.text + pattern_value_ = self.gds_validate_string(pattern_value_, node, 'pattern_value') + self.pattern_value = pattern_value_ + # validate type pattern_st + self.validate_pattern_st(self.pattern_value) + elif nodeName_ == 'token_enum_value': + token_enum_value_ = child_.text + token_enum_value_ = self.gds_validate_string(token_enum_value_, node, 'token_enum_value') + self.token_enum_value = token_enum_value_ + # validate type token_enum_st + self.validate_token_enum_st(self.token_enum_value) + elif nodeName_ == 'integer_range_incl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_incl_value') + self.integer_range_incl_value = ival_ + # validate type integer_range_incl_st + self.validate_integer_range_incl_st(self.integer_range_incl_value) + elif nodeName_ == 'integer_range_excl_value': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'integer_range_excl_value') + self.integer_range_excl_value = ival_ + # validate type integer_range_excl_st + self.validate_integer_range_excl_st(self.integer_range_excl_value) + elif nodeName_ == 'min_max_length_value': + min_max_length_value_ = child_.text + min_max_length_value_ = self.gds_validate_string(min_max_length_value_, node, 'min_max_length_value') + self.min_max_length_value = min_max_length_value_ + # validate type min_max_length_st + self.validate_min_max_length_st(self.min_max_length_value) + elif nodeName_ == 'length_value': + length_value_ = child_.text + length_value_ = self.gds_validate_string(length_value_, node, 'length_value') + self.length_value = length_value_ + # validate type length_st + self.validate_length_st(self.length_value) + elif nodeName_ == 'totalDigits_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'totalDigits_value') + self.totalDigits_value = fval_ + # validate type totalDigits_st + self.validate_totalDigits_st(self.totalDigits_value) + elif nodeName_ == 'date_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minincl_value = dval_ + # validate type date_minincl_st + self.validate_date_minincl_st(self.date_minincl_value) + elif nodeName_ == 'date_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxincl_value = dval_ + # validate type date_maxincl_st + self.validate_date_maxincl_st(self.date_maxincl_value) + elif nodeName_ == 'date_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_minexcl_value = dval_ + # validate type date_minexcl_st + self.validate_date_minexcl_st(self.date_minexcl_value) + elif nodeName_ == 'date_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_date(sval_) + self.date_maxexcl_value = dval_ + # validate type date_maxexcl_st + self.validate_date_maxexcl_st(self.date_maxexcl_value) + elif nodeName_ == 'time_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minincl_value = dval_ + # validate type time_minincl_st + self.validate_time_minincl_st(self.time_minincl_value) + elif nodeName_ == 'time_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxincl_value = dval_ + # validate type time_maxincl_st + self.validate_time_maxincl_st(self.time_maxincl_value) + elif nodeName_ == 'time_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_minexcl_value = dval_ + # validate type time_minexcl_st + self.validate_time_minexcl_st(self.time_minexcl_value) + elif nodeName_ == 'time_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_time(sval_) + self.time_maxexcl_value = dval_ + # validate type time_maxexcl_st + self.validate_time_maxexcl_st(self.time_maxexcl_value) + elif nodeName_ == 'datetime_minincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minincl_value = dval_ + # validate type datetime_minincl_st + self.validate_datetime_minincl_st(self.datetime_minincl_value) + elif nodeName_ == 'datetime_maxincl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxincl_value = dval_ + # validate type datetime_maxincl_st + self.validate_datetime_maxincl_st(self.datetime_maxincl_value) + elif nodeName_ == 'datetime_minexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_minexcl_value = dval_ + # validate type datetime_minexcl_st + self.validate_datetime_minexcl_st(self.datetime_minexcl_value) + elif nodeName_ == 'datetime_maxexcl_value': + sval_ = child_.text + dval_ = self.gds_parse_datetime(sval_) + self.datetime_maxexcl_value = dval_ + # validate type datetime_maxexcl_st + self.validate_datetime_maxexcl_st(self.datetime_maxexcl_value) + elif nodeName_ == 'vbar_pattern_value': + vbar_pattern_value_ = child_.text + vbar_pattern_value_ = self.gds_validate_string(vbar_pattern_value_, node, 'vbar_pattern_value') + self.vbar_pattern_value = vbar_pattern_value_ + # validate type vbar_pattern_st + self.validate_vbar_pattern_st(self.vbar_pattern_value) + elif nodeName_ == 'anonymous_float_value': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'anonymous_float_value') + self.anonymous_float_value = fval_ + # validate type anonymous_float_valueType + self.validate_anonymous_float_valueType(self.anonymous_float_value) + elif nodeName_ == 'primative_integer': + sval_ = child_.text + try: + ival_ = int(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires integer: %s' % exp) + ival_ = self.gds_validate_integer(ival_, node, 'primative_integer') + self.primative_integer = ival_ + elif nodeName_ == 'primative_float': + sval_ = child_.text + try: + fval_ = float(sval_) + except (TypeError, ValueError) as exp: + raise_parse_error(child_, 'requires float or double: %s' % exp) + fval_ = self.gds_validate_float(fval_, node, 'primative_float') + self.primative_float = fval_ +# end class simpleOneType + + +class simpleTwoType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementOne', 'simpleTwoElementOneType', 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementOne=None): + self.original_tagname_ = None + self.simpleTwoElementOne = simpleTwoElementOne + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoType.subclass: + return simpleTwoType.subclass(*args_, **kwargs_) + else: + return simpleTwoType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementOne(self): return self.simpleTwoElementOne + def set_simpleTwoElementOne(self, simpleTwoElementOne): self.simpleTwoElementOne = simpleTwoElementOne + def hasContent_(self): + if ( + self.simpleTwoElementOne is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementOne is not None: + self.simpleTwoElementOne.export(outfile, level, namespace_, name_='simpleTwoElementOne', pretty_print=pretty_print) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'simpleTwoElementOne': + obj_ = simpleTwoElementOneType.factory() + obj_.build(child_) + self.simpleTwoElementOne = obj_ + obj_.original_tagname_ = 'simpleTwoElementOne' +# end class simpleTwoType + + +class simpleTwoElementOneType(GeneratedsSuper): + member_data_items_ = [ + MemberSpec_('simpleTwoElementTwo', ['simpleTwoElementTwoType', 'xs:string'], 0), + ] + subclass = None + superclass = None + def __init__(self, simpleTwoElementTwo=None): + self.original_tagname_ = None + self.simpleTwoElementTwo = simpleTwoElementTwo + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) + def factory(*args_, **kwargs_): + if CurrentSubclassModule_ is not None: + subclass = getSubclassFromModule_( + CurrentSubclassModule_, simpleTwoElementOneType) + if subclass is not None: + return subclass(*args_, **kwargs_) + if simpleTwoElementOneType.subclass: + return simpleTwoElementOneType.subclass(*args_, **kwargs_) + else: + return simpleTwoElementOneType(*args_, **kwargs_) + factory = staticmethod(factory) + def get_simpleTwoElementTwo(self): return self.simpleTwoElementTwo + def set_simpleTwoElementTwo(self, simpleTwoElementTwo): self.simpleTwoElementTwo = simpleTwoElementTwo + def validate_simpleTwoElementTwoType(self, value): + # Validate type simpleTwoElementTwoType, a restriction on xs:string. + if value is not None and Validate_simpletypes_: + if len(value) > 24: + warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + if len(value) < 12: + warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} ) + def hasContent_(self): + if ( + self.simpleTwoElementTwo is not None + ): + return True + else: + return False + def export(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', namespacedef_='', pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.original_tagname_ is not None: + name_ = self.original_tagname_ + showIndent(outfile, level, pretty_print) + outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', )) + already_processed = set() + self.exportAttributes(outfile, level, already_processed, namespace_, name_='simpleTwoElementOneType') + if self.hasContent_(): + outfile.write('>%s' % (eol_, )) + self.exportChildren(outfile, level + 1, namespace_='', name_='simpleTwoElementOneType', pretty_print=pretty_print) + showIndent(outfile, level, pretty_print) + outfile.write('</%s%s>%s' % (namespace_, name_, eol_)) + else: + outfile.write('/>%s' % (eol_, )) + def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='simpleTwoElementOneType'): + pass + def exportChildren(self, outfile, level, namespace_='', name_='simpleTwoElementOneType', fromsubclass_=False, pretty_print=True): + if pretty_print: + eol_ = '\n' + else: + eol_ = '' + if self.simpleTwoElementTwo is not None: + showIndent(outfile, level, pretty_print) + outfile.write('<%ssimpleTwoElementTwo>%s</%ssimpleTwoElementTwo>%s' % (namespace_, self.gds_encode(self.gds_format_string(quote_xml(self.simpleTwoElementTwo), input_name='simpleTwoElementTwo')), namespace_, eol_)) + def build(self, node): + already_processed = set() + self.buildAttributes(node, node.attrib, already_processed) + for child in node: + nodeName_ = Tag_pattern_.match(child.tag).groups()[-1] + self.buildChildren(child, node, nodeName_) + return self + def buildAttributes(self, node, attrs, already_processed): + pass + def buildChildren(self, child_, node, nodeName_, fromsubclass_=False): + if nodeName_ == 'simpleTwoElementTwo': + simpleTwoElementTwo_ = child_.text + simpleTwoElementTwo_ = self.gds_validate_string(simpleTwoElementTwo_, node, 'simpleTwoElementTwo') + self.simpleTwoElementTwo = simpleTwoElementTwo_ + # validate type simpleTwoElementTwoType + self.validate_simpleTwoElementTwoType(self.simpleTwoElementTwo) +# end class simpleTwoElementOneType + + +GDSClassesMapping = { + 'container': containerType, + 'sample1': simpleOneType, + 'sample2': simpleTwoType, + 'sample2_bad': simpleOneType, + 'sample3_bad': simpleOneType, + 'sample4_bad': simpleOneType, + 'simpleTwoElementOne': simpleTwoElementOneType, + 'simpleTypeData': simpleTwoType, +} + + +USAGE_TEXT = """ +Usage: python <Parser>.py [ -s ] <in_xml_file> +""" + + +def usage(): + print(USAGE_TEXT) + sys.exit(1) + + +def get_root_tag(node): + tag = Tag_pattern_.match(node.tag).groups()[-1] + rootClass = GDSClassesMapping.get(tag) + if rootClass is None: + rootClass = globals().get(tag) + return tag, rootClass + + +def parse(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='', + pretty_print=True) + return rootObj + + +def parseEtree(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + mapping = {} + rootElement = rootObj.to_etree(None, name_=rootTag, mapping_=mapping) + reverse_mapping = rootObj.gds_reverse_node_mapping(mapping) + if not silence: + content = etree_.tostring( + rootElement, pretty_print=True, + xml_declaration=True, encoding="utf-8") + sys.stdout.write(content) + sys.stdout.write('\n') + return rootObj, rootElement, mapping, reverse_mapping + + +def parseString(inString, silence=False): + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer + parser = None + doc = parsexml_(IOBuffer(inString), parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('<?xml version="1.0" ?>\n') + rootObj.export( + sys.stdout, 0, name_=rootTag, + namespacedef_='') + return rootObj + + +def parseLiteral(inFileName, silence=False): + parser = None + doc = parsexml_(inFileName, parser) + rootNode = doc.getroot() + rootTag, rootClass = get_root_tag(rootNode) + if rootClass is None: + rootTag = 'containerType' + rootClass = containerType + rootObj = rootClass.factory() + rootObj.build(rootNode) + # Enable Python to collect the space used by the DOM. + doc = None + if not silence: + sys.stdout.write('#from validate_simpletypes2_sup import *\n\n') + sys.stdout.write('import validate_simpletypes2_sup as model_\n\n') + sys.stdout.write('rootObj = model_.rootClass(\n') + rootObj.exportLiteral(sys.stdout, 0, name_=rootTag) + sys.stdout.write(')\n') + return rootObj + + +def main(): + args = sys.argv[1:] + if len(args) == 1: + parse(args[0]) + else: + usage() + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() + + +__all__ = [ + "containerType", + "simpleOneType", + "simpleTwoElementOneType", + "simpleTwoType" +] diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html index e2ffb83..d4945ec 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.12: http://docutils.sourceforge.net/" /> +<meta name="generator" content="Docutils 0.13.2a: http://docutils.sourceforge.net/" /> <title>generateDS -- Introduction and Tutorial</title> <meta name="author" content="Dave Kuhlman" /> <style type="text/css"> @@ -187,9 +187,12 @@ div.warning p.admonition-title { font-family: sans-serif } tt.docutils { - background-color: #eeeeee; + background-color: #dddddd; } +ul.auto-toc { + list-style-type: none } + </style> </head> <body> @@ -203,8 +206,8 @@ tt.docutils { <td>Dave Kuhlman</td></tr> <tr><th class="docinfo-name">Address:</th> <td><pre class="address"> -<a class="first reference external" href="mailto:dkuhlman@rexx.com">dkuhlman@rexx.com</a> -<a class="last reference external" href="http://www.rexx.com/~dkuhlman">http://www.rexx.com/~dkuhlman</a> +dkuhlman (at) davekuhlman (dot) org +<a class="last reference external" href="http://www.davekuhlman.org">http://www.davekuhlman.org</a> </pre> </td></tr> </tbody> @@ -216,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.11a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -225,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">August 16, 2013</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">January 16, 2017</td> </tr> </tbody> </table> @@ -298,7 +301,7 @@ tutorial/Code/ </li> <li><p class="first">You can find additional information about <tt class="docutils literal">generateDS.py</tt> here:</p> <blockquote> -<p><a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p> +<p><a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p> </blockquote> <p>That documentation is also included in the distribution.</p> </li> @@ -465,7 +468,7 @@ more command line options used by <tt class="docutils literal">generateDS.py</tt $ python generateDS.py --help </pre> <p>and by reading the document -<a class="reference external" href="http://www.rexx.com/~dkuhlman/generateDS.html">http://www.rexx.com/~dkuhlman/generateDS.html</a></p> +<a class="reference external" href="http://www.davekuhlman.org/generateDS.html">http://www.davekuhlman.org/generateDS.html</a></p> <dl class="docutils"> <dt>o</dt> <dd>Generate the superclass module. This is the module that @@ -1207,6 +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-01-17 00:01 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 0ad7680..560634e 100644 --- a/tutorial/generateds_tutorial.txt +++ b/tutorial/generateds_tutorial.txt @@ -3,15 +3,15 @@ generateDS -- Introduction and Tutorial ====================================================== :author: Dave Kuhlman -:address: dkuhlman@rexx.com - http://www.rexx.com/~dkuhlman +:address: dkuhlman (at) davekuhlman (dot) org + http://www.davekuhlman.org .. Do not modify the following version comments. They are used by updateversion.py. .. version -:revision: 2.11b +:revision: 2.24b .. version diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip index 724d78077fb3ad5b7e3ff90edf6a1b6dd48e5125..09649363daf7cb1b00b3b67705d890bd0aac6ec8 100644 GIT binary patch delta 22964 zcmZ6SV{m2Py7hOkW81cE+qP}HqaE9J$F^<T=-77BourfQ`#<Nr_dQkj!<x0~H|JRO zRINFm53|Nt{sjN~2~MaY4*`h*003YBUbbGcViz<_df)&65)c5u1`wnUbYX%#d^|KY zU;z+GtsFYQb`Bj+A9w&5<OKu(@b4jCUC?=l1!4D#z7tX=D31w-4R><c3N{A-%qhzE z<%<@APnQ%Y?!uW&WTyR|x+)%N)1;8BoS3NG(eYh(4h%vn|M3pmfy;&1jY40+3qu4N zUYSze;|KS5u>r>%t;`*ey2GK8Fu6Z{AF;<lWgDux-O!(GahLjMppKF+yv`BKm^ei5 zN8W^2k04Rvm3T_Zu@r45IZT=<$#plZTjFB!FAtAHzyeO{i@6OB%SkEZL)8SVhXf5Q z;|(=Ui6yR5mtCI5nBbQ?G3xhx2mMa14esA-Rjcg}bl*38Ih>0?<N7?m!L5Iy%?EPk z+1un5^S^Y3H_Two&jAgL4R=3FQq6Lhf+^L*x-yzHI4wAqEsB|l%iuGI%-EK0S-~=K z%$(fKcW4Fngoi@eanRcBd2LTv(rr{$cRqL-9icP1D~KuGcPa?lOqc(<q|Er}I63C| zvmsejE9jp2vU)axw)=7u!uM_uHu+aZ&=em6%oZR~l_B=08^d?O&k4uiLYRGV1dT!- z`B<@U3|!niyMvgPN#X*9ghbc`kv`&Us?CK_bwi~I-pL7J4PSKnhT|Dc;HM1&(0b?? zfcG1;oePBl#mI>9d{jT-tgpKEQrqoKP*q2Z!|c7{rUYt1b&5vwSV3V3GY^Zri2|-% zFf)S@%9h6As8ec8ep=xb5+xY+_Z4~rNiEfUVdv;W7ryWalMD`eR=>a!PYZ2ai6Dp* zlMx1vbEpuitptuW?Vru%Y}{zX`Slyyc+UF6bIZ3Tt7+lK|GF8l^y_@nauzJzkKJ#b zX6~~61Fj;E`M>*<Du_j{Sefx%k{JNVNF4yD08JVN=$w{0{oftAD)8mLE#)<E+_1^k z7waLORBXZD&aiU)!>M>(Rv>;yzI^48A-XIIJxH=Kh^D;nZ{NK+woVX<B-^~g0(**# z*{|E}Utf~OeStFQt_^VL*Eee>Y<&1I>2sbK)*TH{nq4s8kw>p>K`yV#_ksR?&odLh z%yfq%62JdB9eLGfg_$@WFzO{t+~4g*7Y2Dhe?fzxj4G0{qh|tCsg56i6GNFbGR%Cs z2^iIBm8^})V0Rqn{>2d{sfBfFXC7JJ=8c)Q0Z^|52U%Jfy#{6X`aFhsBfBhFlA*e$ zBT9V1nbP16eb-1=1Chk3eCdt-YJhU~)T*vUa9;1ii{c&d<D^*==atH09`mP#FPYZP zz%YlVOs(?e?9|Mrv#5f1e&!c!nC4+Ua^UE~$)AxoZA!QaO<vMu)rJ=_j%U+Mz;(dQ zjLy-Ey4qDHLm2ba!s4qwlR+hIk=fC3(P2ofVP$qUC9iSY0!c~k(Ldg=vB_GFM`pR@ z)2I%6-ZGw#1A;>yjUju{K)BFD3extE!oeu;0C!rWyf0b*ucDlZWQ=`qKeE?XmCp(~ zvh1m%H>}0J$bnuHnmrOX@yC3*J5Ah$Lv#oN#CW=+G5H|g)aRaUF>PHB+J3!7;ZL7> zbVGv}UGT(5Pyk)*Hct=6Io()CSDXsT?e78T;LirjBCNlPHb44|1-pEH9_3o!ii`bD zI-$!1s)YYaloLdDB@7~^k%?nbb4MJ7HZzV<u#Q=0q8=7@ni+;l9P{Vm<=@6ehCrBi zviFUo$J}QMzG2UoXr)kkuOf#PUzaR}^M#Oq`WdpM4oZ(<XC2z_<cVg-WMbTb6&f?_ zO8WW*=AjwvcT+v{8%IM;QmE;<dJ?^DgAg?Y5)4ZA1%N^K!@i@}z^+lLM>h>#nj(>j zF$NVs((D_OF!sYUWMIMYLQ4i@e!k(Pb&KGGTQ`{hpOon(v!?X-#?`LVs?>2kErriq zaEgNbFHqGM;k<|LRqNi7jT%U3ia2aZmVh(m<Cn>|ez4c6CY7=@$R{(1lQE~H9!l4D z3y8h2!`G|1r_1rD7Q>nEo|(e?O?;JTU^^>QMtm3&r(RzX*7_!^P&8(1*XqZJW=geL z6mSHv_uFP}_PIYMv3yEf?d=baN#vvg5(RMXbU+=;dp?-br%!4+{mf{LV6PI4(~iqX z_jzAO`)vl36#e02K%?)sW*ORL=N0{pOkRS^<&rv#Lv%;vjmj{jt~}+g7?iVoyt$a- zq~|8b8<#3^tKtQdJkNFW3FzH>M;oNI>(4#L^oGTp;fW+_>f*`R)ya+F3da_RHWvyb zcc3oct)<Z9*J@P<K<+CggyZuw1L)x^u3~S2xj?zV_=Ws4U5!!OXFL#vk%tB3NlPNO z#JGo^X@41gFU<ztOAAf_=WA?6qdt%i5%z)T@>2`*Qx7woDFV_A*P0T9Q_;mFce!UJ z!WF1F&O4wpMHbuA9tnJc`TJBAb3}*P4Wc7O!7%K?#*d2K@k3Y38;>M43qTIVs@Lxz z|IqIkiT5pd-6ni&rl*g;+1POP*pErD9Mg)+;@9s$A8B{;^51eRql&S)bDKn*aXTq~ zOo*?Q<ShoR|43AE8NytsqvR@7z>$r_k!`7xYScFWz&N^Tn&V-~iV$|8WK}K=24O%g zC<eDeph|m!7m=Zl8`Tnryu-=kU#o+&yZ(-b3H^EwJB4(I=Y^QMWZLmn+IY&|rZ zSQ5d|EIuGL0wP1Qd8|ifS-4;=JujXSaHSU!92MM<n$)_7>0qt=bHd?0J|fsM<tObj zI@xkQvf=&l6c4o@agu20(pZVoK=d4OUUerGL9!kbE@ROQ%94=OYs3<GLczTZoheSl zpG=~QSa7os2Cxs3)j>BNBrKFRmZd}#3X0Gxw+r>-XyK5HBf@j9<7JpxtgZ;pP6v1V zh-g|NqKQXidTH{&;`|^%NnleIzl}tUnx)jxoLU`_2T>JQC2>nn;~QiM$P7E-=@o`z zT+FNIGPFLa(U-w2U4k^`a}Rt(-*+sW_>j_DPR{;)(7FrSPme}Hkwl9u0b;~YDZ3zX z{`+jy_>dCWU-MLO-riJ%zf>)9SoV`x5l5d6PjloL?~&w#2Iuy0NZx9Pb^4S_XB8rm zE!4vu9OSMoaq%uxIpB`~&>Zbm-cqbvxG!cVnVOZ+D7z&j!*_H4k!q-J>i&U#RN|wq z>A3Efn@J-oiSx$zYH^JnIh;7$3Rm18+>9;F6TTdrC0HH5D68^tqeRYoXn&C5s6ouy z?7T|Nr$(!x(+;r#eM#%5-NZ-HV5;F?zQu<^qyll$)Z;qO<qwH)K##77M&uCiMsi@4 z!@-zYKCa-jGKEAIIp(#Z(0~yvR%z5T3<>RusPlz=5Q<g5Mpdmd3)-Z(NCSMUib*Zv z9x8Jon&diG{S|;0CO8!l4aQ)HfE{fk>5fv$FLSb~Uk68rb_T#!S_zLb6>YI1<=FuD zaNr*$NlS%vkPPku0$_1qu3`JLS>Rt#DR7dDk$h9ooeP2+q|bM+;?#xqBw-^Xg+dBW zlL<irW62}Joe)IEGWZ^H0w6jKF9;1SqvXO1LdV*@jw5Okm?@@5cOdLVsg6M6A}eqw zITaGmP2Oli6Y4NMCSw|OP;?yI2zm}r*K~}#0xXQuaKli6qALQf;BRcI?zQ_n+1Xq< za22RQ^Hx-#%fCNII96xq7dIi0ngxoh7uCYEes?|34=p(s{BrCYa-&p}CeX+AHe;ml z;7X#WxGb~5RMVd{KCpaCqB7;5jxUKFdND&EP#!PR5~re2U4~)PMUL1>FCk|#^N7)q zS0BxsrmY2ls0^;@6qcC7=qCps%)GOWcu&3~lq+*3|Aj4tg^!P6*UFCr*n||qhDBtG z+DMZqa4=i+mp*}KF%BwPCXZZSntXVmGi&VordDzjy7tzIObb98i_NoebmdIIt5j#} zP5;K}L5!Pe8G6~GVseHFxd<g8fE063M@3#1(a^;J!AW=<Wvf+~nwJs8>;qy-gz8?r z;P-B~I+;sZ*b<Y2X=C&bQ&&xY5j0&d9SRY?vugzz^}qYfF>e-;ntWfLU?FHThboSH z3lYqGE)%~87H^acJBMwP?O@#>xTYW6kF;U{AxC#dEh%*cRgLKrQ&aybC6_4vB)@n| z_Gbym&EPXYOzK418=O{{;yO8GlYaQD$kTtY98Z|#@BT~lj}8QLnr;yZh!gliJGu18 zRJ{)wj9}@?SVY7H*a;y9P{^%Wh$j#__+&wpXZ(pw?3@%QEztg`r+ErUzFq<!w#iEt zVJh38$-6v(8iIXT9rVDSMha<ViG#@s`STE@hJ}lTMBuB8(??`T^1_577(!ku!ebsm z&X8xG?1zS>DV0ZY;>$33LTkQ$UW3v?9fb=ZwIWMmTp!l{QG$W9%dpOepA+ou(?1rv zJj_h;{A`&g@xV~3Ld>v9$CPPGNBrV%gbDRo2`<VM6oOK$U^hERD{#LO+<}$XcmN3s zK?mGPgHto`AZ)X<@`hA>y}7;MTA>{A=&z_e@*e#t!TRcCqcIgt9^;jIlQ~+{y97dc zb3MZ<Mx~-A5rWHJ|M))k3_RK@A;!rjp~=P6Q8C6>4RwniVSRygSB_3*+B5|mxdyMM zYpO;3VynVaEBH<tBN+3v9!lnLMvM&_7DGj_?5GzhZZ^g<Py5dHCJTw_-)HYP0;f3J z;+-IhdEoCmRsy9%)rQUm9$O(f{UudvxZ<9PtNUYPDowGl9vfr-4AupOY&)IlE=VT4 z-YN3|J4G(@2ALNr!(OH@D9M#JgKi32Gi1uF_%%N%PXT{=)$ssXw=u~*iq;L3JvQAc zD(3YkwjO*|o^Up6P8S2>=VKf{+G;@GiJuRqiM}38)h>|3OJ!oNrXy&ilXi9;e3KH~ zgw&3~f>|^?@3LB;bG!-iy}gpVPv~slw5(KV?AuMg<cb=9^~!D=gH+UVXXpxIbB!ib z2^xwP&yhoc1}aVo5mGz@hq5E+AP`#3u7NMf#k25Wkq;$37{<y)0axbDvanDeicg2Z z3nLy9D?Y?LR;rj54;YCRFQL3dvpHZx(T))xvRAC?1e{+8WjLO4)9IbF>}X!0yXf7j zgoaB&lhG&Owr92jb{y&-6dfy!;5WLkYV$hgbyTv|`=hxh5wLH^imHK3Hi0UkUPC3o zr0kh(ZP%2b#a9hr7ml6C<!lHdWf7i^DAm>(=iBJ8f$WN9P5@hl&$vn(|HilUq&!hb zeVR2GWM8L3SK6UB71xIJOsE9nS(|&ceSK4a9BNfItO&CHwkQh{6Q_C8cEZA=6g7if zk7oo}a&unu@f|c0u{@}QzOrqrY_l&zLI*NL5an&q88=aNVz@8U=>3P*ihY;kuUDe< zBPyk)94aLtkW})Y&vy@-P|fuDpq5`~2HOm(V6eRkNBe_rFAotvO-}a(tn#N9kgxY^ z4X23?V;{9Qs>dsVNSykML7we}MX^Ouy4`#oBJd}XT|L=umL#A!m&D+WP+P*GfuoXY zhX_Xy=A(X8h{;6SBH=pM4bC!xxB1zMWhXwJj=J+@2?n&Tnj{24-rN-OK?8Gm{7&P0 zNSI)f3#pcgSiS`54q8c|IOqo?L?<qxm=`=&y9^EsZ0g%x@`~y4LZnQVz5w6r?Zv!d z3!EF3(9o6g_b!lEMpBR7dRXID3m9+$g-jfKRCUnLi=5krM|4m4AV^S8b${I255EP= zOG2}ru{G`oESjv9eR8lL7(c>1SMA&j?Y4m1o$pU>89qoKuop@m9d8z`{&0SnuApRe zKN9P?MnT+S<WY~2ymoUiY?D?!<AV~mK|rFwE#IHQb}5j>oxSm(DMKAm(fr#IJOng) z7&se(%+3rVb@wINmkb<nvG_)8(0a-J<yKP7uoG{aqiuQ-7)O0*%%ge`Y|ynbw{=pV zS*X+>Kgv{od)+!Aq;O&a_h(mqhy|di&o3wMMPzvhr*#xDT8kN0D^JF0T>NB>%`H@& zn^L4YC3TRAw7aEVtc<3J+yD=AQ%>+6pfTnMXesJ>i4lUG-xa3T7D`#m=fi4IW9j&O z%4Ld-ym+`QV-<qNf{}}fpVt?BvZ%H#b!%0n4Gx-)2niICUu|7THfpscx0}t48EKyu zGv06+03Qif98<~<&QmhfB<X6(7K#N=q^6DX_5tb9mZSlqI#OS5HS%qV$HIqYYz$l8 zQdRSLX^Yu1Nr)N{K3i;Db;3yRYOcZGUq0*`JsUA4qHx_SJ4f@_xhg}8j*yg?W=?4U zJ*k%|@-!s0n&6k=P`8JoOgja%7`_CT!8K)131@02c{wmRw@qwxgTOi|#q4_xQ7DD( z50HuS(=`kv5h<RUB)E4W16Tf>o<;uL(6a#g3Bz;%!4|@58}cA24=?EX@gofZ6%!_B zHBX%xFc?KR#Nx6mH}WbpBT$YU_Z#3ciu|^FF(g5xf7#C(DO>Lu+h$XHF-v<qrux0n z)ooWJP0fa-K0SRv+`KlNSg9>{CRQQ^0|e2<0%iLkVvf9}MlxrZ%0nPlGj>mgUD%oi z%xHjLJEo7f0uHGWD)O{s1LvV>vkY6GC(!6A5}QKJP8vr2xO$95q6EksYB}eA2xK=d zk$f6)vV2s%kt;RYv#uPp<i^k>Q7C11^<^Jssz!t+Q)ZNmr__N9m$Yb+-@)AIfhO~a zL*f)|<TwIT<fl<&#x$hHj|{t(x!|5yJQ&@zG%{--r5+n$;b|%U29b<Gr_~Wmg2A7> zUT@&cEnBMXhQ6Z>i{#y$dK@FGfYq-B@2lv#Z2#O&L@A#?IXm&c+A`;u=5$nniIc+; z;QS?RN^H9g4O4rtHb0wwNQ+Q62b#RkuFby7DiBqNe(H~Mu0k6h5jwF(oKFIuOv~>U zC5}s%#2*KzyoQ+vwM&DQP<sFvI=B0*C~xpZ!6QEH*&)9v44OashXZF?rY8GeB{rA# zG&y?64O%#V=2RsRtmsfm&~4&ENexR^Y7Px~F`hRT?bB66N9OO9{B40<0O5@oMS%?K z@nuWfH|$9t#3_d5*5Y50a4916xOfI5M2z~&nH?Iz9=1(x<1f&)a3#K_l#nY_lbBPa z6kQBD#ff%-wdp@MiUhdX(Yxdyd8Cj8-l@|q3aB|1X>5dSOW)fDoV&<RDBf|895yGl zbh5|4ql)5Y_#)_EqlqgUg8r!YH5buC5>^Uoe7Kg~7KC^$(k`{rZGDfE3`kUqCinfJ zF%W%|3$0EK8K)6sd5^vqFwKd#qq0H8Rc|2*<gDzLDR!KDH?4n4G2pWM9%Z`|Wluo; z=vWS4UA>%%d$}D_A)etPB_;_*36mExtASo1Lj^%$-oe@~q<@P?3JP3quXe%TXQzf- z*C}1n852=1c3i-@jWqILK0EDTT5O%NQXKCaYef|x#{J+TB0%`2xOl?JKoEv-wZD!_ zE>+aLjM5r@6Nc}c8&9XbxJB>!*U-J=x8)mXRi~a2_!)ExUy2UR{|g^*EtA3~0mGI? zi0@KB8Pr>JDmz)&4tfh2);jI-B5D_sw-Rkg_mOa!d{bWh&<Dvo_1v|%9?S$7eAa7f z9nX{=I#?eoB$~NIqc3~;gu{XC&OP<!A0G-qk?wgO{@LHp(W?F&06d}$dXTc{*(VJn zxiY334`whNE#p0ZtY82`(d)4|ST)h}wE|8HWc<2TpJd3|L1ZCZxWr3)p^<aHRyLV= zW1ZSwu=&f6u}V=mLc_VdU8m~@_hMTyx%8i?IsQtqdWkUVZ{lU9**DghI@{qHG|p;+ zSd%*@bQkj<zCjFqq8$7fH?CW$G}9U0&T4{HGj!<c`we$e#L5-uZk<m|#h&<26X9;P zkdvD4UN^@50R3h8flg@%S0o{Isu5b6`NozLc%2C0_v%}JqQZf*qJ329Do^Z&vS{bF zK^bsH8WqirzL-A_Q|YnrC~=D;l6$Yy+nCaYNcUl>WT*c+(LHtpr|MCDKXO$MT|n6B z^z5)JQLz38!jg<CWlOG9H&S9?6)w8Y&o`JdNI|qx5_AP_@8A`rORvo4QkK|iXD`8q zz~xCe0cloS6Ut9V^Xi>}xw^aq7C%G9P^5t+?cKdk;R1#%Qx39h|GfJ#>YLl-4xjTL zLOW)qJtGSpPa9max4Wd2>t&<v-+0XHIN`bsiIZl)-XcEpvJ%m51N1(ei0@}eS`y@Y zl6u?R0C9Ma@uJ(!I+}%sCbVO$f_`f`b`3EW-}^!5r{<Vp!om|0j0q^NqOzZ{HKFoX zv?7%vzF!AK=cztV^LjSxUhSBB6nS2r1>UZP<$_Bcbq&E%!{CpkeCMLoqQgUeK&0}9 zVkF-&F+7+v(>-;cgR{4M^N?7&YTLC_SNBKh1Pw9u01YDOhBd_ZT*0{!(LEbdR(wC{ z=k=y67j=LOXpP1mEB+hVDzQKx*<Aj^S01$&GzhDB`{3>s2k!+uR*8;42~B<kx~f;* ziNv@1@u@PIHt!Uf$I#qNN*NI)<4TN<^lPx+lP2l?#mq5oKyaLGZsrZnBr%UH;@VD2 z5YvorIi8<xcj=ziu1^&@1$_tsd{Q5K!^7|MzxZR%&B?r(fVX)31uHJt-2D5-{nH}& z<f4|3lQUlZuTy>(0;p!U308tq=N-f>$0X>D<36>^*1d0>5#GDO%mjlHk`pA*ts7SP zbd4iRJIY-ZAzluXvIm;3M`-Xi25-m7pkO`(IG@$c+}b05xV!J|(sy~WKj~_~mMpc9 z-QB+L<}-e+C|@=1@KYA5v+1LCs$Z{sOwP|ex-@7o|Ar!c{D93O<rY#b8?m3R8&uGW zW{A-D`lS*Z)1;^q48bOZzO`?9xv6!~Tclzi>GQ1Q`SB^Z1U}#=HGNWavaJq{3OYu_ zhvztQ{CgiQRj{Ac6KbwyttAVcRB;Dt9bC_~4QbI^)_QHsu=gCUQt*lv$2?eBUeAMB zq_xomBFu+jN(EI<z`By~Y;k9Bq7)t_%>6}56)M}OIX=F#CD<eCBP8EjF&%uy^LN%( zvYxq_l+q-d))Jv4Xc<?1^114019dfOM|h8R_&Sn#AM3p`tdeb@7^x=PAQkNp?qo&) z8`b(MT)OD)IeAq110)DL{@UM9=WO#NJpBF>6R(K`076%hD`gdHa!5{9tE9+>F;rM! z+sQIic@7#{VUt7)ymeTA<k%|*rMYS7SjO&{mseDHmnSy(AuPCvTiU~~f>P>k>O>0J zk~yW~w(_K{&F-9~x@hsh>`2~^6<oq*Sl(PIY=m{Y>rq!BuwuD7Iwx9+SV>*;*$QAM zon7PB6pPuP&AghxClYRFdCx~_5fntR1(Zr!-2A7H!0O{`3EdqgV*Vn&s~_y5p&^W# zY0vUUylRhl=4?HQwMnVhf--h7yNaf`xhJf`(Zh&EyVkg7<aUyZ#}W<X=otc!StBwU zO@4Si<WYukikeeTieYG_plF2CH;LcdcZDA0(5@7qaQ!AZ%?V9(KW1GaRw=}ecDg%L z+WNDb(a4Vlu_)8rV+C0x6<j=<^u|FB5%rr`?PmY2)wQU~%OSF#7$j2Dxo^!~_;q-W zHJAYQXB)`W);wZhVHbAIKv~I9#gSQ<s8e<Iqx(1$JpM5f7&?u%Da9KTIxd8_w!KMz z22mYXvszBZrL7J?^;x9@_oi(x%#k)xh{>joxrycc;e@5a_H+|C|Aulexrov+Wr0*p z$Z6Ag-7xh^oQA5a4>~kt+KB1Z)4+sOG$EMVE6|Fo_88tyR!5Ki#a*|X#4m#O)23De zKXDt%sU0~RM;1}U@-=nM)>wqayjx%sUhK7`ze;6U>!a}m$&<9_i(412Ofj7+qwGn# zpz2g{ci|Ge9ZdKnB>(-_h;hmF<iNDyNTT#=X9PykFqMhU9cU#9LfB{nLU8YyMo`~9 zDC<KNkK1LPEUqDLDdP5*(x_kL{S){a{>6l;J|&u|v9ttIY4KuN{~FU1Ttk8*TUgMb zb<`iapSza`L?k3dX2lSKzZd1lZbnW&wgwU~4;ww7APdfGET#s`O)dTy)~Ub1TUq!m z2dzE4^Qw>?i-B@@LdPg(Ha@LAz?c{r^)uy+A1Gs&d0e5Ll88=hc2#^Z1OSEkQ(i!* zN-juzy=(>X!$qnqCAU}bv1rQ3j=m)r+Aa72Cf~yiq;S2)gWx|VIDFut0xpo_DF9`Y z8-BuL+g!}G%XZm-@*MtNP@f#H$dIRNtq#FB6)J)uKIpnm_UrnF=GP+zCB+OWRn6N4 zb|dQa0+IM&xYO0S;RXQXm}*|e6#fjIoQ<@CyHIak+=HQt5XsG*1P1(&9~vG#{H649 z%N0P2varf)4KM11A{AQ6oxeMg-=oPlDn8Zt6r8F2!nXdX>U{UU0@$CU?MyeJHp-Bo zV7W+B1JQu(GNZ0`FTyZ!tC?=|>gKl>&E+D)kRP$Zo#WkTk+V-=O*2e0>+qk9I`F5q z?%!M<y~d|HjHzS0q{PTFx3!!)kTy>iqN-69DPSRJGN}FbHGWXPuyBwk=<VyH3~iA= zDijdl2$Uv5oRICkSs5lq`oN?_tcUPbitc-f2HmUucGyn7RdGQzenV+7xCLtC(sn%6 zs-K=FTsGKh{<ubbOAg`q{0cw%<1~kWrV>+O)nMOjDPK)5M04t(Fl_JcgJR65qvi?Q zNXo(16vc~*sYF~9Rc-toV$qm@hEgA1a3ee4PeGHR3DvOGN{q<S8Tbw20LHc3<)i^T z6hsq^Y><aQ&|2RG?b=PF$nz^ro3D{$Y#{T>GxNn;0f(NMCcWB!A`K60xB>osE#w#i z=9&(cL?Du-PRQzKbFt_GEh2zbMvwO<wHjOvlu>7bKX{KD0@NvyQN81U5S}vNT>0%= z&yn1i=o}7$@fLk_Y17@!roq}=7OK&B27OsL4Fp#+T4=U}%*s_se(Jnbda^QQxKq-M zxLBh=@~kKJ*%XbMZQ)1st@!BH9%9p&w#ppsF+<Fx`E{USlH}|62%q5Xp#QM{2Fqpi z@H>2#EwGgbtvg}|3~TY_ep&c~^cxC9*A-bjLcPLCij#v_9jEt0Wf_FUCgBgz4rp0u zLEI1dlRFUi!CRWMwOYcA+tU3QE~Zv${Y0IQGRniQYP7DE%511ZhMl%@ULKl#PqEFw zFkezKt{MbJrVYY2b+1pv!>*4)A9ZVsFgh+GIEjtTA04tHEUhM9mgZ})xnnC&b?^3J zJb3adfM>GXx|r)s#V)x=5t7h%1equ-H`9+4RnD~>rjpRJxC|AborFpL;7Wk4=u43Y zhkEPUL7Q9g!`>JT=%kRVhq>VDi?aTNw%QYS05{ui;UjH|Fh)y3B8p|~!w{=hw$$bo zo1z_kK6och8y(z)qI8zf)#7@VF*wZGR#T1P^fc;oGAXLj9IgJEB<N;?26^k$6zMIT zYI8B*9<G6nAjuPC78kh`sDD*S=$EZkjo6uiixBY1W7|_F6vz6*7BANSl%#6FAb^L| z`<5EsZn$B_-4zR7^%ha7O@z@1;qFtfxSP``pI!yW1|A_V{s^rw6LC<a_UCYwW;W5< z-pbF7aj6&D4P=NZ&*ELr2@*peaF~@=!`@_A?G$PX0;_=ft_#EX;gz^a$+M&t6*E$~ z+wn5z?LH$!dkJMxZooLHRCL6^p7Vz<6o>&Q4e_=k1@C2ZFT0J$^sU$6G^I;~ynIxc zEKZL3Hgaw}b|!%?VF^8}Z}~Tp3iqQ?!<fqtPX>Btzm6RI*Wt*+6%gTXG&B5e50ph6 zZlmtp0pd)sK(=g+-?p*?3=P~+`f}02A%r^)xQzzoH|B~Ne<Gu!h49YPV|jh6xcs*b zonriLFsSsZlQ0K@S+8<o7>F}i&-E(tb*l^+*ZAz4+gs>j*Y0b_?RGmG=&sl9Yt}>R zuID-|r1AekzT^iKM1%Nv{@h*czQ8N4dP}dQ4g?fM^L_p~*nO-ixuu?V=WV4-<IIa) zM9gS8ZGwfIuw`Igb7K(WhMwA0Rz%5!1tVSBPck4oF-oe>Vv-^1m^JCF!+2wvffyhu z%#jjU<LZfVw?cVKWTiu4-YDdYuE2TNM;&Ba8wjg~Qn3)VTma4NS;IFQ(%F%oR!gXA z*R;egpIsq8cVdX(ZTY-IwGqMLuvmXuq{h#v9YiCnb-LD+vb>FfF(<fS*gx?70uCv! zCTQ}N*coI&i*Uot=khRS{n>S^EQLYU=wmU|Xm%pTE5bho*BggUgm#I@<6J<=#joy; zY$1!Pjjj^Qbq96fYK@NAGy!VSwG7L<4brSg?7Ro<ysM(HDMvW$H!q4xT<2U2f_Sc~ ztw)Mq5$tr>nDn&%JR*HPDfp>7#|lzO3l?Dg(+Mn^mr<RG%(0G2^7D76lp7M2AHLbw zA=;#CD8i}{znUg6gc9U4N?RQz%ikGx!rGw;vpnX6PlKLf->?cQZGHr7>2{iWJPK<C zS$AN4_?j`^OJ{4@AXsk~E${K;@v89q*dH*4JJm6{>R00tt)R-<%#};XO1I8F-HE3f z)xvJt*xlLcv3O2R>)VqAELVw6c6KlP9Bo^l-@0Spp;5aTthqss>WXsz{-=(DD!aq` zP}b5=eHz3!`(&Z3$WFvQpz7{(!k)3-3GKSxTU0i;{%ptDQ+}Ky;_bUr&%gV~LA?e% zl8bv@USp_ThTA@4y08lsrvDiaIWK~rl2$XQAMOYLOE@4^e&n6`c`hX|XydESnVmU! z4xRp&;$mkpD|YdhO$KWTI6tq+@dsWR>Xr)POa;hBy$Y|Y=FaLI+FAX+q>}L!6(^r9 zVp;<L^ZYz%2<g6@^3#wOINzC%?u|E4-`+C87ijs*g98`jsPt_u#^5Jo7kev-Ej}a( z6impGjOeUvr8^)@{5Fhoy@u;s>ygMf1(X5F5;#W?)r2vDTqmE4J+};zKy|Z2#Co*T zWh)34Lft_(l<3o`neHiC?~%&YcW$qm#0N#7(#Up|u=ibULaw}q$3N9D^6>k}ZiS!n z_Zz`?D5a&nCI&X6eG0#ar8iZMhzJJZwofCy-aH-;gz+JU9c0oF>`$EY3SHEN3(d|? zGCdmivWA}=Wg_OXtp<1HI4}%`Ml=C=jpLv){aO@}%(p=i&!D32KgXgfPBgr8Lxtu) zGTw9irI5ugLIh3$vEc)de=$<))EAjs?AR1W(npWwr+c5XObzZXnC{#e0ri;S#mLTy zP1f}Q)KLwTTTCw3v~%3weJ>_9BGz8GAOehY3_(2MuTa<56&z1$^K(w`#ayJF?>QhY zB95n_BKi1Xyf_x9y#{loXwlJ9C4uS_b@tr5P))<lwaI2D0{de<%JV2cTAom>yH%HV z+e=$3lUSc!>ih1ehU7@DKB0|nm--ApB<LQNMYCegBP2JUeSzJuhWK7bQ%CKe!^%XI zk`BV-Uwu(2K+SQJ^>iVh%|Bo)--kiLLDo4a2*PH1WgjQjUy-VTst6;I$bSPN23%#- zT#Jks)^h3qhl66?iSxS`reMhwi1}x-5+@V@{|zeQL>vRLDu3R-Q2BJ^5g&h6B0a~j zLS)mrS)I_{@ed)-4^^9YNm$6}r8gVjsQimymtJ*R_cKyDjZ61Qq|53FU1E@~MTOln zblp)DJsm-r95qDpCbFNZYX*g&?@ON=R(ddklOr|vKs^U^t1JmYSwz$)*4NF8_8FDL zU|B&_H=h+D6kX8lfv;(_i(5h>nFKVk4%sL6S!>1ZWdVH*j@Eu;v-6Us@qi+LSi7;I zWUSs7tx)a?9s-S)M))D~PbmlmWKX<@Tl|fS1_Z{_`pzhpN7Pjm;L~t~NP1l2i+F}_ zgn^OL(@(2e_vw3>nqYX3M}V#bYyy`aC;fbj=z{zk_lzUl73d5}`l-8+j2p;BV(Vk% zJ*XHrEWs6d4(|Ejy4UBMM9>4YN44Kk;pD4R5QQxszx6v{3tW;+6$Ql-#m%NV^<JA` zqShXZV0PIO*F+&-(KZ~XA_~zX&x;mn?);=GcT&rtmN2l)`5VjdJ(%#k1apa%uf-+i zV6*kF(=g+@qUA0JoF<njBs+(N4u%E<Qb+a;-I?aB+6Y4SR&ar+M4{5U1FqrAAqoqX z$XAu#N}pm$>=vfR)--5k>y1sXAYeFh;;L!rjch?nTN3o(+A0qquz5&=6%&ueZdFzd zzK-DF4|A$T-M*iCx)8EwM!mW(`bOFK^CmDwY!}J?vWRfT;bI*k=ZO1&U^7zsa3q*M zz}@}IL+S;0eCiqkx9S@kZ4&T~q+)WnfDrjg)2--kWYwcj@C$_LMflCqpXkt50PFNB zn$-&Dn+Dx=<n*5=(;!)iSRh8Lq&Cv(^7^av;q-Gy!vq%l>nI*YYUycv_>Ndy*H_+8 z1G*YFEgMkw?F@kplPL~{jYf;m_WdiAW@%HY3v_!_-T_hlNl+jvC76a-_tRC~Mck8j z8OfC5%JN^}6$m6-ctshtfcp7Y@A)1x9{O!ALm=hzR_K#=O-(hhV<<nmY{xp@89!rj zWVi#DrQVo4j*K&%?Q%5M8j4aydT7w&DE9JqYG|f(%jJ@?x+HOAe%)W_``8PzJ@kX) z7VCw<U+~{`QwmyI(U^)q>9%wq`f1W3y*Lf++>W;`wxB^C_OSEtQe=~PzA|6FU#{Nw z*vZywe#DNG58l5I>&uW;GhedG(L^Rq`tNYo#QXdEzro4Kh;&FuEi9(w&IJ{2#UXY< zrx<Yxf5CquuW)AY>d>s7bHVH)<Af9fC?Hz(4xZ}QHy&YhIofLN{&K%@0zJo@qr0m} zDXvz2k79x#IHDZP(Jm>ldg9MEvm{wX=1IsytK-c~X)0Gpg0t{HV;`&;dso`ONd|^b zz+B5{j`B@0T&nLU$Abr{%_Ij4h+0@XR<N{|L7QaT((#H^R7lu@iFAWU+nuHIQ^<L4 z3i!TdCH%mbB$ojYEs5TjD61BXOP<4gp~nzvSp<R1ZXQ@ik*cg5!+6)wg_H|=T*)G# z01*=v52^T&2#1{c4#DNjqjtYx5QsO|T7Hm!8kX4alwqS^qoLLKMyR;fDx<))Dy6gN znr>fXG*4-d!qYSS`g=k6mz^fm^PyMkHfg)v(AqMDmH8x*-?L)?p==Fq_&PN+{bOih zXo?RsS07VKA}VnB(S?N-0?+M|k>~AOt!wiIV7DhK<xX<Y2(Vm78t6hQmeSM`?N5U; z6S9(jw^<Tw*I=A)u6c#}-R@V4Q8{-?Uen0olxI8vW`?KIvNmHs;gkhd#vo1iVuu~} zoqBAIOi!M&czPwl#SiM0>>`6T%D9*U=bI-eiLaDCLt9*qKdezys6s+)30_Q^dGR;j zC0?$>^$df^@Jv^<q1P|!6906v3nXvvfjFJWx-VMCTTSTa!Sz3o?OwdZDBL%0Q!McV z?A8ja!FQ#FwUPBdNK|Xw#$1@hHp@K#X0^zCFWp|M3U*_CdW^!zyt`b?{<B6Wo(9Dr zNSTG>ZT+@zW2L~{XI5TJ5_9~Sy7~d5YdVV^+2Bg$d)6;LVGIAq)v<Y>^UH*fr6dN? zqNgtd@^AVx9Xgd(GVwEO!?LgzcZlbN5C#zxjAi<zZxQZW-$cn%*AQQuj3(fN#)kQS z5}sosGW7?&F#4?a7vplE8uT#D9^EX0wkg|mFC7_=9=<$2LeV0TiG||!3BO)e-X3nR zr<@o5e*F1;yaDaZ7d5g!e5_5q@^Bmb@Nk=ZIdu4P;vO~9Q*yo?Ju=jDT*57#8$HtG zYYE|+)zAO-c=5KDn`taZz%~C|CK;{tJ@lBt8II5OH-@{0v_<wX6h9iIu@_Mm2twP$ zaO4ZL=l@jMa_upD9U6Lcz%o5=>ks<8+7@2R1B<+Uiv-vC4YM~f+lhcoo9%Ar=Sx@t zEAo!0f!-R+PGbX*oMe7gjn7(YSOsf4s)_HGNn_ksL2r`pv#m;EIU4pN59)|xD%nP8 z!Iv@^b%m59knS-|g&j~;s16wc$$Rp4#1+h!J;+IQ0|ko^2*RW4$ir)ooh4w8IVyi1 z=WqXG+L9$i`ow#_@pz5MU=Qljtxt18WZOJt=)AZ=Nc?lyorD1w$!Iul71Yq6&-i{t zTbAe+b^$k!bE~K1|4W%AAG7oN>hgqu?=ITyk}FGYb@w(i-LYI_xzffH#O2B*pQ#s_ zQa!v-J>}qMu+?1Qp9elKSX{2yPI8)CZTg}eYw1=+<<mqIR)NZ(m(^gGD1)@N_$r)2 zMzfj$(=V7|;U%c@J`@~~!b!*+7H9jDmy#B_A={OU_~=x3;@MTzJTmU!h9F@eoqZ|> z)nc(`mn`BIJz-Jb3$s}m6q=;Tb5ZV(MS>Nw%1PoUS?LGYMJ+wq53w;4->5r-iz(?k z=D4Cs))g-at8-S<>FWyEsCj{VBWB5-Kk*^od=T0qTeW^X$cE}7C56>PmsAPaD_Gd+ z#^|=Qd!yB#g*Va^h#)OMR;Ga~8B=VP3R!F|c`iAWDn^DqZVl}O9VcUHIqJ)0Xj4$U zM=2BGlWrMm7fSP!5MWa66|F@RkR_jd_^@A%CdWd^B&zzWK=D?{`Gos4-Kkf3v6ovw zF4x-z+2x;APG&uoXylKcfDeH=r?6C9Cl(T9sW&NYT+k*N?l2)TOjzse%5goxt3&z9 zNSBN3YR;3m&gry(c>icq5*afd6z*NM9uptzHFd4A9^x4PPE_L5lK1cEU7S~>3r9Dp z`Wr{T9ASLnXUr7I8;pmh67(cr%Bqd{pwtqW$UBh>vzR#xzDG5cv2s=GImyQ{t_<1{ zs__(fe9~)qAe&AXk)@;mIxWks_T($;es7mrEc%mg#AGJ`YT;-s6qiRzuXRuVh0qr% z4P>tpAJWN!epg1JDChsh#Z(nE$9i(X`V%@`QM9vhM@q5EDhXxxptNX5NjIElp)ioL z8rbE{nCHKJ+30lL%N5Z4{-kwTBuw=f&#M-bzy!H#LXc%K!mt~9GVCnH-&3;dJe;53 zm%sb)^|BZUf|}pF4z%f%5xuM(ZRih}?+Ai{v)hsG>0-mUq<JDJ43P`}$3SRSoih}8 z@#tzob;yz1aA@pvxqV>#uh<FPKd}=4;Ko5x_TMl6ZvX-a0OHOTmdyVSoqSrnYX9r` zKcSO<r&eJ9QNa9LpK8TM4fDTCThiIExgr1c+0;f`+W+E1TVgPze_`LIum0tKw7Oua z4G}o0j6HDh|HNDVSN@L^<N7~pItRx8s*N4kG5>=zf|>q{XM=IU|AQ|>>HdrH!(_nz zgRR5=i&L}1RsKV7!<qm8;(sVns#t{ae`d-e{yWpM6QPBK_^*<$z6ja}$N_-JRN-`r ze=C1lziOx2r>la91O>ke?zWzL>0;k~waO$5@*uxceEWIhA*B2WogK|#jB%=V)NyRR zAdwO``Yz@W+oog5hOJ4;CHalIdb?R?e`k203Tv&KZd$`i+^!={ze(n~ONQRHrg_aQ zpAwwkO460u0vM3C=+-rzmWAmK+&?VJn~OP>JF8lLEHnp^2GXvx3?r0x9GCOPvnhLO zmalM%(XYQ7q)$x1a*QS3f^`1=fjScy^&DypRN0CFC#@LkM%&onrqeE~UFFU^Ui<lh zhowcwz2>M{mw=4Sojd2lbicOy!KFX#Z;-|vDLSximu;FzZ*bR}RhLQE;De=8KkEU; zzR>(?Ft-g_=T=H7g^m2GAN#d^g%y!ABL{Z@<nLoTbR}LVTZJg{%bI1YYRjV6VXM>n z#{tcd0p9rV+yh@^-C;*d=wcqEX)9??HI!ARHzd3m6r_<oJdPL4b-W2?LM0dq9E>U7 zhQ$A^Yhs)`L(1^RS!YqDS(Po;EH<C|0cndA280K3t3c5c$3E}eUa1T!!$pLerb^1C zK~F+6oN$XZRD@xVX4J2%i@-U^G?}?gwj&ktl1kKql|#ZpOJU0cTNc_#STuOB3QK5$ zDIO~{b!XGoS0SyX{3*wZ6PP#6^9JXvxzjgCMQRh1y_6*b=z)%{dAmOl5BCLFzpX-` zLa~F6Oyp&Axv`(w`k<4ruk$E?=0qEOWu6PR`Eo1sBP>K}kV^>TJ>!Plwi#f3lixx) zxH@PDtAoK_Lb3})!bA}<(M;XwKj-4Qle_zg&oXfpAPR>7ok^Nade#yWY8qu~1#FN9 zgo`>;1nrOm8l=-jJ(7I)<cwGOTb6@pMOmO^<W3djnqmu~M)R1eyj@rf{0IJq$^{K@ z$c5X6253l&3BZF+3_~4&3?n~bH%X_-l)h$L7VWUS>wwgROJ@{!nD7R>Zg3d`v4^I) zc5{#-V^~CJ@j^t$3hZkNa>|hn7s1rNM&GAD5B%<)GHTs6f<p9!rsbt!uoLyJG62Ms z8RTK{Y4_ClMc?e7;InksLvBulC)FAnOVoM+rj95%-J_LDxV4TZI4@PHGaZTCvemsx z-RFt4Owc;o>m4BIk++Ssk;KQ}81Vqy+zm7>1aqzCKorS)-N#PnYrjJ41g;T@d<zi7 z8|qL^o|9$~x|xz$5#~YTn5+_Xg#&#O3<1emEOdP<aC*O+*Dh^526^9n_;xF`@P0b| ztced`v?h_}OEKpXVU+h6lKZE2Z=KrjO)6btS|NnpJ~~#T+OyB!M1Cyov{oy^hT)|8 z5Mz@(*G-CMp=<=75b(AWuplRuGL;Wh;o`vLoJf}uRe$6q%zx+LJj$Tjx8|@Laf_f8 zRV5(^jp%JZG7jT|3R6H@IbsOyUR5IKLg(h!vhE4eOH3{n+Z_&ts5?$TLN89e$tDCT zrIS}Q4eF$3F{6oui`il=i2ARQZ}lW^87`pxR0*Skz13VUCuYRxyzVq>@Q*GgS0^13 z<TPQ}&`mFP#XXeA*98As!U}plIx%r)GDZIst6~IigMuUrk|*~L#$Bgy091eL)(QH8 zmYW?!)T@}RGpsQa)OOU4xqu8;H)#hYaT1X?&yj=xNq<%v4&TOI)~yLH7mt-TrMx&c zp}rZPHlgRBhS5IrABFI7uKGMN3OC_J`WA2qUkD_vLTDdO=f1|dpz){!`6Oi)l`X!n zu+=x1n-i?_D$9q*Siz_Mt<<bd^kKYF)PeZ>T_TK*74NV?)-4cVfQ%38bJhmpbj@k5 zx;lsaBY|oF4z1Z?o(vc`l^okcIB?GoHiQgBj*Fm~_|rA)n7N24qA!;;N882nz#_>x zc~WV04c7%+e<56i&wdy24J*cS$Jg@8S%^H*H__jrbgNv>)gO>vXChsO*_?Y?3gF{z zf57;}8zge+X~l5)_<9f8OzZ{0-$OOV!$7de<jX+a7Qq2PWZJZXi$B3cLXh9K-$WPY z%+%H+@Uv3|DNK)-+H#Uj4FP=8MiLvhM$N0DMzx5dL1c!5e@Iu3j@VUR%#vk`k##Vt zS%pbrh*^fws_qv{FZGs=%&~yayVGt$KLEhCC@Vvj%c7EQ3E-Fk(j-VZWAK&6B!n_v z=7VEh5=}Xe)t&t9_pJ=T-rnzayP=u<i~#&#G!dQg4I)cl<ZA`Iw99)B?89S9rhY3y znL0m!lysH+5v{=v7z2*M>j7m~>?66cx}?DTGixf#1(U7)q!UOpk!FT@fufx&_D{R< z8&;|2JVC3&V5PYi)&X4t5M=||PV`u<a{2?m@DPzgkSoW)+~I%Vm8P&BdnF_J)sr-6 z6zq(;^<vsshs?{Y4wYV-*^dT?;=9&sw&TE~y(B6MF)I*Iv*JUsEspEUxbs7iKvbvI z=%>Nj_?)f5tiHWMb|JL;B=04yNFCdy)avc2pHt4b#;aiynt)2WO*xfX!UvipcUPfV z5{;^GnQ~}qECo%%qB|tBX%-T0<tAsnLxi55OPb!VHk<;^bEYv@>S#82!^xN7ToI}z zv29on$tiM5L+7*@wzkUvQh71WJx!*)jo(r}J$hb$OCR=ch#iO<3`&s}I?5+i?#3OA zS1wfhBEmG?seo`kWBH4HwoVGwC~GKN4+j~_PLJwEomVdj%E%*`=6*xGVAzYsFo?t4 ztUwY{d!$S<j3Xs@T*~qU={nwk6UUGJ+EiiJEFAU{l0Xsq#)>7}Efr`<a+BORN!&sj zl`#l$CqGA9ku;KNrD5ga<!-YiPaIun$qilZf{v5L!vT^a{n+svyhH!#Y9s|=$ByUa z31N0~U|Oz)Ib}p4_vU!#pBCtwicQ(IZ(<4&&~T!F7@;5_!1?BFao0%8sc94~V???c z!c7}tRAQ2ak{SMp?6mAB)g(eJdj;NylBOCCD^9MD8T;WD$2r6IkD&_59n8{44u%?h zy+m{fNgmWoIL<GJPPzpJ?m4PPkq<PzZQB~9D3240WXKH`x^|$nfzq!sH0Rhc2{UL+ zm(?r5GPG}5`}K!n%I^gk#a~O{7a~d?7L_<UM+Dmti2fL@F@P*v>WEYf`|jSijjp!R z%Y90~){<+76-`5$rb@*nHOw1Tf(xFfGcNGk9SO+Hqe*cchjWlDXp4F;cmVAn9}J(T ziR7-?+Y9E19ILKKRDph1I};hz?;O_L8cynNk!FHm1ikle65P`(`<Fwi5dL2yS>N;l zr{~TyNt2u1I|I8?sf1dhE(z78as`Nn@eiOkFU!^n>?^kWo<*c?$Tg%Jn8F`Qc#=jm zLl+Q1ISc*7gEnjkWba#8aoZwi-K3cr*u=1|U(`}CB{i0JTu;R}HQ`D=;EWZ_aZYC` zxqYdqhY3El`~h+rA&=Spx9y{W;SswYyX_>eOq@t5BMmnv%9vDiW!`Q&n`Y-aV!YH$ zlZ6Nm2EI*(&3Donmm7kyTtokGRB#?-vun`n3c{6A6NVPN(k8%i?=i5*Z<n)KwXGQY z+c=Iwdp+(P&a?`4(6DY*OFW};#~wxF6V;OAX7;+vb1b=kT-6G(&C0o4Q;(Dc^ljWy z+8Kcky#hh1O^f<5f^8I)vnhe_*e1M8e~JMZJyFo$D<MheQ+4Ecl0V6G4Z>MV3?ir# zK|3y2`POzO{&Ydqbq|_jC}&7Q9@E1MdYDMMv)}3$^yKz$g0llUEXRO`7=<tbFV9jx zh(s<7s-Cm+H(F(e^Iw%n0-{X}FV{otcro9&Ob;39YtPsFr)iE3O(8Gg_?5|5tzL{M zmVjU^%JkC1oYhBjrTN2I9Bsg(VMdTgK^_~48z|D)+D&^5?q>@FoJ(JptCH_oBI;42 zG$F{rtX$2*233v_sRgfeyX7z{V0ouGF+K>_c1aw@w>_10;}O@hV<M-VRYqAeAp?jL z7!U+XtMW@n^sf<U-oyn=Y=Kd?<TOezpLhLZL8C!5A3OrzYA!?-xMh8E)BtVG+l5q1 zA&_3&QM*mJB5+926yMw+eV+aEha*VwiVon~9W|4KK`re|PcBFZ^mWOzwG3c%jGk*= zBnFwr@w;WDT>h;jRW%0IVg498_%&N9<ABlH2N{CPRED)R(EJLnb8g$?FpUYxTyK>_ zLY2+dEaPk;O&|jPra~wU6bJ-8Y!I4h-T^4}MCsuU!Q}ceKJ&e+enHQG*-T~iXwY^1 z!1{=_ih<yFPerFnwQRz%8mlJ2&?|xb!8T^)wHIlc0#=D@%L__^;n@7tl|gxloAWpA zR5_9u9}yI;*pl~|F$?-cmP`B2KbPuu{4VMnEWsj>OU##J$}6~2BA~cU1zb3zywov7 zGUxm$w@&jgECe-)iCln>1kPQpwla<c+hZ6B?C>NZ(ZPrBQv!+$?6zBgVXi=0U_0>- zFezPX*reF@9`EXVJ)LDakz&UkqLpy6fgjsqs9=se(f?D&RR+bebz9us!(bu7g2Uj! zEx1b{xWf=6=s;*BXpjWgU<rZX?(Xh`yGw8gGLT2^t^3ux->cVM-PKk5tiAT`Q+0l= zy-K6PJ7*(B!_gJ9>=VbIq;U0UZDQHK)Z}RIG#&sylL0i-#3<b;*@S&_dMRgp^Gu6C zd?PyDYJ0z5eF?oBN0SaU!A_5gEKjdIc!r)bWJV|Lru%qaFENU`bKB5YC7A2@OL7I) z%k!2A93dbH8@1bNg?UG8r0a!?hJBSN4vo_e;?CB1??EvhE-D*`IBWYh0b8gNPjm3F z>Dbb%3>!G!2-+bn?LxmRduPziLCf-$Ew@j*E<an~AY7w~HKgC=^T)ABv60J7>!=6D z>tyT;704pV9SEa2*rMY*;zgIc!l(?ZPmjVTyMXzV%F?0(<d4k~Up$zgWr?+8sAE`> z4cmf*K4<UtZQEzQxMyfI)R;wo-Rbz=%%6mTEHn!cU#R^WHxA~uuj;s-m5neR`^v7a zf;??&x0C1dRp{4<{+c}p#0`2R>MU;@zJX<#jPj1d#dD$PrU1!6;iD^Oj8|!uMC^1` zHlqs@=j==HJN%p3j^2bY#Q7j4T=Bj+f)!Gbc7=>R<^XzRl4Vzq?w3W9vIfV`?_$wd zKQbr+-Wj?Md!5MX&FvXPN#P&T%V4C8-%*S)9Y2Uf{Hlqn{q^!QUrfVjr-dJHgSeiG zT%)+c+0*ZvJQU~FN<DVYCmaqV9~EvZT68L&LG|@fsvF}s0YQ3c^n7oQh7AcweQ?2n zO&Z0O^q5CuN_xI2x<r5V3DYyxS)re8N1-YZ;OD7tGqYA(M?dQZnO@c*=gee_C_3nT zqrJSpp21UU)~!mcLiGE)Rlm$8PFDm}=sta|$pDf*p&#c>04NmVx*n_09CfX-Ja{{a zfa1|hkI+j^_u5uUB4pS*l%A4GoR0#H5Q%Jc5i)#=poZarLSK#c&0Cmpun};!dxkg# zteo7m)9nXprklxKO4tC&)V(pc)u))@7lVQ*{YY_DW&`7A3Qapx*Vw}7_Ss>{+Ri;> zn(e)f3R}kQ=IZ-t8OHGkRXjkhyHRrMWc|&Cv9-grl(4PJLXE9BvtwvV_ABOr;+q#v zW2GKlbtrr=xrlTgl^5HDuFoKz?1M!>9~;_?St1wY5LD8Je7wd_=VKfC)HyR4Z-waQ z$qU|jYcPFSbocRP!1a4%1NpGod~u2hG#5f+`gN@QufcU4CL$w7&{c{HLDmWyVjpEm zFlmqX+rR`?3AS5fF-v)F&w)8RA-lGsUOH7>@dK=hgcWrx)B7?)+?KLwR5?}PrrhC) z2o39r0<>}goEFr$SSdu1T>C|xDkvYh8LUp3yb&g;f@3Qm`gx-2!nh?I$s(`D1(BR_ znuwT{C2QfGU887O776NNHoy@Lx#(bsz~?d?rlz0b9~mRLb=Pv^(1_ECx>td>n?6$) z+>VGsekT!W@G@G0a-rH*qs;<%shpI+>W8>E!C{ONx>nJ|Ef>M^6l1dFZnc9FtvB7} z0Ma?Hf|WU1gE#5jd#M0T_r&RwxrWaB9V~2EMqsM@opyF2*AH-XCez?F=Q>&Qw|5(0 z)m&-C-M!^?{b}}69V<${)z!q}Rb_pcYGD@r6CBmi2qKw@AEt%<{P<cx(+0|MI#Hv* zuD-cPsTV_ZPfj$pSQ{U<_?6J4^xY0f`h;;jji`MubTXpQCBCK~#UQ2W=Y?@f*!yM= z47HeG+|EiuCB!6pWiuwc1hDek4eC&;u&0$nB2J93#aKsEtwHAvE{qhIicKWO;7h)_ zm5{YD`&vJ*BZ^FRfq`29LgZuGB|8_$KVw(eSt=PpN`qKB(S;VYmsO{B^D`iE^@^@$ z4`tf!p=IWAK&sL_sv@+HOj=*)gg|PJBAPCx(;2-rGf0^5{XWYBU3AfQ*f6<3`7{=I zJ$(H0d7PW^v1|<v42@#2PoK6LHLBQkalgD|TjGiIsc%~y-AgzCrQ^-|uy4wYm-l1B z5N_eYI>@Gj4g@5M7Zoq}?F0<8DOWO4tLrIME$q!H1s&?)%_gB?*G(;J9P3oUlEQ-Z zaJC1fZ`Va=Tt}m`jjQlv4}8~OnbbsE5>)%J!9xz-2OkM29<cNi7KSc>y^~j|rm-7} z96&B^l+Oj-t)qaP`puzwA(yjrC|{hxXTIE@EpD}0ogP>h1T%_pfI;9;T~Z(6;Zz|r zA4S!x1&S;U`y$Z!4>idyMjt_&>+20_uq%&M&7|F(rF=0hyXh;~W*cZ+#fd#|Ut^~j zO^(@|0JO$IAZJhKS2Rc(wXhFa3;ex|H?y(un?-eI#~G-i93fRrTgeZ<ks^Ig!P=D@ z($7JUH8w_<BkEfgb5YM$=l&{F(MIO={H;1)3|2nojG*mhVXE5&$qE(&%S<Wd-AE!< zHk$)4n9_`$7>l2AJrTu}Zcl;&eXCXyEkcD_dakGYJ=Ie5fI?^Z!FJO}N#euRpOy>E z{`*+|j$(kUKITwM5W8GRzoT`39ziy0G@0wrpsB4UrXM?T2S;xfjD!eF&)R?%B@bMn zp|31sMMS}hUXLG_r>$cixjeELn6YTnumW412{`pWj+G2MW6>d{xnM4CgW`KZqGgzz zld}v$%E(ZlDqgL5qfIXs%tH7{=nQiUhthK22m%6TLq`=#8a{H+6I#2piOp=12kpBm z?dgW9eqS0;y7kY1E#WER@LoI>2f7E%U78s8}S`2A~B{Ir{VGyPiTR@2?_058TC zs4<}2Yk8;os+fXS!6*XpvX?b-BHWQZ58?_*PVIP|$0(lN4v`e>mNA_eu;y#*+?;@- z14?63x&C&(qA5!AbiIg5+LSGlQN@B3jvh?lUI*hK@A;oX>Os`Y$oI=-cc4yKGln>% zkg0qp-#w-yW`0elD(0XW8-CT5PuD;>8?|?Ko^^Y%eo#qUA|~>qRjjcAzEzofJM8&g z{7rhMDCu;v^$;1<%imUt4*Kh+puklHu#r||e`2Q7si<KWB&ve)+k5o7WY~r-hRsOR zI(hg!i^}0@2s<-{Wa>v)j`BX~U70lwL%^EkoEU1tXKC8Vssj6u5mP<UU)rIW3{%8f zG+_4c3?!t_X;HWIYbsy{;&d$QY|pev`1H)`-jU?_x>MM#Gkpw%Mpz7f=Ii++0-U7; zHX3jtg$OCTZBnrHZs|;X=8hqr3Y=d3MpC`}i6?h5KQoiBWi_yxmPy4<+?kq?X||Od zc6XaR-#4qHO=f|oB=82LCRqJ_I`o0&(}Xr5rHEo5TW79yLsiINn9#!TyqdzWUo3w+ z5gQ{G16L7oAnB-Y5JB7EjMujy1>gj+oX2n3$FYME|8_PKS;h4|JWCBKxqiK^G(ZlV z!f(dcMvpl-3Rt)r%=8Z5YSs1W?v4A6{2=^^#NIC2DW880T_3CT;UX|5N+>{w5aDkN zqiG_o>HaR)^&eEv0V86)VZ+A1Vo;X<bofTik)<gTb|ByJ)P$xcFud{=2yo&*w?xgq z$XP_Ck0PUEnGaUod=Fk{ZjIOa0Ft0SI>L(XmcObpeuqs%)9rC^^<+ha0{?rRhSl-L z6-!1f4(U&CB_=NAk37Xv%w(^h7Rrl^L=-X0GiQnia(U@=mFFvSvQ`txGyizoQABLW z`5FGRTrC#9DSD%ChcYeOSP9I%v3khFJ$&YK)fqSl)2+{Rhx3Ma<OdX7mEaSBZEewi z85&uJTmf}3x+PfNpuU5QVfVJW83Dqh)s(G1Dh#1Z2BD)sqM$2y(Tu^Lg=w-{kq1Xu zu)3%$iwxiM;F8)U2cLS}*rb*|sm&bf9dIGF-^gmU>(X#~L2MK-4ro4%V~%nOj=l#6 zg0qlSh><lJbA6(pDC$#dk2ed7@h*jMGpj`jI><04inK+plXrX}dG6v8%Z~B184?Ne zq6H;=zS)2dGMd1ToQnsgSNo(BRzR)8aLaY4;%jd9oRF1<wwY;z@L%1{1ixQIw+KJ% z$Mgbl^3(O3@$)t!01UC?^*4z$>2ndZCGfy(74Rx?Da#rgN(mzlSkr}`G3lscJ4<_G z!1s!Wz`tRkzuWq<1`a1``dFX~Ug-h#>yt*5;vjba$woQk<Vf?PdrqPFF)DCIqHR3d ziS8Dx5n_Uo4nzOIWrLEb|ADz?zv{K8fR|qmEVw?}v<(IjkjW=Aua6(kX}&SXr7~4U zxbRAeU~L+;^RKL6Lt+9O&~Unt8KcW7fxYuMdra=1MmwGUSn}P-cOb@9la*ayJPJzS z7?N3S4-9m_^mVo)Z!pm4v0VT;6es&oxnyE{-_e(0hx@EK)4udrk3CJv4NB|wu_ih+ z^r479k_-egL1}93w&c3fWe#48<Vhl@;k2QX?==*$d1Hr50X2i_%+YWwq+QJ9p3!IE z#Xt!B@S`(4o@e?6Wd680!LG;M5e>lI^WR3>uG;eYb%xXKJnpSHg+9);Cmy#IMH68& zdc=RNM^KK=cG1YakgcoS6Zf0yq&g5?`&ZI-4mW`7*FtbL!B6?@4W`k-o3&!wt3auD zqA>OR(_t@tkbIVqoL&TT5<6G)JQqT%LEQtAOvfglSR+(Au09yG7xCPD8+6u9>pnEC zCX=N!Y&;ObLP4KB{q72(#g?P8l4?lyYX-3k-6fj}{(6bHt{vJ4wH!QW{%gruqcfh^ zI4Tg=KhbhTKDiP|-6qXsD38$^88sZN0}%U`IBaHe<O^loXy!%`6@6mFOF#A+du}Z} zF5G^HyZPf-ZdGf8@#Es)A%?-mYe8q$z#$v+;Y5s>8jVu1D^P6fRP4!Wq6m;xc|m@P z3A*~ZYbAM0+CV>SYU4At6#vciaTp}`U=Vo96%Eg>U*M4=E*2D&)dB^{!foEXSU-Gd z$50z*M8~BB|BOpcZP{yJ)t2pgvUqxcY^kv>_p^3s4#WtbN>MaJJ5Wutm73_w;CeSz zL8IJjor)YiAG@NyL1s_Lmt|q_@-+GkG6Z%E=bsX!PvW2onIjxVO~bulA!1iC;0H<_ zHfUDBAYE6Vc+xEtqXp;>+~6}t$yi*p-HzkN*tZ^zo-?|JeNtJ1@;yOB660Uk&kIn- zL&g%ReJy{jXGp*LlwJk~H2c%UjB}|FP-09i1<n(iQi{szT8Ef6z7<*5PMP5hqiv*B z=$E<yCkMNInZ+AzPB{J}nBDjo6WE3Y3Sx6>p@K%ZptzlKT7co0d&D(x_%r6Ig7{l! zQk4-dpUwHFXiv#}544FRQZedsj07=8>G6cir@9Xb(`oZsvpuSodaxC0A5Smj;+}Yw zWh5c5FyHC0(`06cmxCv<Oc5W}rtOc+>3q+ILp?VrJDvregyYn#=WQj+H~C%ez_T!| z410JEn)<_+k^l?~w^t!tNLI?KczF9TJ(SdJHs046Upe~G5L4I0r7Y0dE&QMl?WrSI zK1`=`XntM4nL2(u$ke5+4>6qm<{W(Z^=X{^IW{Gs^)uox_d+quKjr}Wu+$Q8`b*(J zc~Z|Z!3;XhI}wa|O+!|rUmY6I#%<aztt!Inn56G3UsQmS5x*8BW*<?Xgt#V+UjBoF zKZDZqK*~0@^t7*iSaCCYgpt%_GVdPzgfMykY4L5c@XqbbIp+A5oc)KMlb!og`Cb6C zfM#_!PLIRSlRnxWMisQ4CQ`>OO%#MYYGKiT_I9PVD(jmqH}O2v=5JL-j9p8jx>l3f z{ji&h72pJj7cxrNt@WmupFjq3cp1d*z$s#>6;{#~Q_Vv`a9N+iEx8o(FgG*|Q{QA3 zRK^BAofwX^d@HOLY5_<>nCXa3@+e$+%m_;#-yXk){~~HKoWPBo`oz1RZ#Qt}jXLzB ztiO*MQSr!j6UHVqb0;v=Y=Nt~&M8r<JH~ejC?4Y5=CeypCL=`XR_HmhJX3m^vN@Rd zT<0})>MzjJ0FNFt<{aYlVvpB;_s45q<$Eq7U;|=##&zmet#*?fbdnbuBRasF8%pEn zQ*u7STU+9hE<wU9JL13a4gbAk+jmyE!VCjEPLZZviTsCAJ)O+{^>D54SNy(1eV4X+ z0I~8w;=|5PV=6q?^ay5k%+YG4)5AiUw9ur#r|q-f1fH=*4ad#Ps=l9oVho**X+*Z# zyQCpj06Czg?uKKLz@|#X9glx=T<&#CWC;yFk6{_X%MfJMU1;dQDp{9HEAfsJSUUYS z;3LCkrT(dXs|z9+A216WIf>F=EB<&6XqWQTSI;0+8S|?QIP`osmdwEBCiu2F!$DaV z%%fr^yT!FOh){g>(LHk#Qlw!~t-H3=2yW~@vAn;MpK`hq_R~~e>n6Fg<6k83{As5b zo7hZRn8-PmPit!xvHSFkzzOPjJQc*4NgX7hih$%&VW5}ELw@Cu)CSjL&VG{&h$y?T zPj@2kW^b*nY;Q+wavAZ2>9j&?-SrHTH7*A`%L0zA{eC^2Up_xQFa6T_oyk{oMWM8d zss{#zWcuAGCbnhlZ<(Dizdbl(H^~UJA2gx4MR$<~S-(dm@h&y}<z!6LVB?|%3VnaM zzLkBqz<DxOG^T43YWpzzBHW-Ekm-fJ_jJD$g)FIw--9344tFwpoy3|%;0pr3A2vM6 zk5yMZ-!5^kufxw2eZ5$heZ2tp+wJ``t=gl|N++6?hDlnEk>$*vweI9&ZZXA;w`&(_ zHsm|Ut@n2jqh_=Sq4?6g?*gCf{7lB;Uxdm*7IG<Q<}SFQy&qcd$>!1l?Y5?KQIK!O z%a%CFnPn4S(r|WrNh=CeqjO;aKJT060j;5>%Ny@}3~PPt@R?ioB_-Va9)hpJeRQ9? zg;A3%dzZM6XoP$mU-^oM556ifvN)e|2$H*?r?XQn4s84+vT|l`;yHPWq+C+rESn-J z(j?C1&nLuli3j)N^;E$HXfw0JY6R@)UEC}>wAsd9I|^?M1T&efapQb?O@N2bPh+cD zK&+X^NSMY6EuWjd#wC!%Z+n}u&XD*aWmU(~?U=3grPN2U79(fOzWy3y?u1w6+KI#? z4yE|+vZV#8;64Vom|^}WYC)W4Pd*%vtT_Z=!o^z5NhCj@3fk)M0iaosUIA&V-0bRx z1U8!ivhJ3l#HmVzn#|dZZL`xM64jUb3w}8P0+rh=i6)&bgD0s{waXqI()Lwm)>m(h zp*N;s3oY$wl8E&2<w?#oylcmu=0w_(w=>PlWOIv6ycI3hiWb?1Ucp2Bu1Z?5eBDm* z*+~cu2SqA@r8#Lrz{>SqQdKh+FZ&YiEXw%uhmW3#*39z~`g)8ybsqi1I>iD<r#bPP zU8?)&t3IKML`4s}bS1psx}2My`7WGKfBWDLgrB)7=@tX!xvh|aWo%02#OF?(p6>SV zl4^&OqjBXpp>V@l&v?>swGuWW$7!nT)Z4nMT_0apN&Iz9;EPwXwL6Y`(R7b~zTtp{ zLA$r6oyGx1R)&?l_ki)eB&PY<xJd#l74+cC;p^Pz!h<F<dZ;+d-y2>{kC-!zzfP>M z(6Vm>;3J0`J{K3%_u#LhHQh_I5eHuRA@ruORk3+!LEljhRlo!6x=c4kD-47=0(pz= zat$Ky^>-csLXSvupKgx@cu-AmOYzzsH9L+|<=>=sj1-_03`@Bo+!X4SLcUJMkUqT1 zK^k3!E8|Jf(qe{`yTHnT-fm+LlSThf?IQT2v<VT32KoQ<)TQ`K=7jk8t_t|`X=C-) z%GJ!x$}$d8PmJ=%V>hn62}JiVv(p{~1d7M|&-FL35Gl^Ao($L4%@Lxbjf#N$#|SlU ztseB3gebOwg5+LOiU;8z8P(&0KjNl8c}4$-i8^me@gDdQ5JV`D5QzSjH{c(Tvz3!G z#LC3X*^a~6`!9-rGSL3XprR#nf%aGm)uUA~$-goT#<et1q5QM>Z%NaA0|iP|0IfsZ z=O&UzwH5Avg^e2jgk>Rrg`*m={}ZPBL$#d!%>dz%Mgau@;mN<K$^-sF95mwm8v(W6 z66Jg>uISOBnDk!=ln;*xVq6Zdcb5ORr$wbH1cAptEcy8SZ`gf6VBDuB>i=;3-P2eT z1<HK@M#!HMVw?ZFC9dW_Ew%j>jWhix?9wcRC?8kYEdEzx|B-YB{rB!_Bs}geX&h|} R*59P;Esu_|^?!E%e*k`bM85z4 delta 22910 zcmZ5{V~izCwC!ozwr$(CZQJH)+nTm*+qP{@W7?YLbieQ3yyPXXl2t!;C42o@mD*Lc z*UuN|@)sz9vK$yVIsgEG2FR!jiGIT}!)t*80N>yM02Tm0HL(j92m=74?SfUY`41l6 zZ~zeS3oroSf2TY(h1eZt<i1a>S&BwDJPVz_%J9L<XQ<t9;kQKs95L((5*G1GQm7-# z2m8tRcacZ}wTu~MSzJ#0{B;{dI%^;VzBn#VU>S0o-4`-c7zjK`iX&<<r}3?8k&7D| z8Z+p6j~w>EQ<Nh;TL&tF0^1vwFx=;Yhl`epCmrfPw1;csn;SK2m+q)5?|<&lbu~l> zBL-E%5?XB_qZmZR)|aO`!SI(NcL7!&7pBNKPgP?erBc!$9M@3NeP{hlO~pjwLw#Rt zE{Rg99UQySO17R^YIff91?R3Djzzf}jc=fE0bsE}Ba8{!KTuAH4z)*Dt>JVY2woi> zuXpY!v&-O%rK*&SPuMYpKImN&!V3JqDdoZAMSNN&0J+6cUGV`fCHI{HAy6fY5Vhwa zstXfoy`m!Djm>7-+8&gQOhTj!4n)PjVq^wR(qd(xEFIIlSzyI!<#m3mX5wz%7%GhO z-g!C$ZR2fCcoFUcj1xQQ^TF$<8>9C?v=H7wL#(!5Fr9>Ta5CXI$FuZ#^~FxAX5s<` z1%;IvJRiersMQ9LvqJr@-&6Uf-Iq+8V7WMh6{yYrN?aE^D|$0f8RLm;3p?TdDMPx( zNJum5r>Hs~)ETA6gvf0%lRqo+uz9p>1%R6awId?OwNIm4M6@CQ`bmG1%4g7zwpwX; z%dVcA+uSHWQn~7)N8bDMQ|nX<N6v~y+ITwMYa>45PO#j2+{rxjFqmYCEX7&z+d25l zfoQl_)kwju<9=?gI~!@t^vX_#Jq%!<q$%(U)%+qHzMFDV9d)a%2L3-;qS^hY%SWLg zBO)dMAblJF!2VxdVx;bY!T|qAlqXFv|GzL-`R&|x#yt-n=-TC-NcTvjmzoLmGA>+h z*j=v3^Cd6)vJ@v;z%!0D0hmK#=qvl*fAc388v!CQ>bY5l3(};~do5NApAts>{Yq#q z6)~zg*S73Ax$$Asq-a;yXSV8EGxuZCz4=hUUqAP^6CE1^{$G-{w43)2=fIEq?>g-8 zl}n@f1I3EF`h)0!K(BxQpg@pEJxE$qwE!xVE0<hCaii868t-H7-G&WRS5MJ2j^!Ia zoPAQ-Y`gYG5$PRns9F!uisfJ+Gqt_A05-q(M~XYbqvBX`(qme@=rfFAW!4Cxs_Igp zFm};L+q#!lNe5+(x@P!Bj()uO=v}>JdUr!P^iz72W;3;hhlLD_hcatcb<I-zv^oi$ zns?4YR%N}rYD~+Ny(bC%bkjd~)$H!5Ra9rKRCx`x2%Sq>6*oA=zE7F3BJTo?@aQY( zDH3zc*ehJcW!A3T$45lk=6X#7{?j}l>W^+iin^u0w2lKR1#M?dpQ(C=aGvpp6-dKq zL4`;o^MmA<7x5_SpnlXZD<G;-KqVQ0+ylcsrKVB**gy?wMizdo6UZLl+YH?JF#;(U z=0Vk|q6Tk>lB}_ncC{#z5y)(KoTC%0n$<)2o2kst{mCSGc_(r#IN`~sIwlv8w+C5C zJ;uomr-Xg`6$l6VPE;ex@RPdO>Nnu+`~CHMW1%N9>@Nw71|wV{>|KF6C9DfU5DB$( z9J6LJ$T3(Glei_Tgq;@K5mASkN$dox?(F<L;#dhdq!kxJ-$>gs7aj5EFgXju5{-}t zxyfXCl!l0tvCO^!vroCI3#BFS4G)WoSM6weIPXYpHyw`0pGa5>qjRFZyK|*5k@jzN z-iAbeW$0}bGC4G}bTL$+@`Fgv@3HA1o9%^SeQr`8_e<rtO>WE@s(Uv?A*G{poG<=6 z>BX(BF8_XR08<6t;Q2xoJ^`j)77|^mUOumly?NQ{0FChR`&PmB-qA2nJzXY;A%Sx4 zyyeR<jdIC_t_ldJsnlL57(lO1LlMk>0P53EbQ&n5FR&NFW#%2~+v3~a_GN$Yc>eD< z)8AUeKjMH_dDkRF2$wd!fuk)%?0AqEotKDJ@7PQ>I?8BJso_u0%-!+w_GSn|nwuTm zH}0s^sYNoR2)^~YRxU%}Ri~~2^vtV;DS2UjrA3?E_EBDo(N|A0T-F7iw*KME7Nez) zfluHcwky*EG6%h|7uZ@-LD0`IWYkEr>Jx60^{KI9Y&e|Y_=8e27L`{YQjaseJOQfb zzOe=~ZHM9=BRjPsj_^ccc{Q_Stm^c}GI@_?5O#S>W3N)fmuF+3X`gMa+@Ph~kZ{iz z|IA&0&`H&6>=RZC*7*oDut<FZBfp7A91d~T$Ot-0Sw8Z0^tYt%^Pc#45LY<ROyrIZ z-XgmLMc8^DVCAGf)S#h~X(~^w$y@U#mUmWOS?ZSqvh}7><`&qLAyM8^9|`dY{qtBA z<B<oeriBa<)4vOhWf+yX?Sr9FJQ+c5DvA_=+Q{2M`IonIBnh?<ag*S^_A6cUZ_X8W z_nr7evniG2Y+l|@v<V*<U;lNdDxO5E7tdLQ28YX%_k!d{vHUW84O0a=r`Q{Rn-2K+ z<UJHKh6<^iv>dWNEIJ+x0hdg0%#5-hi9fU^O|3n&lFSrv_NJmI9uetBi%lNq6cl>d zw6LWNC)z?}YcOx=K^ono_>hDbjUU-@LyySxc5rHFP%KAw6Fyuul#kUdsA&qtRAZK@ zW{r699Zy!8kyuCPXxjUhiu~S&KhkJSO!&A{+2T^9OWe<DLpCrbQ~GsF70Uu*xJliZ zmyBW%SP2STo=P5M{<ck%%~L-k?Y9u`|2lqO(F*S#C=jP4n1d4P&z1cFf9tygFiCj; z%73m76VCjIo@CTINxyAm*z0N+6{4>)6GOv#*^sH!jjzo5cB5>|g#Vy1w^j0SmO)v_ zsIbn+IQOaIfqaXvQdrNMlKtU_G--jOdbb2swITub>^+MZEo!@E=u)_3UNrM+UwF?H zPCk(Jo*LR*(G$I!o($z<!M0#Rmq^<RTSF>l31#(0MU4&_;{F7vf#UT3g8d<F(Z$4b zL4;XOZP|JULx1lf6E=TD2#@!xx?itDrCOp{Ji4yBk6#nlZ*Zr{O|L)}5RQ$b)ylSL zlWYSnr$=evVE7ivg3OS``D?ETzl^@#HH<+KRMo0u<+JciCS>BbtL#PD8p4FqR8-ZA zewLeQBWfpRSS}y^Eh0~kMKxWq7Lwot7qgv|zvvfpn^#tkkcNq%VU}~z(a<B!5biW6 z+_4WJ*QOsV%r>JZtPAr~j!DFG=Fb9b{Q?ClhlAPOqaK5&qzdoNuuo8jAp#;8I3}=u z(?r$Fpezgo{)nV4$(A*D4T%#Yf%FM3iU!v)J|uX9q*JrDJ8M8qia_VuCkY=O|ILi{ zMv698#l1u2$smYD)tsgc+NHS#6L%%ulCS#Eg79`06t6;OfV!6k;Re8E$NYhFBzOcO zKciao5sMQ0OjjEMFoLuw&tdJGVY0O?MMdH9L1~h~2}I4f1sDll`L&$`U<<&!)37K( zi4^4Qg+Zw3KR2@YjeRsFj3_sGy;Zcq2<*cWxG~)dismMBoZ$*~f>MSdS^>R?{!F#C zcxGWda@twaX}G^3hsb>eOZx{C5<Y-|N3nclB_~_ff}gB<Y43DD9YmK!hK3>Igf2<H zQPyHLX-8`p^IpNfcK`YuaN^NxnZ87sT`lKrLc`=CoWjcZ(j11DVzJ_R<Lp<+Y$Bw2 z_zPwiIGwz@T`JoVqoq*WfM?Z0iQUdDkuj=fqgQ2=M=@dOYJ*HWoBd&y7(fQrlW>j1 z?pa#iBmsG|h4v)Bse&l!*=cvQJ!m0>(ZCgm*?Zwd{lJICpG42-X!(P-KzG$K`Fiu? z&lcJrL|+^@qb*m+5<1#svd$0XCUGJx>Ph>+%XBN#dsj9ijrH>r&lWmde8iAPk-?9M zkxh4Eywf0yr;C+|yHyM{DG`8rbib9qaFui6ZOS_I?j0A#11Q6jyCfmYscplRR3rD` zMjeGCBi&EsY7zQ;pB@ATj3Xn00%V0Ejw%V@kS#{BuDjwi5&M2c?FYdQpg6`l>-C0K zc!UfjuBf6TBfqL@wVA(&2h<5D&d*CeH9)bac*S^9Z6$8IJiNl-BohJmrYN<N?j~SO z8?gOi)*nD}aK8q>fCA*U2dr^T7hot1Nee-?I#v9+9LrM0(EOqX_BL-}&iKQRRGW;J z+S$&?(%<-D6WWI27c$V07Ms~`_4c0gQ3w~HB!9tCMjFi*tNE8FP(sd+x`Xc7(n!E9 zHL$U8K|h@-V&UzO5c_}?ar;4x$iC-MghME*#JMyhD46qR$$q$)9+J7_r;zlM*EnXJ zr!~ke6;U_<5=+t~g7smoZ7CY&Zk^hYc6PA4d(%j$vhV_tvyya0Q*TVwN+eACx*Cnl zX+Jax50wxi4dO`%Wn|GbolqR^a4a$2`}Ghs%v@n-(7}Jwhhad7NE1Iw%S7Wp%>DQQ z5jbJo^XskZ{=uDym1E5H@Uq&<<}QR}{^Ty!b+f3Ud^zu77ExemNd%xWIgdqSPZY;I zg+$m{#MC($+R8@h#UQ^?BPSNoW(6oD%Z(#JqOL%z=&nj(@61&@O8s3Us1d2B^^js3 zvj!N$!b!2G0}X(|;=dc&%hdy?52;Yp+5Xnw#Iv-rEDZ5LVkAGkQy`HTm#rc0L)Q*q z(s+?JeJLy$Sen}$kgIV9`wo=8aViCcB5&0zxWN5)=?G{E8Awv^HV4kSH0}!jfe2eo z*RCQrT8E*Gjb`Z(b!9bBEq4S1PKJcX5tmO|lxu83z-$5EnaUBFnLL;|a$2;({`wB} z!Ty;sycg&tZDwEyTZIP0<*QuzyQVj2vb}DB2Xc)D(uj<J>6%n1$|!F@U~r-x?60@F z!$|ye*QvVfIp_0-K*~-1Q*QO&Z+iKt&DO{*4%Rv~_7YL#bsl$23J-Wnn;<1LxH&b# z&fm$;yp^~>a(xbJ?si=9G2##${&H;cFH_}3CP)GXd_P$!P&ug~GdZbZ1_FqQjD%6) zOKR?3cXH3Pgpi?S6-S8qg$VkSsX*=Cnb^R93bl2g77Yw^a*Cv0Zb#1kRanQFjzO^r zoG32ibM_5hht`f-wt66{TM|CpPLhbK@jZlcsN)u}1S~0QW@m#}M)(5KHdG&#LF96p zB1cY?qcKFjdCu-WI=m~xqQK^_jJS$|49DH>sfVa5q>Fu#IvxMTK=61vIGQ*`zoI8D zcOY{~pIm@bI0&^wsU;;qz&;#mh`V#OcFd7qZ~`x{k@{u>2U2|6b^6v1o7<m$ufA}} z@|QIbNf*@w1sYNK5NyDLpHcwsHU2qfv%P$O(xId4wGh2yDQ1n`<?#|N=D9+t!VIsu z+8rdfFZJ*cGa6R<(4rU!Hp4QAw;lTO^GI@~9?*U8WqG6e7hog{^eC~7(>+vfu|Uwa zn!zo{hMQYn>w(ZE7TVlfNSi?ofqBLD7RUy2xqM*|X;{JG!zr^2glj{4&cf`un2ivM zWj_SY`gg~@ib2@@VF*Y%CYGzV4i0VMc?bD=32%JBYd216ltN`3<(0Qi;SSR?y*64d zU>pKCN=7E_g@hBJLdp+|9|$`0+J9ZKpq^nWDF*O$du<d)%tk9Uez2L>=TV&QXK(;X z?El&e53z(zE<(7V-y`%S+p*^o-w`=~5Y|;XowS6;>p<}p(`sS!O5T7+leffA4)z5R zKw9B(T7INC5b}7nyfH}&fO~^HQ*e8Gv1|5+^TBonC8I$RTg^2J;1nZ`y3gc#nt@;$ zyW<)kmaq;268UfVz6+Zq&2RCH22FtUb@_$!Z%c4sP-tPGtccRPH4IeUH>CfhVTp>x zxMqUZOYU$slWK+?dD`Y|(u+Xo4TvyKDgY~hjWWjtV!tuS_^(%8%8vDB-2i+zA?`EG z(|XQ)xRCqXe}qLu8IZfpBw?zPSsZ7c1k>r9q*YA=WR0gX0lKN>g9(49TQPyj)xl|j z(T1i9V0|FQ7*`a(MHN6WLa<W1T2(zlDQX40S<EY399qs8O%jn7kCvq^Lr|H~bMSs~ z2Z7NPm$k=l&!p?XeO2kget<BjtO!c^E|u3+vN&BK_WXep>l+!FhL>u`^jm{;<yCM9 zJ{>>%q=)4%DJ9-NN-m321tkXV8!mgHd6oy%!i6U<mYX~*l>I@FLrL#KesB&rB$9|6 zA%%A_QX`l=zZ(G6gVGZT%Ve2|i9O40k|2P`cy)2rsiOqh%$rr$mj;okLX&2Kw?<NO zJNheMw0L5Sq|cDv!JbD-W=mn*Ix$@dz-q-su;^EVz+t|u4g;HNAVUUvhk46;!0ZM$ zZ~o=NOZMP|T6mIAYN7VxZO5s!BMlOBcKtp(`BY;SS0}bsb5raC0LcDAM+9GKLe{^^ zoMj7A??DBT1rFX(zFJ&2rQg=@$h#uw*GiiiP!-2vK?M%4PrazA$QBKCu4{fL#5ZLG za<4hCFrmq)!k-RfmyQ9!;swm*g6W-hMvt&{8Gu+_fU<P@#wdeI5F;I2O=SAbC2;l} zokRbmkSz(mA8pg{Q<lHVabM|g5p%az$fSwTdUi9O4*9d2*2sZc3~?s3-%)6{lJxLz z*X@k3<V!ScUd(J?{L{|t&7-cX+RYk=R`TmM69S+;h^$HpBI7_xb_`shsc;MEQg)2g zCU32}`1lZhc!QH%jJ4miB30g}Vd3a0K;figuxZVN(;$e)j~BZ*%S+ZOoI!sG6XJwd z*X{?XO2EdSL8nUk&dZM*DCiY)R}`KCO8`#1s~8@7h$@9#e%@zEV`BUbB)H~1uGLx0 z19}9f<>~9}#w_r4cCoMu%*W^tUUk^RB+~m9DwPa~`Ltr6I8j`>1l~9(MGo{l&{G)1 zjMyDO-+A6=LV=Gf4jS?0#s~YJ88mV16Am%cvNhWOBEGq_ufhHqsvnEsnOl`mYtxBJ zigAquMs`HDT778Uli{|>Y@fa|Ix>&H2(cYu6@NrLIsmNYtRq)_x@tpyBSAH(%l_+| z2#+epfQN4^M%-Yy!X>l`c$;gym3)S|f-mNuT0)`JNMb>qQg%1y8ZX?9*lzIAE)?Wx z!{{`0;gvxadZodzCZz6AuC^N@D1L42_v$P=;e6deanYF!znwD=6j!E@6Nso&h&Cx? z{Bdh(E(6km6I2SQf4G$01c!Jo(k*$?ZVCOud;ycCNVu@k`$yUAL?oYw%&ZEM(Wm77 zO0!|@ET)#T*_{G`!Csh68r{Tk{we(%qsx9(u*l{j$_}6EgOUwGL*sHL;n`t$g+-2= ztmrrh6<kpSvl>B(JQXCR2`?UDQL#rdsvxe8b{BZTcNR8?8%vL%$+DP=y~88<X_E0T z*5|zrj@_YoE9t?Q#Q|bLDx$v*3QEint<?ts4vHl7qr+`EN~N-n9o&F~?`V9-vt$~> z9Z_}{xbb{rg7Zzpk!vRhB4qpydO12YzlS+UnNkXm5&~}#36*OFL+o_njmla{&|lcN z<^y!hjdYk#(P6fxAVkJz{bp<ZUO!0Las05ye{&_m8gNeMcw@EU-r3?^DZ$o14r?Va zEE+D@uF6Yr;}^U*IKj6PFgiQ$60a8G1`v>K>_g3_L!8!|;mKKO-&@3ZHjh)@*u;hm z!Dzv4XI956UKP12+4t((zDSdLl7=wi5CIqWOQhzJRyG%Sk{#QgvG{6FFiVlyL&F)J zJf`ah_hVZzIQ1T>*de4?JcSwbHmm8TIX2fCxft~H8)rBC`I0-X=r0!DdxMPw;hh~$ z8kTI-S?G@(6t=;uXgqiK1CSm!vGE25TBZ_Hv!G-nqVRNCDa@=4a+nbR{ove3rve4@ zlo?NK9fkMl{BafrUZg_%ss%ROs3}*UU$|`#mLu_D-F5dAObU2lhL05>pRHIyX%F4h zmpY*qFZD24YprfWV)nDtb`&w1ZP<HU(ep0-n#*5<t)S}9dpBDjDqcW^vofRAZ^@U7 zrHYMk+eRS;`vygY%ZU$3%Yr#LrGSIG>E}3|`%>L)Y>YTiJGhA>ptv<xhiS010PauN zX`Ox0_!>^`qA*M-?~emoXA`8!3ZO;%&+Yc8Z%&6BS@wHK^q8m9j0_Y4U2xC-!G_{a zxwT$MqZqHjtIKi(PMRrOi`dNbN=Cai-0RWAO+S6o13~wb=G*2;tJjzf8qjvZ!7NlP zv7MOR|5Gu%YmA}1ArPuBbvp$E295yVE}!O4G>%)=X4F45U8v=Vua|zM`AQ#&Jj&m- z^0zGA%;m0ZgPxwl3gBc9yKiA=VRb`O1syb+G`OhubCj=83}n0B28RmfI=|f*;Os2k z+{KsvwC&lVsrw^$J}~w`-~%IRhgXIFx`1*apm|iJtXM+JTjim%S=WVF!EEw%XZ62k zDbG;6$>xY0y>J^oFN0ae+l6(n*e5RFvWR#1h_~^<GgN_WizmO;4^2_X#wVsoKa}WY zVn_=s8r7q7wOxUKP8!$smovq?5`g~TMFdxM^#`LDPkb5A#k=WnJOS4>msl}8I<x=E zrBdpkoJIv*8~B7DNc<FNOKH%#F(TaWaOKb0uW<7HHW}Cu!y*;4dYMx2@a&%LIOLX{ zoFkZUuI%^VGHw?k)US9|Eqk&&|Bb%?GSTl0kA^`YMzCm@<5xY1DC?&6J7Ideo17|G zYphF-zQpA{5eh2Xm>PK4WaiW#(?Z(`+$QLCW8AK3fE52F!L~fL=jqk{tR!R;;&zu7 zq&Q`7a;WK`m_z2rH8Ii`(ua>5IeJB99I;Eyfq{IW76D<|tZ2@%-{cphtDfR80*jye zkTv;@2shb|cpe|2%Qu?yTD?+n7mfKQz^+P(L~)SM8-?w(sSPZ|aQggFZhibJ?-k&6 z^{`BL2l)K?_JXq?Om}czm)`Ei*>Xit;!dApbZG_k*WJ#-1mT6q+ZK*aHIbk}{~n+l z4L&?wjA{?V#_+QLsmOY!`6r1}@K@;s`gLiC<ye3Kiob2>)l<TweKx^fovt_+LVcLU z4wnjvDu_=H9t!x|C-E(!LE*gKU?e|W_Y`uNjut}#d3x{L$WQBIx7}lO;G{wLN=Bxe zoZ?+t*8@G#bS9yqd9Nvxn}BL0SX^3C7KBz<)>P=(>2BxBpp#}xpgdcK{>Xcxf6UMC z%TsF(iv-NL;dWBr^eUhZQDvOC=wNOU9!Y(@OPGF3_6i6K&WxtxCcZG|<4!3H97xUq zM<s?#(U|X)=B5a}QwaH+nr=rd!eiWJ&z9iFj)y0K`buL~5TuPIWpQ&-qJ#bv%aQ42 zpE}P2rBdVv+kNPRo0Z<Dj)~yxWPX_`z@LHTJX-)-kb!JT?At@S&vHG0+qxp3@vE9c z*R<`XehP@KfY}YfNtZ^94)a*IuCs0$hfWiCoX{$I$K`2e4YN}10JW?W?1o0}3CbvL z@*6pXwt~X*B7nimSii-5n{e2cD9oq@&ei1F@&gR^nR03FVwdJ|U<cE4VibU@<hjvF zoJO6Lj)PrbSqgCZF%tz~&u}`jubtg2c7R!<yaGS3Axnk6c0svW24i|g>ogTJW98?Z zQ_H|JDU#1nPf_UX4eY$WR11^88%>mBK=o*(JQty*$$aqw#{7lT_tUo<N6%(q2SF2c zbq*P$vDBZS6J=Pw#SuPDL%VYze#P<k6`Tl;`l7IVJF)77+KM62-hSA*-auLCuWMHR zngPb+8ZxxQ>QgZ%TG}bmscP^ZolH(8j-KaaI8NddoA|M7;o>dqL^!o8WkJgz2tU50 zzFaC7GOKm-ZzGAml=N3AhiFAK{!Z{v><R7AfrU{{XU`~ml*+HVQP^9!1Z@WqGLOpp zd>t_=xtbi9HW*3ds<fF?Hb?&p82>Fe=L|fYxbiJM_aiK`!t+E^6OuiKoYn<9p;KEm zi3~+++CS>)6+w{vaN*XpiE^$dV}t@#y;xqf#j*+4s`$%n4hU94{-=T8IfKJ5tSvew z3g!D!^ebj9a^|H5NKg|zvNQ$fo!^j(@sn_w`tH@Hw8Vs+cjE$fHhX?992Ey=a}0#% zOr<}#FIa-eY-M*cp!FF#r-wZoMe7XqODgtIJJPuaH@@b#|7BvlYB^|G%P-G1+$2!R z_pl~sPIZPa_?Hq5e=6`zg9UoPRk9KXju1Oxyl8}38Z6R;9`PP~ynkh>W}RtBu|w<+ z+wX&;rz?+XMA-RcGoRB%vFM}=-9(_10>IcxtShma`ba0=Y%(S>7=)nc>zajI|Drr_ zp94X7+Oar}yvvxEg%OR^4{X|7KyoC7_lQ^&Dwp_h)D4+MMOq0rhk!2$v`IeCZ5CM^ zx`->vcZDTzw=1Vfj6MyXk;q3yqQUfr;$=Nw2%&K=H$(?U@mM2T0yI>GrVEI=_=PI6 z4;O#pDuB_RpSmW4r`z`)WK619<y=qV#KG@oZ!%Z>6;dXKxX^wg6FHZ`xPQRCs!8tw z5?P%|tj1?KZ%Jy0%`O&0l{OYq6(ebDL<AcH8z1Lz6xz|zQR?goLzEUdF@8JQVj>ic z6{`ETBGOX~KH@RBNYnmH@BwIGTj0UBOaME74o75~QPXlrOLnB0@4?!?%L2_=2OHQ2 z!l#-PG0>yDdQhVy5+e7oeC>tMWe?*$21U^p598<HiF7O%NjJ>`!W%YDg~<|GA{vkS zSozV#3jiBWP+e|Ybj{mBnM_+k#an{0_na)gxgmA}AtjN-`un9pi~^+i3Pwv04qn%I z9aO?9gOMtHRD{Yd-+Wc=yG!{>Ffsd$P^Ox8hpkQK{H8!Mpj+r4WNJVG(s_<t%Q5<9 zh{=AzLjgjJDgzfOhN=;Cwb0Cg5B4Sy+5&jOs7mIW8&qmmo`dh#rIsPbKh`_C8xcU} z*SFF1q6~p(cON8OI|dT#Y&sQM!!@nZ6SpYaA_UU9u9jzF)`Xj;xpeZug63XLh_tHP zH{r&O4B7P3a^Az0vguMj9R5l!o9;7;g-&9uT_GYxyoGsc>jo!adfQXg#1YcXg)tEO z1Awu9f4w03m&6~Hpzo1v3903In&N05scUz8s3Hd?-N@Ja(+MmKFpT_5_~!J*dU%&$ zYOT>d>Nsq9XCFf^xh}53dl}^(RP|QZN^Tn5Da}ely(0(3v5(NHZ<Hq?5myWZq1OUp z4Y}3F<8swUjf}dsMH-r2A~uhWDZUxEz^kqyO_Ak!v3udIknkGRVmkZq%|K9f+P7Nn zPQ|deLkdb7H~`Jnmz!xua8z<EMu<YL2ZbU0WRg(V7u#9nxo^_tQJIGpEHbPO_j@ua zZ%4>gSS5rzE+zQSg_yqy{m~A0@;6wbIsT!hx;JXu+mt00eUw~JOHJ~GYZLPGg&kvO z?o^t`Q$NWH#g1a!b}{&rX{(;^T|sho>x$HFC(PE<sR2huwh`6>83&q8r=S}Ur9C%~ zxk(VZo^tV(%bGN7^S0|KX#sCVE$&?|U(~#7zldRPa*awKWw)Dz3)8uDtgk#6d{cX9 zlA@d-U$#R*J&6$;+NKQAJf}D`SmJ_2R+2zLLtBP?D#L)44B;w|wR84D`mr2$CY=NI zu^5$n8$jHmXd_NZiYmBTOk4c|>%kzk&;|N1%z!?rXH<Rb8Hq8+)mtgwpOxKZCD~?> zDjF@hWi@JvncR#4MH7(V;beed$8re4w$*Zbj2vOZde<n^VjRs^BBUftCgQN=?=cD~ zjIj%tI1?OysLC8~;9@cN4NrEuSFhfj0_4%iJ@B$V0Hz7SfEU`jzOUo<>~4Z0h)9)^ z2dEpuJo6bpl%e{TXbkn~0G2V8=1@B|{lm<%D|OQAsv^a-7VMNWqfm_$KP;|*VS3_6 zUD6*j_+>)lRv)n~CwEg_wQiHzmZxD;8)(I$Yj@XQ-KsUvpo`F6&t;UF_xufW!S~4z z2lVj%+FSbE!qTn0OR%H@{u70J`T87rooGmGH=<rRUBuK}S0*dMqqmwtg$19mk!M{~ zB`wMcKE1_2A2k;hmTu)D{{`KJRZ0hmkTS-=hV4j)EI9i(s03G;fns-HspT>c4*JRB z3vs*#DNfad4))Cls$Kr^D`^c7Lr)Fi3*7p!7ipKPVj#CkhyG*h<*Blr3ucP)3tt)y zkLiGTT?`kjJdVhInU4oT)2ebjUN1U)h!N4-C9Fg{b)$(1I<VNY793aOX_y<(E#kaC zYBThFM=3!e5>@yo{IWR39cmGJkGf)smD9WS9LM#VU(DW-`jxOghPc^No^d-j6*%8W zOei@+VVuYO%4%_5%nXLo1BTfnSJg|6U9K}M2}dwzm+%BSs-ne%$605UG?n7A)cmC6 zb@|I`JKI<9`pJ3q#HI;Ir$|Xh`f$dAS?AZ<)6?;^l5>LQzrSq<woRd-7P2bklPNGW zC}mX>t>ayq;)mrJk~xZW?L8-&0erXchf`8#zv;iW-(~K3yR#c?(ZdV)XUuRV<x{(e zUEj_o`+03$DtvQV7u`|X)7Cv|R%PqUpCGMo_g5O-OT32uPLShrOgG3-&P{11q)1M4 zS9fI5i<bi$MeB7dKXZMXW+xyVPbUV!JN@5~G2`(r(T^s6D*blPeP?q$4X}*B(x<ta zkPWlsZVewZVjLXrb#OkLv$bu@)v(TdL%kcuykg>}d4+(EuZj^_%QWs+y}1d6_9myN z$T|L(PO=lJGbC>kxedfV?XI5p_hn8l@jNigDdQBZ_m(K&UoAMNLhUA($Vtqoe$;b` z%y<~=^<mJy4yP<za}jQa0&t12%(j$qB8PyeS7AM|nDa==*nArMQ4NH6Hj&H=WmZOR z(~AO&`^mHVjy=%8!DEs)(Bf6SJZ^xKYRXoE{xf40M=z<B5HSiRq;OLW*$w#*DBviG z&m>%@MghMLJBcL<giCrAfKWKqgcW&QkGQ*wfC`mZOkY#vQL9(Y12i#?VenfFJ-Duo z^_RNw=5z6#TdyYeM&_^Fw^=3VeV6@|wY=i?&oPKRA{yzd_*5#m7J7%IwY}5D#kq4r z6?n7$pw1Q*%gECWWO6V}AmWAmZA?fQb~pqV827YN8+HCns~?ENklxLzZk3H%$ikw_ z=%wZkp25hJ&abF_0$gUmgf5ixH!kHB*4n#&pr+<Z%RMVxeAv`{kFb|S61@na{|$%@ z9{~SBPpwy5WP18zk{Lk<mB>W%GEWx4(pA#sJ=q1|HbZX~>=hWx=K&K(R?}_W*c?^K zx3Yg-PA!7T+nV}vQN>q#w*Gj29bZ*)Tg{Wt+t`(P&FdUs2Rg7@mxi)2a=_WKieh^Y zBydxJq9pS!Ri-G;nRg?pdXQ+5O?9i(#@nW+k^Lz%hS%+u8(AtZtH=ssxb`S$y^<Y} z#N9r5sag+rZCiDt-V6`IM5)8^Ivn{dw;}50Ty76<HJE}E@<~H)`iK4c$|{?Yh7&5I z^>KLg1~upp3mgMkcots#7iE(EC$#{HNb+5R1(8VbYX{+LoKZ$1+(babE&((QY^D=R zJ-{poMm&YxJ(~(M*%$CuFW^tl)fp1@t~wHmmXSE(?aM--=MYAWWHLUh9ok#|A?Wd; zGX5BA3T;|)xpd9rSxhzjtw=GO6-jMSrbMz+Rzqmz12oUds~#aLjUk(_bWWqqg4aGK z#up#cNrAsuB1&tlL^o%)<7;~NsNyM906n5+5r6BzwyYRn<ro5Ed>3C`qnTk&0x?J2 zfQt=Jb@N9j;e8u~JsM~%2dh&;($^I4_y8dX#@0uCIDo!&#sv^CysoAKG*peS;gfS8 z$$(c%K-i`Z#G^cxYO9h*tROYLUDDCZ<g4w-SK9p~6MyxFA>WbM5K-4xE{f`OBc`t+ zvkgDUi7+{l(!s1IIH7(M+99D8{&6Ko?#v)KprEsNL;*q+p5bbGS9Efg^!dGfA)?@X zj}}sjS&K1)X*^!FWJS7^a!94iCt+utk^7SQe+Lp2*;6Op9j~?o_!YOZgyZ%E?Qy8@ z)YXM~=)!cW8?rS<M_+iAUfLN1idt6r59`c%;l#VO1bf^(LoO*c=gmNlbF7D)PDdOo zt)DPB8~aG3q%s2cu4PkAlva~00-d=glrJP^Fu%@|hC54`sxd#{rNUO>l{1#{Oe@I( zNT+nZGGp!W7ltUmdO~s~mS4{ZV`OP!iV(!PaOj+$SiRL->=PZM(@DC;>|#8->0iEm z;%&=c%%X3?94*kRSwc#h)0@V2Lf)p?U`K&MsV~epFsOTKe{N?BYsdNAd29a&=f@9e zOWS;TSn^=LDI8TV<IhmYboI(l=9kWWVBR-uMM5vDKw=|hB8ThCC^}hOuL|u=<nniu zX^@Ec3`J?1gc_px>bj2f(R8erQ#mHf%P=l^YS{1gu3gdRu7A0RyDFMvwTthpLP;Ep z>Y`lKaVm8mU&hSX8VK<`;e3rcr{D|DV^Ghr&@jZP%jp|;;+AOxbT~4O*%{vpK;<7f zc#Q=SeTDlUzqx^59E68ldd<?09iR8->TVM6dysCFl<oyw{SMNiNN{^+!ks1vY_J>Z zkEJI}`FLr<d(e{QXax#DZXSOR_5y-`>}n@w9W5_EhmoY+QLhkhZ`WIFjsJ$NGD^>9 z>%wBG2V{LQdznNjf(;aY`F1`y0Gn|^yW7CeAt+G16$MHI`@TCneq!%i{sctvn!n|Q zIxnO|R?7LxC!z{Z7WUubE{XN`7x}<OBn8<=hvk=0autjOow;eA5=wio9X~7G3&C$_ z|1K<2F4!S<7b=7c!B2u;v<;r=Q8k(nZLYM{;rVg8w}btYW^v-7rY5~w0ep>SgS1B0 zxg${(!0d^)JjmoQ4ayY}hqS;O8&yuK5W#2Rdc!(e(6z4cc#3(0O+?l-(HP~OqP^U{ zla>S#uDY2N&L3=PX%fTU9tLBcV=u!m#HCfy1tirEig2t<<)Mc2KEDzQmWTMIT7!ZN zqS3wzzN7!P(Rcs5C`58#0+ax!{y-!Oy-RXkm&8`<8`1dPg*V}54KUUg4==brVh-DI zZ-l7sKdd1jW%f6>TCjb+_j;*!`IWC!8!K1)2S;?QiC=_zkym9{JlugvZIZ<3h^cmQ z_oqbZYk?SkedtNIOw4hIGcO$~&V|J2Zhh~Ym8=dEc|W(eIt?ih5va&%<EcRo!Ey|9 zzR=c)oZA^(a@vbqZCUa{FiY=~v@6`J@{+DY<qyOWpR1-1@uz_q^`FhSUn2Fhr_s%| z(8?h^Z`ad?9X)eBqLq)wJKt~#%7jd_fBC!Jghwe%Go6guw+(ZICF9Z-$C(mc*?fjV zxIk<OzDElAAeROp12Q40Mmmo@I!c>F9&%1%p-WS{id;-WeCSi@lq@v$PlMun^KdrJ zTz;FUG^l~^9bMj5pj<h(3YC@gRr4d^-zXhg|Dp}{HvXj+Ve^$&#i9b$of_6m*j+7E zsQEkLNFTgIp$gu#c80*$pof~W?ZmK7tH6qT50S}#cK@`^2v`g*&Gc)s3V^et?db7u zPST3xL=jdzz&G)7<DJATwt~^KqDRSVEiu9z1~&cf9CvCbyMIiSL(E#go>LK)*v*Oi z4*QT5+=gb0bc`!^W*!bVtJbkH@rBnAlpb@x>5jX>+W7$@%xS3PFNQ)P!BE@PDE&N4 zpMi1?#{T*+BJg0r5~y;0e>4(#`B_pBm@No=wLC9i`u_T_26jR`@HCDbh?r<lvOMbf zb@b%rWEHt!MO6?=uus&tnLvPeKt$9h@Mi*X;!ir^HM1Y^?PTfUs-vMFo$oo}sZ1f- zc2PuSCMV>NV}WVhpD=bcZeyyD!<l(7HD`#w9Q;36bHEp=JhcileWJA3(3G^ik+=Tu zn+{-Q6?o*$n*>O$8~B}>xqgI%EGGVTzTt!osB$3K8u;ZgJSwg*>Z6=NBMR9^I(MO` zzlSnb^zv^!S5nU@E(RP_%G^yy(EE%j3-=ro_mQwvZbjng6Y~Z;<|D2cX$@!ZDaP~i zrIjXhL*TSDR}ocdFd0^phUz3OkW3UiQlt&b$5CnV9KwV9-Y%|XWeZQ27R0S3mu4^9 zym3Osd1(tL<NK&L=@d4S%)pjyaASkvm;X!3vJ{VqJA_o6rvg>~E0p#;?5@X)t1CRg zt9X;UKnALX*QZ5U4oxyUt!}&m{@gOfMp0PxJ+Q@=Wrt9!`<mvL+F+a1YHKuRska(O z{E=^$EaMs|6IaPSdx!$uiN+0%j0!^D4;f8}C_%LGj+vt63RoEt{?<!vRWCAX`PNxl zDSw~k@Roa&mK8zGY4Io`%Fq@M`cQhd`4~9q#hMMu$O8<;v!+4Tb>g5o24pwR2I#2x ze@#zNr-jfSN+hqR%v)Z@zMUwnc7i3P)QmkZdlV@<+F?N&{RuT(P|SU@4M9I3>6h}; zctgRjQ<g;}El>^Y_XsR9i@4Mw_|Lcgw`XOGI%*?ITdpei^~Wgi5B}Ok)NvVHOOQ}u z)dU*J5qQyzsN*J3E)yx3nvQy~8Cqh}k3bkL!koj#o?GEW&tM)}_1<$$DphgPDGwjE zKch#nV$g{y?#i${k+R;=-Yj=&G+t~G=HScqHbJg=XVjCK&n0PjqobfA!CWwzEALWC zNb(xBD+s!<r|2DOU~=#9HG0vKfi}y+iB;yXrv|^FQMKYZB2R!ChYxG0(=VEl1i&AN zTY?-t0<eUKwx0`Sv$ip>Sh$<rQdDk`jE}@lQv0{E{@358nP`(FATZPe;@EC$;CHQm zUa{SFBZK?R(eF7$+VM55Zp1W~u!X){J}cKR6R<Y2!?9HAv1LVdE}58i)o)g4e$RDK zgdo1(J$tH{WtBxk5a_x}PO)me&jJ^%yw#bLdCB9#J(7OFMNGThoK7-eH}To<1tyLv zn`xY}GIlCu*5L7r@pf&bJJc{q=Gi8VqD@6^4dA@`Z`7N2syE87avB`d@juK^4>D6! z)w_|+Lv8M-J>Q?H;TY-kt3%&*oQ&=nE`sneUzZ%~(}b(p^TFViqoM4|ILKzz**1{` z1QFnam0HFizr%m^BYZ>rPwzhLf0hye047gRC{>vimm)bJLh;HxRq_8bko><c|0HiN zq0~fHDrjfW0LAG4(9+L}#RWd+A|RByWkUnqbP%T4{~ualZHYj@A=OL-QW@-+pnG2D z<p&S9<WtS<uE5XK|6^0LXMi634p&_H4=qvlY#88_xi$i+1Hp{Y-l*I1K6`ueEib`1 zpeX;7!`Je+022rRQ2U>w1tZni9vy|z+s#}<{Xfgg|73pO-;!?;50n1Cgh}DF|4WE` z@E@T<1Yzo7I4k(^|BzxvFhO_xM>y~w{#ywEpVRm+I{#nP6%e85_8(dxA~g{a!rTRf zSQi@5ddL8P_*Cn3a_Gs^FvaQrkeZgR0xYliZy2oz_~mO^uox{=w@#*}9;T8n<mb(w z(|i-NC7;C>>&t$5eqCotrzCS5ML9HK*2td~(~g!?--&zZVP56vy>YD->uO14P1{S~ zWVq5{+6ZFVP&jI|>(;i28&A|y--gu|CZg&xYGt9enARWi@u#)uH0e+AYw$t>c`=WF znIa%tGWUk(oPk^9|EZR*up8B^ed?l3OhmJeA=>$A{Qid!=M(h=+DKSwPZ6B7Vrme5 zb%mE+qpJBQXXe4yF8~3JE*<Yrd$s07WMs~qrG9l}B+KmSz0*_Ai$i<byUF59yRPNt zC9D-cljT*}G#w$dB|V$L;9-kBP(bUcohBib+@{!c!0zE+dpCr#n~n@fpK;R$1^?}c zdzdeA3{t8NWgDg&L`yl$Rj_v2m@0rIFwl$S`C60Vzfu9dleP}p5_OP%4fZ=2GOTnO zopU{^HP{SfP}&y~EeJ=U1BUZ&$>1_)g_!!io9>iqjVfEJd3Y|>3&=7)&>N1@u@T-< z5c9lCZ?h<<06hq-af+1U4D1*T;}NfDL#-H2RZi=Q1{nggRGUT0TrYAl7n*cENG+rn zY;jC==)#Qw8UbS%)D@k=nc};ZHa2THJNs}_x}j8i^%BA^4y^Oxx_DWU1^dd({6I~` zNLB=n!K%Yk<c(`VKL2?T7&a6IZBJwKaAs;){u=aXnwQ#WJbj{H!G6axr)Hz;12|!k zKu2IU<hbpYX@P%}n8&Ma>Qea641_1l<b8k^16Xw?VWI38K7e11UwwID9+)-87DfOZ ziffM9=Aod;sHDsK%p(hX5t~uCX`_CrhLcC$W?b|puvd9mrU%Oc#Z4*y>kt;GjY)Y8 z4yP%1^`ugE9lYZ&5p;uL=I<EjCqzym030@<>*#_=QVZ;Pidl|D)amUZra*JeLWBk_ z8KYW7c{LicgUzUcd#af0GzE*$M+W;7Ukqwng8rKV-*RBZfj6<K(ev)l1--eWklwI~ zpclEOZh3BKbRpXYs(k7*248eO)J%>1ZRq^%RvPPhK!C?)9b_FGOW1lbRE`^yrd7wu z>!>&L%#E9DN<$<#Yk8$w@Vw3g?XHaewEyz5c(d!-8?m}o#1Y2SxOamki3?pJy8;;1 z`3X>|GOJ-R=_ot{qi<-CB75VcZGMM79LbJj{}-B6D57`+w5b?eKrsXav&<~>ja~f1 zSBvjYfa*2f*jVw%o;&htF?873xP{+MPWbJOS6EEZZ(K&~n#M=JzMx&Hf20|L(e15m z+1lW}a1LT8WwuhwNx^J7dmNA(G}}Q6Wg^;xNPa%)FavT2lCnDX%*6qQCzASAxhkeX zwDRzt8X>vOy?poy@6evRl~zcNoG2n@sQ17mN&qHG8EN8@CSqVqm9S^S)l)a`3DQPL zCKcWt9t_rS5`&0#oQjf70F+NZQ8Wu~qGT~57lsXArY8*jtC47aCu!*=FtaI!l1<*K zDU%b}s(n~}64&=gk&qxC4!*Hk*racz5%bqVoXJ5Q=2=P)a26XH+SDE<agSEk9<_=K z9R<x8zZ*W+NNED5J-0FjDle>T3hA`SE8(c1hjG<q+oL*4MV$-U0t|<L%uI5CM3INC zlDa{4w5oNgyG_PopomW|b&8E2{GnCKTZ|)?%{oZNT&*e^Pjz~aUgKVUDt#CE2`(k{ zhSS<_whBod%%WYS5e*3>MawI92_V=xVP5djrB!Fw!~T-0GYuGZGl?ADe)}OORgGSP z1}daHfo;AtCJ9^R1NBnNX>zIq<u?ncL*zC^)^4=P8xJ0fO(P*My5<KNK{ucZNv4{B z_0C%q?hvaPsOE06hVcCIDhRB6)mz=ed!TL~h;QMu{>B2NDzRM%Y<zR)Vy;Y$4E3n* z>X&nMMr3xsknO;C=59+q-5u?ZXgWEC1vYP%T?a2;&%w3>fu{!ETtN=vfI(^xRGijG zTEM?({jz7_9jG7}!9%ALC;_fi867-FbH%?&Vc}ADwvrJZAgA~~C<YyVQ>sutO`Px` zG43E&kvW)D1;NEwvGS<E!BXXTpCIbML1?+sezDYYJIUC@Ec7@px|w%tF#J{0Y>%PZ z$o@a580dGdK;ppWFoQ%;%FN}cQYAA(@`q6zCr5GM00xY+gF{2Wr-tV!UnDa3gL5$q z5a0&a3DgZ@fBoh&E?~@><k)$*tZiYU6!$eZ+^*3LE(S;-<^|_an=f&=voFUANU~Du zhvVtFUVx^V$sWPFN7X2h_zq19m~gM*x<+fpa8fq_g|sh&5M%;bPjzW5v-<=8;UXXo zBXy3ExWR4XmZq?rcs3#W)e|?U=kJcX_F~vrh0IH@4i#RS+KmQ};Mvq`v}41eJ|`jw zGRad@vA{vHE=K4}yY(OlL#oqgbx@-%-p|&cR6bn6+_GvPOZbW@;tj2l>$LS&%*$n* z;Fd80c?TsuM(lGf;eckb-Bn1&_<gEux$G{QGya3nXil-LDuI0MbR=y1Fdvf(iQ{KA z1wAi$cC=dZ9mV?R=n2wvr7V@028Cl`iAgpo2@dV1Q~Qh%%*X0!d+~GQa5+>{N*#Iw zf#?r@4B&#JF!t!A+nf;5+jG#4aUZqS8^XxIE5z`JfljiRUkZq{8qK<*c!;yA*^KqL z&ysob!Mv^)%e_LvN==xhldPkIf(nZ+qEykdrq_qszw*NXv-W0KZ`Snv6A{^6pcw5> zBq8@xu}yDF9FJ^ZCW&zp-<b#^t>A>t2DXYk;rRXR%04A6Ibx}XAJX6oJusQW3dY7j zQtP<?9#md~_NcB;dgCD1A#puD04$#O%xX0;=1i;<Uz}covO;}Ru_?Pwjg7$rTCU}g zVwQx2xL<s%UYlvzv<>3q3&{3EIp`$~D$MdxGsACCT$ci=+J%Ya9>Ipt)0M;G#V&dn zu^;Yn95cK-nN10<AXeUr&`=?DQo=((M7dsqaXMKrk{w7;k5N_fJc#6*Hl0!OvpB&> z`kY|FD|-rSNWCh99qZ1)s4io=)K*D`?sdzWyMHn%|9$ikf7E*4;!$%m$VX6G!&@Bx zXpU1De~PolkBW&i>L0w=YG|w6jHmc4cW*h5Nh=c+m5L52pzcc`Z_ytfvVQyqc8x?$ zjdALL*$PVtw<!5Reajl(!EX*mL%96vYY{^xYO+Q^FwMT~@Ai*c<x|S!RbzIIl;k<X z&Oh{#!mMnW>9xvv-g<kLU9S1^$eG|^0yVqyJXa^<a5aCKq=<>(w7~V|SZC^-F-aB3 zQvtF_DPqo|>Qg1b89y@V0D{wj7a=FiVOcy81G32EhhtReb>a0k5}0Uk+?ey*W^su0 zJWZXZy8?5mA3AF^+MHrRcE>3Rb;(dm!4CM0!9vQOi&1^&4zWM5NHsUr4kFtIrr_~@ zDpOtQ)QXDy56{(w5B+WR*0Uxdd3dTV7iKN?=aKZ|O>XF}o+Oy%Fi8SH=!Oj>_Da5R zHElL-AFx@U3AqSDPb~8i2MH$E1eSdJJ~mty^b$tM@Df!kJi~m)J`H0D#p0bxwz{P= ztcg!-%?hE#+J$t}#P~PFZJZvOIi7aSOl8U@tBPeD)Tpz+!^(j%M_9;#6h2^@qJYFJ zK4RzJZAe2&{`Au=@Z&AOZUj!;d2FnL?UfX~lY*1uUPS9~j+5vNx{Ei&QvuP=eoG{1 z?%f`OvuoN6$AE@-`6PTzk5WG{CC)Uep7C>JS|s}O*Gd$Au_o^4ry(<3SU*meBMQ3O zr***@>Wd>6a1b~;C1hJNU#XP05ai5?bh9H|tq0R(SrhH-ZBRGh5h|~hA`W`jKuJSO zca15;l@2C^w^6T)qVHKE%5tL=0nlExT-DtX1(q<O6}Ncj<jDH7v};e06WX#=0*U2f zOL5$E!fJId-#&YsSXhHc7t{Fj1>{Gi{8oeWzV30-+6sJk9?_H44%Ux0ARn$xJ7}Mo zlU^|?9xmk2Covl61UBQTj;6(73a#QLlq{9NyhvD7*vuwypEKf+n~AU#1*z3&UlU{h zmD7fh8EIy0ZWC{BX#wMGQ&rQ>cGUf4Tgw={d4CyFTJM^N@}OeuQ0pp&1BTr)Pv%mp z)U2-c!=q%?Yrj4V2NoR6{<PlAQ&nv9<amS-b39=WmSYb@4nMjR&a`uOzeWveMI3&W zY#bKdNqT47c+rV{mB2&C;JM~Ddt!Ua48uhH*;BKoUL&7ysm^2wGUSUyeG?w5^2>+% zoeCbAV=o9slJPM0$emGfk)QpN_TLk<3PEBheA5LV95Z(Gh&;EhV{QXq8$oB0U79d? z2q5$MxZ)C+Xih9?-w!{=G(U9#ncOjN&a(?r6dr=U`alWDM~$GnT0<L8mX{`(4E=B8 zf#@44?W2G&n&{Lw{GU3`Iw+3jPvfvyAZW0~EqHL(K!A|ogs?zx*TvlicVFB!5ZnnG zJh($}4Fn00#YvEZ{Oao7_pWZL=CAJW(@#&;Oiguv`mqiSof^N866s_*c#h~g>3Xho zt~;Du|18d(Eaj_n-g?zVqe`y?ncJ>)&n7~~Cq}pe`ukCCVFvtu_lP#h=;9%I!3Fs= zz)bp$)wFDeQlM(6@|k82e-5*sOF@5g=@s)W)xv2tHk8x(tYKhb9Xu=~^715pkQS9+ z8fc)4`v#p=BX)Z6N}d^l0!F3-d+{Q9ZDDifA`xK<1}7G)jCmx@*S(3D^%Q-}2WBOm zH4ml8nh)e9$&KEDG{^BA&^1Jj9VmqWXkKt}X?H!if_EE^NU{3Q^Y~Xo+!#v1FjCLq zZ2pMLeoh(olV|CO1I^jX<&)dU0#5!%;aFKlKww^zy#g{{XSS>E6c6HXHXPq$Fj})8 z`NhF)rwNC>a;ubB>ag}M$Rs$rWk&^1<kV^3V)C2sfpCE{l#b%<xQvPyR1Xj6cdTaI z%{iKG$LN`{2!;<v5+F_#vOyI6tlH|GCdDQ*L(R+W`G_C>S}v778&~xnVk~o_o9S)t zH)@@#p|m9sZR;t)_0s&Gmsv_G9x3Tndsy^So(u-#uuY;`#B%W6P@7A6YuKm^J}aYV zqT)13nB;Ff`To&w0UDWk%Bu-zy-*!GsQ(~OMYE2KeU$jw<oPnXwXUJB+<MZ)tIyN! zc1!MF<2+iY^?yV~_XH+xC#|>_A3ps!Lfa{bBN=QY#a#=n<w6_`$HTuNgE0t3hUha# z?-K4eQZXrVcP4jZcxtwZLMo~3jK1TjE*+XVRtBK>C0K9Z$YxeME&8tjI2lWeTX0X+ zTE9M+c|TjF#Dachv5yx4|IXJyW0;5hQBXCBrO)z3=A{3D&q>DsBH`|*$Yo#Vr}GiN zyasW|$!iBKQxx{0y>=&hb2+F?)gnYRf=3dAM)<VcHZdXuc=k6l_F!pbO+TkPK1O6w z>Uq33Go;Bod#Nvu@4AYBXk-<jZX5?yl{j%Til-D!_^t<8$akiyi;;GUV+)r)Qeo;f z^VeZUc)Hpa$1YPzFr5*k3r|}Uh3eQW$qNN0`N<CAsaiQbbQ3-2VtA+YV<*-ttwR0j zK`tM3DgQRN9)(9LUL{fcRDCs9|1i}7-KspAP{=y{{RrL9*E2^zdU9HP8s=D!g5kWT zK&HR!>K0VxVjf%SyZBS84*Clo9kcpT3u!P#<k|re{10kl3|@^Yz)66$L)#)fLTLZ? zsZ;P5SMv6=POe=CBNH)(i_`!MmZ;NZWL6Cc&9ipzftc>2#KvjIdB5;j$;@)!WkQn| zU-Djb{`R0F^)@U6o<?P!7=Pn-6@{$B&di!D`O(~(&8Mk3UBvPPQ611cEpvG}NAUvF z!P7BgbVZhX?cVq({U*>Y5W7Mn{SM@vMAHv$H!lN8=7?sgdmZwH-QZzDDueEH5!n*9 z%njzVgO9s9`3z;G2N_p&U9WTPM`Xy*cA~%y?&SWwjn<PuzTa2(Y<5-+5K?`SdfSt+ z9#aqFC;~MZTr<7Pu3$bg^6CDHIxHsvEpPD+;gMa6Z)kfC`&_vA@B_;~6?V#r%n$4R z{Wv%{-&tCp8+&q|#dMG?AQM|_%`f689<?eCHT-~gG9$<OZg=#@nK|KQK_p$c!I{~F z^kIeST@V-mr8M*SDzqxJ?P@ns(~GPRmm`ms$s+O&v1ai7IsGy8Vq73(L$Oj|J75~8 zn2`886Z90lp8M0%UOPA5A5RoKO6sR%A?9?+Aa<G5J|&U&&mPX*i(m`kN|~j(ttyl^ z({FT|rEGK?;&NAHjDhizJ*=K}j)q8;t^D3-Ub?aYnpHQ=VGBrf>~i4xJtb`lU#!~l zUj*(+4E$gP^FALr2b_B3CbSyG&=RH7%k~b*ximuSM6upRaQBcQ4oxzaeb69zC&i8L zLngr4r{b$X!P;~>e*NW62rF(cegWMN#=W-HNE?zDIGoAxHR4wIq}tn`XN`47{dqz* zul+0mN$0C`3A0Z0*)A1w1@)q)tFJ#H$y%k@cOW)EQ@cHW94X0v&`eplpfcH_X}T^Y zWWI{LmII5>zO=nywalWDBOap)Jem@E*5@YrJ)0s|uRb8(LmY1^r6LY9&$Xx9PH;_Q z*SDZPJAu5$^Rpr>RA@|fHdnr_5l^;QG9VBzpJPfd8_UeV|M9X)gXa^W7SCd(yxUV@ zyJ88P!w;74ROI7GE}yv}i=49zVWYB5p(63hK@a-9X3c4gU}Bj(-ZyY;QlT{NrM-He z+Jd=Q2F~Z!j_c98ADf5_&r41rQgj4dZ=&r9!)W;kUe0YttTzg43vPUA>N&qU0V1Y> zb0PAI5U1dt9RVw&4i!A~ehhetVQpkMh?_Un0*C4+oez7YEyZ;435i2;qxk#L0+4OD z5cY@LQU)rqzNS}ihv>`uJL+a%F%2(bM!(h^4ho14|4fevej|+AFNtCs=WkT^Ri)9v zhf21oAY#gXy+!EQXd+0&U1WhDBe#VVFvw8GBSNY>HaLhkw9nA0WtO(^F9;?-Hs$2~ zg!?5K-LTmBjkOhea2am}l0S{2E5RJTY7uh(kmONME;C^=xS+}DvjP1j$x##Em5YJ* zYO4wEruPse7)?x$wR#naGJ|d!9T}fs1a~$-q6+=^+gX~1smRDg2*||RImyEbNVNXJ zps=9p%4{|M2Ir0rszxfB*qvjQlU({Cg+FIpEs&=|tX3z&lh$?VlcHmT>TFZK_i$hp zJnS6>)lWknDn85uqHSV7N{TS^&9WcoU!4^ikNsvM_Tp!X!1jP>4^zQ>vhmPP43?Uj z;N;AAMqYkxTqQ2N)cV@+(Id`gpnkRMS^WglJa0$g2t71z%TJvJYc032LJ$mvF!Fx2 z)(iAlJQPxS*nC2|U9J8@W^kYvgtoN*_9uG7k*a$Mg`SLv&av)#6XR=?$=OcZk(8X! znPOu7oLl?zg}1lo3$xoCIaxDy9U`|In>Rl{74|C_H%{~*N#lbiTgR0ZfjnzrvUgU4 zPo9!NB1*}ATGC#Pd-c0P#gRNr_7b>zY_idcwCc?Du0{%Tbz}%k-*GI43K=t@W8w^5 zFqb5d|28O8RM&oA$nScF`EblGFFW-l*HV}*uY~%VsbrwGuVL;t;#)j(lC+kRW{jS! z0?zHSo;Ua}wVutWk!#14a{(dC@#6$K-vaPBM-21nz8VO#S0%(mktnHPLwZu)&3H=5 z#V8f{`p#U%Je~8+<Si0g7p76F1~^_^pK~?D*OZlT_md~veiqHPuu?9=xmBkwVt&r+ zni!`QB0K7Aho$k%sWGD=Cn5dzIW&M?Q-MIvK!-7iHTxQs#xJD`4gt_$>qthXH*J@T zL5h@THU3D7jy^ZJ%AS%(S3AQFs;lH3?sqr4zkaw8r_2!Ww=7i7uY9zRub3)0&s3-T zfRY~I6%wlgKkv<3J3^#xV_{LlnSYMDBaHeE1c%($KqQ7$@_F$vbY4W_T+qwOrvA)S zhO&r8&yl@(6~}?2Jqh%x7DfwXIMjmPd#WD2iqA!nj)3IB+^G}=hd8zgHc;P%wzdWs z!{fy&zAe8BmHo8R;@y9Vy}p4fQ2NtnS-9wwNM$m;$r;pB&os@_YZOmd>sh~5J`mv; zbaG7x4m6h$AxhdaErM)5k(pIYbul`iPxvBs@irl+jgg8qIv41)aO2Nl9lNjV@-Z3r z)wEwYVY#e}0T@)le4Hq2F4U5NA+GjcW@XGQ?n9lhrl8Q4sD{_|>NYV1Aqbq(sgWVU z23XPx$kgN*iE=u_6cA8q1h+0LLr-p?+AxN-72Li_Zw-&}_XOVIxeKcUI@?YP@c>6* zN9(%~${%FoFM&xmFxxg&))i*p>9Q={8zkWgUM^}=?v@{^c|o(1gu2mNJkwBc;K_`I zdGtW9BU-BJ&8vA>z;kw`S`?bXl;}y)D&sA2Za~MbX^{Afh|a+YuIu-_q2uT^Ghc3a z6XbU)k!p{f?)rgMMem<Yy)b}KR-Xbm|GM?^F47%-1MGSjpr=DEdHnRF^amWC@IGk` zS|jtSbg0gq7)cAm_uqhco-nE_J++r2LB2bKn56>;J%E9Uii4}A_IHAIsOVUy4t$S2 zIwzW_b3?ZP5%V?I++7N}oCQd+n4Yu<u|vK2oPCKH6nc(GGeXkEm`oi}Aq?GFiO!}f zaWSd{=)l!{0eyH35$<PRjif1!s30&tNG$u~Chf5k$R3g`vmW$%dW(6io2<(sf?@ou z@2c!&FPtsAfy|EF1)8w&sn9~Z*QaDkChdt>stRXSHV*qCtp@90s*RUgMUrDI{*e=& zoj%AF&w+#VNb0N72W~MZXZt$$QH1~>YaA(HN=);YliDdW!C}5tm}_**pD9O1G5D56 z3&&eaqt~_9*T;ip7pFp>6rPCrPhEKgg=&XI=lGz<<h=X%Az1NGdlUEQ=gQHEDjJH3 z<<87Tayx@;8d7#)<?!Fsqzt#_wQZA9@Sh7SsP`DO7ZSm~0;VD}5rgh0IY=E^zx?*^ zfGHi`kgjp!?$xE&oZV>?+hc@!QD(<XyaFaz!K7<Zp?rd%QLYws>1G>$hnWz(tJ%$S zVuNR9Rq%ybGSU&n7lPQS#5`+p$9E-amA<qfU8{?C5QQ#W^or~{v|ln#X<6F_?6k+3 zVMw3MEj@AFZfoRt?2kA%iDwyHlGcKafnVY5sS3%LE?-jbh{_Qtg%^ZhU76b0u$TYN zSa;GjzIT=!-5W_ERZlbs7Ij$n{u;=@GaWvMuIE6l;e+O{9G#*4UC&H*f^@vwu!(la zn_<o-{K|steBbyB&9yumI*x72DVnf6fR|HkxE7;FRHUEBdV=ZND7&Jlg|TBM0)TaM zu=5<g<BYB(aHU!FcQL0gf>}0SZoQivJEDsEMF4f2SeKj@4{zSfs62S3-kaIQ_eETS zh~9R_cPXpguv<Cn69KBG+oCi+?DbI)NkQ_tfiV9xIj)twuN1UNC9(vOVtO;&Ez#UK z#8SRKuOF|~d6IJ^#zJZSMXqwZ1z<T<>#qCs@+yC!IzhXjoQZLFaZU}&lqi6nV8bav z?7NoaTxZ?fn!IR4MB69CO__ucd0~^LY#PQN&{)1sS4Lb#ZWQn{sOTCdw|WL=*hZjn zM~+(=&^R%x?cTiO&WTE?O<#Ez%Ee0-WjAEhK6TqwRX_(c#`vv)k+bk4u&Hnho8G~^ zYu7^sb)rdO=(SV;!!g&GW5B4x!w!M(@;VD?ro%;V12rlQq4&Xi{P1+-&-v<tPsVAn zg+I+SEYOL*Q~;z7En1_A6WCKLMo~XRGiS7+IQ_!CF2&p8Qk`>8-VjqJK<`<aU0#v6 z`ksMv+|L&vi@AYMV$-KM%oXc?yFY#{i9g&JWjf~p!*68=@cMS+FddM`QZvcPXDX_m z@bze!RSV1OCSZX?dw`&R><|4nXE%X-S%;TOJ9Sv1z4zwb_tpxZGqy&=PVPB|?=Gt+ ziJw0u#WSPB&%PCk6)ar<WW&;J`7%W@x?m9^n(0b$CASoq(B_JyDleME)k-)T92bgt zx3#_3WDWz$>T;?OhV{nvwx8S0)QtZ2y#37=a-sk6y4#*Fht$aW*xx8+f_Fzj7)Sh- znpmMamD&%TdrxtimgRxy3GiLp{rT<{2hBGmN}rRVzGJ0c)zNh0_ufvS0%mWF?AJYP zUM#dPU9z!RF@G45zCgeJ0z;=2PD4IACT<iq62BDyZm3L^H0XarDMK62I&*dv!pFrG zKgNEvS(pI39G_AHlX^DIsyh_4S%@G%9J-?Fa9hRMf?)<Lk^qhYENyyP@F~d-&r5vg z6wqAYVqgW9&z3W-^ok6cx1J+b>$)Ow;;Iq)x?YlWU7ZjI$gO?csjH_Nn)+c`KrL@m zwgV18c1Tatd9f5=PvSP88@q8|(`PH3n5rd|mSc~y#@L#sv9^EpXcS92BjIyiDo0d% zh^1Q-Buf)j5Y;_Y6W^h3+uJaXJ;6Mi=&>7jS@qbNn~lK_0~HOB*teeLRbgE@_gOTk z4R4r+5>q^xy}vHq=g|^%*q>PqiS^fsb>#yl3vKoQ-;T1uml!{6buW%iv>~RM`3}va zkx5DoKgQ&pppdwE1B?$#YuOt`8n>TCRFd_MxnT9sQ3-r8RsZhH#q;9B+qEL`cJLG4 zVv_G%eG7T`=6zP$8k$|uWs7M(yOWP19q&D2gNiUQxIaIvvPqIeK@Tz4!U$Je1eJkv z7MQjdmc)V2bYYvB_delF^8{*s;?1HAQlrX8=JFD925+j|S>Ku?r}St(tMWOPHm{V| z0wmexYj<J4M^^`wBbeJ#jb4t1Jl(7mJCvKMZ8DlY2_`*9s>q=A4EurQEz3)fmLY&K zv)+#`L9GNi*jMZC_C0)-3SiJDK6L^vUG-wgKgy%l>}wo19?3mLQvV`~Np@ws<3^Q# zC`R@2eqYGjvzzfe>r8IM(5B++#a>F433{tqyC^1QA5^zvyG%_5dOa+4Pi<?_Q(omq zcT8A*H##hJ`NGy}tGY_BP1G6qgHD-FvbcW`H$tUNuUeL}tJ!i~S=kX<^k)w!&gp-d zd3$quH5%#`3jEnw18$BsSN8sl75$OX$<)^i$Fb{sc#W%+)^v1z_or^{FGjcI-G2A< zE&QpwO+EspAJsT(yv)4Y`?+~@+XUnkm3@<dV{b3*?a`a0>yz*n4dvl2T`+~n^7};T z@od<A>4Pe<7_45GVs)re>JJ0C)^=PS5xqnWx!h3!l^$6c>1{W9+sr#hzi&j}BlDC8 z_gX&;(~kPy_{lp86Wjr#tN{7its}5oY-T(E^NyTe)92qRYdrQFB<Vbf<9Lf9UAhBV z9G(q!ZF}x$3>sRW^G9+YSTgW>I(eEWnr~lP>&KATaTV#M4BmL57G}VZg=n{&Kg(ge z8&>iQj56@zNmpPrTKfC_pu|sadv_xBY+U(#kzP$8RcjZ!htsPvxNDQGhzuXcPUOdO zfOS9)wTBW4^o}o*wu81752SP_txNH-9MM;d>lFH@*X1=)Hx8VxJ{Y|E5^F~yLtqHP z)>a=yz35lB>a%;se<lb_fFkD%%1+pFuekddpIuwmuL`(=V#ahl$zWuu3_dE<tEG+= zn96zDb|M=ze2bhsUIHBL0B0d|ZDKSI0exsjUNAOo_tKCHy_EWvOy4fj##WC^D~G43 zW`eEll^I!c5zS!wX3Efn7s86m97C7J<Y=bd&8_^RUT|9S5h`HQZDH5nCnC>70HrQx zg|X<geh)95BfE50m2)&gJ4d)$%}YQo`$8CYpuo&Ue*9$Z!rO&ebwxj4bR|LkVC`_1 zBct{*05y<)aOsyz*5dLul;@*y;AAA_J^KZPsmvyfHBwre53QqIoSp4AWsc57;O9g} z)amk=yqJbXa3tU&@1ejdtjxk@6^yW`<(gRhbCxQRnt|$8y}3KD>1Z&UPcFaiM#fpa zbKR#j^8Mip$g?a{W)Y&IkejbnBa{uY%KDSabc@FF%Ze4BV?wQ%0!B%fWwkj77jzTp zCe}!)=2)CC9O$~zMxiv=z}6-hSLu49-ITYGTzJA(w!y4<A}Za>MVlAZs^ep|6N{u3 z4<3cV-To{q+1^=oH`Uws>m->}gEYHabckRwbF4pZIzLUn^&yHD8g1W$ROAsslt}+y zG%olr-}HbEAr!(Qn`w|A6LMiSEo9XHH?8y^UHwZyu$X2dEDL9-jrw~O1f<9O(uXoa zjDPS_Y%O4dLrD^D1OzEN6H|`A{T}(LM|rVFPO9g+3j2;90YL-|LU{HNhx&N^b>gr2 z-$nMOcJ?-=`iAzF?Digi6&|^&M}_|&RTC{>q(c9E*g*?9@*`UH*h2G{h^o2mn0nCD zdJrW2m-dAf0!-AJ0`0-|BOCQtLG?&n!9(U_NeK}UbetZeS^w#V99Gmyjr<5>{gr>@ zuvYVmJ|H~g3%`BH7bf{v=P-W+*qA^0qx>VM^*@IGiD><+Vkr;-MiT`7m!ZcgEX&Uz z2s}(d^5G`@N5!GP7OcIE0{Oq){|DW=Z3818`mY7UNZM(T9~rL4k^jSQ>9&JW3jI?; z5MV1If9L%Ob3Hc0n%gN6DPi;NFKPZobOrwJC%}}10JBXZd$jlndci()P@(cQKlnoU EFEtIb$N&HU diff --git a/tutorial/generateds_tutoriala.txt b/tutorial/generateds_tutoriala.txt index 450aa1d..c1e5792 100644 --- a/tutorial/generateds_tutoriala.txt +++ b/tutorial/generateds_tutoriala.txt @@ -12,7 +12,7 @@ Introduction - You can find additional information about ``generateDS.py`` here: - http://www.rexx.com/~dkuhlman/generateDS.html + http://www.davekuhlman.org/generateDS.html That documentation is also included in the distribution. @@ -204,7 +204,7 @@ more command line options used by ``generateDS.py`` by typing:: $ python generateDS.py --help and by reading the document -http://www.rexx.com/~dkuhlman/generateDS.html +http://www.davekuhlman.org/generateDS.html o Generate the superclass module. This is the module that diff --git a/updateversion.py b/updateversion.py new file mode 100755 index 0000000..0ec2618 --- /dev/null +++ b/updateversion.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python + +""" +Usage: + python updateversion.py [options] +Options: + -h, --help Display this help message. + -v x.xx, --version=x.xx + New version. Required. + --verbose Print extra info. +Example: + python updateversion.py -v 1.17c +""" + + +# +# Imports + +import sys +import getopt +import re +import shutil + + +# +# Globals and constants + +VERBOSE = False + +REPL_SPEC = [ + { + 'filename': 'setup.py', + 'pattern': r'(##VERSION##\s*version=")([\w\.\-]*)(",\s*##VERSION##)', + }, + { + 'filename': 'generateDS.py', + 'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)", + }, + { + 'filename': 'process_includes.py', + 'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)", + }, + { + 'filename': 'generateDS.txt', + 'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)", + }, + { + 'filename': 'generateds_gui_notes.txt', + 'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)", + }, + { + 'filename': 'librarytemplate_howto.txt', + 'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)", + }, + { + 'filename': 'tutorial/generateds_tutorial.txt', + 'pattern': r"(.. version\s*:revision: )([\w\.\-]*)(\s*.. version)", + }, + { + 'filename': 'gui/generateds_gui.py', + 'pattern': r"(##VERSION##\s*VERSION = ')([\w\.\-]*)('\s*##VERSION##)", + }, +] + + +# +# Functions for external use + +def updateversion(version): + replfunc = replfuncmaker(version) + for spec in REPL_SPEC: + targetfilename = spec['filename'] + if VERBOSE: + print 'updating: "%s"' % (targetfilename, ) + targetfile = open(targetfilename, 'r') + content = targetfile.read() + targetfile.close() + content1 = re.sub( + spec['pattern'], + replfunc, + content) + update1file(targetfilename, content1) + + +# Classes + + +# +# Functions for internal use and testing + +def update1file(targetfilename, content): + backupfilename = targetfilename + '.bak' + shutil.copy2(targetfilename, backupfilename) + targetfile = open(targetfilename, 'w') + targetfile.write(content) + targetfile.close() + #shutil.copymode(backupfilename, targetfilename) + + +def replfuncmaker(version): + def replfunc(matchobj): + if VERBOSE: + print '(replfunc) matchobj.groups()', matchobj.groups() + return matchobj.group(1) + version + matchobj.group(3) + return replfunc + + +USAGE_TEXT = __doc__ + + +def usage(): + print USAGE_TEXT + sys.exit(1) + + +def main(): + global VERBOSE + args = sys.argv[1:] + try: + opts, args = getopt.getopt(args, 'hv:', [ + 'help', 'version=', 'verbose', ]) + except: + usage() + version = None + for opt, val in opts: + if opt in ('-h', '--help'): + usage() + elif opt in ('-v', '--version'): + version = val + elif opt in ('--verbose', ): + VERBOSE = True + if len(args) != 0 or version is None: + usage() + updateversion(version) + + +if __name__ == '__main__': + #import pdb; pdb.set_trace() + main() diff --git a/upload_pypi b/upload_pypi new file mode 100755 index 0000000..37a8a71 --- /dev/null +++ b/upload_pypi @@ -0,0 +1,4 @@ +#!/bin/bash -v +# python setup.py sdist --formats=gztar upload +# python setup.py bdist_egg upload +python setup.py register sdist --formats=gztar bdist_egg upload -- GitLab