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