Hello community,

here is the log from the commit of package python-zope.exceptions for 
openSUSE:Factory checked in at 2020-08-01 12:28:59
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zope.exceptions (Old)
 and      /work/SRC/openSUSE:Factory/.python-zope.exceptions.new.3592 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-zope.exceptions"

Sat Aug  1 12:28:59 2020 rev:11 rq:822052 version:4.4

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-zope.exceptions/python-zope.exceptions.changes
    2019-04-09 20:16:49.225612845 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-zope.exceptions.new.3592/python-zope.exceptions.changes
  2020-08-01 12:29:09.378343243 +0200
@@ -1,0 +2,7 @@
+Tue Jul 21 09:01:45 UTC 2020 - Marketa Calabkova <mcalabk...@suse.com>
+
+- update to version 4.4
+  * Add support for Python 3.8 and preliminary support for 3.9b4.
+  * Drop support for Python 3.4 and 3.5.
+
+-------------------------------------------------------------------

Old:
----
  zope.exceptions-4.3.tar.gz

New:
----
  zope.exceptions-4.4.tar.gz

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

Other differences:
------------------
++++++ python-zope.exceptions.spec ++++++
--- /var/tmp/diff_new_pack.MG5G5C/_old  2020-08-01 12:29:12.982346617 +0200
+++ /var/tmp/diff_new_pack.MG5G5C/_new  2020-08-01 12:29:12.986346621 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-zope.exceptions
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -26,7 +26,7 @@
 %bcond_with test
 %endif
 Name:           python-zope.exceptions%{psuffix}
-Version:        4.3
+Version:        4.4
 Release:        0
 Summary:        Zope Exceptions
 License:        ZPL-2.1

++++++ zope.exceptions-4.3.tar.gz -> zope.exceptions-4.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/.gitignore 
new/zope.exceptions-4.4/.gitignore
--- old/zope.exceptions-4.3/.gitignore  2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/.gitignore  1970-01-01 01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-*.pyc
-__pycache__
-.installed.cfg
-bin
-develop-eggs
-eggs
-parts
-*.egg-info
-docs/_build
-.tox
-.coverage
-htmlcov
-nosetests.xml
-coverage.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/.travis.yml 
new/zope.exceptions-4.4/.travis.yml
--- old/zope.exceptions-4.3/.travis.yml 2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/.travis.yml 1970-01-01 01:00:00.000000000 +0100
@@ -1,27 +0,0 @@
-language: python
-sudo: false
-python:
-    - 2.7
-    - 3.4
-    - 3.5
-    - 3.6
-    - pypy
-matrix:
-    include:
-        - python: "3.7"
-          dist: xenial
-          sudo: true
-install:
-    - pip install -U pip setuptools
-    - pip install -U coverage coveralls
-    - pip install -U -e .[test,docs]
-script:
-    - coverage run -m zope.testrunner --test-path=src
-    - coverage run -a -m sphinx -b doctest -d docs/_build/doctrees docs 
docs/_build/doctest
-notifications:
-    email: false
-cache: pip
-before_cache:
-    - rm -f $HOME/.cache/pip/log/debug.log
-after_success:
-  - coveralls
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/CHANGES.rst 
new/zope.exceptions-4.4/CHANGES.rst
--- old/zope.exceptions-4.3/CHANGES.rst 2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/CHANGES.rst 2020-07-16 08:49:22.000000000 +0200
@@ -2,6 +2,14 @@
  zope.exceptions Changelog
 ===========================
 
+4.4 (2020-07-16)
+================
+
+- Add support for Python 3.8 and preliminary support for 3.9b4.
+
+- Drop support for Python 3.4 and 3.5.
+
+
 4.3 (2018-10-04)
 ================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/MANIFEST.in 
new/zope.exceptions-4.4/MANIFEST.in
--- old/zope.exceptions-4.3/MANIFEST.in 2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/MANIFEST.in 2020-07-16 08:49:22.000000000 +0200
@@ -2,13 +2,11 @@
 include *.txt
 include .coveragerc
 
-recursive-include docs *
-recursive-include src *
-
-global-exclude *.pyc
-
-# added by check_manifest.py
-include *.py
-include .travis.yml
 include buildout.cfg
 include tox.ini
