From 54c96ef43f274aa51e725af6bd0da020e0a64d13 Mon Sep 17 00:00:00 2001
From: Dave Kuhlman <dkuhlman@davekuhlman.org>
Date: Fri, 2 Mar 2018 11:36:34 -0800
Subject: [PATCH] Handled fixed attribute and corrections for Py 2/3 unicode.

---
 README.rst                        |  11 +
 generateDS.html                   |   6 +-
 generateDS.py                     |  48 +++--
 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               |   2 +-
 setup.py                          |   2 +-
 tests/defaults_cases.xml          |  30 +++
 tests/defaults_cases.xsd          |  88 ++++++++
 tests/defaults_cases1_out.xml     |  13 ++
 tests/defaults_cases1_sub.py      |  18 +-
 tests/defaults_cases1_sup.py      | 340 +++++++++++++++++++++++++++++-
 tests/ipo1_out.xml                |   2 +-
 tests/ipo1_sub.py                 |   2 +-
 tests/ipo1_sup.py                 |   4 +-
 tests/ipo2_sub.py                 |   2 +-
 tests/ipo2_sup.py                 |   4 +-
 tutorial/generateds_tutorial.html |   6 +-
 tutorial/generateds_tutorial.txt  |   2 +-
 tutorial/generateds_tutorial.zip  | Bin 48771 -> 48768 bytes
 24 files changed, 557 insertions(+), 43 deletions(-)

diff --git a/README.rst b/README.rst
index 6183e7f..676d637 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,17 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.29.8 (03/02/2018)
+
+- Added a change so that an attribute specified as `fixed` will be
+  handled in the same way as one specified as `default`.  This
+  leaves it to the user to validate and enforce the `fixed`
+  restriction in some other way, e.g. through use of an XML
+  validating parser such as `xmllint`.  Thanks to Sanja Abbott for
+  suggesting this enhancement.
+- Various fixes for string/unicode differences across Python 2 and
+  Python 3.
+
 Version 2.29.7 (02/05/2018)
 
 - Fix for unicode error that occurs during simpleType validation
diff --git a/generateDS.html b/generateDS.html
index 38fc6cc..ea060c8 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.29.7</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.8</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">February 05, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 02, 2018</td>
 </tr>
 </tbody>
 </table>
@@ -3380,7 +3380,7 @@ following among others:</p>
 <div class="footer">
 <hr class="footer" />
 <a class="reference external" href="generateDS.txt">View document source</a>.
-Generated on: 2018-02-05 22:01 UTC.
+Generated on: 2018-03-02 19:35 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 b68e947..81f53ea 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.7'
+VERSION = '2.29.8'
 ##VERSION##
 
 BaseStrTypes = six.string_types
@@ -1431,11 +1431,15 @@ class XschemaAttribute:
             name,
             data_type='xs:string',
             use='optional',
-            default=None):
+            default=None,
+            fixed=None):
         self.name = name
         self.data_type = data_type
         self.use = use
         self.default = default
+        # treat `fixed` the same as `default`.
+        if fixed is not None:
+            self.default = fixed
         # Enumeration values for the attribute.
         self.values = list()
         # If we change the name, e.g. because an attribute and child have
@@ -1695,13 +1699,19 @@ class XschemaHandler(handler.ContentHandler):
                 default = attrs['default']
             else:
                 default = None
+            if 'fixed' in attrs:
+                fixed = attrs['fixed']
+            else:
+                fixed = None
             if self.stack[-1].attributeGroup:
                 # Add this attribute to a current attributeGroup.
-                attribute = XschemaAttribute(name, data_type, use, default)
+                attribute = XschemaAttribute(
+                    name, data_type, use, default, fixed)
                 self.stack[-1].attributeGroup.add(name, attribute)
             else:
                 # Add this attribute to the element/complexType.
-                attribute = XschemaAttribute(name, data_type, use, default)
+                attribute = XschemaAttribute(
+                    name, data_type, use, default, fixed)
                 self.stack[-1].attributeDefs[name] = attribute
                 self.stack[-1].attributeDefsList.append(name)
             self.lastAttribute = attribute
@@ -2651,6 +2661,8 @@ def generateExportAttributes(wrt, element, hasAttributes):
                         s1 = '        if self.%s != "%s" and ' % (
                             cleanName, default, )
                 s1 += "'%s' not in already_processed:\n" % (cleanName, )
+                if sys.version_info.major == 2:
+                    s1 = s1.encode('utf-8')
                 wrt(s1)
                 wrt("            already_processed.add('%s')\n" % (
                     cleanName, ))
