From 5af6f6959074347361436c98684fd6324b22e9ce Mon Sep 17 00:00:00 2001 From: Dave Kuhlman <dkuhlman@davekuhlman.org> Date: Tue, 22 Nov 2016 13:19:29 -0800 Subject: [PATCH] Fixes for Python 3 from Ian Glover --- README | 6 ++++++ generateDS.html | 6 +++--- generateDS.py | 9 ++++++--- generateDS.txt | 2 +- generateds_gui_notes.html | 6 +++--- generateds_gui_notes.txt | 2 +- gui/generateds_gui.py | 2 +- librarytemplate_howto.html | 6 +++--- librarytemplate_howto.txt | 2 +- process_includes.py | 10 +++------- setup.py | 2 +- tests/OnePer/oneperType00_2One.py | 7 +++++-- tests/OnePer/oneperType01_2One.py | 7 +++++-- tests/OnePer/oneperType02_2One.py | 7 +++++-- tests/OnePer/oneperType03_2One.py | 7 +++++-- tests/abstract_type1_sup.py | 7 +++++-- tests/annotations1_sup.py | 7 +++++-- tests/anonymous_type1_sup.py | 7 +++++-- tests/anysimpletype1_sup.py | 7 +++++-- tests/anywildcard1_sup.py | 7 +++++-- tests/attr_groups1_sup.py | 7 +++++-- tests/catalogtest1_sup.py | 7 +++++-- tests/cdata1_sup.py | 7 +++++-- tests/cleanupname1_sup.py | 7 +++++-- tests/defaults_cases1_sup.py | 7 +++++-- tests/defaults_coverage1_sup.py | 7 +++++-- tests/extensions1_sup.py | 7 +++++-- tests/ipo1_sup.py | 7 +++++-- tests/ipo2_sup.py | 7 +++++-- tests/mapcleanname1_sup.py | 7 +++++-- tests/nested_def1_sup.py | 7 +++++-- tests/out1_sup.py | 7 +++++-- tests/people_procincl1_sup.py | 7 +++++-- tests/prefix_classname1_sup.py | 7 +++++-- tests/recursive_simpletype1_sup.py | 7 +++++-- tests/reference_simpletype1_sup.py | 7 +++++-- tests/rem_dup_elems1_sup.py | 7 +++++-- tests/simplecontent_restriction1_sup.py | 7 +++++-- tests/simpletype_memberspecs1_sup.py | 7 +++++-- tests/simpletypes_other1_sup.py | 7 +++++-- tests/to_etree1_sup.py | 7 +++++-- tests/validate_simpletypes1_sup.py | 7 +++++-- tests/validate_simpletypes2_sup.py | 7 +++++-- tutorial/generateds_tutorial.html | 6 +++--- tutorial/generateds_tutorial.txt | 2 +- tutorial/generateds_tutorial.zip | Bin 48764 -> 48766 bytes 46 files changed, 193 insertions(+), 92 deletions(-) diff --git a/README b/README index bdd0179..bf1bb16 100644 --- a/README +++ b/README @@ -141,6 +141,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Change history -------------- +Version 2.24b (11/28/2016) + +- 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. + Version 2.24a (11/16/2016) - Added entry_points to setup.py so that distutils will generate diff --git a/generateDS.html b/generateDS.html index 5312fd5..e11615d 100644 --- a/generateDS.html +++ b/generateDS.html @@ -220,7 +220,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -229,7 +229,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td> </tr> </tbody> </table> @@ -3184,7 +3184,7 @@ following among others:</p> <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateDS.txt">View document source</a>. -Generated on: 2016-11-16 20:28 UTC. +Generated on: 2016-11-22 21:17 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 465a61c..985d124 100755 --- a/generateDS.py +++ b/generateDS.py @@ -204,7 +204,7 @@ logging.disable(logging.INFO) # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.24a' +VERSION = '2.24b' ##VERSION## if sys.version_info.major == 2: @@ -5761,8 +5761,11 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO -%(preserve_cdata_tags)s doc = parsexml_(StringIO(inString), parser) + 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() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/generateDS.txt b/generateDS.txt index 09a490e..eebc634 100644 --- a/generateDS.txt +++ b/generateDS.txt @@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema .. version -:revision: 2.24a +:revision: 2.24b .. version diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html index c3958eb..43aca00 100644 --- a/generateds_gui_notes.html +++ b/generateds_gui_notes.html @@ -220,7 +220,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -229,7 +229,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td> </tr> </tbody> </table> @@ -401,7 +401,7 @@ $ mv generateds_gui.mo locale/ru/LC_MESSAGES/ <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateds_gui_notes.txt">View document source</a>. -Generated on: 2016-11-16 20:28 UTC. +Generated on: 2016-11-22 21:17 UTC. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source. </div> diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt index 0086f3d..25921cc 100644 --- a/generateds_gui_notes.txt +++ b/generateds_gui_notes.txt @@ -12,7 +12,7 @@ GenerateDS GUI Notes .. version -:revision: 2.24a +:revision: 2.24b .. version diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py index 8c99e30..41864be 100755 --- a/gui/generateds_gui.py +++ b/gui/generateds_gui.py @@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.24a' +VERSION = '2.24b' ##VERSION## diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html index 785be91..2093c8e 100644 --- a/librarytemplate_howto.html +++ b/librarytemplate_howto.html @@ -217,7 +217,7 @@ dkuhlman (at) davekuhlman (dot) org <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -226,7 +226,7 @@ dkuhlman (at) davekuhlman (dot) org <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td> </tr> </tbody> </table> @@ -380,7 +380,7 @@ this command for your needs. For example, you may need to use <div class="footer"> <hr class="footer" /> <a class="reference external" href="librarytemplate_howto.txt">View document source</a>. -Generated on: 2016-11-16 20:28 UTC. +Generated on: 2016-11-22 21:17 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 4b30ec1..6969b4d 100644 --- a/librarytemplate_howto.txt +++ b/librarytemplate_howto.txt @@ -8,7 +8,7 @@ How to package a generateDS.py generated library .. version -:revision: 2.24a +:revision: 2.24b .. version diff --git a/process_includes.py b/process_includes.py index 3325f9d..8fe5493 100755 --- a/process_includes.py +++ b/process_includes.py @@ -40,7 +40,7 @@ except ImportError: # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## -VERSION = '2.24a' +VERSION = '2.24b' ##VERSION## CatalogDict = {} @@ -208,7 +208,7 @@ def resolve_ref(node, params, options): 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] @@ -240,11 +240,7 @@ def collect_inserts_aux(child, params, inserts, options): save_base_url = params.base_url string_content = resolve_ref(child, params, options) if string_content is not None: - if sys.version_info.major == 2: - root = etree.fromstring(string_content, base_url=params.base_url) - else: - root = etree.fromstring( - string_content.encode(), base_url=params.base_url) + root = etree.fromstring(string_content, base_url=params.base_url) roots.append(root) for child1 in root: if not isinstance(child1, etree._Comment): diff --git a/setup.py b/setup.py index 2bf1e46..7963851 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup(name="generateDS", # Do not modify the following VERSION comments. # Used by updateversion.py. ##VERSION## - version="2.24a", + version="2.24b", ##VERSION## author="Dave Kuhlman", author_email="dkuhlman@davekuhlman.org", diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py index bb1a48b..1f3eab9 100644 --- a/tests/OnePer/oneperType00_2One.py +++ b/tests/OnePer/oneperType00_2One.py @@ -807,9 +807,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py index af44b2c..3c0ff82 100644 --- a/tests/OnePer/oneperType01_2One.py +++ b/tests/OnePer/oneperType01_2One.py @@ -882,9 +882,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py index 4c66103..d3cad9d 100644 --- a/tests/OnePer/oneperType02_2One.py +++ b/tests/OnePer/oneperType02_2One.py @@ -882,9 +882,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py index bc486fd..a1d3637 100644 --- a/tests/OnePer/oneperType03_2One.py +++ b/tests/OnePer/oneperType03_2One.py @@ -881,9 +881,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py index 2605227..7919997 100644 --- a/tests/abstract_type1_sup.py +++ b/tests/abstract_type1_sup.py @@ -1011,9 +1011,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py index 5c615e2..492423d 100644 --- a/tests/annotations1_sup.py +++ b/tests/annotations1_sup.py @@ -1007,9 +1007,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py index 565f1d0..50667a5 100644 --- a/tests/anonymous_type1_sup.py +++ b/tests/anonymous_type1_sup.py @@ -1072,9 +1072,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py index bc66620..fd90c17 100644 --- a/tests/anysimpletype1_sup.py +++ b/tests/anysimpletype1_sup.py @@ -906,9 +906,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py index 872cf51..955f656 100644 --- a/tests/anywildcard1_sup.py +++ b/tests/anywildcard1_sup.py @@ -1246,9 +1246,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py index 2de44a5..17fff17 100644 --- a/tests/attr_groups1_sup.py +++ b/tests/attr_groups1_sup.py @@ -906,9 +906,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py index 8cd42d3..3d948ca 100644 --- a/tests/catalogtest1_sup.py +++ b/tests/catalogtest1_sup.py @@ -720,9 +720,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py index b991443..408e230 100644 --- a/tests/cdata1_sup.py +++ b/tests/cdata1_sup.py @@ -876,9 +876,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py index e1a5c88..9638243 100644 --- a/tests/cleanupname1_sup.py +++ b/tests/cleanupname1_sup.py @@ -1218,9 +1218,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py index 82d9b6d..16925d8 100644 --- a/tests/defaults_cases1_sup.py +++ b/tests/defaults_cases1_sup.py @@ -1109,9 +1109,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py index ddec7e9..641b237 100644 --- a/tests/defaults_coverage1_sup.py +++ b/tests/defaults_coverage1_sup.py @@ -1472,9 +1472,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py index 9926473..75907f8 100644 --- a/tests/extensions1_sup.py +++ b/tests/extensions1_sup.py @@ -1759,9 +1759,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py index a828cba..f5e8822 100644 --- a/tests/ipo1_sup.py +++ b/tests/ipo1_sup.py @@ -1449,9 +1449,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py index a828cba..f5e8822 100644 --- a/tests/ipo2_sup.py +++ b/tests/ipo2_sup.py @@ -1449,9 +1449,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py index d7837d3..a596dcf 100644 --- a/tests/mapcleanname1_sup.py +++ b/tests/mapcleanname1_sup.py @@ -1558,9 +1558,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py index fed05aa..17b3c39 100644 --- a/tests/nested_def1_sup.py +++ b/tests/nested_def1_sup.py @@ -1118,9 +1118,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/out1_sup.py b/tests/out1_sup.py index e9dc161..f542a38 100644 --- a/tests/out1_sup.py +++ b/tests/out1_sup.py @@ -3480,9 +3480,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py index 996caa3..159c8e8 100644 --- a/tests/people_procincl1_sup.py +++ b/tests/people_procincl1_sup.py @@ -2864,9 +2864,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py index fa179c1..7e77a97 100644 --- a/tests/prefix_classname1_sup.py +++ b/tests/prefix_classname1_sup.py @@ -2485,9 +2485,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py index 06c6f8c..0b0a9e5 100644 --- a/tests/recursive_simpletype1_sup.py +++ b/tests/recursive_simpletype1_sup.py @@ -822,9 +822,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py index e27710f..7e784fe 100644 --- a/tests/reference_simpletype1_sup.py +++ b/tests/reference_simpletype1_sup.py @@ -840,9 +840,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py index 1c364ed..2d38d44 100644 --- a/tests/rem_dup_elems1_sup.py +++ b/tests/rem_dup_elems1_sup.py @@ -893,9 +893,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py index e9e28c9..afb69f9 100644 --- a/tests/simplecontent_restriction1_sup.py +++ b/tests/simplecontent_restriction1_sup.py @@ -1009,9 +1009,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py index fc9e39c..cc12dd5 100644 --- a/tests/simpletype_memberspecs1_sup.py +++ b/tests/simpletype_memberspecs1_sup.py @@ -869,9 +869,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py index 2bceefa..e1a21b7 100644 --- a/tests/simpletypes_other1_sup.py +++ b/tests/simpletypes_other1_sup.py @@ -1215,9 +1215,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py index 6d0f7c6..f6eb789 100644 --- a/tests/to_etree1_sup.py +++ b/tests/to_etree1_sup.py @@ -2959,9 +2959,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py index 4e3ff4b..798aff9 100644 --- a/tests/validate_simpletypes1_sup.py +++ b/tests/validate_simpletypes1_sup.py @@ -1627,9 +1627,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py index 4e3ff4b..798aff9 100644 --- a/tests/validate_simpletypes2_sup.py +++ b/tests/validate_simpletypes2_sup.py @@ -1627,9 +1627,12 @@ def parseEtree(inFileName, silence=False): def parseString(inString, silence=False): - from StringIO import StringIO + if sys.version_info.major == 2: + from StringIO import StringIO as IOBuffer + else: + from io import BytesIO as IOBuffer parser = None - doc = parsexml_(StringIO(inString), parser) + doc = parsexml_(IOBuffer(inString), parser) rootNode = doc.getroot() rootTag, rootClass = get_root_tag(rootNode) if rootClass is None: diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html index 212e6af..949cc9d 100644 --- a/tutorial/generateds_tutorial.html +++ b/tutorial/generateds_tutorial.html @@ -219,7 +219,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24a</td> +<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.24b</td> </tr> </tbody> </table> @@ -228,7 +228,7 @@ They are used by updateversion.py. --> <col class="field-name" /> <col class="field-body" /> <tbody valign="top"> -<tr class="field"><th class="field-name">date:</th><td class="field-body">November 16, 2016</td> +<tr class="field"><th class="field-name">date:</th><td class="field-body">November 22, 2016</td> </tr> </tbody> </table> @@ -1210,7 +1210,7 @@ named <tt class="docutils literal">garden_api.py</tt>, you can create an instanc <div class="footer"> <hr class="footer" /> <a class="reference external" href="generateds_tutorial.txt">View document source</a>. -Generated on: 2016-11-16 20:28 UTC. +Generated on: 2016-11-22 21:17 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 e334ec3..560634e 100644 --- a/tutorial/generateds_tutorial.txt +++ b/tutorial/generateds_tutorial.txt @@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial .. version -:revision: 2.24a +:revision: 2.24b .. version diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip index 31b243add61d581c179eadee276101e0113a622c..b491af4b3650151c5280fe52c817df891051cfde 100644 GIT binary patch delta 6662 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 Ql^c^#z9t4?xc~qF03MsAYXATM delta 6698 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 AeE<Le -- GitLab