Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-zope.testing for 
openSUSE:Factory checked in at 2021-10-08 22:04:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zope.testing (Old)
 and      /work/SRC/openSUSE:Factory/.python-zope.testing.new.2443 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-zope.testing"

Fri Oct  8 22:04:49 2021 rev:11 rq:923212 version:4.9

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-zope.testing/python-zope.testing.changes  
2019-11-04 17:09:34.400464127 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-zope.testing.new.2443/python-zope.testing.changes
        2021-10-08 22:05:09.172570451 +0200
@@ -1,0 +2,19 @@
+Tue Oct  5 09:48:25 UTC 2021 - [email protected]
+
+- version update to 4.9
+  4.9 (2021-01-08)
+  ----------------
+  - Make ``setupstack.txt`` test work again if the current directory is empty.
+  4.8 (2021-01-04)
+  ----------------
+  - Add support for Python 3.8 and 3.9.
+  - Drop support for Python 3.3 and 3.4.
+  - Extend IGNORE_EXCEPTION_MODULE_IN_PYTHON2 to cover also exceptions without
+    arguments (thus without a colon on the last line of the traceback output).
+
+-------------------------------------------------------------------
+Tue Oct  5 09:42:28 UTC 2021 - [email protected]
+
+- %check: use %pyunittest rpm macro
+
+-------------------------------------------------------------------

Old:
----
  zope.testing-4.7.tar.gz

New:
----
  zope.testing-4.9.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-zope.testing.spec ++++++
--- /var/tmp/diff_new_pack.CoyiOE/_old  2021-10-08 22:05:09.696571313 +0200
+++ /var/tmp/diff_new_pack.CoyiOE/_new  2021-10-08 22:05:09.700571319 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-zope.testing
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-zope.testing
-Version:        4.7
+Version:        4.9
 Release:        0
 Summary:        Zope testing helpers
 License:        ZPL-2.1
@@ -92,7 +92,8 @@
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-%python_exec setup.py test
+pushd build/lib
+%pyunittest -v zope.testing.tests.test_suite
 
 %files %{python_files}
 %license LICENSE.txt

++++++ zope.testing-4.7.tar.gz -> zope.testing-4.9.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/.gitignore 
new/zope.testing-4.9/.gitignore
--- old/zope.testing-4.7/.gitignore     2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/.gitignore     1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-*.pyc
-__pycache__
-.installed.cfg
-bin
-eggs
-develop-eggs
-build
-docs/_build
-parts
-*.egg-info
-.tox
-.coverage
-nosetests.xml
-coverage.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/.travis.yml 
new/zope.testing-4.9/.travis.yml
--- old/zope.testing-4.7/.travis.yml    2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/.travis.yml    1970-01-01 01:00:00.000000000 +0100
@@ -1,21 +0,0 @@
-language: python
-sudo: false
-python:
-    - 2.7
-    - 3.3
-    - 3.4
-    - 3.5
-    - 3.6
-    - pypy
-    - pypy3
-matrix:
-    include:
-        - python: "3.7"
-          dist: xenial
-          sudo: true
-install:
-    - pip install -e .[test]
-script:
-    - python setup.py -q test -q
-notifications:
-    email: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/CHANGES.rst 
new/zope.testing-4.9/CHANGES.rst
--- old/zope.testing-4.7/CHANGES.rst    2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/CHANGES.rst    2021-01-08 08:04:50.000000000 +0100
@@ -1,6 +1,23 @@
 Changes
 =======
 
+4.9 (2021-01-08)
+----------------
+
+- Make ``setupstack.txt`` test work again if the current directory is empty.
+
+
+4.8 (2021-01-04)
+----------------
+
+- Add support for Python 3.8 and 3.9.
+
+- Drop support for Python 3.3 and 3.4.
+
+- Extend IGNORE_EXCEPTION_MODULE_IN_PYTHON2 to cover also exceptions without
+  arguments (thus without a colon on the last line of the traceback output).
+
+
 4.7 (2018-10-04)
 ----------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/MANIFEST.in 
new/zope.testing-4.9/MANIFEST.in
--- old/zope.testing-4.7/MANIFEST.in    2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/MANIFEST.in    2021-01-08 08:04:50.000000000 +0100
@@ -1,9 +1,13 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
 include *.rst
 include *.txt
-include bootstrap.py
 include buildout.cfg
 include tox.ini
+include appveyor.yml
 
-exclude appveyor.yml
-
-recursive-include src *.py *.txt
+recursive-include src *.pt
+recursive-include src *.py
+recursive-include src *.rst
+recursive-include src *.txt
+recursive-include src *.zcml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/PKG-INFO 
new/zope.testing-4.9/PKG-INFO
--- old/zope.testing-4.7/PKG-INFO       2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/PKG-INFO       2021-01-08 08:04:51.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zope.testing
-Version: 4.7
+Version: 4.9
 Summary: Zope testing helpers
 Home-page: https://github.com/zopefoundation/zope.testing
 Author: Zope Foundation and Contributors
@@ -14,8 +14,8 @@
             :target: https://pypi.python.org/pypi/zope.testing/
             :alt: Latest Version
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zope.testing.svg?branch=master
-                :target: https://travis-ci.org/zopefoundation/zope.testing
+        .. image:: 
https://travis-ci.com/zopefoundation/zope.testing.svg?branch=master
+                :target: https://travis-ci.com/zopefoundation/zope.testing
         
         .. image:: 