+
+recursive-include docs *.bat
+recursive-include docs *.py
+recursive-include docs *.rst
+recursive-include docs Makefile
+recursive-include docs/_static *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/PKG-INFO 
new/zope.exceptions-4.4/PKG-INFO
--- old/zope.exceptions-4.3/PKG-INFO    2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/PKG-INFO    2020-07-16 08:49:23.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zope.exceptions
-Version: 4.3
+Version: 4.4
 Summary: Zope Exceptions
 Home-page: https://github.com/zopefoundation/zope.exceptions
 Author: Zope Foundation and Contributors
@@ -38,6 +38,14 @@
          zope.exceptions Changelog
         ===========================
         
+        4.4 (2020-07-16)
+        ================
+        
+        - Add support for Python 3.8 and preliminary support for 3.9b4.
+        
+        - Drop support for Python 3.4 and 3.5.
+        
+        
         4.3 (2018-10-04)
         ================
         
@@ -263,15 +271,14 @@
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 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 :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
 Classifier: Topic :: Internet :: WWW/HTTP
-Classifier: Framework :: Zope3
-Provides-Extra: test
+Classifier: Framework :: Zope :: 3
 Provides-Extra: docs
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/bootstrap.py 
new/zope.exceptions-4.4/bootstrap.py
--- old/zope.exceptions-4.3/bootstrap.py        2018-10-04 16:03:48.000000000 
+0200
+++ new/zope.exceptions-4.4/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.exceptions-4.3/setup.cfg 
new/zope.exceptions-4.4/setup.cfg
--- old/zope.exceptions-4.3/setup.cfg   2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/setup.cfg   2020-07-16 08:49:23.000000000 +0200
@@ -1,17 +1,12 @@
-[nosetests]
-nocapture = 1
-cover-package = zope.exceptions
-cover-erase = 1
-with-doctest = 0
-where = src
-
-[aliases]
-dev = develop easy_install zope.exceptions[testing]
-docs = easy_install zope.exceptions[docs]
-
 [bdist_wheel]
 universal = 1
 
