From d73539b74e8e02aea0099b149bbe6071726cac99 Mon Sep 17 00:00:00 2001
From: Dave Kuhlman <dkuhlman@davekuhlman.org>
Date: Thu, 2 Aug 2018 12:53:00 -0700
Subject: [PATCH] v. 2.29.21  Fix (cleanupName) for simpleType name

---
 README.rst                               |   6 +++
 generateDS.html                          |   6 +--
 generateDS.py                            |  13 ++---
 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/OnePer/oneperType00_2One.py        |   4 +-
 tests/OnePer/oneperType01_2One.py        |   4 +-
 tests/OnePer/oneperType02_2One.py        |   4 +-
 tests/OnePer/oneperType03_2One.py        |   4 +-
 tests/abstract_type1_sup.py              |   4 +-
 tests/annotations1_sup.py                |   4 +-
 tests/anonymous_type1_sup.py             |   4 +-
 tests/anysimpletype1_sup.py              |   4 +-
 tests/anywildcard1_sup.py                |   4 +-
 tests/attr_groups1_sup.py                |   4 +-
 tests/catalogtest1_sup.py                |   4 +-
 tests/cdata1_sup.py                      |   4 +-
 tests/cleanupname1_sup.py                |   4 +-
 tests/defaults_cases1_sup.py             |   4 +-
 tests/defaults_cases_always1_sup.py      |   4 +-
 tests/defaults_cases_always2_sup.py      |   4 +-
 tests/defaults_coverage1_sup.py          |   4 +-
 tests/disable_xml_super1_sup.py          |   4 +-
 tests/extensions1_sup.py                 |   4 +-
 tests/ipo1_sup.py                        |   4 +-
 tests/ipo2_sup.py                        |   4 +-
 tests/mapcleanname1_sup.py               |   4 +-
 tests/mixedcontent1_sup.py               |   4 +-
 tests/mixedcontent2_sup.py               |   4 +-
 tests/nested_def1_sup.py                 |   4 +-
 tests/no_namespace_defs1_sup.py          |   4 +-
 tests/out1_sup.py                        |   4 +-
 tests/people_procincl1_sup.py            |   4 +-
 tests/prefix_classname1_sup.py           |   4 +-
 tests/recursive_simpletype1_sup.py       |   4 +-
 tests/reference_simpletype1_sup.py       |   4 +-
 tests/rem_dup_elems1_sup.py              |   4 +-
 tests/simplecontent_restriction1_sup.py  |   4 +-
 tests/simpletype_memberspecs1_sup.py     |   4 +-
 tests/simpletypes_other1_sup.py          |   4 +-
 tests/to_etree1_sup.py                   |   4 +-
 tests/validate_simpletypes1_sup.py       |   4 +-
 tests/validate_simpletypes1_warnings.txt |  62 +++++++++++------------
 tests/validate_simpletypes2_sup.py       |   4 +-
 tutorial/generateds_tutorial.html        |   6 +--
 tutorial/generateds_tutorial.txt         |   2 +-
 tutorial/generateds_tutorial.zip         | Bin 48767 -> 48771 bytes
 53 files changed, 139 insertions(+), 132 deletions(-)

diff --git a/README.rst b/README.rst
index c5b7fba..011c8ca 100644
--- a/README.rst
+++ b/README.rst
@@ -141,6 +141,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 Change history
 --------------
 
+Version 2.29.21 (08/02/2018)
+
+- Fix to use of simpleType name.  Needed to do cleanupName() on the
+  class name.  Thanks to Daniel Ramirez for reporting this and for
+  suggesting a fix.
+
 Version 2.29.20 (07/30/2018)
 
 - Fix to generation of regular expression used to validate a
diff --git a/generateDS.html b/generateDS.html
index 1505945..10d8979 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.20</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.21</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">July 30, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">August 02, 2018</td>
 </tr>
 </tbody>
 </table>
@@ -3392,7 +3392,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-07-30 20:37 UTC.
+Generated on: 2018-08-02 19:16 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 bbb2f85..82e17ba 100755
--- a/generateDS.py
+++ b/generateDS.py
@@ -227,7 +227,7 @@ _log = logging.getLogger(__name__)
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-VERSION = '2.29.20'
+VERSION = '2.29.21'
 ##VERSION##
 
 BaseStrTypes = six.string_types