@@ -2707,6 +2719,8 @@ def generateExportAttributes(wrt, element, hasAttributes):
                 s1 = '''%s        outfile.write(' %s=%%s' %% ''' \
                     '''(quote_attrib(self.%s), ))\n''' % (
                         indent, orig_name, cleanName, )
+            if sys.version_info.major == 2:
+                s1 = s1.encode('utf-8')
             wrt(s1)
     if element.getExtended():
         wrt("        if self.extensiontype_ is not None and 'xsi:type' "
@@ -2810,6 +2824,10 @@ def getParentName(element):
 def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     childCount = countChildren(element, 0)
     name = element.getName()
+    if sys.version_info.major == 2:
+        encodedname = name.encode('utf-8')
+    else:
+        encodedname = name
     base = element.getBase()
     ns_prefix = SchemaNamespaceDict.get(name)
     if ns_prefix is not None and ns_prefix[0] is not None:
@@ -2819,9 +2837,9 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
             nameSpacesDef += ' {}="{}"'.format(ns_def, ns_prefix[1])
     wrt("    def export(self, outfile, level, namespace_='%s', "
         "name_='%s', namespacedef_='%s', pretty_print=True):\n" %
-        (namespace, name, nameSpacesDef))
+        (namespace, encodedname, nameSpacesDef))
     wrt("        imported_ns_def_ = GenerateDSNamespaceDefs_.get"
-        "('%s')\n" % (name, ))
+        "('%s')\n" % (encodedname, ))
     wrt("        if imported_ns_def_ is not None:\n")
     wrt("            namespacedef_ = imported_ns_def_\n")
     wrt('        if pretty_print:\n')
@@ -2837,7 +2855,7 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
     wrt("        already_processed = set()\n")
     wrt("        self.exportAttributes(outfile, level, "
         "already_processed, namespace_, name_='%s')\n" %
-        (name, ))
+        (encodedname, ))
     # fix_abstract
     if base and base in ElementDict:
         base_element = ElementDict[base]
@@ -2863,7 +2881,7 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
             wrt("            outfile.write('>%s' % (eol_, ))\n")
         wrt("            self.exportChildren(outfile, level + 1, "
             "namespace_='%s', name_='%s', pretty_print=pretty_print)\n" %
-            (namespace, name))
+            (namespace, encodedname))
         # Put a condition on the indent to require children.
         if childCount != 0:
             wrt('            showIndent(outfile, level, pretty_print)\n')
