From 83c56b73621d2d8cf4e107d2ea1540ea592bde37 Mon Sep 17 00:00:00 2001
From: Dave Kuhlman <dkuhlman@davekuhlman.org>
Date: Thu, 7 Dec 2017 15:03:26 -0800
Subject: [PATCH] V. 2.29.2 Fix for StringIO error with Python 2/3

---
 README.rst                              |   5 +++++
 generateDS.py                           |   7 +++++--
 generateDS.txt                          |   2 +-
 generateds_gui_notes.txt                |   2 +-
 gui/generateds_gui.py                   |   2 +-
 librarytemplate_howto.txt               |   2 +-
 process_includes.py                     |   2 +-
 setup.py                                |   2 +-
 tests/abstract_type1_sub.py             |   5 ++++-
 tests/annotations1_sub.py               |   5 ++++-
 tests/anonymous_type1_sub.py            |   5 ++++-
 tests/anysimpletype1_sub.py             |   5 ++++-
 tests/anywildcard1_sub.py               |   5 ++++-
 tests/attr_groups1_sub.py               |   5 ++++-
 tests/catalogtest1_sub.py               |   5 ++++-
 tests/cdata1_sub.py                     |   5 ++++-
 tests/check_results.rb                  |   2 ++
 tests/cleanupname1_sub.py               |   5 ++++-
 tests/copy_all                          |   2 ++
 tests/defaults_cases1_sub.py            |   5 ++++-
 tests/defaults_coverage1_sub.py         |   5 ++++-
 tests/extensions1_sub.py                |   5 ++++-
 tests/ipo1_sub.py                       |   5 ++++-
 tests/ipo2_sub.py                       |   5 ++++-
 tests/mapcleanname1_sub.py              |   5 ++++-
 tests/mixedcontent1_sub.py              |   5 ++++-
 tests/mixedcontent2_sub.py              |   5 ++++-
 tests/nested_def1_sub.py                |   5 ++++-
 tests/out1_sub.py                       |   5 ++++-
 tests/people_procincl1_sub.py           |   5 ++++-
 tests/prefix_classname1_sub.py          |   5 ++++-
 tests/recursive_simpletype1_sub.py      |   5 ++++-
 tests/reference_simpletype1_sub.py      |   5 ++++-
 tests/rem_dup_elems1_sub.py             |   5 ++++-
 tests/simplecontent_restriction1_sub.py |   5 ++++-
 tests/simpletype_memberspecs1_sub.py    |   5 ++++-
 tests/simpletypes_other1_sub.py         |   5 ++++-
 tests/to_etree1_sub.py                  |   5 ++++-
 tests/validate_simpletypes1_sub.py      |   5 ++++-
 tests/validate_simpletypes2_sub.py      |   5 ++++-
 tutorial/generateds_tutorial.txt        |   2 +-
 tutorial/generateds_tutorial.zip        | Bin 48770 -> 48769 bytes
 42 files changed, 141 insertions(+), 39 deletions(-)

diff --git a/README.rst b/README.rst
index cc072c4..80b1b68 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.29.2 (12/07/2017)
+
+- Fix for use of StringIO in generated subclass modules.  Thanks to
+  Rohan Dsa for alerting me on this.
+
 Version 2.29.1 (12/07/2017)
 
 - Fix to generation of code to export child elements that have
diff --git a/generateDS.py b/generateDS.py
index 2e7a2ff..748f668 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -229,7 +229,7 @@ logging.disable(logging.INFO)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 BaseStrTypes = six.string_types
@@ -6337,7 +6337,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
 %(preserve_cdata_tags)s    doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
     rootTag, rootClass = get_root_tag(rootNode)