@@ -5678,8 +5678,8 @@ class GeneratedsSuper(object):
         for patterns1 in patterns:
             found2 = False
             for patterns2 in patterns1:
-                mo = re_.fullmatch(patterns2, target)
-                if mo is not None:
+                mo = re_.search(patterns2, target)
+                if mo is not None and len(mo.group(0)) == len(target):
                     found2 = True
                     break
             if not found2:
@@ -6712,16 +6712,17 @@ def generateSimpleTypes(wrt, prefix, simpleTypeDict):
 
     def writeEnumClass(simpleType):
         enumValues = simpleType.getEnumValues()
+        simpleTypeName = cleanupName(simpleType.getName())
         if enumValues:
             output = ""
             try:
-                validateIdentifier(simpleType.getName())
+                validateIdentifier(simpleTypeName)
             except ValueError:
                 err_msg(
                     '*** The Simple Type name "%s" is not a valid '
-                    'Python identifier\n' % simpleType.getName())
+                    'Python identifier\n' % simpleTypeName)
                 return
-            output += 'class %s(object):\n' % simpleType.getName()
+            output += 'class %s(object):\n' % simpleTypeName
             for enumValue in enumValues:
                 try:
                     validatedEnumValue = validateIdentifier(enumValue)
diff --git a/generateDS.txt b/generateDS.txt
index b9c038f..31b509b 100644
--- a/generateDS.txt
+++ b/generateDS.txt
@@ -12,7 +12,7 @@ generateDS -- Generate Data Structures from XML Schema
 
 .. version
 
-:revision: 2.29.20
+:revision: 2.29.21
 
 .. version
 
diff --git a/generateds_gui_notes.html b/generateds_gui_notes.html
index 6e42bda..ca7a70a 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.20</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.21</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">July 30, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">August 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-07-30 20:37 UTC.
+Generated on: 2018-08-02 19:16 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 1a74e19..bc75f78 100644
--- a/generateds_gui_notes.txt
+++ b/generateds_gui_notes.txt
@@ -12,7 +12,7 @@ GenerateDS GUI Notes
 
 .. version
 
-:revision: 2.29.20
+:revision: 2.29.21
 
 .. version
 
diff --git a/gui/generateds_gui.py b/gui/generateds_gui.py
index add27ec..540354f 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.20'
+VERSION = '2.29.21'
 ##VERSION##
 
 
diff --git a/librarytemplate_howto.html b/librarytemplate_howto.html
index 3550810..ce9fca7 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.20</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.21</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">July 30, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">August 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-07-30 20:37 UTC.
+Generated on: 2018-08-02 19:16 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 9a2f647..9dbd798 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.20
+:revision: 2.29.21
 
 .. version
 
diff --git a/process_includes.py b/process_includes.py
index d0399f8..69553f2 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.20'
+VERSION = '2.29.21'
 ##VERSION##
 
 CatalogDict = {}