https://readthedocs.org/projects/zopetesting/badge/?version=latest
                 :target: http://zopetesting.readthedocs.org/en/latest/
@@ -821,8 +821,6 @@
         
         Here's an example:
         
-            >>> open('t', 'w').close()
-        
             >>> class MyTests(zope.testing.setupstack.TestCase):
             ...
             ...     def setUp(self):
@@ -835,7 +833,8 @@
             ...             print('done w test')
             ...
             ...     def test(self):
-            ...         print(os.listdir('.'))
+            ...         if here == os.getcwd():
+            ...             print('Failed to change directory')
         
         .. let's try it
         
@@ -845,7 +844,6 @@
             >>> result = suite.run(unittest.TestResult())
             enter
             enter time.time {'return_value': 42}
-            []
             done w test
             exit (None, None, None) time.time {'return_value': 42}
             exit (None, None, None)
@@ -856,7 +854,6 @@
             ...     sys.modules['mock'] = old_mock
             ... else:
             ...     del sys.modules['mock']
-            >>> os.remove('t')
         
         
         
@@ -1374,6 +1371,23 @@
         Changes
         =======
         
+        4.9 (2021-01-08)
+        ----------------
+        
+        - Make ``setupstack.txt`` test work again if the current directory is 
empty.
+        
+        
+        4.8 (2021-01-04)
+        ----------------
+        
+        - Add support for Python 3.8 and 3.9.
+        
+        - Drop support for Python 3.3 and 3.4.
+        
+        - Extend IGNORE_EXCEPTION_MODULE_IN_PYTHON2 to cover also exceptions 
without
+          arguments (thus without a colon on the last line of the traceback 
output).
+        
+        
         4.7 (2018-10-04)
         ----------------
         
@@ -1898,14 +1912,14 @@
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Framework :: Zope3
+Classifier: Framework :: Zope :: 3
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Testing
 Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/README.rst 
new/zope.testing-4.9/README.rst
--- old/zope.testing-4.7/README.rst     2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/README.rst     2021-01-08 08:04:50.000000000 +0100
@@ -6,8 +6,8 @@
     :target: https://pypi.python.org/pypi/zope.testing/
     :alt: Latest Version
 
-.. image:: https://travis-ci.org/zopefoundation/zope.testing.svg?branch=master
-        :target: https://travis-ci.org/zopefoundation/zope.testing
+.. image:: https://travis-ci.com/zopefoundation/zope.testing.svg?branch=master
+        :target: https://travis-ci.com/zopefoundation/zope.testing
 
 .. image:: https://readthedocs.org/projects/zopetesting/badge/?version=latest
         :target: http://zopetesting.readthedocs.org/en/latest/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/appveyor.yml 