diff --git a/generateDS.txt b/generateDS.txt
index 46bbdf0..42c1493 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/generateds_gui_notes.txt b/generateds_gui_notes.txt
index 0c0919d..d4a8e61 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 6d96b4a..ff91ffd 100644
--- a/gui/generateds_gui.py
+++ b/gui/generateds_gui.py
@@ -41,7 +41,7 @@ from libgenerateDS.gui import generateds_gui_session
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.txt b/librarytemplate_howto.txt
index 6caf901..f10f55e 100644
--- a/librarytemplate_howto.txt
+++ b/librarytemplate_howto.txt
@@ -8,7 +8,7 @@ How to package a generateDS.py generated library
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 734d6a0..08ee2c8 100644
--- a/process_includes.py
+++ b/process_includes.py
@@ -40,7 +40,7 @@ except ImportError:
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.1'
+VERSION = '2.29.2'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index 98670f6..1eb1c68 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.29.1",
+    version="2.29.2",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/abstract_type1_sub.py b/tests/abstract_type1_sub.py
index 3a5a98a..51ec544 100644
--- a/tests/abstract_type1_sub.py
+++ b/tests/abstract_type1_sub.py
@@ -131,7 +131,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/annotations1_sub.py b/tests/annotations1_sub.py
index a3b9f13..fc1467f 100644
--- a/tests/annotations1_sub.py
+++ b/tests/annotations1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anonymous_type1_sub.py b/tests/anonymous_type1_sub.py
index 3785a39..cc15886 100644
--- a/tests/anonymous_type1_sub.py
+++ b/tests/anonymous_type1_sub.py
@@ -131,7 +131,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anysimpletype1_sub.py b/tests/anysimpletype1_sub.py
index 172c678..2f6bcb3 100644
--- a/tests/anysimpletype1_sub.py
+++ b/tests/anysimpletype1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/anywildcard1_sub.py b/tests/anywildcard1_sub.py
index 1c7ca20..84897dd 100644
--- a/tests/anywildcard1_sub.py
+++ b/tests/anywildcard1_sub.py
@@ -145,7 +145,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/attr_groups1_sub.py b/tests/attr_groups1_sub.py
index 1dbf964..b5627f9 100644
--- a/tests/attr_groups1_sub.py
+++ b/tests/attr_groups1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/catalogtest1_sub.py b/tests/catalogtest1_sub.py
index d72941c..5789ad7 100644
--- a/tests/catalogtest1_sub.py
+++ b/tests/catalogtest1_sub.py
@@ -104,7 +104,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/cdata1_sub.py b/tests/cdata1_sub.py
index 3e89c4c..e73b9d9 100644
--- a/tests/cdata1_sub.py
+++ b/tests/cdata1_sub.py
@@ -118,7 +118,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/check_results.rb b/tests/check_results.rb
index 38f9fbe..63ce8b7 100755
--- a/tests/check_results.rb
+++ b/tests/check_results.rb
@@ -73,6 +73,8 @@ $commands = [
   "diff -u disable_xml_super1_sup.py disable_xml_super2_sup.py",
   "diff -u defaults_cases_export1_sub.py defaults_cases_export2_sub.py",
   "diff -u defaults_cases_export1_sup.py defaults_cases_export2_sup.py",
+  "diff -u mixedcontent1_sub.py mixedcontent2_sub.py",
+  "diff -u mixedcontent1_sup.py mixedcontent2_sup.py",
 ]
 
 def check
diff --git a/tests/cleanupname1_sub.py b/tests/cleanupname1_sub.py
index 95b7655..0bdd0ef 100644
--- a/tests/cleanupname1_sub.py
+++ b/tests/cleanupname1_sub.py
@@ -146,7 +146,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/copy_all b/tests/copy_all
index 4c9eeb6..0ba8184 100755
--- a/tests/copy_all
+++ b/tests/copy_all
@@ -61,3 +61,5 @@ cp disable_xml_super2_sup.py disable_xml_super1_sup.py
 cp disable_xml_super2_sub.py disable_xml_super1_sub.py
 cp defaults_cases_export2_sub.py defaults_cases_export1_sub.py
 cp defaults_cases_export2_sup.py defaults_cases_export1_sup.py