diff --git a/setup.py b/setup.py
index 3a7f874..b21d86c 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ setup(
 # Do not modify the following VERSION comments.
 # Used by updateversion.py.
 ##VERSION##
-    version="2.29.20",
+    version="2.29.21",
 ##VERSION##
     author="Dave Kuhlman",
     author_email="dkuhlman@davekuhlman.org",
diff --git a/tests/OnePer/oneperType00_2One.py b/tests/OnePer/oneperType00_2One.py
index 4c010be..4f2b00c 100644
--- a/tests/OnePer/oneperType00_2One.py
+++ b/tests/OnePer/oneperType00_2One.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/OnePer/oneperType01_2One.py b/tests/OnePer/oneperType01_2One.py
index 3301c1d..88d1791 100644
--- a/tests/OnePer/oneperType01_2One.py
+++ b/tests/OnePer/oneperType01_2One.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/OnePer/oneperType02_2One.py b/tests/OnePer/oneperType02_2One.py
index 60b276e..7eb4aef 100644
--- a/tests/OnePer/oneperType02_2One.py
+++ b/tests/OnePer/oneperType02_2One.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/OnePer/oneperType03_2One.py b/tests/OnePer/oneperType03_2One.py
index 742b519..dbf59e3 100644
--- a/tests/OnePer/oneperType03_2One.py
+++ b/tests/OnePer/oneperType03_2One.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/abstract_type1_sup.py b/tests/abstract_type1_sup.py
index 8c96e30..b6b7b47 100644
--- a/tests/abstract_type1_sup.py
+++ b/tests/abstract_type1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/annotations1_sup.py b/tests/annotations1_sup.py
index bc42f0d..bd590ce 100644
--- a/tests/annotations1_sup.py
+++ b/tests/annotations1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/anonymous_type1_sup.py b/tests/anonymous_type1_sup.py
index d0b56a3..79335bf 100644
--- a/tests/anonymous_type1_sup.py
+++ b/tests/anonymous_type1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/anysimpletype1_sup.py b/tests/anysimpletype1_sup.py
index 6698b2f..2e1ec8e 100644
--- a/tests/anysimpletype1_sup.py
+++ b/tests/anysimpletype1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/anywildcard1_sup.py b/tests/anywildcard1_sup.py
index 5ab725f..f8186dd 100644
--- a/tests/anywildcard1_sup.py
+++ b/tests/anywildcard1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/attr_groups1_sup.py b/tests/attr_groups1_sup.py
index 11d019d..fe40940 100644
--- a/tests/attr_groups1_sup.py
+++ b/tests/attr_groups1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/catalogtest1_sup.py b/tests/catalogtest1_sup.py
index 59bdd56..34a7b0b 100644
--- a/tests/catalogtest1_sup.py
+++ b/tests/catalogtest1_sup.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/cdata1_sup.py b/tests/cdata1_sup.py
index 1caf58a..8df3046 100644
--- a/tests/cdata1_sup.py
+++ b/tests/cdata1_sup.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/cleanupname1_sup.py b/tests/cleanupname1_sup.py
index 530e5a7..16bac1b 100644
--- a/tests/cleanupname1_sup.py
+++ b/tests/cleanupname1_sup.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/defaults_cases1_sup.py b/tests/defaults_cases1_sup.py
index 47a6a4c..3209180 100644
--- a/tests/defaults_cases1_sup.py
+++ b/tests/defaults_cases1_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/defaults_cases_always1_sup.py b/tests/defaults_cases_always1_sup.py
index 003444d..c4a28c0 100644
--- a/tests/defaults_cases_always1_sup.py
+++ b/tests/defaults_cases_always1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/defaults_cases_always2_sup.py b/tests/defaults_cases_always2_sup.py
index 003444d..c4a28c0 100644
--- a/tests/defaults_cases_always2_sup.py
+++ b/tests/defaults_cases_always2_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/defaults_coverage1_sup.py b/tests/defaults_coverage1_sup.py
index fcb9a31..052c02a 100644
--- a/tests/defaults_coverage1_sup.py
+++ b/tests/defaults_coverage1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/disable_xml_super1_sup.py b/tests/disable_xml_super1_sup.py
index a24cf28..72e0e94 100644
--- a/tests/disable_xml_super1_sup.py
+++ b/tests/disable_xml_super1_sup.py
@@ -341,8 +341,8 @@ class GeneratedsSuper(object):
         for patterns1 in patterns:
             found2 = False
             for patterns2 in patterns1:
-                mo = re_.fullmatch(patterns2, target)
-                if mo is not None:
+                mo = re_.search(patterns2, target)
+                if mo is not None and len(mo.group(0)) == len(target):
                     found2 = True
                     break
             if not found2:
diff --git a/tests/extensions1_sup.py b/tests/extensions1_sup.py
index be117d5..46d4e74 100644
--- a/tests/extensions1_sup.py
+++ b/tests/extensions1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/ipo1_sup.py b/tests/ipo1_sup.py
index 308abf8..82cd1f9 100644
--- a/tests/ipo1_sup.py
+++ b/tests/ipo1_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/ipo2_sup.py b/tests/ipo2_sup.py
index 308abf8..82cd1f9 100644
--- a/tests/ipo2_sup.py
+++ b/tests/ipo2_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/mapcleanname1_sup.py b/tests/mapcleanname1_sup.py
index 8f1e0a0..2c6b831 100644
--- a/tests/mapcleanname1_sup.py
+++ b/tests/mapcleanname1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/mixedcontent1_sup.py b/tests/mixedcontent1_sup.py
index deec386..4c311da 100644
--- a/tests/mixedcontent1_sup.py
+++ b/tests/mixedcontent1_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/mixedcontent2_sup.py b/tests/mixedcontent2_sup.py
index deec386..4c311da 100644
--- a/tests/mixedcontent2_sup.py
+++ b/tests/mixedcontent2_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/nested_def1_sup.py b/tests/nested_def1_sup.py
index f25ebd7..af0b3d9 100644
--- a/tests/nested_def1_sup.py
+++ b/tests/nested_def1_sup.py
@@ -340,8 +340,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/no_namespace_defs1_sup.py b/tests/no_namespace_defs1_sup.py
index 5a9b44d..001afd8 100644
--- a/tests/no_namespace_defs1_sup.py
+++ b/tests/no_namespace_defs1_sup.py
@@ -341,8 +341,8 @@ class GeneratedsSuper(object):
         for patterns1 in patterns:
             found2 = False
             for patterns2 in patterns1:
-                mo = re_.fullmatch(patterns2, target)
-                if mo is not None:
+                mo = re_.search(patterns2, target)
+                if mo is not None and len(mo.group(0)) == len(target):
                     found2 = True
                     break
             if not found2:
diff --git a/tests/out1_sup.py b/tests/out1_sup.py
index 36bc1ad..93c8498 100644
--- a/tests/out1_sup.py
+++ b/tests/out1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/people_procincl1_sup.py b/tests/people_procincl1_sup.py
index d4682eb..11849ef 100644
--- a/tests/people_procincl1_sup.py
+++ b/tests/people_procincl1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/prefix_classname1_sup.py b/tests/prefix_classname1_sup.py
index 10ad9f5..7d3c39a 100644
--- a/tests/prefix_classname1_sup.py
+++ b/tests/prefix_classname1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/recursive_simpletype1_sup.py b/tests/recursive_simpletype1_sup.py
index d5fe186..ad25d51 100644
--- a/tests/recursive_simpletype1_sup.py
+++ b/tests/recursive_simpletype1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/reference_simpletype1_sup.py b/tests/reference_simpletype1_sup.py
index 53f1fe3..a65f200 100644
--- a/tests/reference_simpletype1_sup.py
+++ b/tests/reference_simpletype1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/rem_dup_elems1_sup.py b/tests/rem_dup_elems1_sup.py
index b8c779d..8945e59 100644
--- a/tests/rem_dup_elems1_sup.py
+++ b/tests/rem_dup_elems1_sup.py
@@ -342,8 +342,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/simplecontent_restriction1_sup.py b/tests/simplecontent_restriction1_sup.py
index b5a0111..895aa6e 100644
--- a/tests/simplecontent_restriction1_sup.py
+++ b/tests/simplecontent_restriction1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/simpletype_memberspecs1_sup.py b/tests/simpletype_memberspecs1_sup.py
index 74a42d9..b1d7ed3 100644
--- a/tests/simpletype_memberspecs1_sup.py
+++ b/tests/simpletype_memberspecs1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/simpletypes_other1_sup.py b/tests/simpletypes_other1_sup.py
index ecbe57b..2e3d062 100644
--- a/tests/simpletypes_other1_sup.py
+++ b/tests/simpletypes_other1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/to_etree1_sup.py b/tests/to_etree1_sup.py
index a91dacb..d360208 100644
--- a/tests/to_etree1_sup.py
+++ b/tests/to_etree1_sup.py
@@ -343,8 +343,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/validate_simpletypes1_sup.py b/tests/validate_simpletypes1_sup.py
index b7d1d4f..772c0fd 100644
--- a/tests/validate_simpletypes1_sup.py
+++ b/tests/validate_simpletypes1_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tests/validate_simpletypes1_warnings.txt b/tests/validate_simpletypes1_warnings.txt
index af03491..503ad4e 100644
--- a/tests/validate_simpletypes1_warnings.txt
+++ b/tests/validate_simpletypes1_warnings.txt
@@ -1,62 +1,62 @@
-tests/validate_simpletypes2_sup.py:1077: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:1078: UserWarning: Value "2" does not match xsd minExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1087: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1088: UserWarning: Value "mmaaa1234mnopzzz" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1100: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
+tests/validate_simpletypes2_sup.py:1101: UserWarning: Value "floatxx" does not match xsd enumeration restriction on token_enum_st
   warnings_.warn('Value "%(value)s" does not match xsd enumeration restriction on token_enum_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1107: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1108: UserWarning: Value "22" does not match xsd maxInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1112: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
+tests/validate_simpletypes2_sup.py:1113: UserWarning: Value "-40" does not match xsd minExclusive restriction on integer_range_excl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on integer_range_excl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1121: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1122: UserWarning: Value "mno pqr" does not match xsd minLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1126: UserWarning: Value "012345" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1127: UserWarning: Value "012345" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1210: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1211: UserWarning: Value "0.2" does not match xsd minInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1197: UserWarning: Value "efgh" does not match xsd pattern restrictions: [[u'^abcd|ef\\|gh$']]
+tests/validate_simpletypes2_sup.py:1198: UserWarning: Value "efgh" does not match xsd pattern restrictions: [[u'^abcd|ef\\|gh$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_vbar_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1204: UserWarning: Value "efÄŸh" does not match xsd pattern restrictions: [[u'^ab\xe7d|ef\\|gh$']]
+tests/validate_simpletypes2_sup.py:1205: UserWarning: Value "efÄŸh" does not match xsd pattern restrictions: [[u'^ab\xe7d|ef\\|gh$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_unicode_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1079: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
+tests/validate_simpletypes2_sup.py:1080: UserWarning: Value "9" does not match xsd maxExclusive restriction on integer_range_1_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on integer_range_1_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1087: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1088: UserWarning: Value "aaa1234mnopzzzbcd" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1105: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
+tests/validate_simpletypes2_sup.py:1106: UserWarning: Value "-50" does not match xsd minInclusive restriction on integer_range_incl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on integer_range_incl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1119: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
+tests/validate_simpletypes2_sup.py:1120: UserWarning: Value "asdf asdf asdf asdf asdf asdf" does not match xsd maxLength restriction on min_max_length_st
   warnings_.warn('Value "%(value)s" does not match xsd maxLength restriction on min_max_length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1126: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
+tests/validate_simpletypes2_sup.py:1127: UserWarning: Value "01234567890" does not match xsd length restriction on length_st
   warnings_.warn('Value "%(value)s" does not match xsd length restriction on length_st' % {"value" : value.encode("utf-8")} )
-tests/validate_simpletypes2_sup.py:1136: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
+tests/validate_simpletypes2_sup.py:1137: UserWarning: Value "2015-05-01" does not match xsd minInclusive restriction on date_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on date_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1141: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
+tests/validate_simpletypes2_sup.py:1142: UserWarning: Value "2015-11-01" does not match xsd maxInclusive restriction on date_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on date_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1146: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
+tests/validate_simpletypes2_sup.py:1147: UserWarning: Value "2015-05-01" does not match xsd minExclusive restriction on date_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on date_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1151: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
+tests/validate_simpletypes2_sup.py:1152: UserWarning: Value "2015-11-01" does not match xsd maxExclusive restriction on date_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on date_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1156: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
+tests/validate_simpletypes2_sup.py:1157: UserWarning: Value "13:30:00" does not match xsd minInclusive restriction on time_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on time_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1161: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
+tests/validate_simpletypes2_sup.py:1162: UserWarning: Value "17:00:00" does not match xsd maxInclusive restriction on time_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on time_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1166: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
+tests/validate_simpletypes2_sup.py:1167: UserWarning: Value "13:30:00" does not match xsd minExclusive restriction on time_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on time_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1171: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
+tests/validate_simpletypes2_sup.py:1172: UserWarning: Value "17:00:00" does not match xsd maxExclusive restriction on time_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on time_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1176: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
+tests/validate_simpletypes2_sup.py:1177: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minInclusive restriction on datetime_minincl_st
   warnings_.warn('Value "%(value)s" does not match xsd minInclusive restriction on datetime_minincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1181: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
+tests/validate_simpletypes2_sup.py:1182: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxInclusive restriction on datetime_maxincl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on datetime_maxincl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1186: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
+tests/validate_simpletypes2_sup.py:1187: UserWarning: Value "2015-06-01 13:20:10" does not match xsd minExclusive restriction on datetime_minexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd minExclusive restriction on datetime_minexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1191: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
+tests/validate_simpletypes2_sup.py:1192: UserWarning: Value "2015-11-01 14:20:10" does not match xsd maxExclusive restriction on datetime_maxexcl_st
   warnings_.warn('Value "%(value)s" does not match xsd maxExclusive restriction on datetime_maxexcl_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1212: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
+tests/validate_simpletypes2_sup.py:1213: UserWarning: Value "6.6" does not match xsd maxInclusive restriction on anonymous_float_valueType
   warnings_.warn('Value "%(value)s" does not match xsd maxInclusive restriction on anonymous_float_valueType' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1084: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
+tests/validate_simpletypes2_sup.py:1085: UserWarning: Value "aaa12zzz" does not match xsd minLength restriction on pattern_st
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on pattern_st' % {"value" : value} )
-tests/validate_simpletypes2_sup.py:1087: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
+tests/validate_simpletypes2_sup.py:1088: UserWarning: Value "aaa12zzz" does not match xsd pattern restrictions: [[u'^aaa.*zzz$', u'^bbb.*xxx$'], [u'^.*123.*$', u'^.*456.*$']]
   warnings_.warn('Value "%s" does not match xsd pattern restrictions: %s' % (value.encode('utf-8'), self.validate_pattern_st_patterns_, ))
-tests/validate_simpletypes2_sup.py:1646: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
+tests/validate_simpletypes2_sup.py:1647: UserWarning: Value "pqrst" does not match xsd minLength restriction on simpleTwoElementTwoType
   warnings_.warn('Value "%(value)s" does not match xsd minLength restriction on simpleTwoElementTwoType' % {"value" : value.encode("utf-8")} )
diff --git a/tests/validate_simpletypes2_sup.py b/tests/validate_simpletypes2_sup.py
index b7d1d4f..772c0fd 100644
--- a/tests/validate_simpletypes2_sup.py
+++ b/tests/validate_simpletypes2_sup.py
@@ -341,8 +341,8 @@ except ImportError as exp:
             for patterns1 in patterns:
                 found2 = False
                 for patterns2 in patterns1:
-                    mo = re_.fullmatch(patterns2, target)
-                    if mo is not None:
+                    mo = re_.search(patterns2, target)
+                    if mo is not None and len(mo.group(0)) == len(target):
                         found2 = True
                         break
                 if not found2:
diff --git a/tutorial/generateds_tutorial.html b/tutorial/generateds_tutorial.html
index 2cd30e8..764131b 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.20</td>
+<tr class="field"><th class="field-name">revision:</th><td class="field-body">2.29.21</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">July 30, 2018</td>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">August 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-07-30 20:37 UTC.
+Generated on: 2018-08-02 19:16 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 a535966..afcdc58 100644
--- a/tutorial/generateds_tutorial.txt
+++ b/tutorial/generateds_tutorial.txt
@@ -11,7 +11,7 @@ generateDS -- Introduction and Tutorial
 
 .. version
 
-:revision: 2.29.20
+:revision: 2.29.21
 
 .. version
 
diff --git a/tutorial/generateds_tutorial.zip b/tutorial/generateds_tutorial.zip
index 5a697437cc0705a4362989649684a1c95e92f388..09e63c6174e36f71d071efe8e4c174fb9cc5c5e1 100644
GIT binary patch
delta 12948
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
K24=Yc0002uGg2l1

delta 12882
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

-- 
GitLab