new/zope.testing-4.9/appveyor.yml
--- old/zope.testing-4.7/appveyor.yml   1970-01-01 01:00:00.000000000 +0100
+++ new/zope.testing-4.9/appveyor.yml   2021-01-08 08:04:50.000000000 +0100
@@ -0,0 +1,39 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
+environment:
+
+  matrix:
+    - python: 27
+    - python: 27-x64
+    - python: 35
+    - python: 35-x64
+    - python: 36
+    - python: 36-x64
+    - python: 37
+    - python: 37-x64
+    - python: 38
+    - python: 38-x64
+    - python: 39
+    - python: 39-x64
+
+install:
+  - "SET PATH=C:\\Python%PYTHON%;c:\\Python%PYTHON%\\scripts;%PATH%"
+  - ps: |
+      $env:PYTHON = "C:\\Python${env:PYTHON}"
+      if (-not (Test-Path $env:PYTHON)) {
+        curl -o install_python.ps1 
https://raw.githubusercontent.com/matthew-brett/multibuild/11a389d78892cf90addac8f69433d5e22bfa422a/install_python.ps1
+        .\install_python.ps1
+      }
+  - ps: if (-not (Test-Path $env:PYTHON)) { throw "No $env:PYTHON" }
+  - echo "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 > 
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vcvars64.bat"
+  - python -m pip install -U pip
+  - pip install -U setuptools wheel
+  - pip install -U -e .[test]
+
+build: false
+
+test_script:
+  - zope-testrunner --test-path=src
+
+on_success:
+  - echo Build succesful!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/bootstrap.py 
new/zope.testing-4.9/bootstrap.py
--- old/zope.testing-4.7/bootstrap.py   2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/bootstrap.py   1970-01-01 01:00:00.000000000 +0100
@@ -1,210 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2006 Zope Foundation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (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.
-#
-##############################################################################
-"""Bootstrap a buildout-based project
-
-Simply run this script in a directory containing a buildout.cfg.
-The script accepts buildout command-line options, so you can
-use the -c option to specify an alternate configuration file.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-
-from optparse import OptionParser
-
-__version__ = '2015-07-01'
-# See zc.buildout's changelog if this version is up to date.
-
-tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
-
-usage = '''\
-[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-
-Bootstraps a buildout-based project.
-
-Simply run this script in a directory containing a buildout.cfg, using the
-Python that you want bin/buildout to use.
-
-Note that by using --find-links to point to local resources, you can keep
-this script from going over the network.
-'''
-
-parser = OptionParser(usage=usage)
-parser.add_option("--version",
-                  action="store_true", default=False,
-                  help=("Return bootstrap.py version."))
-parser.add_option("-t", "--accept-buildout-test-releases",
-                  dest='accept_buildout_test_releases',
-                  action="store_true", default=False,
-                  help=("Normally, if you do not specify a --version, the "
-                        "bootstrap script and buildout gets the newest "
-                        "*final* versions of zc.buildout and its recipes and "
-                        "extensions for you.  If you use this flag, "
-                        "bootstrap and buildout will get the newest releases "
-                        "even if they are alphas or betas."))
-parser.add_option("-c", "--config-file",
-                  help=("Specify the path to the buildout configuration "
-                        "file to be used."))
-parser.add_option("-f", "--find-links",
-                  help=("Specify a URL to search for buildout releases"))
-parser.add_option("--allow-site-packages",
-                  action="store_true", default=False,
-                  help=("Let bootstrap.py use existing site packages"))
-parser.add_option("--buildout-version",
-                  help="Use a specific zc.buildout version")
-parser.add_option("--setuptools-version",
-                  help="Use a specific setuptools version")
-parser.add_option("--setuptools-to-dir",
-                  help=("Allow for re-use of existing directory of "
-                        "setuptools versions"))
-
-options, args = parser.parse_args()
-if options.version:
-    print("bootstrap.py version %s" % __version__)
-    sys.exit(0)
-
-
-######################################################################
-# load/install setuptools
-
-try:
-    from urllib.request import urlopen
-except ImportError:
-    from urllib2 import urlopen
-
-ez = {}
-if os.path.exists('ez_setup.py'):
-    exec(open('ez_setup.py').read(), ez)
-else:
-    exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
-
-if not options.allow_site_packages:
-    # ez_setup imports site, which adds site packages
-    # this will remove them from the path to ensure that incompatible versions
-    # of setuptools are not in the path
-    import site
-    # inside a virtualenv, there is no 'getsitepackages'.
-    # We can't remove these reliably
-    if hasattr(site, 'getsitepackages'):
-        for sitepackage_path in site.getsitepackages():
-            # Strip all site-packages directories from sys.path that
-            # are not sys.prefix; this is because on Windows
-            # sys.prefix is a site-package directory.
-            if sitepackage_path != sys.prefix:
-                sys.path[:] = [x for x in sys.path
-                               if sitepackage_path not in x]
-
-setup_args = dict(to_dir=tmpeggs, download_delay=0)
-
-if options.setuptools_version is not None:
-    setup_args['version'] = options.setuptools_version
-if options.setuptools_to_dir is not None:
-    setup_args['to_dir'] = options.setuptools_to_dir
-
-ez['use_setuptools'](**setup_args)
-import setuptools
-import pkg_resources
-
-# This does not (always?) update the default working set.  We will
-# do it.
-for path in sys.path:
-    if path not in pkg_resources.working_set.entries:
-        pkg_resources.working_set.add_entry(path)
-
-######################################################################
-# Install buildout
-
-ws = pkg_resources.working_set
-
-setuptools_path = ws.find(
-    pkg_resources.Requirement.parse('setuptools')).location
-
-# Fix sys.path here as easy_install.pth added before PYTHONPATH
-cmd = [sys.executable, '-c',
-       'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
-       'from setuptools.command.easy_install import main; main()',
-       '-mZqNxd', tmpeggs]
-
-find_links = os.environ.get(
-    'bootstrap-testing-find-links',
-    options.find_links or
-    ('http://downloads.buildout.org/'
-     if options.accept_buildout_test_releases else None)
-    )
-if find_links:
-    cmd.extend(['-f', find_links])
-
-requirement = 'zc.buildout'
-version = options.buildout_version
-if version is None and not options.accept_buildout_test_releases:
-    # Figure out the most recent final version of zc.buildout.
-    import setuptools.package_index
-    _final_parts = '*final-', '*final'
-
-    def _final_version(parsed_version):
-        try:
-            return not parsed_version.is_prerelease
-        except AttributeError:
-            # Older setuptools
-            for part in parsed_version:
-                if (part[:1] == '*') and (part not in _final_parts):
-                    return False
-            return True
-
-    index = setuptools.package_index.PackageIndex(
-        search_path=[setuptools_path])
-    if find_links:
-        index.add_find_links((find_links,))
-    req = pkg_resources.Requirement.parse(requirement)
-    if index.obtain(req) is not None:
-        best = []
-        bestv = None
-        for dist in index[req.project_name]:
-            distv = dist.parsed_version
-            if _final_version(distv):
-                if bestv is None or distv > bestv:
-                    best = [dist]
-                    bestv = distv
-                elif distv == bestv:
-                    best.append(dist)
-        if best:
-            best.sort()
-            version = best[-1].version
-if version:
-    requirement = '=='.join((requirement, version))
-cmd.append(requirement)
-
-import subprocess
-if subprocess.call(cmd) != 0:
-    raise Exception(
-        "Failed to execute command:\n%s" % repr(cmd)[1:-1])
-
-######################################################################
-# Import and run buildout
-
-ws.add_entry(tmpeggs)
-ws.require(requirement)
-import zc.buildout.buildout
-
-if not [a for a in args if '=' not in a]:
-    args.append('bootstrap')
-
-# if -c was provided, we push it back into args for buildout' main function
-if options.config_file is not None:
-    args[0:0] = ['-c', options.config_file]
-
-zc.buildout.buildout.main(args)
-shutil.rmtree(tmpeggs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/setup.cfg 
new/zope.testing-4.9/setup.cfg
--- old/zope.testing-4.7/setup.cfg      2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/setup.cfg      2021-01-08 08:04:51.000000000 +0100
@@ -1,6 +1,14 @@
 [bdist_wheel]
 universal = 1
 
+[flake8]
+doctests = 1
+
+[check-manifest]
+ignore = 
+       .editorconfig
+       .meta.toml
+
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/setup.py 
new/zope.testing-4.9/setup.py
--- old/zope.testing-4.7/setup.py       2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/setup.py       2021-01-08 08:04:50.000000000 +0100
@@ -49,7 +49,7 @@
 
 setup(
     name='zope.testing',
-    version='4.7',
+    version='4.9',
     url='https://github.com/zopefoundation/zope.testing',
     license='ZPL 2.1',
     description='Zope testing helpers',
@@ -65,14 +65,14 @@
         "Programming Language :: Python :: 2",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
-        "Programming Language :: Python :: 3.3",
-        "Programming Language :: Python :: 3.4",
         "Programming Language :: Python :: 3.5",
         "Programming Language :: Python :: 3.6",
         "Programming Language :: Python :: 3.7",
-        'Programming Language :: Python :: Implementation :: CPython',
-        'Programming Language :: Python :: Implementation :: PyPy',
-        "Framework :: Zope3",
+        "Programming Language :: Python :: 3.8",
+        "Programming Language :: Python :: 3.9",
+        "Programming Language :: Python :: Implementation :: CPython",
+        "Programming Language :: Python :: Implementation :: PyPy",
+        "Framework :: Zope :: 3",
         "Topic :: Software Development :: Libraries :: Python Modules",
         "Topic :: Software Development :: Testing",
     ],
@@ -88,6 +88,7 @@
     ],
     extras_require={
         'test': [
+            'zope.testrunner',
         ],
     },
     include_package_data=True,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/cleanup.py 
new/zope.testing-4.9/src/zope/testing/cleanup.py
--- old/zope.testing-4.7/src/zope/testing/cleanup.py    2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/cleanup.py    2021-01-08 
08:04:50.000000000 +0100
@@ -35,8 +35,10 @@
   addCleanUp(pigRegistry._clear)
 
 """
+
 _cleanups = []
 
+
 def addCleanUp(func, args=(), kw={}):
     """Register a cleanup routines
 
@@ -45,6 +47,7 @@
     """
     _cleanups.append((func, args, kw))
 
+
 class CleanUp(object):
     """Mix-in class providing clean-up setUp and tearDown routines."""
 
@@ -60,4 +63,5 @@
     for func, args, kw in _cleanups:
         func(*args, **kw)
 
+
 setUp = tearDown = cleanUp
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/doctestcase.py 
new/zope.testing-4.9/src/zope/testing/doctestcase.py
--- old/zope.testing-4.7/src/zope/testing/doctestcase.py        2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/doctestcase.py        2021-01-08 
08:04:50.000000000 +0100
@@ -108,11 +108,13 @@
 
 _parser = doctest.DocTestParser()
 
+
 def _testify(name):
     if not name.startswith('test'):
         name = 'test_' + name
     return name
 
+
 def doctestmethod(test=None, optionflags=0, checker=None):
     """Define a doctest from a method within a unittest.TestCase.
 
@@ -133,8 +135,10 @@
 
     return _doctestmethod(test, optionflags, checker)
 
+
 method = doctestmethod
 
+
 def _doctestmethod(test, optionflags, checker):
     doc = test.__doc__
     if not doc:
@@ -155,6 +159,7 @@
 
     return test_method
 
+
 def docteststring(test, optionflags=0, checker=None, name=None):
     """Define a doctest from a string within a unittest.TestCase.
 
@@ -177,9 +182,12 @@
 
     return test_string
 
+
 string = docteststring
 
 _not_word = re.compile(r'\W')
+
+
 def doctestfile(path, optionflags=0, checker=None):
     """Define a doctest from a test file within a unittest.TestCase.
 
@@ -209,10 +217,12 @@
     def test_file(self):
         if isinstance(self, types.FunctionType):
             setup = self
+
             def test_file_w_setup(self):
                 setup(self)
                 _run_test(self, test, {}, name, path, optionflags, checker,
                           'test')
+
             test_file_w_setup.__name__ = _testify(setup.__name__)
             test_file_w_setup.filepath = path
             test_file_w_setup.filename = os.path.basename(path)
@@ -226,8 +236,10 @@
 
     return test_file
 
+
 file = doctestfile
 
+
 def doctestfiles(*paths, **kw):
     """Define doctests from test files in a decorated class.
 
@@ -258,13 +270,16 @@
 
     return doctestfiles_
 
+
 files = doctestfiles
 
+
 def name_from_path(path):
     return _testify(
         _not_word.sub('_', os.path.splitext(os.path.basename(path))[0])
         )
 
+
 def _run_test(self, test, globs, name, path,
               optionflags, checker, testname='self', lineno=0):
     globs.update(getattr(self, 'globs', ()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/exceptions.py 
new/zope.testing-4.9/src/zope/testing/exceptions.py
--- old/zope.testing-4.7/src/zope/testing/exceptions.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/exceptions.py 2021-01-08 
08:04:50.000000000 +0100
@@ -16,9 +16,11 @@
 
 import warnings
 # Tell people to use the builtin module instead.
-warnings.warn('zope.testing.exceptions is deprecated in favour of '
-              'zope.testrunner.exceptions', DeprecationWarning,
-               stacklevel=2)
+warnings.warn(
+    'zope.testing.exceptions is deprecated in favour of '
+    'zope.testrunner.exceptions', DeprecationWarning,
+    stacklevel=2)
+
 
 class DocTestFailureException(AssertionError):
     """Use custom exception for doctest unit test failures"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/formparser.py 
new/zope.testing-4.9/src/zope/testing/formparser.py
--- old/zope.testing-4.7/src/zope/testing/formparser.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/formparser.py 2021-01-08 
08:04:50.000000000 +0100
@@ -36,7 +36,7 @@
         self._parser.handle_starttag = self._handle_starttag
         self._parser.handle_startendtag = self._handle_starttag
         self._buffer = []
-        self.current = None # current form
+        self.current = None  # current form
         self.forms = FormCollection()
 
     def parse(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/loggingsupport.py 
new/zope.testing-4.9/src/zope/testing/loggingsupport.py
--- old/zope.testing-4.7/src/zope/testing/loggingsupport.py     2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/loggingsupport.py     2021-01-08 
08:04:50.000000000 +0100
@@ -13,6 +13,7 @@
 ##############################################################################
 import logging
 
+
 class Handler(logging.Handler):
 
     def __init__(self, *names, **kw):
@@ -46,15 +47,16 @@
 
     def __str__(self):
         return '\n'.join(
-            [("%s %s\n  %s" %
-              (record.name, record.levelname,
-               '\n'.join([line
-                          for line in record.getMessage().split('\n')
-                          if line.strip()])
-               )
-              )
-              for record in self.records]
-              )
+            "%s %s\n  %s" % (
+                record.name, record.levelname,
+               '\n'.join(
+                   line
+                   for line in record.getMessage().split('\n')
+                   if line.strip()
+               ),
+            )
+            for record in self.records
+        )
 
 
 class InstalledHandler(Handler):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/loghandler.py 
new/zope.testing-4.9/src/zope/testing/loghandler.py
--- old/zope.testing-4.7/src/zope/testing/loghandler.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/loghandler.py 2021-01-08 
08:04:50.000000000 +0100
@@ -15,6 +15,7 @@
 """
 import logging
 
+
 class Handler(logging.Handler):
     """Handler for use with unittest.TestCase objects.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/module.py 
new/zope.testing-4.9/src/zope/testing/module.py
--- old/zope.testing-4.7/src/zope/testing/module.py     2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/module.py     2021-01-08 
08:04:50.000000000 +0100
@@ -16,17 +16,21 @@
 
 import sys
 
+
 class FakeModule(object):
     def __init__(self, dict):
         self.__dict = dict
+
     def __getattr__(self, name):
         try:
             return self.__dict[name]
         except KeyError:
             raise AttributeError(name)
+
     def __dir__(self):
         return self.__dict.keys()
 
+
 def setUp(test, name='__main__'):
     dict = test.globs
     dict['__name__'] = name
@@ -37,6 +41,7 @@
         parent = sys.modules['.'.join(name[:-1])]
         setattr(parent, name[-1], module)
 
+
 def tearDown(test, name=None):
     if name is None:
         name = test.globs['__name__']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/renormalizing.py 
new/zope.testing-4.9/src/zope/testing/renormalizing.py
--- old/zope.testing-4.7/src/zope/testing/renormalizing.py      2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/renormalizing.py      2021-01-08 
08:04:50.000000000 +0100
@@ -11,8 +11,9 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-import sys
 import doctest
+import re
+import sys
 
 
 IGNORE_EXCEPTION_MODULE_IN_PYTHON2 = doctest.register_optionflag(
@@ -31,7 +32,7 @@
 
 
 class OutputChecker(doctest.OutputChecker):
-    """Pattern-normalizing outout checker
+    """Pattern-normalizing output checker
     """
 
     def __init__(self, patterns=None):
@@ -58,11 +59,17 @@
             want = transformer(want)
             got = transformer(got)
 
+        if doctest.OutputChecker.check_output(self, want, got, optionflags):
+            return True
+
         if sys.version_info[0] < 3:
             if optionflags & IGNORE_EXCEPTION_MODULE_IN_PYTHON2:
                 want = strip_dottedname_from_traceback(want)
+                if doctest.OutputChecker.check_output(
+                        self, want, got, optionflags):
+                    return True
 
-        return doctest.OutputChecker.check_output(self, want, got, optionflags)
+        return False
 
     def output_difference(self, example, got, optionflags):
 
@@ -97,9 +104,23 @@
 
         return result
 
+
 RENormalizing = OutputChecker
 
 
+def is_dotted_name(name):
+    if sys.version_info[0] >= 3:
+        return (
+            name and
+            all(element.isidentifier() for element in name.split('.')))
+    else:
+        # Python 2 lacked str.isidentifier, but also restricted identifiers
+        # to ASCII so a regex match is straightforward.
+        match = re.match(
+            r'^(?:[A-Za-z_][A-Za-z0-9_]*\.)*[A-Za-z_][A-Za-z0-9_]*$', name)
+        return match is not None
+
+
 def maybe_a_traceback(string):
     # We wanted to confirm more strictly we're dealing with a traceback here.
     # However, doctest will preprocess exception output. It gets rid of the
@@ -110,9 +131,20 @@
 
     lines = string.splitlines()
     last = lines[-1]
+    if not last:
+        return None
     words = last.split(' ')
     first = words[0]
-    if not first.endswith(':'):
+    if len(words) > 1 and not first.endswith(':'):
+        return None
+    # If IGNORE_EXCEPTION_MODULE_IN_PYTHON2 was applied to an entire file,
+    # then this may run on strings that aren't the exception message part of
+    # a traceback.  The doctest interface makes it impossible to detect this
+    # reasonably, so do our best to restrict this to only lines that start
+    # with something that looks like a Python dotted name.  It's best to
+    # apply IGNORE_EXCEPTION_MODULE_IN_PYTHON2 only to examples that need
+    # it.
+    if not is_dotted_name(first[:-1]):
         return None
 
     return lines, last, words, first
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/server.py 
new/zope.testing-4.9/src/zope/testing/server.py
--- old/zope.testing-4.7/src/zope/testing/server.py     2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/server.py     2021-01-08 
08:04:50.000000000 +0100
@@ -11,7 +11,7 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
-"""Functional test server to interactively inspect the state of the 
application.
+"""Functional test server to interactively inspect the state of the system.
 
 You can run it in a functional test by adding a line like this:
 
@@ -22,10 +22,13 @@
 done with inspecting the application press Ctrl+C to continue with the
 functional test.
 """
-import urlparse
-import webbrowser
-from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
+from __future__ import print_function
+
 import sys
+import webbrowser
+import urlparse
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+# XXX: I don't think this module works on Python 3!
 
 
 def makeRequestHandler(http, user=None, password=None):
@@ -54,7 +57,7 @@
                 while True:
                     try:
                         char = self.rfile.read()
-                    except:
+                    except Exception:  # XXX: should probably be IOError?
                         break
                     request += char
 
@@ -93,7 +96,7 @@
         httpd = HTTPServer(server_address, requestHandler)
         # XXX we rely on browser being slower than our server
         webbrowser.open(url)
-        print >> sys.stderr, 'Starting HTTP server...'
+        print('Starting HTTP server...', file=sys.stderr)
         httpd.serve_forever()
     except KeyboardInterrupt:
-        print >> sys.stderr, 'Stopped HTTP server.'
+        print('Stopped HTTP server.', file=sys.stderr)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/setupstack.py 
new/zope.testing-4.9/src/zope/testing/setupstack.py
--- old/zope.testing-4.7/src/zope/testing/setupstack.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/setupstack.py 2021-01-08 
08:04:50.000000000 +0100
@@ -21,14 +21,17 @@
 import tempfile
 import unittest
 
+
 key = '__' + __name__
 
+
 def globs(test):
     try:
         return test.globs
     except AttributeError:
         return test.__dict__
 
+
 def register(test, function, *args, **kw):
     tglobs = globs(test)
     stack = tglobs.get(key)
@@ -36,6 +39,7 @@
         stack = tglobs[key] = []
     stack.append((function, args, kw))
 
+
 def tearDown(test):
     tglobs = globs(test)
     stack = tglobs.get(key)
@@ -43,6 +47,7 @@
         f, p, k = stack.pop()
         f(*p, **k)
 
+
 def setUpDirectory(test):
     tmp = tempfile.mkdtemp()
     register(test, rmtree, tmp)
@@ -50,6 +55,7 @@
     register(test, os.chdir, here)
     os.chdir(tmp)
 
+
 def rmtree(path):
     for path, dirs, files in os.walk(path, False):
         for fname in files:
@@ -62,15 +68,18 @@
             os.rmdir(dname)
     os.rmdir(path)
 
+
 def context_manager(test, manager):
     result = manager.__enter__()
     register(test, manager.__exit__, None, None, None)
     return result
 
+
 def mock(test, *args, **kw):
     import mock as mock_module
     return context_manager(test, mock_module.patch(*args, **kw))
 
+
 class TestCase(unittest.TestCase):
 
     tearDown = tearDown
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/setupstack.txt 
new/zope.testing-4.9/src/zope/testing/setupstack.txt
--- old/zope.testing-4.7/src/zope/testing/setupstack.txt        2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/setupstack.txt        2021-01-08 
08:04:50.000000000 +0100
@@ -224,8 +224,6 @@
 
 Here's an example:
 
-    >>> open('t', 'w').close()
-
     >>> class MyTests(zope.testing.setupstack.TestCase):
     ...
     ...     def setUp(self):
@@ -238,7 +236,8 @@
     ...             print('done w test')
     ...
     ...     def test(self):
-    ...         print(os.listdir('.'))
+    ...         if here == os.getcwd():
+    ...             print('Failed to change directory')
 
 .. let's try it
 
@@ -248,7 +247,6 @@
     >>> result = suite.run(unittest.TestResult())
     enter
     enter time.time {'return_value': 42}
-    []
     done w test
     exit (None, None, None) time.time {'return_value': 42}
     exit (None, None, None)
@@ -259,5 +257,4 @@
     ...     sys.modules['mock'] = old_mock
     ... else:
     ...     del sys.modules['mock']
-    >>> os.remove('t')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.testing-4.7/src/zope/testing/test_renormalizing.py 
new/zope.testing-4.9/src/zope/testing/test_renormalizing.py
--- old/zope.testing-4.7/src/zope/testing/test_renormalizing.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/test_renormalizing.py 2021-01-08 
08:04:50.000000000 +0100
@@ -1,10 +1,41 @@
-import unittest
+import sys
 import textwrap
-from zope.testing.renormalizing import strip_dottedname_from_traceback
+import unittest
+
+from zope.testing.renormalizing import (
+    is_dotted_name,
+    strip_dottedname_from_traceback,
+)
 
 
 class Exception2To3(unittest.TestCase):
 
+    def test_is_dotted_name_ascii_no_dots(self):
+        self.assertTrue(is_dotted_name('FooBarError'))
+
+    def test_is_dotted_name_ascii_dots(self):
+        self.assertTrue(is_dotted_name('foo.bar.FooBarError'))
+
+    def test_is_dotted_name_unicode_no_dots(self):
+        result = is_dotted_name(u'FooB\xe1rError')
+        if sys.version_info[0] >= 3:
+            self.assertTrue(result)
+        else:
+            self.assertFalse(result)
+
+    def test_is_dotted_name_unicode_dots(self):
+        result = is_dotted_name(u'foo.b\xe1r.FooB\xe1rError')
+        if sys.version_info[0] >= 3:
+            self.assertTrue(result)
+        else:
+            self.assertFalse(result)
+
+    def test_is_dotted_name_ellipsis(self):
+        self.assertFalse(is_dotted_name('...'))
+
+    def test_is_dotted_name_not_identifier(self):
+        self.assertFalse(is_dotted_name('foo=bar'))
+
     def test_strip_dottedname(self):
         string = textwrap.dedent("""\
             Traceback (most recent call last):
@@ -14,6 +45,15 @@
             FooBarError: requires at least one argument.""")
         self.assertEqual(expected, strip_dottedname_from_traceback(string))
 
+    def test_strip_dottedname_without_exception_arguments(self):
+        string = textwrap.dedent("""\
+            Traceback (most recent call last):
+            foo.bar.FooBarError""")
+        expected = textwrap.dedent("""\
+            Traceback (most recent call last):
+            FooBarError""")
+        self.assertEqual(expected, strip_dottedname_from_traceback(string))
+
     def test_no_dots_in_name(self):
         string = textwrap.dedent("""\
             Traceback (most recent call last):
@@ -42,6 +82,16 @@
         expected = '   '
         self.assertEqual(expected, strip_dottedname_from_traceback(string))
 
+    def test_input_ellipsis(self):
+        string = '...'
+        expected = '...'
+        self.assertEqual(expected, strip_dottedname_from_traceback(string))
+
+    def test_input_last_line_not_dotted_name(self):
+        string = 'foo=bar'
+        expected = 'foo=bar'
+        self.assertEqual(expected, strip_dottedname_from_traceback(string))
+
     def test_last_line_empty(self):
         string = textwrap.dedent("""\
             Traceback (most recent call last):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/testrunner.py 
new/zope.testing-4.9/src/zope/testing/testrunner.py
--- old/zope.testing-4.7/src/zope/testing/testrunner.py 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/testrunner.py 2021-01-08 
08:04:50.000000000 +0100
@@ -8,4 +8,4 @@
     # Now replace this module with the right one:
     zope.testing.testrunner = testrunner
 except ImportError:
-    pass
\ No newline at end of file
+    pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/tests.py 
new/zope.testing-4.9/src/zope/testing/tests.py
--- old/zope.testing-4.7/src/zope/testing/tests.py      2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/tests.py      2021-01-08 
08:04:50.000000000 +0100
@@ -18,9 +18,11 @@
 from zope.testing import renormalizing
 from zope.testing.test_renormalizing import Exception2To3
 
+
 def print_(*args):
     sys.stdout.write(' '.join(map(str, args))+'\n')
 
+
 def setUp(test):
     test.globs['print_'] = print_
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope/testing/wait.py 
new/zope.testing-4.9/src/zope/testing/wait.py
--- old/zope.testing-4.7/src/zope/testing/wait.py       2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope/testing/wait.py       2021-01-08 
08:04:50.000000000 +0100
@@ -14,6 +14,7 @@
 
 import time
 
+
 class Wait:
 
     class TimeOutWaitingFor(Exception):
@@ -24,7 +25,7 @@
 
     def __init__(self,
                  timeout=None, wait=None, exception=None,
-                 getnow=(lambda : time.time), getsleep=(lambda : time.sleep)):
+                 getnow=lambda: time.time, getsleep=lambda: time.sleep):
 
         if timeout is not None:
             self.timeout = timeout
@@ -63,6 +64,7 @@
                     message or
                     getattr(func, '__doc__') or
                     getattr(func, '__name__')
-                    )
+                )
+
 
 wait = Wait()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/src/zope.testing.egg-info/PKG-INFO 
new/zope.testing-4.9/src/zope.testing.egg-info/PKG-INFO
--- old/zope.testing-4.7/src/zope.testing.egg-info/PKG-INFO     2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope.testing.egg-info/PKG-INFO     2021-01-08 
08:04:50.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zope.testing
-Version: 4.7
+Version: 4.9
 Summary: Zope testing helpers
 Home-page: https://github.com/zopefoundation/zope.testing
 Author: Zope Foundation and Contributors
@@ -14,8 +14,8 @@
             :target: https://pypi.python.org/pypi/zope.testing/
             :alt: Latest Version
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zope.testing.svg?branch=master
-                :target: https://travis-ci.org/zopefoundation/zope.testing
+        .. image:: 
https://travis-ci.com/zopefoundation/zope.testing.svg?branch=master
+                :target: https://travis-ci.com/zopefoundation/zope.testing
         
         .. image:: 
https://readthedocs.org/projects/zopetesting/badge/?version=latest
                 :target: http://zopetesting.readthedocs.org/en/latest/
@@ -821,8 +821,6 @@
         
         Here's an example:
         
-            >>> open('t', 'w').close()
-        
             >>> class MyTests(zope.testing.setupstack.TestCase):
             ...
             ...     def setUp(self):
@@ -835,7 +833,8 @@
             ...             print('done w test')
             ...
             ...     def test(self):
-            ...         print(os.listdir('.'))
+            ...         if here == os.getcwd():
+            ...             print('Failed to change directory')
         
         .. let's try it
         
@@ -845,7 +844,6 @@
             >>> result = suite.run(unittest.TestResult())
             enter
             enter time.time {'return_value': 42}
-            []
             done w test
             exit (None, None, None) time.time {'return_value': 42}
             exit (None, None, None)
@@ -856,7 +854,6 @@
             ...     sys.modules['mock'] = old_mock
             ... else:
             ...     del sys.modules['mock']
-            >>> os.remove('t')
         
         
         
@@ -1374,6 +1371,23 @@
         Changes
         =======
         
+        4.9 (2021-01-08)
+        ----------------
+        
+        - Make ``setupstack.txt`` test work again if the current directory is 
empty.
+        
+        
+        4.8 (2021-01-04)
+        ----------------
+        
+        - Add support for Python 3.8 and 3.9.
+        
+        - Drop support for Python 3.3 and 3.4.
+        
+        - Extend IGNORE_EXCEPTION_MODULE_IN_PYTHON2 to cover also exceptions 
without
+          arguments (thus without a colon on the last line of the traceback 
output).
+        
+        
         4.7 (2018-10-04)
         ----------------
         
@@ -1898,14 +1912,14 @@
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.3
-Classifier: Programming Language :: Python :: 3.4
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
 Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Classifier: Framework :: Zope3
+Classifier: Framework :: Zope :: 3
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Testing
 Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.testing-4.7/src/zope.testing.egg-info/SOURCES.txt 
new/zope.testing-4.9/src/zope.testing.egg-info/SOURCES.txt
--- old/zope.testing-4.7/src/zope.testing.egg-info/SOURCES.txt  2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope.testing.egg-info/SOURCES.txt  2021-01-08 
08:04:51.000000000 +0100
@@ -1,11 +1,9 @@
-.gitignore
-.travis.yml
 CHANGES.rst
 COPYRIGHT.txt
 LICENSE.txt
 MANIFEST.in
 README.rst
-bootstrap.py
+appveyor.yml
 buildout.cfg
 rtd.txt
 setup.cfg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.testing-4.7/src/zope.testing.egg-info/requires.txt 
new/zope.testing-4.9/src/zope.testing.egg-info/requires.txt
--- old/zope.testing-4.7/src/zope.testing.egg-info/requires.txt 2018-10-04 
15:59:02.000000000 +0200
+++ new/zope.testing-4.9/src/zope.testing.egg-info/requires.txt 2021-01-08 
08:04:50.000000000 +0100
@@ -1,3 +1,4 @@
 setuptools
 
 [test]
+zope.testrunner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.testing-4.7/tox.ini new/zope.testing-4.9/tox.ini
--- old/zope.testing-4.7/tox.ini        2018-10-04 15:59:02.000000000 +0200
+++ new/zope.testing-4.9/tox.ini        2021-01-08 08:04:50.000000000 +0100
@@ -1,9 +1,65 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/pure-python
 [tox]
 envlist =
-    py27,py33,py34,py35,py36,py37,pypy,pypy3
+    lint
+    py27
+    py35
+    py36
+    py37
+    py38
+    py39
+    pypy
+    pypy3
+    coverage
 
 [testenv]
+usedevelop = true
+deps =
+    zope.testrunner
 commands =
-    python setup.py -q test -q
+    zope-testrunner --test-path=src []
+extras =
+    test
+
+[testenv:lint]
+basepython = python3
+skip_install = true
+deps =
+    flake8
+    check-manifest
+    check-python-versions
+commands =
+    flake8 src setup.py
+    check-manifest
+    check-python-versions
+
+[testenv:coverage]
+basepython = python3
 deps =
-    .[test]
+    coverage
+    coverage-python-version
+    zope.testrunner
+commands =
+    coverage run -m zope.testrunner --test-path=src []
+    coverage html
+    coverage report -m --fail-under=55
+
+[coverage:run]
+branch = True
+plugins = coverage_python_version
+source = src
+
+[coverage:report]
+precision = 2
+exclude_lines =
+    pragma: no cover
+    pragma: nocover
+    except ImportError:
+    raise NotImplementedError
+    if __name__ == '__main__':
+    self.fail
+    raise AssertionError
+
+[coverage:html]
+directory = htmlcov

Reply via email to