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