+cp mixedcontent2_sub.py mixedcontent1_sub.py
+cp mixedcontent2_sup.py mixedcontent1_sup.py
diff --git a/tests/defaults_cases1_sub.py b/tests/defaults_cases1_sub.py
index 2e3a83a..af45048 100644
--- a/tests/defaults_cases1_sub.py
+++ b/tests/defaults_cases1_sub.py
@@ -123,7 +123,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/defaults_coverage1_sub.py b/tests/defaults_coverage1_sub.py
index c1bdcc1..63093d9 100644
--- a/tests/defaults_coverage1_sub.py
+++ b/tests/defaults_coverage1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/extensions1_sub.py b/tests/extensions1_sub.py
index 5dd0b47..1d42391 100644
--- a/tests/extensions1_sub.py
+++ b/tests/extensions1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py
index 3205173..f5b8efc 100644
--- a/tests/ipo1_sub.py
+++ b/tests/ipo1_sub.py
@@ -144,7 +144,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py
index 3205173..f5b8efc 100644
--- a/tests/ipo2_sub.py
+++ b/tests/ipo2_sub.py
@@ -144,7 +144,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mapcleanname1_sub.py b/tests/mapcleanname1_sub.py
index faf1c03..ecdbfc4 100644
--- a/tests/mapcleanname1_sub.py
+++ b/tests/mapcleanname1_sub.py
@@ -152,7 +152,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mixedcontent1_sub.py b/tests/mixedcontent1_sub.py
index 1302fdc..3f6d05f 100644
--- a/tests/mixedcontent1_sub.py
+++ b/tests/mixedcontent1_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/mixedcontent2_sub.py b/tests/mixedcontent2_sub.py
index 1302fdc..3f6d05f 100644
--- a/tests/mixedcontent2_sub.py
+++ b/tests/mixedcontent2_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/nested_def1_sub.py b/tests/nested_def1_sub.py
index 7cb1b24..ad6412a 100644
--- a/tests/nested_def1_sub.py
+++ b/tests/nested_def1_sub.py
@@ -137,7 +137,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/out1_sub.py b/tests/out1_sub.py
index c22e9ad..8738817 100644
--- a/tests/out1_sub.py
+++ b/tests/out1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/people_procincl1_sub.py b/tests/people_procincl1_sub.py
index ad55ab0..4cac655 100644
--- a/tests/people_procincl1_sub.py
+++ b/tests/people_procincl1_sub.py
@@ -215,7 +215,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/prefix_classname1_sub.py b/tests/prefix_classname1_sub.py
index f815091..2200141 100644
--- a/tests/prefix_classname1_sub.py
+++ b/tests/prefix_classname1_sub.py
@@ -187,7 +187,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/recursive_simpletype1_sub.py b/tests/recursive_simpletype1_sub.py
index 44c0271..acbf3a3 100644
--- a/tests/recursive_simpletype1_sub.py
+++ b/tests/recursive_simpletype1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/reference_simpletype1_sub.py b/tests/reference_simpletype1_sub.py
index 9866ae4..51aff83 100644
--- a/tests/reference_simpletype1_sub.py
+++ b/tests/reference_simpletype1_sub.py
@@ -110,7 +110,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/rem_dup_elems1_sub.py b/tests/rem_dup_elems1_sub.py
index 4fec8a5..a4b8c9e 100644
--- a/tests/rem_dup_elems1_sub.py
+++ b/tests/rem_dup_elems1_sub.py
@@ -118,7 +118,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simplecontent_restriction1_sub.py b/tests/simplecontent_restriction1_sub.py
index 0e89a79..1ff34de 100644
--- a/tests/simplecontent_restriction1_sub.py
+++ b/tests/simplecontent_restriction1_sub.py
@@ -124,7 +124,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simpletype_memberspecs1_sub.py b/tests/simpletype_memberspecs1_sub.py
index d0f58c0..cce3276 100644
--- a/tests/simpletype_memberspecs1_sub.py
+++ b/tests/simpletype_memberspecs1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/simpletypes_other1_sub.py b/tests/simpletypes_other1_sub.py
index d375821..721a1e4 100644
--- a/tests/simpletypes_other1_sub.py
+++ b/tests/simpletypes_other1_sub.py
@@ -117,7 +117,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/to_etree1_sub.py b/tests/to_etree1_sub.py
index 34b23c3..eebd733 100644
--- a/tests/to_etree1_sub.py
+++ b/tests/to_etree1_sub.py
@@ -231,7 +231,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/validate_simpletypes1_sub.py b/tests/validate_simpletypes1_sub.py
index a78dd6d..de1aa85 100644
--- a/tests/validate_simpletypes1_sub.py
+++ b/tests/validate_simpletypes1_sub.py
@@ -130,7 +130,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tests/validate_simpletypes2_sub.py b/tests/validate_simpletypes2_sub.py
index a78dd6d..de1aa85 100644
--- a/tests/validate_simpletypes2_sub.py
+++ b/tests/validate_simpletypes2_sub.py
@@ -130,7 +130,10 @@ def parseEtree(inFilename, silence=False):
 
 
 def parseString(inString, silence=False):
-    from StringIO import StringIO
+    if sys.version_info.major == 2:
+        from StringIO import StringIO
+    else:
+        from io import BytesIO as StringIO
     parser = None
     doc = parsexml_(StringIO(inString), parser)
     rootNode = doc.getroot()