@@ -2873,7 +2891,7 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
         wrt("            outfile.write('/>%s' % (eol_, ))\n")
     wrt("    def exportAttributes(self, outfile, level, "
         "already_processed, namespace_='%s', name_='%s'):\n" %
-        (namespace, name, ))
+        (namespace, encodedname, ))
     hasAttributes = 0
     if element.getAnyAttribute():
         wrt("""\
@@ -2914,13 +2932,13 @@ def generateExportFn(wrt, prefix, element, namespace, nameSpacesDef):
         elName = element.getCleanName()
         wrt("        super(%s%s, self).exportAttributes("
             "outfile, level, already_processed, namespace_, name_='%s')\n" %
-            (prefix, elName, name, ))
+            (prefix, elName, encodedname, ))
     hasAttributes += generateExportAttributes(wrt, element, hasAttributes)
     if hasAttributes == 0:
         wrt("        pass\n")
     wrt("    def exportChildren(self, outfile, level, namespace_='%s', "
         "name_='%s', fromsubclass_=False, pretty_print=True):\n" %
-        (namespace, name, ))
+        (namespace, encodedname, ))
     hasChildren = 0
     # Generate call to exportChildren in the superclass only if it is
     #  an extension, but *not* if it is a restriction.
@@ -4120,6 +4138,8 @@ def generateCtor(wrt, prefix, element):
     elName = element.getCleanName()
     childCount = countChildren(element, 0)
     s2 = buildCtorArgs_multilevel(element, childCount)
+    if sys.version_info.major == 2:
+        s2 = s2.encode('utf-8')
     wrt('    def __init__(self%s):\n' % s2)
     # Save the original tag name.  This is needed when there is a
     # xs:substitutionGroup and we later (e.g. during export) do not know
@@ -7118,8 +7138,12 @@ def capture_cleanup_name_list(option):
                     'Option --cleanup-name-list contains '
                     'invalid element.')
         try:
+            if sys.version_info.major == 2:
+                target = cleanup_pair[0].decode('utf-8')
+            else:
+                target = cleanup_pair[0]
             cleanupNameList.append(
-                (re.compile(cleanup_pair[0]), cleanup_pair[1]))
+                (re.compile(target), cleanup_pair[1]))
         except Exception:
             raise RuntimeError(
                 'Option --cleanup-name-list contains invalid '
diff --git a/generateDS.txt b/generateDS.txt
index 86be3c3..d90d20e 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.29.7
+:revision: 2.29.8
 
 .. version
 
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
index f92b4b0..1358124 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.29.7</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.8</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">February 05, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 02, 2018</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: 2018-02-05 22:01 UTC.
+Generated on: 2018-03-02 19:35 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 e509ff5..a0172b1 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.29.7
+:revision: 2.29.8
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index 59f7cd7..5fa5216 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.7'
+VERSION = '2.29.8'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 700cf0d..db0f08c 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.29.7</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.8</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">February 05, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 02, 2018</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: 2018-02-05 22:01 UTC.
+Generated on: 2018-03-02 19:35 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 93e2b37..7107cea 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.7
+:revision: 2.29.8
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index 57331e3..8682081 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.29.7'
+VERSION = '2.29.8'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index 4ed191c..0eddedd 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.7",
+    version="2.29.8",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/defaults_cases.xml b/tests/defaults_cases.xml
index 5862ed4..7642133 100644
--- a/tests/defaults_cases.xml
+++ b/tests/defaults_cases.xml
@@ -27,5 +27,35 @@
     <default2 attrnormal01="wxy"/>
     <default2 attrnormal02="89"/>
 
+    <!-- `fixed` attribute tests.
+    -->
+
+    <fixed1>
+        <!-- case 1 -->
+        <!-- case 2 -->
+        <normal02>a new value 1</normal02>
+        <!-- case 3 -->
+        <!-- case 4 -->
+        <fixed02>a new value 2</fixed02>
+        <!-- case 5 -->
+        <!--
+        -->
+        <normal03>55.66</normal03>
+        <!-- case 6 -->
+        <normal04>66.77</normal04>
+        <!-- case 7 -->
+        <!--
+        -->
+        <fixed03>77.88</fixed03>
+        <!-- case 8 -->
+        <fixed04>88.99</fixed04>
+    </fixed1>
+
+    <fixed2 attrfixed01="xyz"/>
+    <fixed2 attrfixed02="14"/>
+    <fixed2 />
+    <fixed2 attrnormal01="wxy"/>
+    <fixed2 attrnormal02="89"/>
+
 </defaults>
 
diff --git a/tests/defaults_cases.xsd b/tests/defaults_cases.xsd
index 32cafe4..3d76db5 100644
--- a/tests/defaults_cases.xsd
+++ b/tests/defaults_cases.xsd
@@ -11,6 +11,10 @@
                 maxOccurs="unbounded"/>
             <xs:element name="default2" type="DefaultType2"
                 maxOccurs="unbounded"/>
+            <xs:element name="fixed1" type="FixedType1"
+                maxOccurs="unbounded"/>
+            <xs:element name="fixed2" type="FixedType2"
+                maxOccurs="unbounded"/>
         </xs:sequence>
     </xs:complexType>
 
@@ -94,4 +98,88 @@
         <xs:attribute name="attrnormal02" type="xs:integer"/>
     </xs:complexType>
 
+    <!-- 'fixed' attribute tests.  Note that we handle `fixed` attributes
+         in the same way as `default` attributes.
+    -->
+
+    <xs:complexType name="FixedType1">
+        <xs:sequence>
+            <!--
+                *case 1:*
+                xsd: element optional, no fixed value given
+                xml: element missing
+                output: element missing
+            -->
+            <xs:element name="normal01" type="xs:integer"
+                minOccurs="0"/>
+            <!--
+                *case 2:*
+                xsd: element optional, no fixed value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="normal02" type="xs:string"
+                minOccurs="0"/>
+            <!--
+                *case 3:*
+                xsd: element optional, fixed value given
+                xml: element missing
+                expected output: element missing
+                current output: missing element is added with fixed value
+            -->
+            <xs:element name="fixed01" type="xs:integer" fixed="23"
+                minOccurs="0"/>
+            <!--
+                *case 4:*
+                xsd: element optional, fixed value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="fixed02" type="xs:string" fixed="Peach"
+                minOccurs="0"/>
+            <!--
+                *case 5:*
+                xsd: element mandatory, no fixed value given
+                xml: element missing
+                error on reading xml
+            -->
+            <xs:element name="normal03" type="xs:float"
+                minOccurs="1"/>
+            <!--
+                *case 6:*
+                xsd: element mandatory, no fixed value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="normal04" type="xs:double"
+                minOccurs="1"/>
+            <!--
+                *case 7:*
+                xsd: element mandatory, fixed value given
+                xml: element missing
+                error on reading xml
+                output: missing element is generated with fixed value
+            -->
+            <xs:element name="fixed03" type="xs:float" fixed="23.45"
+                minOccurs="1"/>
+            <!--
+                *case 8:*
+                xsd: element mandatory, fixed value given
+                xml: element exists
+                output: element is unchanged
+            -->
+            <xs:element name="fixed04" type="xs:double" fixed="54.32"
+                minOccurs="1"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="FixedType2">
+        <xs:sequence>
+        </xs:sequence>
+        <xs:attribute name="attrfixed01" type="xs:string" fixed="abcd"/>
+        <xs:attribute name="attrfixed02" type="xs:integer" fixed="14"/>
+        <xs:attribute name="attrnormal01" type="xs:string"/>
+        <xs:attribute name="attrnormal02" type="xs:integer"/>
+    </xs:complexType>
+
 </xs:schema>
diff --git a/tests/defaults_cases1_out.xml b/tests/defaults_cases1_out.xml
index 58064fb..3d2737e 100644
--- a/tests/defaults_cases1_out.xml
+++ b/tests/defaults_cases1_out.xml
@@ -13,4 +13,17 @@
     <default2/>
     <default2 attrnormal01="wxy"/>
     <default2 attrnormal02="89"/>
+    <fixed1>
+        <normal02>a new value 1</normal02>
+        <fixed02>a new value 2</fixed02>
+        <normal03>55.659999999999997</normal03>
+        <normal04>6.677000e+01</normal04>
+        <fixed03>77.879999999999995</fixed03>
+        <fixed04>8.899000e+01</fixed04>
+    </fixed1>
+    <fixed2 attrfixed01="xyz"/>
+    <fixed2/>
+    <fixed2/>
+    <fixed2 attrnormal01="wxy"/>
+    <fixed2 attrnormal02="89"/>
 </defaults>
diff --git a/tests/defaults_cases1_sub.py b/tests/defaults_cases1_sub.py
index af45048..32171bb 100644
--- a/tests/defaults_cases1_sub.py
+++ b/tests/defaults_cases1_sub.py
@@ -48,8 +48,8 @@ ExternalEncoding = 'ascii'
 
 
 class DefaultTypesSub(supermod.DefaultTypes):
-    def __init__(self, default1=None, default2=None):
-        super(DefaultTypesSub, self).__init__(default1, default2, )
+    def __init__(self, default1=None, default2=None, fixed1=None, fixed2=None):
+        super(DefaultTypesSub, self).__init__(default1, default2, fixed1, fixed2, )
 supermod.DefaultTypes.subclass = DefaultTypesSub
 # end class DefaultTypesSub
 
@@ -68,6 +68,20 @@ supermod.DefaultType2.subclass = DefaultType2Sub
 # end class DefaultType2Sub
 
 
+class FixedType1Sub(supermod.FixedType1):
+    def __init__(self, normal01=None, normal02=None, fixed01=None, fixed02=None, normal03=None, normal04=None, fixed03=None, fixed04=None):
+        super(FixedType1Sub, self).__init__(normal01, normal02, fixed01, fixed02, normal03, normal04, fixed03, fixed04, )
+supermod.FixedType1.subclass = FixedType1Sub
+# end class FixedType1Sub
+
+
+class FixedType2Sub(supermod.FixedType2):
+    def __init__(self, attrfixed01='abcd', attrfixed02=14, attrnormal01=None, attrnormal02=None):
+        super(FixedType2Sub, self).__init__(attrfixed01, attrfixed02, attrnormal01, attrnormal02, )
+supermod.FixedType2.subclass = FixedType2Sub
+# end class FixedType2Sub
+
+
 def get_root_tag(node):
     tag = supermod.Tag_pattern_.match(node.tag).groups()[-1]
     rootClass = None
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index e576fe2..78baf41 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -725,10 +725,12 @@ class DefaultTypes(GeneratedsSuper):
     member_data_items_ = [
         MemberSpec_('default1', 'DefaultType1', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'DefaultType1', u'name': u'default1'}, None),
         MemberSpec_('default2', 'DefaultType2', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'DefaultType2', u'name': u'default2'}, None),
+        MemberSpec_('fixed1', 'FixedType1', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'FixedType1', u'name': u'fixed1'}, None),
+        MemberSpec_('fixed2', 'FixedType2', 1, 0, {u'maxOccurs': u'unbounded', u'type': u'FixedType2', u'name': u'fixed2'}, None),
     ]
     subclass = None
     superclass = None
-    def __init__(self, default1=None, default2=None):
+    def __init__(self, default1=None, default2=None, fixed1=None, fixed2=None):
         self.original_tagname_ = None
         if default1 is None:
             self.default1 = []
@@ -738,6 +740,14 @@ class DefaultTypes(GeneratedsSuper):
             self.default2 = []
         else:
             self.default2 = default2
+        if fixed1 is None:
+            self.fixed1 = []
+        else:
+            self.fixed1 = fixed1
+        if fixed2 is None:
+            self.fixed2 = []
+        else:
+            self.fixed2 = fixed2
     def factory(*args_, **kwargs_):
         if CurrentSubclassModule_ is not None:
             subclass = getSubclassFromModule_(
@@ -759,10 +769,22 @@ class DefaultTypes(GeneratedsSuper):
     def add_default2(self, value): self.default2.append(value)
     def insert_default2_at(self, index, value): self.default2.insert(index, value)
     def replace_default2_at(self, index, value): self.default2[index] = value
+    def get_fixed1(self): return self.fixed1
+    def set_fixed1(self, fixed1): self.fixed1 = fixed1
+    def add_fixed1(self, value): self.fixed1.append(value)
+    def insert_fixed1_at(self, index, value): self.fixed1.insert(index, value)
+    def replace_fixed1_at(self, index, value): self.fixed1[index] = value
+    def get_fixed2(self): return self.fixed2
+    def set_fixed2(self, fixed2): self.fixed2 = fixed2
+    def add_fixed2(self, value): self.fixed2.append(value)
+    def insert_fixed2_at(self, index, value): self.fixed2.insert(index, value)
+    def replace_fixed2_at(self, index, value): self.fixed2[index] = value
     def hasContent_(self):
         if (
             self.default1 or
-            self.default2
+            self.default2 or
+            self.fixed1 or
+            self.fixed2
         ):
             return True
         else:
@@ -799,6 +821,10 @@ class DefaultTypes(GeneratedsSuper):
             default1_.export(outfile, level, namespace_, name_='default1', pretty_print=pretty_print)
         for default2_ in self.default2:
             default2_.export(outfile, level, namespace_, name_='default2', pretty_print=pretty_print)
+        for fixed1_ in self.fixed1:
+            fixed1_.export(outfile, level, namespace_, name_='fixed1', pretty_print=pretty_print)
+        for fixed2_ in self.fixed2:
+            fixed2_.export(outfile, level, namespace_, name_='fixed2', pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -819,6 +845,16 @@ class DefaultTypes(GeneratedsSuper):
             obj_.build(child_)
             self.default2.append(obj_)
             obj_.original_tagname_ = 'default2'
+        elif nodeName_ == 'fixed1':
+            obj_ = FixedType1.factory()
+            obj_.build(child_)
+            self.fixed1.append(obj_)
+            obj_.original_tagname_ = 'fixed1'
+        elif nodeName_ == 'fixed2':
+            obj_ = FixedType2.factory()
+            obj_.build(child_)
+            self.fixed2.append(obj_)
+            obj_.original_tagname_ = 'fixed2'
 # end class DefaultTypes
 
 
@@ -1118,6 +1154,302 @@ class DefaultType2(GeneratedsSuper):
 # end class DefaultType2
 
 
+class FixedType1(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('normal01', 'xs:integer', 0, 1, {u'type': u'xs:integer', u'name': u'normal01', u'minOccurs': u'0'}, None),
+        MemberSpec_('normal02', 'xs:string', 0, 1, {u'type': u'xs:string', u'name': u'normal02', u'minOccurs': u'0'}, None),
+        MemberSpec_('fixed01', 'xs:integer', 0, 1, {u'fixed': u'23', u'type': u'xs:integer', u'name': u'fixed01', u'minOccurs': u'0'}, None),
+        MemberSpec_('fixed02', 'xs:string', 0, 1, {u'fixed': u'Peach', u'type': u'xs:string', u'name': u'fixed02', u'minOccurs': u'0'}, None),
+        MemberSpec_('normal03', 'xs:float', 0, 0, {u'type': u'xs:float', u'name': u'normal03', u'minOccurs': u'1'}, None),
+        MemberSpec_('normal04', 'xs:double', 0, 0, {u'type': u'xs:double', u'name': u'normal04', u'minOccurs': u'1'}, None),
+        MemberSpec_('fixed03', 'xs:float', 0, 0, {u'fixed': u'23.45', u'type': u'xs:float', u'name': u'fixed03', u'minOccurs': u'1'}, None),
+        MemberSpec_('fixed04', 'xs:double', 0, 0, {u'fixed': u'54.32', u'type': u'xs:double', u'name': u'fixed04', u'minOccurs': u'1'}, None),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, normal01=None, normal02=None, fixed01=None, fixed02=None, normal03=None, normal04=None, fixed03=None, fixed04=None):
+        self.original_tagname_ = None
+        self.normal01 = normal01
+        self.normal02 = normal02
+        self.fixed01 = fixed01
+        self.fixed02 = fixed02
+        self.normal03 = normal03
+        self.normal04 = normal04
+        self.fixed03 = fixed03
+        self.fixed04 = fixed04
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, FixedType1)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if FixedType1.subclass:
+            return FixedType1.subclass(*args_, **kwargs_)
+        else:
+            return FixedType1(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_normal01(self): return self.normal01
+    def set_normal01(self, normal01): self.normal01 = normal01
+    def get_normal02(self): return self.normal02
+    def set_normal02(self, normal02): self.normal02 = normal02
+    def get_fixed01(self): return self.fixed01
+    def set_fixed01(self, fixed01): self.fixed01 = fixed01
+    def get_fixed02(self): return self.fixed02
+    def set_fixed02(self, fixed02): self.fixed02 = fixed02
+    def get_normal03(self): return self.normal03
+    def set_normal03(self, normal03): self.normal03 = normal03
+    def get_normal04(self): return self.normal04
+    def set_normal04(self, normal04): self.normal04 = normal04
+    def get_fixed03(self): return self.fixed03
+    def set_fixed03(self, fixed03): self.fixed03 = fixed03
+    def get_fixed04(self): return self.fixed04
+    def set_fixed04(self, fixed04): self.fixed04 = fixed04
+    def hasContent_(self):
+        if (
+            self.normal01 is not None or
+            self.normal02 is not None or
+            self.fixed01 is not None or
+            self.fixed02 is not None or
+            self.normal03 is not None or
+            self.normal04 is not None or
+            self.fixed03 is not None or
+            self.fixed04 is not None
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='FixedType1', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('FixedType1')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='FixedType1')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FixedType1', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='FixedType1'):
+        pass
+    def exportChildren(self, outfile, level, namespace_='', name_='FixedType1', fromsubclass_=False, pretty_print=True):
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.normal01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<normal01>%s</normal01>%s' % (self.gds_format_integer(self.normal01, input_name='normal01'), eol_))
+        if self.normal02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<normal02>%s</normal02>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.normal02), input_name='normal02')), eol_))
+        if self.fixed01 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<fixed01>%s</fixed01>%s' % (self.gds_format_integer(self.fixed01, input_name='fixed01'), eol_))
+        if self.fixed02 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<fixed02>%s</fixed02>%s' % (self.gds_encode(self.gds_format_string(quote_xml(self.fixed02), input_name='fixed02')), eol_))
+        if self.normal03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<normal03>%s</normal03>%s' % (self.gds_format_float(self.normal03, input_name='normal03'), eol_))
+        if self.normal04 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<normal04>%s</normal04>%s' % (self.gds_format_double(self.normal04, input_name='normal04'), eol_))
+        if self.fixed03 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<fixed03>%s</fixed03>%s' % (self.gds_format_float(self.fixed03, input_name='fixed03'), eol_))
+        if self.fixed04 is not None:
+            showIndent(outfile, level, pretty_print)
+            outfile.write('<fixed04>%s</fixed04>%s' % (self.gds_format_double(self.fixed04, input_name='fixed04'), eol_))
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        pass
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        if nodeName_ == 'normal01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'normal01')
+            self.normal01 = ival_
+        elif nodeName_ == 'normal02':
+            normal02_ = child_.text
+            normal02_ = self.gds_validate_string(normal02_, node, 'normal02')
+            self.normal02 = normal02_
+        elif nodeName_ == 'fixed01':
+            sval_ = child_.text
+            try:
+                ival_ = int(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires integer: %s' % exp)
+            ival_ = self.gds_validate_integer(ival_, node, 'fixed01')
+            self.fixed01 = ival_
+        elif nodeName_ == 'fixed02':
+            fixed02_ = child_.text
+            fixed02_ = self.gds_validate_string(fixed02_, node, 'fixed02')
+            self.fixed02 = fixed02_
+        elif nodeName_ == 'normal03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal03')
+            self.normal03 = fval_
+        elif nodeName_ == 'normal04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'normal04')
+            self.normal04 = fval_
+        elif nodeName_ == 'fixed03':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'fixed03')
+            self.fixed03 = fval_
+        elif nodeName_ == 'fixed04':
+            sval_ = child_.text
+            try:
+                fval_ = float(sval_)
+            except (TypeError, ValueError) as exp:
+                raise_parse_error(child_, 'requires float or double: %s' % exp)
+            fval_ = self.gds_validate_float(fval_, node, 'fixed04')
+            self.fixed04 = fval_
+# end class FixedType1
+
+
+class FixedType2(GeneratedsSuper):
+    member_data_items_ = [
+        MemberSpec_('attrfixed01', 'xs:string', 0, 1, {'use': 'optional'}),
+        MemberSpec_('attrfixed02', 'xs:integer', 0, 1, {'use': 'optional'}),
+        MemberSpec_('attrnormal01', 'xs:string', 0, 1, {'use': 'optional'}),
+        MemberSpec_('attrnormal02', 'xs:integer', 0, 1, {'use': 'optional'}),
+    ]
+    subclass = None
+    superclass = None
+    def __init__(self, attrfixed01='abcd', attrfixed02=14, attrnormal01=None, attrnormal02=None):
+        self.original_tagname_ = None
+        self.attrfixed01 = _cast(None, attrfixed01)
+        self.attrfixed02 = _cast(int, attrfixed02)
+        self.attrnormal01 = _cast(None, attrnormal01)
+        self.attrnormal02 = _cast(int, attrnormal02)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, FixedType2)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if FixedType2.subclass:
+            return FixedType2.subclass(*args_, **kwargs_)
+        else:
+            return FixedType2(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_attrfixed01(self): return self.attrfixed01
+    def set_attrfixed01(self, attrfixed01): self.attrfixed01 = attrfixed01
+    def get_attrfixed02(self): return self.attrfixed02
+    def set_attrfixed02(self, attrfixed02): self.attrfixed02 = attrfixed02
+    def get_attrnormal01(self): return self.attrnormal01
+    def set_attrnormal01(self, attrnormal01): self.attrnormal01 = attrnormal01
+    def get_attrnormal02(self): return self.attrnormal02
+    def set_attrnormal02(self, attrnormal02): self.attrnormal02 = attrnormal02
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespace_='', name_='FixedType2', namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('FixedType2')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, namespace_, name_='FixedType2')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespace_='', name_='FixedType2', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespace_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, namespace_='', name_='FixedType2'):
+        if self.attrfixed01 != "abcd" and 'attrfixed01' not in already_processed:
+            already_processed.add('attrfixed01')
+            outfile.write(' attrfixed01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrfixed01), input_name='attrfixed01')), ))
+        if self.attrfixed02 != 14 and 'attrfixed02' not in already_processed:
+            already_processed.add('attrfixed02')
+            outfile.write(' attrfixed02="%s"' % self.gds_format_integer(self.attrfixed02, input_name='attrfixed02'))
+        if self.attrnormal01 is not None and 'attrnormal01' not in already_processed:
+            already_processed.add('attrnormal01')
+            outfile.write(' attrnormal01=%s' % (self.gds_encode(self.gds_format_string(quote_attrib(self.attrnormal01), input_name='attrnormal01')), ))
+        if self.attrnormal02 is not None and 'attrnormal02' not in already_processed:
+            already_processed.add('attrnormal02')
+            outfile.write(' attrnormal02="%s"' % self.gds_format_integer(self.attrnormal02, input_name='attrnormal02'))
+    def exportChildren(self, outfile, level, namespace_='', name_='FixedType2', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('attrfixed01', node)
+        if value is not None and 'attrfixed01' not in already_processed:
+            already_processed.add('attrfixed01')
+            self.attrfixed01 = value
+        value = find_attr_value_('attrfixed02', node)
+        if value is not None and 'attrfixed02' not in already_processed:
+            already_processed.add('attrfixed02')
+            try:
+                self.attrfixed02 = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+        value = find_attr_value_('attrnormal01', node)
+        if value is not None and 'attrnormal01' not in already_processed:
+            already_processed.add('attrnormal01')
+            self.attrnormal01 = value
+        value = find_attr_value_('attrnormal02', node)
+        if value is not None and 'attrnormal02' not in already_processed:
+            already_processed.add('attrnormal02')
+            try:
+                self.attrnormal02 = int(value)
+            except ValueError as exp:
+                raise_parse_error(node, 'Bad integer attribute: %s' % exp)
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class FixedType2
+
+
 GDSClassesMapping = {
     'defaults': DefaultTypes,
 }
@@ -1249,5 +1581,7 @@ if __name__ == '__main__':
 __all__ = [
     "DefaultType1",
     "DefaultType2",
-    "DefaultTypes"
+    "DefaultTypes",
+    "FixedType1",
+    "FixedType2"
 ]
diff --git a/tests/ipo1_out.xml b/tests/ipo1_out.xml
index 44ae582..efb1667 100644
--- a/tests/ipo1_out.xml
+++ b/tests/ipo1_out.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" ?>
 <ipo:purchaseOrder xmlns:ipo="http://www.example.com/IPO" orderDate="1999-12-01">
-    <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress" exportCode="1">
+    <ipo:shipTo xmlns:ipo="http://www.example.com/IPO" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ipo:UKAddress">
         <ipo:name>Helen Zoe</ipo:name>
         <ipo:street>47 Eden Street</ipo:street>
         <ipo:city>Cambridge</ipo:city>
diff --git a/tests/ipo1_sub.py b/tests/ipo1_sub.py
index f5b8efc..edd498e 100644
--- a/tests/ipo1_sub.py
+++ b/tests/ipo1_sub.py
@@ -83,7 +83,7 @@ supermod.USAddress.subclass = USAddressSub
 
 
 class UKAddressSub(supermod.UKAddress):
-    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=1, postcode=None):
         super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, )
 supermod.UKAddress.subclass = UKAddressSub
 # end class UKAddressSub
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index 5299bd7..a212146 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -1379,7 +1379,7 @@ class UKAddress(Address):
     ]
     subclass = None
     superclass = Address
-    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=1, postcode=None):
         self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
         self.exportCode = _cast(int, exportCode)
@@ -1430,7 +1430,7 @@ class UKAddress(Address):
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'):
         super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
-        if self.exportCode is not None and 'exportCode' not in already_processed:
+        if self.exportCode != 1 and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode'))
     def exportChildren(self, outfile, level, namespace_='ipo:', name_='UKAddress', fromsubclass_=False, pretty_print=True):
diff --git a/tests/ipo2_sub.py b/tests/ipo2_sub.py
index f5b8efc..edd498e 100644
--- a/tests/ipo2_sub.py
+++ b/tests/ipo2_sub.py
@@ -83,7 +83,7 @@ supermod.USAddress.subclass = USAddressSub
 
 
 class UKAddressSub(supermod.UKAddress):
-    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=1, postcode=None):
         super(UKAddressSub, self).__init__(name, street, city, exportCode, postcode, )
 supermod.UKAddress.subclass = UKAddressSub
 # end class UKAddressSub
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index 5299bd7..a212146 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -1379,7 +1379,7 @@ class UKAddress(Address):
     ]
     subclass = None
     superclass = Address
-    def __init__(self, name=None, street=None, city=None, exportCode=None, postcode=None):
+    def __init__(self, name=None, street=None, city=None, exportCode=1, postcode=None):
         self.original_tagname_ = None
         super(UKAddress, self).__init__(name, street, city, )
         self.exportCode = _cast(int, exportCode)
@@ -1430,7 +1430,7 @@ class UKAddress(Address):
             outfile.write('/>%s' % (eol_, ))
     def exportAttributes(self, outfile, level, already_processed, namespace_='ipo:', name_='UKAddress'):
         super(UKAddress, self).exportAttributes(outfile, level, already_processed, namespace_, name_='UKAddress')
-        if self.exportCode is not None and 'exportCode' not in already_processed:
+        if self.exportCode != 1 and 'exportCode' not in already_processed:
             already_processed.add('exportCode')
             outfile.write(' exportCode="%s"' % self.gds_format_integer(self.exportCode, input_name='exportCode'))
     def exportChildren(self, outfile, level, namespace_='ipo:', name_='UKAddress', fromsubclass_=False, pretty_print=True):
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 6103b5a..acda940 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.29.7</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.8</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">February 05, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">March 02, 2018</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: 2018-02-05 22:01 UTC.
+Generated on: 2018-03-02 19:35 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 0601dee..dd46399 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.29.7
+:revision: 2.29.8
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 6af5372e5e0e6031da3fd616a99d1968c0f78bce..e3a54a1505c696f7798968ce6ccb75b3754e270e 100644
GIT binary patch
delta 10118
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

delta 10132
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
CU^2u2

-- 
GitLab