[Zope3-checkins] SVN: zope.testing/trunk/ zope.testing.renormalizer no longer imports zope.testing.doctest, which

Marius Gedminas marius at pov.lt
Thu Mar 25 12:05:55 EDT 2010


Log message for revision 110179:
  zope.testing.renormalizer no longer imports zope.testing.doctest, which
  caused deprecation warnings.
  
  

Changed:
  U   zope.testing/trunk/CHANGES.txt
  A   zope.testing/trunk/src/zope/testing/renormalizing/
  A   zope.testing/trunk/src/zope/testing/renormalizing/__init__.py
  D   zope.testing/trunk/src/zope/testing/renormalizing.py

-=-
Modified: zope.testing/trunk/CHANGES.txt
===================================================================
--- zope.testing/trunk/CHANGES.txt	2010-03-25 16:02:15 UTC (rev 110178)
+++ zope.testing/trunk/CHANGES.txt	2010-03-25 16:05:54 UTC (rev 110179)
@@ -4,6 +4,9 @@
 3.9.3 (unreleased)
 ==================
 
+- zope.testing.renormalizer no longer imports zope.testing.doctest, which
+  caused deprecation warnings.
+
 - Fix testrunner-layers-ntd.txt to suppress output to sys.stderr.
 
 

Copied: zope.testing/trunk/src/zope/testing/renormalizing/__init__.py (from rev 110176, zope.testing/trunk/src/zope/testing/renormalizing.py)
===================================================================
--- zope.testing/trunk/src/zope/testing/renormalizing/__init__.py	                        (rev 0)
+++ zope.testing/trunk/src/zope/testing/renormalizing/__init__.py	2010-03-25 16:05:54 UTC (rev 110179)
@@ -0,0 +1,316 @@
+##############################################################################
+#
+# Copyright (c) 2004 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+#
+# This file is a package rather than a module because we want
+#
+#     import doctest
+#
+# to import the stdlib version of doctest rather than the deprecated
+# zope.testing.doctest, and
+#
+#     from __future__ import absolute_import
+#
+# is not available on Python 2.4 which we still support.
+#
+##############################################################################
+r"""Regular expression pattern normalizing output checker
+
+The pattern-normalizing output checker extends the default output checker with
+an option to normalize expected and actual output.
+
+You specify a sequence of patterns and replacements.  The replacements are
+applied to the expected and actual outputs before calling the default outputs
+checker.  Let's look at an example.  In this example, we have some times and
+addresses:
+
+    >>> want = '''\
+    ... <object object at 0xb7f14438>
+    ... completed in 1.234 seconds.
+    ... <BLANKLINE>
+    ... <object object at 0xb7f14440>
+    ... completed in 123.234 seconds.
+    ... <BLANKLINE>
+    ... <object object at 0xb7f14448>
+    ... completed in .234 seconds.
+    ... <BLANKLINE>
+    ... <object object at 0xb7f14450>
+    ... completed in 1.234 seconds.
+    ... <BLANKLINE>
+    ... '''
+
+    >>> got = '''\
+    ... <object object at 0xb7f14458>
+    ... completed in 1.235 seconds.
+    ...
+    ... <object object at 0xb7f14460>
+    ... completed in 123.233 seconds.
+    ...
+    ... <object object at 0xb7f14468>
+    ... completed in .231 seconds.
+    ...
+    ... <object object at 0xb7f14470>
+    ... completed in 1.23 seconds.
+    ...
+    ... '''
+
+We may wish to consider these two strings to match, even though they differ in
+actual addresses and times.  The default output checker will consider them
+different:
+
+    >>> doctest.OutputChecker().check_output(want, got, 0)
+    False
+
+We'll use the RENormalizing to normalize both the wanted and gotten strings to
+ignore differences in times and addresses:
+
+    >>> import re
+    >>> checker = RENormalizing([
+    ...    (re.compile('[0-9]*[.][0-9]* seconds'), '<SOME NUMBER OF> seconds'),
+    ...    (re.compile('at 0x[0-9a-f]+'), 'at <SOME ADDRESS>'),
+    ...    ])
+
+    >>> checker.check_output(want, got, 0)
+    True
+
+Usual OutputChecker options work as expected:
+
+    >>> want_ellided = '''\
+    ... <object object at 0xb7f14438>
+    ... completed in 1.234 seconds.
+    ... ...
+    ... <object object at 0xb7f14450>
+    ... completed in 1.234 seconds.
+    ... <BLANKLINE>
+    ... '''
+
+    >>> checker.check_output(want_ellided, got, 0)
+    False
+
+    >>> checker.check_output(want_ellided, got, doctest.ELLIPSIS)
+    True
+
+When we get differencs, we output them with normalized text:
+
+    >>> source = '''\
+    ... >>> do_something()
+    ... <object object at 0xb7f14438>
+    ... completed in 1.234 seconds.
+    ... ...
+    ... <object object at 0xb7f14450>
+    ... completed in 1.234 seconds.
+    ... <BLANKLINE>
+    ... '''
+
+    >>> example = doctest.Example(source, want_ellided)
+
+    >>> print checker.output_difference(example, got, 0)
+    Expected:
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        ...
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        <BLANKLINE>
+    Got:
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        <BLANKLINE>
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        <BLANKLINE>
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        <BLANKLINE>
+        <object object at <SOME ADDRESS>>
+        completed in <SOME NUMBER OF> seconds.
+        <BLANKLINE>
+    <BLANKLINE>
+
+    >>> print checker.output_difference(example, got,
+    ...                                 doctest.REPORT_NDIFF)
+    Differences (ndiff with -expected +actual):
+        - <object object at <SOME ADDRESS>>
+        - completed in <SOME NUMBER OF> seconds.
+        - ...
+          <object object at <SOME ADDRESS>>
+          completed in <SOME NUMBER OF> seconds.
+          <BLANKLINE>
+        + <object object at <SOME ADDRESS>>
+        + completed in <SOME NUMBER OF> seconds.
+        + <BLANKLINE>
+        + <object object at <SOME ADDRESS>>
+        + completed in <SOME NUMBER OF> seconds.
+        + <BLANKLINE>
+        + <object object at <SOME ADDRESS>>
+        + completed in <SOME NUMBER OF> seconds.
+        + <BLANKLINE>
+    <BLANKLINE>
+
+    If the wanted text is empty, however, we don't transform the actual output.
+    This is usful when writing tests.  We leave the expected output empty, run
+    the test, and use the actual output as expected, after reviewing it.
+
+    >>> source = '''\
+    ... >>> do_something()
+    ... '''
+
+    >>> example = doctest.Example(source, '\n')
+    >>> print checker.output_difference(example, got, 0)
+    Expected:
+    <BLANKLINE>
+    Got:
+        <object object at 0xb7f14458>
+        completed in 1.235 seconds.
+        <BLANKLINE>
+        <object object at 0xb7f14460>
+        completed in 123.233 seconds.
+        <BLANKLINE>
+        <object object at 0xb7f14468>
+        completed in .231 seconds.
+        <BLANKLINE>
+        <object object at 0xb7f14470>
+        completed in 1.23 seconds.
+        <BLANKLINE>
+    <BLANKLINE>
+
+If regular expressions aren't expressive enough, you can use arbitrary Python
+callables to transform the text.  For example, suppose you want to ignore
+case during comparison:
+
+    >>> checker = RENormalizing([
+    ...    lambda s: s.lower(),
+    ...    lambda s: s.replace('<blankline>', '<BLANKLINE>'),
+    ...    ])
+
+    >>> want = '''\
+    ... Usage: thundermonkey [options] [url]
+    ... <BLANKLINE>
+    ... Options:
+    ...     -h    display this help message
+    ... '''
+
+    >>> got = '''\
+    ... usage: thundermonkey [options] [URL]
+    ...
+    ... options:
+    ...     -h    Display this help message
+    ... '''
+
+    >>> checker.check_output(want, got, 0)
+    True
+
+Suppose we forgot that <BLANKLINE> must be in upper case:
+
+    >>> checker = RENormalizing([
+    ...    lambda s: s.lower(),
+    ...    ])
+
+    >>> checker.check_output(want, got, 0)
+    False
+
+The difference would show us that:
+
+    >>> source = '''\
+    ... >>> print_help_message()
+    ... ''' + want
+    >>> example = doctest.Example(source, want)
+    >>> print checker.output_difference(example, got,
+    ...                                 doctest.REPORT_NDIFF),
+    Differences (ndiff with -expected +actual):
+          usage: thundermonkey [options] [url]
+        - <blankline>
+        + <BLANKLINE>
+          options:
+              -h    display this help message
+
+
+It is possible to combine RENormalizing checkers for easy reuse:
+
+    >>> address_and_time_checker = RENormalizing([
+    ...    (re.compile('[0-9]*[.][0-9]* seconds'), '<SOME NUMBER OF> seconds'),
+    ...    (re.compile('at 0x[0-9a-f]+'), 'at <SOME ADDRESS>'),
+    ...    ])
+    >>> lowercase_checker = RENormalizing([
+    ...    lambda s: s.lower(),
+    ...    ])
+    >>> combined_checker = address_and_time_checker + lowercase_checker
+    >>> len(combined_checker.transformers)
+    3
+
+Combining a checker with something else does not work:
+
+    >>> lowercase_checker + 5
+    Traceback (most recent call last):
+        ...
+    TypeError: unsupported operand type(s) for +: 'instance' and 'int'
+
+"""
+
+import doctest
+
+
+class RENormalizing(doctest.OutputChecker):
+    """Pattern-normalizing outout checker
+    """
+
+    def __init__(self, patterns):
+        self.transformers = map(self._cook, patterns)
+
+    def __add__(self, other):
+        if not isinstance(other, RENormalizing):
+            return NotImplemented
+        return RENormalizing(self.transformers + other.transformers)
+
+    def _cook(self, pattern):
+        if callable(pattern):
+            return pattern
+        regexp, replacement = pattern
+        return lambda text: regexp.sub(replacement, text)
+
+    def check_output(self, want, got, optionflags):
+        if got == want:
+            return True
+
+        for transformer in self.transformers:
+            want = transformer(want)
+            got = transformer(got)
+
+        return doctest.OutputChecker.check_output(self, want, got, optionflags)
+
+    def output_difference(self, example, got, optionflags):
+
+        want = example.want
+
+        # If want is empty, use original outputter. This is useful
+        # when setting up tests for the first time.  In that case, we
+        # generally use the differencer to display output, which we evaluate
+        # by hand.
+        if not want.strip():
+            return doctest.OutputChecker.output_difference(
+                self, example, got, optionflags)
+
+        # Dang, this isn't as easy to override as we might wish
+        original = want
+
+        for transformer in self.transformers:
+            want = transformer(want)
+            got = transformer(got)
+
+        # temporarily hack example with normalized want:
+        example.want = want
+        result = doctest.OutputChecker.output_difference(
+            self, example, got, optionflags)
+        example.want = original
+
+        return result