+[check-manifest]
+ignore = 
+       .travis.yml
+       docs/_build
+       docs/_build/*
+
 [egg_info]
 tag_build = 
 tag_date = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/setup.py 
new/zope.exceptions-4.4/setup.py
--- old/zope.exceptions-4.3/setup.py    2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/setup.py    2020-07-16 08:49:22.000000000 +0200
@@ -25,6 +25,7 @@
 def read(*rnames):
     return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
 
+
 def alltests():
     import os
     import sys
@@ -40,55 +41,56 @@
     suites = list(zope.testrunner.find.find_suites(options))
     return unittest.TestSuite(suites)
 
+
 tests_require = [
     'zope.testrunner',
 ]
 
-setup(name='zope.exceptions',
-      version='4.3',
-      author='Zope Foundation and Contributors',
-      author_email='zope-...@zope.org',
-      description='Zope Exceptions',
-      long_description=(read('README.rst') + '\n\n' +
-                        read('CHANGES.rst')),
-      keywords='zope exceptions',
-      classifiers=[
-          'Development Status :: 5 - Production/Stable',
-          'Environment :: Web Environment',
-          'Intended Audience :: Developers',
-          'License :: OSI Approved :: Zope Public License',
-          'Programming Language :: Python',
-          'Programming Language :: Python :: 2',
-          'Programming Language :: Python :: 2.7',
-          'Programming Language :: Python :: 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",
-          'Natural Language :: English',
-          'Operating System :: OS Independent',
-          'Topic :: Internet :: WWW/HTTP',
-          'Framework :: Zope3',
-      ],
-      url='https://github.com/zopefoundation/zope.exceptions',
-      license='ZPL 2.1',
-      packages=find_packages('src'),
-      package_dir={'': 'src'},
-      namespace_packages=['zope'],
-      install_requires=[
-          'setuptools',
-          'zope.interface',
-      ],
-      tests_require=[
-          'zope.testrunner',
-      ],
-      test_suite='__main__.alltests',
-      include_package_data=True,
-      zip_safe=False,
-      extras_require={
-          'docs': ['Sphinx', 'repoze.sphinx.autointerface'],
-          'test': tests_require,
-      },
+setup(
+    name='zope.exceptions',
+    version='4.4',
+    author='Zope Foundation and Contributors',
+    author_email='zope-...@zope.org',
+    description='Zope Exceptions',
+    long_description=(read('README.rst') + '\n\n' +
+                      read('CHANGES.rst')),
+    keywords='zope exceptions',
+    classifiers=[
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Web Environment',
+        'Intended Audience :: Developers',
+        'License :: OSI Approved :: Zope Public License',
+        'Programming Language :: Python',
+        'Programming Language :: Python :: 2',
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Programming Language :: Python :: 3.6',
+        'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: Implementation :: CPython',
+        'Programming Language :: Python :: Implementation :: PyPy',
+        'Natural Language :: English',
+        'Operating System :: OS Independent',
+        'Topic :: Internet :: WWW/HTTP',
+        'Framework :: Zope :: 3',
+    ],
+    url='https://github.com/zopefoundation/zope.exceptions',
+    license='ZPL 2.1',
+    packages=find_packages('src'),
+    package_dir={'': 'src'},
+    namespace_packages=['zope'],
+    install_requires=[
+        'setuptools',
+        'zope.interface',
+    ],
+    tests_require=[
+        'zope.testrunner',
+    ],
+    test_suite='__main__.alltests',
+    include_package_data=True,
+    zip_safe=False,
+    extras_require={
+        'docs': ['Sphinx', 'repoze.sphinx.autointerface'],
+        'test': tests_require,
+    },
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/src/zope/__init__.py 
new/zope.exceptions-4.4/src/zope/__init__.py
--- old/zope.exceptions-4.3/src/zope/__init__.py        2018-10-04 
16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope/__init__.py        2020-07-16 
08:49:22.000000000 +0200
@@ -1 +1 @@
-__import__('pkg_resources').declare_namespace(__name__) # pragma: no cover
+__import__('pkg_resources').declare_namespace(__name__)  # pragma: no cover
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/src/zope/exceptions/__init__.py 
new/zope.exceptions-4.4/src/zope/exceptions/__init__.py
--- old/zope.exceptions-4.3/src/zope/exceptions/__init__.py     2018-10-04 
16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope/exceptions/__init__.py     2020-07-16 
08:49:22.000000000 +0200
@@ -16,6 +16,7 @@
 These exceptions are so general purpose that they don't belong in Zope
 application-specific packages.
 """
+
 from zope.exceptions.interfaces import DuplicationError
 from zope.exceptions.interfaces import IDuplicationError
 from zope.exceptions.interfaces import UserError
@@ -25,17 +26,27 @@
 from zope.exceptions.exceptionformatter import print_exception
 from zope.exceptions.exceptionformatter import extract_stack
 
+__all__ = [
+    'DuplicationError', 'IDuplicationError', 'UserError', 'IUserError',
+    'format_exception', 'print_exception', 'extract_stack',
+]
+
+
 # avoid dependency on zope.security:
 try:
-    import zope.security
-except ImportError as v: #pragma: no cover
+    import zope.security  # noqa: suppress unused import warning from flake8
+except ImportError as v:  # pragma: no cover
     # "ImportError: No module named security"
     if 'security' not in str(v):
         raise
-else: #pragma: no cover
+else:  # pragma: no cover
     from zope.security.interfaces import IUnauthorized
     from zope.security.interfaces import Unauthorized
     from zope.security.interfaces import IForbidden
     from zope.security.interfaces import IForbiddenAttribute
     from zope.security.interfaces import Forbidden
     from zope.security.interfaces import ForbiddenAttribute
+    __all__ += [
+        'IUnauthorized', 'Unauthorized', 'IForbidden', 'IForbiddenAttribute',
+        'Forbidden', 'ForbiddenAttribute',
+    ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.exceptions-4.3/src/zope/exceptions/exceptionformatter.py 
new/zope.exceptions-4.4/src/zope/exceptions/exceptionformatter.py
--- old/zope.exceptions-4.3/src/zope/exceptions/exceptionformatter.py   
2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope/exceptions/exceptionformatter.py   
2020-07-16 08:49:22.000000000 +0200
@@ -92,7 +92,7 @@
                 extra = getInfo()
                 if extra:
                     result.append(self.formatSupplementInfo(extra))
-            except: #pragma: no cover
+            except Exception:  # pragma: no cover
                 if DEBUG_EXCEPTION_FORMATTER:
                     traceback.print_exc()
                 # else just swallow the exception.
@@ -150,7 +150,7 @@
             try:
                 supp = factory(*args)
                 result.extend(self.formatSupplement(supp, tb))
-            except: #pragma: no cover
+            except Exception:  # pragma: no cover
                 if DEBUG_EXCEPTION_FORMATTER:
                     traceback.print_exc()
                 # else just swallow the exception.
@@ -159,7 +159,7 @@
             tbi = f_locals.get('__traceback_info__', None)
             if tbi is not None:
                 result.append(self.formatTracebackInfo(tbi))
-        except: #pragma: no cover
+        except Exception:  # pragma: no cover
             if DEBUG_EXCEPTION_FORMATTER:
                 traceback.print_exc()
             # else just swallow the exception.
@@ -174,8 +174,9 @@
         return self.escape(exc_line)
 
     def formatException(self, etype, value, tb):
-        # The next line provides a way to detect recursion.
-        __exception_formatter__ = 1
+        # The next line provides a way to detect recursion.  The 'noqa'
+        # comment disables a flake8 warning about the unused variable.
+        __exception_formatter__ = 1  # noqa
         result = []
         while tb is not None:
             if tb.tb_frame.f_locals.get('__exception_formatter__'):
@@ -206,8 +207,9 @@
             except ZeroDivisionError:
                 f = sys.exc_info()[2].tb_frame.f_back
 
-        # The next line provides a way to detect recursion.
-        __exception_formatter__ = 1
+        # The next line provides a way to detect recursion.  The 'noqa'
+        # comment disables a flake8 warning about the unused variable.
+        __exception_formatter__ = 1  # noqa
         result = []
         while f is not None:
             if f.f_locals.get('__exception_formatter__'):
@@ -250,10 +252,9 @@
                 s = str(s)
             except UnicodeError:
                 if hasattr(s, 'encode'):
-                    # We probably got a unicode string on
-                    # Python 2.
+                    # We probably got a unicode string on Python 2.
                     s = s.encode('utf-8')
-                else: # pragma: no cover
+                else:  # pragma: no cover
                     raise
         return escape(s, quote=False)
 
@@ -309,7 +310,7 @@
     information to the traceback and accepts two options, 'as_html'
     and 'with_filenames'.
     """
-    if file is None: # pragma: no cover
+    if file is None:  # pragma: no cover
         file = sys.stderr
     lines = format_exception(t, v, tb, limit, as_html, with_filenames)
     for line in lines:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/src/zope/exceptions/log.py 
new/zope.exceptions-4.4/src/zope/exceptions/log.py
--- old/zope.exceptions-4.3/src/zope/exceptions/log.py  2018-10-04 
16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope/exceptions/log.py  2020-07-16 
08:49:22.000000000 +0200
@@ -19,7 +19,8 @@
 
 from zope.exceptions.exceptionformatter import print_exception
 
-Buffer = io.StringIO if bytes is not str else io.BytesIO
+Buffer = io.StringIO if bytes is not str else io.BytesIO  # PY2
+
 
 class Formatter(logging.Formatter):
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.exceptions-4.3/src/zope/exceptions/tests/test_exceptionformatter.py 
new/zope.exceptions-4.4/src/zope/exceptions/tests/test_exceptionformatter.py
--- 
old/zope.exceptions-4.3/src/zope/exceptions/tests/test_exceptionformatter.py    
    2018-10-04 16:03:48.000000000 +0200
+++ 
new/zope.exceptions-4.4/src/zope/exceptions/tests/test_exceptionformatter.py    
    2020-07-16 08:49:22.000000000 +0200
@@ -17,6 +17,9 @@
 import sys
 
 
+IS_PY39_OR_GREATER = sys.version_info >= (3, 9)
+
+
 class TextExceptionFormatterTests(unittest.TestCase):
 
     def _getTargetClass(self):
@@ -121,13 +124,16 @@
     def test_formatSupplement_w_warnings(self):
         fmt = self._makeOne()
         supplement = DummySupplement()
-        supplement.warnings = ['Beware the ides of March!',
-                               'You\'re gonna get wasted.',
-                              ]
-        self.assertEqual(fmt.formatSupplement(supplement, tb=None),
-                         ['   - Warning: Beware the ides of March!',
-                          '   - Warning: You\'re gonna get wasted.',
-                         ])
+        supplement.warnings = [
+            'Beware the ides of March!',
+            'You\'re gonna get wasted.',
+        ]
+        self.assertEqual(
+            fmt.formatSupplement(supplement, tb=None),
+            [
+                '   - Warning: Beware the ides of March!',
+                '   - Warning: You\'re gonna get wasted.',
+            ])
 
     def test_formatSupplement_w_getInfo_empty(self):
         fmt = self._makeOne()
@@ -407,9 +413,10 @@
         expected = [
             '  File "dummy/filename.py", line 17, in dummy_function\n',
             '  File "dummy/filename.py", line 27, in dummy_function\n',
-            '(Recursive extractStack() stopped, trying 
traceback.format_stack)\n',
+            ('(Recursive extractStack() stopped,'
+             ' trying traceback.format_stack)\n'),
             '  Module dummy/filename.py, line 43, in dummy_function\n',
-            ]
+        ]
 
         self.assertEqual(expected, lines)
 
@@ -627,6 +634,7 @@
     def test_multiple_levels(self):
         # Ensure many levels are shown in a traceback.
         HOW_MANY = 10
+
         def f(n):
             """Produces a (n + 1)-level traceback."""
             __traceback_info__ = 'level%d' % n
@@ -658,7 +666,8 @@
             s = self._callFUT(False)
         lines = s.splitlines()[-3:]
         self.assertEqual(lines[0], '    syntax error')
-        self.assertTrue(lines[1].endswith('    ^')) #PyPy has a shorter prefix
+        # PyPy has a shorter prefix
+        self.assertTrue(lines[1].endswith('    ^'))
         self.assertEqual(lines[2], 'SyntaxError: invalid syntax')
 
     def test_traceback_info_non_ascii(self):
@@ -671,7 +680,6 @@
         self.assertIsInstance(s, str)
         self.assertIn('Have a Snowman', s)
 
-
     def test_recursion_failure(self):
         from zope.exceptions.exceptionformatter import TextExceptionFormatter
 
@@ -711,13 +719,20 @@
         expected = dedent("""\
             <p>Traceback (most recent call last):</p>
             <ul>
-            <li>  Module zope.exceptions.tests.test_exceptionformatter, line 
ABC, in test_format_exception_as_html<br />
+            <li>  Module {module}, line ABC, in {fn}<br />
                 exec('import')</li>
             </ul><p>  File "&lt;string&gt;", line 1<br />
                 import<br />
                      ^<br />
             SyntaxError: invalid syntax<br />
-            </p>""")
+            </p>""").format(
+                module='zope.exceptions.tests.test_exceptionformatter',
+                fn='test_format_exception_as_html',
+        )
+        if IS_PY39_OR_GREATER:  # pragma: no cover
+            # Python 3.9 moves the pointer after the statement instead to the
+            # last character of it:
+            expected = expected.replace('^<br />', ' ^<br />')
         # HTML formatter uses Windows line endings for some reason.
         result = result.replace('\r\n', '\n')
         result = re.sub(r'line \d\d\d,', 'line ABC,', result)
@@ -856,6 +871,7 @@
     line = 634
     column = 57
     warnings = ['Repent, for the end is nigh']
+
     def __init__(self, expression):
         self.expression = expression
 
@@ -863,6 +879,7 @@
 class DummySupplement(object):
     def __init__(self, info=''):
         self._info = info
+
     def getInfo(self):
         return self._info
 
@@ -875,15 +892,18 @@
 class DummyFrame(object):
     f_lineno = 137
     f_back = None
+
     def __init__(self):
         self.f_locals = {}
         self.f_globals = {}
         self.f_code = DummyCode()
 
+
 class DummyCode(object):
     co_filename = 'dummy/filename.py'
     co_name = 'dummy_function'
 
+
 class _Monkey(object):
     # context-manager for replacing module names in the scope of a test.
     def __init__(self, module, **kw):
@@ -898,13 +918,11 @@
 
     def __exit__(self, exc_type, exc_val, exc_tb):
         for key, value in self.to_restore.items():
-            if value is not self: # pragma: no cover
+            if value is not self:  # pragma: no cover
                 setattr(self.module, key, value)
             else:
                 delattr(self.module, key)
 
 
-
-
 def test_suite():
     return unittest.defaultTestLoader.loadTestsFromName(__name__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.exceptions-4.3/src/zope/exceptions/tests/test_log.py 
new/zope.exceptions-4.4/src/zope/exceptions/tests/test_log.py
--- old/zope.exceptions-4.3/src/zope/exceptions/tests/test_log.py       
2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope/exceptions/tests/test_log.py       
2020-07-16 08:49:22.000000000 +0200
@@ -36,9 +36,8 @@
         self.assertEqual(lines[0], 'Traceback (most recent call last):')
         self.assertEqual(lines[1], '  File "dummy/filename.py", line 14, '
                                    'in dummy_function')
-        self.assertEqual(lines[2],
-                         traceback.format_exception_only(
-                             ValueError, exc)[0][:-1]) #trailing \n
+        emsg = traceback.format_exception_only(ValueError, exc)[0]
+        self.assertEqual(lines[2], emsg[:-1])  # strip trailing \n from emsg
 
     def test_unicode_traceback_info(self):
         import traceback
@@ -58,11 +57,10 @@
         # utf-8 encoded on Python 2, unicode on Python 3
         expected += '\xe2\x98\x83' if bytes is str else u'\u2603'
 
-        self.assertEqual(lines[2],
-                         expected)
-        self.assertEqual(lines[3],
-                         traceback.format_exception_only(
-                             ValueError, exc)[0][:-1]) #trailing \n
+        self.assertEqual(lines[2], expected)
+
+        emsg = traceback.format_exception_only(ValueError, exc)[0]
+        self.assertEqual(lines[3], emsg[:-1])  # strip trailing \n from emsg
 
 
 class DummyTB(object):
@@ -72,14 +70,17 @@
     def __init__(self):
         self.tb_frame = DummyFrame()
 
+
 class DummyFrame(object):
     f_lineno = 137
     f_back = None
+
     def __init__(self):
         self.f_locals = {}
         self.f_globals = {}
         self.f_code = DummyCode()
 
+
 class DummyCode(object):
     co_filename = 'dummy/filename.py'
     co_name = 'dummy_function'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.exceptions-4.3/src/zope.exceptions.egg-info/PKG-INFO 
new/zope.exceptions-4.4/src/zope.exceptions.egg-info/PKG-INFO
--- old/zope.exceptions-4.3/src/zope.exceptions.egg-info/PKG-INFO       
2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope.exceptions.egg-info/PKG-INFO       
2020-07-16 08:49:23.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zope.exceptions
-Version: 4.3
+Version: 4.4
 Summary: Zope Exceptions
 Home-page: https://github.com/zopefoundation/zope.exceptions
 Author: Zope Foundation and Contributors
@@ -38,6 +38,14 @@
          zope.exceptions Changelog
         ===========================
         
+        4.4 (2020-07-16)
+        ================
+        
+        - Add support for Python 3.8 and preliminary support for 3.9b4.
+        
+        - Drop support for Python 3.4 and 3.5.
+        
+        
         4.3 (2018-10-04)
         ================
         
@@ -263,15 +271,14 @@
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 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 :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
 Classifier: Topic :: Internet :: WWW/HTTP
-Classifier: Framework :: Zope3
-Provides-Extra: test
+Classifier: Framework :: Zope :: 3
 Provides-Extra: docs
+Provides-Extra: test
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.exceptions-4.3/src/zope.exceptions.egg-info/SOURCES.txt 
new/zope.exceptions-4.4/src/zope.exceptions.egg-info/SOURCES.txt
--- old/zope.exceptions-4.3/src/zope.exceptions.egg-info/SOURCES.txt    
2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/src/zope.exceptions.egg-info/SOURCES.txt    
2020-07-16 08:49:23.000000000 +0200
@@ -1,12 +1,9 @@
 .coveragerc
-.gitignore
-.travis.yml
 CHANGES.rst
 COPYRIGHT.txt
 LICENSE.txt
 MANIFEST.in
 README.rst
-bootstrap.py
 buildout.cfg
 rtd.txt
 setup.cfg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.exceptions-4.3/tox.ini 
new/zope.exceptions-4.4/tox.ini
--- old/zope.exceptions-4.3/tox.ini     2018-10-04 16:03:48.000000000 +0200
+++ new/zope.exceptions-4.4/tox.ini     2020-07-16 08:49:22.000000000 +0200
@@ -1,13 +1,12 @@
 [tox]
 envlist =
-    py27,py34,py35,py36,py37,pypy,pypy3,coverage,docs
+    flake8,py27,py36,py37,py38,py39,pypy,pypy3,coverage,docs
 
 [testenv]
 commands =
     zope-testrunner --test-path=src []
     sphinx-build -b doctest -d {envdir}/.cache/doctrees docs 
{envdir}/.cache/doctest
-deps =
-    .[test,docs]
+extras = test,docs
 
 [testenv:coverage]
 usedevelop = true
@@ -16,14 +15,20 @@
 commands =
     coverage run -m zope.testrunner --test-path=src []
     coverage run -a -m sphinx -b doctest -d {envdir}/.cache/doctrees docs 
{envdir}/.cache/doctest
-    coverage report --fail-under=100
+    coverage report -m --fail-under=100
 deps =
-    {[testenv]deps}
     coverage
 
 [testenv:docs]
 basepython =
-    python2.7
+    python3
 commands =
-    sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
+    sphinx-build -b html    -d docs/_build/doctrees docs docs/_build/html
     sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
+
+[testenv:flake8]
+skip_install = true
+deps =
+    flake8
+commands =
+    flake8 src/ setup.py


Reply via email to