diff --git a/tutorial/generateds_tutorial.txt b/tutorial/generateds_tutorial.txt
index e3f298b..0fb9cbf 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.29.1
+:revision: 2.29.2
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 72796061feaf3b438d4142cfb29f8a3a26b7eb17..09298b890a24b88b384642a10cc2b5baa95ed2d9 100644
GIT binary patch
delta 822
zcmV-61Ihe?{Q`mg0vk|E0|XQR000O8Ep~@X8p#{TTLJ(84+Q`K7n5(577s3Tcyv`%
z2>=6j#VK0wyOBT@f7>t+-SsPO36KCW9T-_EAWNGiXaW?dhjyxI@?;UEcmhe;5s)9>
zJIcz3h7RE(>Uj6~?%m_v-Dg&Hz<^O_y#EQS6+DC-$qptv3ZR39?T{%t?W<3r-&Iwu
zhul)E;a(pRz7MVMbl|A95mTzc{+&W_sq+<BPI?Vk;t0h<e+9hSocnscKAleLU6PXH
zN-4M}2$Z2C>zWaAi_nnwbaLSUM~q4OG1PS!a#8}gZE*x05r%{o_9G0vWf{)7svlLs
zJ^ynb5syx`HEh)8i`p!XrMQL{`Mi{)X$vJ@!^Ky)u-9<$yW(6!{TSV$%{6?Rw{U5$
zU~_YG`#~the>`0ROJ)%2TIN#Zkl9F=iJE+pHe3da$waru1YBZ>xlNsMtMK%&g-2&F
zB&?TuQqN%;qCt^!?WeS~?p$7-f0PVzpK{cONq^uZm+`dR(mDC;9LQ9dvd-mVYGAi}
za~&(a+rg=IriD40;K#_O2_l{bzLjAIwhLS~6blGGf9tOIcn!wu#9Xj(!O7L>3Ytir
zF#7fM2+6eA=~u3*%>7Jc2_CWMk8~t-(PJ?SH#URKC{y)W?4qy~yj`c@A%pgb-Zj+g
znAj_vsi%5R+Ae`bL=lS;F4-|A^RTuwc|BPG5;82qL*qR1#MvM$13Nwq`yz};mh!M?
zRd`C&TT8L_ek}DfIjf38cs>z~F1J93%)+L5cJJ_54vH41G4OF8$?!uiX~Ljr#xq{D
zHoc~VCWoP`CkxgV``p%WTU9GrC1u9=UycjL4_2PlYY*wq>^H6QbFQj?v#kQewh1kE
zhf5mC8^~Ledbu?McEyvixjO=^0+W%s7L(rs29pZ9KmkOPOS(z}gE9b<p)wVdt-3$~
z&6DoBSpp$zlfk?clU=(?0!M6<!Mqfcy}L*Pvw@SrycClgyh#EEgp<L%6O(zoMgfGA
zz`R-l3Wk%xycCl#y-EVYhLgd(6qAs>N&!ie+r3=^Q<amExfPR7zAXl1xc~qF0LOTN
A$^ZZW

delta 819
zcmV-31I+w^{Q`ph0v%9G0|XQR000O8I$?)Ph#o*uTmk?94+Q`K7XTcSk+~WP2>=5R
zpeb4pppifof7~z(-Tf=L1jqq7T^eMmfh=v7LldAtGqh7rC(&o2vT5ie7X$h6CFOHI
zJY<L#%M|(a`1o{l^O;p0u*aYi-u{C18n%53WV1<*deFUvhny%l?W<3r-&9qtb80En
zaH}5?e&p77y63310b{Je{+mK@uG0!EC%ptLafHI5e*#`@N<+Qb9FIr!CP~S0r4-x}
z^pv0@>zWZ#i_nnwbaedz9x+7e$57W{pP~}LhZaZB0U<}Uupc20mSs5Qs$o<G_w>(w
z1blR|t>H>teN|r;$5LFwvwWV*(X@pUui@+)oY@OF`%`hQp<xW}(54!`&s#V*E4aG6
zynZK?e`204f+drMx|X>VIb=4{Wuzt@r45(BVl=_+F#?wuVs2As+$!8}AK=az>?77o
zJ!#-D<zP_c-1sRiZaSCNrynJQ+{YBOVbbq7$z?n(w{%WAIR_FIrmS<hm>SsaUR}pZ
z?{;u(ooQi?M)*0hX?hV)1K-N9ne77S4TS=Ne^0s_JYInDIx-h*T<_%SxPm57CyajI
z-$67jcKU^@Dsw*(S%L=~_#+(&UG!MY!i~*fGs;wb61ylY1+UjB*e1|E(wl|`9U^;$
zGxb#ON!ul`h$v!F#3eh%WFFR*CNCxnKtzURcxaqQo;VwXWnjn0yf4CtWHIGEtHM*F
zTtSMp_hYG_$yrq#!t)7Wbh!mOWEM8gvwMTba!{~1je(DcK!zW3NfQP|GoJCHwdplQ
zG^x*BJz21}IHb0Q>#ADIDk(F@M>(!HK3jQKFFnM+v){BzPpPW@1GB6G#I^}KVTVhI
z9zaoClX<x{0uP{*u(>+|tpbyfxfYY&0tS-_x<CO%lS;Zu1B5aFlb|vcldQTx0nU@{
zx>*AvYXFm>g%gupyGjE{Yygv?g%gv!yGR4HfdG@Cg%gt+yh#BElVrSF0fm#lyjlYb
xh5(bHg%gu6y-EYah5(bHg%gvHy-EQ}liIyq0#ucgkhv9;PQEP$Ww`(V000jBYbyW%

-- 
GitLab