Deleted: zope.testing/trunk/src/zope/testing/renormalizing.py
===================================================================
--- zope.testing/trunk/src/zope/testing/renormalizing.py	2010-03-25 16:02:15 UTC (rev 110178)
+++ zope.testing/trunk/src/zope/testing/renormalizing.py	2010-03-25 16:05:54 UTC (rev 110179)
@@ -1,302 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-r"""Regular expression pattern normalizing output checker
-
-The pattern-normalizing output checker extends the default output checker with
-an option to normalize expected and actual output.
-
-You specify a sequence of patterns and replacements.  The replacements are
-applied to the expected and actual outputs before calling the default outputs
-checker.  Let's look at an example.  In this example, we have some times and
-addresses:
-
-    >>> want = '''\
-    ... <object object at 0xb7f14438>
-    ... completed in 1.234 seconds.
-    ... <BLANKLINE>
-    ... <object object at 0xb7f14440>
-    ... completed in 123.234 seconds.
-    ... <BLANKLINE>
-    ... <object object at 0xb7f14448>
-    ... completed in .234 seconds.
-    ... <BLANKLINE>
-    ... <object object at 0xb7f14450>
-    ... completed in 1.234 seconds.
-    ... <BLANKLINE>
-    ... '''
-
-    >>> got = '''\
-    ... <object object at 0xb7f14458>
-    ... completed in 1.235 seconds.
-    ...
-    ... <object object at 0xb7f14460>
-    ... completed in 123.233 seconds.
-    ...
-    ... <object object at 0xb7f14468>
-    ... completed in .231 seconds.
-    ...
-    ... <object object at 0xb7f14470>
-    ... completed in 1.23 seconds.
-    ...
-    ... '''
-
-We may wish to consider these two strings to match, even though they differ in
-actual addresses and times.  The default output checker will consider them
-different:
-
-    >>> doctest.OutputChecker().check_output(want, got, 0)
-    False
-
-We'll use the RENormalizing to normalize both the wanted and gotten strings to
-ignore differences in times and addresses:
-
-    >>> import re
-    >>> checker = RENormalizing([
-    ...    (re.compile('[0-9]*[.][0-9]* seconds'), '<SOME NUMBER OF> seconds'),
-    ...    (re.compile('at 0x[0-9a-f]+'), 'at <SOME ADDRESS>'),
-    ...    ])
-
-    >>> checker.check_output(want, got, 0)
-    True
-
-Usual OutputChecker options work as expected:
-
-    >>> want_ellided = '''\
-    ... <object object at 0xb7f14438>
-    ... completed in 1.234 seconds.
-    ... ...
-    ... <object object at 0xb7f14450>
-    ... completed in 1.234 seconds.
-    ... <BLANKLINE>
-    ... '''
-
-    >>> checker.check_output(want_ellided, got, 0)
-    False
-
-    >>> checker.check_output(want_ellided, got, doctest.ELLIPSIS)
-    True
-
-When we get differencs, we output them with normalized text:
-
-    >>> source = '''\
-    ... >>> do_something()
-    ... <object object at 0xb7f14438>
-    ... completed in 1.234 seconds.
-    ... ...
-    ... <object object at 0xb7f14450>
-    ... completed in 1.234 seconds.
-    ... <BLANKLINE>
-    ... '''
-
-    >>> example = doctest.Example(source, want_ellided)
-
-    >>> print checker.output_difference(example, got, 0)
-    Expected:
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        ...
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        <BLANKLINE>
-    Got:
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        <BLANKLINE>
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        <BLANKLINE>
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        <BLANKLINE>
-        <object object at <SOME ADDRESS>>
-        completed in <SOME NUMBER OF> seconds.
-        <BLANKLINE>
-    <BLANKLINE>
-
-    >>> print checker.output_difference(example, got,
-    ...                                 doctest.REPORT_NDIFF)
-    Differences (ndiff with -expected +actual):
-        - <object object at <SOME ADDRESS>>
-        - completed in <SOME NUMBER OF> seconds.
-        - ...
-          <object object at <SOME ADDRESS>>
-          completed in <SOME NUMBER OF> seconds.
-          <BLANKLINE>
-        + <object object at <SOME ADDRESS>>
-        + completed in <SOME NUMBER OF> seconds.
-        + <BLANKLINE>
-        + <object object at <SOME ADDRESS>>
-        + completed in <SOME NUMBER OF> seconds.
-        + <BLANKLINE>
-        + <object object at <SOME ADDRESS>>
-        + completed in <SOME NUMBER OF> seconds.
-        + <BLANKLINE>
-    <BLANKLINE>
-
-    If the wanted text is empty, however, we don't transform the actual output.
-    This is usful when writing tests.  We leave the expected output empty, run
-    the test, and use the actual output as expected, after reviewing it.
-
-    >>> source = '''\
-    ... >>> do_something()
-    ... '''
-
-    >>> example = doctest.Example(source, '\n')
-    >>> print checker.output_difference(example, got, 0)
-    Expected:
-    <BLANKLINE>
-    Got:
-        <object object at 0xb7f14458>
-        completed in 1.235 seconds.
-        <BLANKLINE>
-        <object object at 0xb7f14460>
-        completed in 123.233 seconds.
-        <BLANKLINE>
-        <object object at 0xb7f14468>
-        completed in .231 seconds.
-        <BLANKLINE>
-        <object object at 0xb7f14470>
-        completed in 1.23 seconds.
-        <BLANKLINE>
-    <BLANKLINE>
-
-If regular expressions aren't expressive enough, you can use arbitrary Python
-callables to transform the text.  For example, suppose you want to ignore
-case during comparison:
-
-    >>> checker = RENormalizing([
-    ...    lambda s: s.lower(),
-    ...    lambda s: s.replace('<blankline>', '<BLANKLINE>'),
-    ...    ])
-
-    >>> want = '''\
-    ... Usage: thundermonkey [options] [url]
-    ... <BLANKLINE>
-    ... Options:
-    ...     -h    display this help message
-    ... '''
-
-    >>> got = '''\
-    ... usage: thundermonkey [options] [URL]
-    ...
-    ... options:
-    ...     -h    Display this help message
-    ... '''
-
-    >>> checker.check_output(want, got, 0)
-    True
-
-Suppose we forgot that <BLANKLINE> must be in upper case:
-
-    >>> checker = RENormalizing([
-    ...    lambda s: s.lower(),
-    ...    ])
-
-    >>> checker.check_output(want, got, 0)
-    False
-
-The difference would show us that:
-
-    >>> source = '''\
-    ... >>> print_help_message()
-    ... ''' + want
-    >>> example = doctest.Example(source, want)
-    >>> print checker.output_difference(example, got,
-    ...                                 doctest.REPORT_NDIFF),
-    Differences (ndiff with -expected +actual):
-          usage: thundermonkey [options] [url]
-        - <blankline>
-        + <BLANKLINE>
-          options:
-              -h    display this help message
-
-
-It is possible to combine RENormalizing checkers for easy reuse:
-
-    >>> address_and_time_checker = RENormalizing([
-    ...    (re.compile('[0-9]*[.][0-9]* seconds'), '<SOME NUMBER OF> seconds'),
-    ...    (re.compile('at 0x[0-9a-f]+'), 'at <SOME ADDRESS>'),
-    ...    ])
-    >>> lowercase_checker = RENormalizing([
-    ...    lambda s: s.lower(),
-    ...    ])
-    >>> combined_checker = address_and_time_checker + lowercase_checker
-    >>> len(combined_checker.transformers)
-    3
-
-Combining a checker with something else does not work:
-
-    >>> lowercase_checker + 5
-    Traceback (most recent call last):
-        ...
-    TypeError: unsupported operand type(s) for +: 'instance' and 'int'
-
-"""
-
-import doctest
-
-class RENormalizing(doctest.OutputChecker):
-    """Pattern-normalizing outout checker
-    """
-
-    def __init__(self, patterns):
-        self.transformers = map(self._cook, patterns)
-
-    def __add__(self, other):
-        if not isinstance(other, RENormalizing):
-            return NotImplemented
-        return RENormalizing(self.transformers + other.transformers)
-
-    def _cook(self, pattern):
-        if callable(pattern):
-            return pattern
-        regexp, replacement = pattern
-        return lambda text: regexp.sub(replacement, text)
-
-    def check_output(self, want, got, optionflags):
-        if got == want:
-            return True
-
-        for transformer in self.transformers:
-            want = transformer(want)
-            got = transformer(got)
-
-        return doctest.OutputChecker.check_output(self, want, got, optionflags)
-
-    def output_difference(self, example, got, optionflags):
-
-        want = example.want
-
-        # If want is empty, use original outputter. This is useful
-        # when setting up tests for the first time.  In that case, we
-        # generally use the differencer to display output, which we evaluate
-        # by hand.
-        if not want.strip():
-            return doctest.OutputChecker.output_difference(
-                self, example, got, optionflags)
-
-        # Dang, this isn't as easy to override as we might wish
-        original = want
-
-        for transformer in self.transformers:
-            want = transformer(want)
-            got = transformer(got)
-
-        # temporarily hack example with normalized want:
-        example.want = want
-        result = doctest.OutputChecker.output_difference(
-            self, example, got, optionflags)
-        example.want = original
-
-        return result



More information about the Zope3-Checkins mailing list