Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-zodbpickle for 
openSUSE:Factory checked in at 2021-09-25 00:35:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zodbpickle (Old)
 and      /work/SRC/openSUSE:Factory/.python-zodbpickle.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-zodbpickle"

Sat Sep 25 00:35:44 2021 rev:7 rq:921375 version:2.1.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-zodbpickle/python-zodbpickle.changes      
2021-01-22 21:52:40.509878961 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-zodbpickle.new.1899/python-zodbpickle.changes
    2021-09-25 00:36:40.747209845 +0200
@@ -1,0 +2,7 @@
+Fri Sep 24 09:50:50 UTC 2021 - pgaj...@suse.com
+
+- version update to 2.1.0
+  * Add support for Python 3.9.
+- use %pyunittest_arch rpm macro
+
+-------------------------------------------------------------------

Old:
----
  zodbpickle-2.0.0.tar.gz

New:
----
  zodbpickle-2.1.0.tar.gz

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

Other differences:
------------------
++++++ python-zodbpickle.spec ++++++
--- /var/tmp/diff_new_pack.XYN3Rd/_old  2021-09-25 00:36:41.175210292 +0200
+++ /var/tmp/diff_new_pack.XYN3Rd/_new  2021-09-25 00:36:41.179210295 +0200
@@ -18,7 +18,7 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-zodbpickle
-Version:        2.0.0
+Version:        2.1.0
 Release:        0
 Summary:        Fork of Python 3 pickle module
 License:        Python-2.0 AND ZPL-2.1
@@ -57,7 +57,9 @@
 }
 
 %check
-%python_exec setup.py test
+pushd src
+mv zodbpickle{,_hide}
+%pyunittest_arch -v zodbpickle_hide.tests.test_pickle.test_suite
 
 %files %{python_files}
 %license LICENSE.txt

++++++ zodbpickle-2.0.0.tar.gz -> zodbpickle-2.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/.coveragerc 
new/zodbpickle-2.1.0/.coveragerc
--- old/zodbpickle-2.0.0/.coveragerc    2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/.coveragerc    2021-09-24 08:23:18.000000000 +0200
@@ -1,6 +1,29 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 [run]
-branch = True
 source = zodbpickle
+# New in 5.0; required for the GHA coveralls submission.
+relative_files = True
+branch = true
+
+[paths]
+source =
+    src/
+    .tox/*/lib/python*/site-packages/
+    .tox/pypy*/site-packages/
 
 [report]
+show_missing = true
 precision = 2
+exclude_lines =
+    except ImportError:
+    if __name__ == '__main__':
+    pragma: no cover
+    pragma: nocover
+    raise AssertionError
+    raise NotImplementedError
+    raise unittest.Skip
+    self.fail\(
+
+[html]
+directory = parts/htmlcov
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/.manylinux-install.sh 
new/zodbpickle-2.1.0/.manylinux-install.sh
--- old/zodbpickle-2.0.0/.manylinux-install.sh  2019-11-13 13:40:47.000000000 
+0100
+++ new/zodbpickle-2.1.0/.manylinux-install.sh  2021-09-24 08:23:18.000000000 
+0200
@@ -1,16 +1,47 @@
 #!/usr/bin/env bash
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 
 set -e -x
 
+# Running inside docker
+# Set a cache directory for pip. This was
+# mounted to be the same as it is outside docker so it
+# can be persisted.
+export XDG_CACHE_HOME="/cache"
+# XXX: This works for macOS, where everything bind-mounted
+# is seen as owned by root in the container. But when the host is Linux
+# the actual UIDs come through to the container, triggering
+# pip to disable the cache when it detects that the owner doesn't match.
+# The below is an attempt to fix that, taken from bcrypt. It seems to work on
+# Github Actions.
+if [ -n "$GITHUB_ACTIONS" ]; then
+    echo Adjusting pip cache permissions
+    mkdir -p $XDG_CACHE_HOME/pip
+    chown -R $(whoami) $XDG_CACHE_HOME
+fi
+ls -ld /cache
+ls -ld /cache/pip
+
+# We need some libraries because we build wheels from scratch:
+yum -y install libffi-devel
+
 # Compile wheels
 for PYBIN in /opt/python/*/bin; do
     if [[ "${PYBIN}" == *"cp27"* ]] || \
        [[ "${PYBIN}" == *"cp35"* ]] || \
        [[ "${PYBIN}" == *"cp36"* ]] || \
        [[ "${PYBIN}" == *"cp37"* ]] || \
-       [[ "${PYBIN}" == *"cp38"* ]]; then
+       [[ "${PYBIN}" == *"cp38"* ]] || \
+       [[ "${PYBIN}" == *"cp39"* ]]; then
         "${PYBIN}/pip" install -e /io/
         "${PYBIN}/pip" wheel /io/ -w wheelhouse/
+        if [ `uname -m` == 'aarch64' ]; then
+         cd /io/
+         "${PYBIN}/pip" install tox
+         "${PYBIN}/tox" -e py
+         cd ..
+        fi
         rm -rf /io/build /io/*.egg-info
     fi
 done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/.manylinux.sh 
new/zodbpickle-2.1.0/.manylinux.sh
--- old/zodbpickle-2.0.0/.manylinux.sh  2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/.manylinux.sh  2021-09-24 08:23:18.000000000 +0200
@@ -1,5 +1,16 @@
 #!/usr/bin/env bash
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 
 set -e -x
 
-docker run --rm -v "$(pwd)":/io $DOCKER_IMAGE $PRE_CMD 
/io/.manylinux-install.sh
+# Mount the current directory as /io
+# Mount the pip cache directory as /cache
+# `pip cache` requires pip 20.1
+echo Setting up caching
+python --version
+python -mpip --version
+LCACHE="$(dirname `python -mpip cache dir`)"
+echo Sharing pip cache at $LCACHE $(ls -ld $LCACHE)
+
+docker run --rm -e GITHUB_ACTIONS -v "$(pwd)":/io -v "$LCACHE:/cache" 
$DOCKER_IMAGE $PRE_CMD /io/.manylinux-install.sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/CHANGES.rst 
new/zodbpickle-2.1.0/CHANGES.rst
--- old/zodbpickle-2.0.0/CHANGES.rst    2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/CHANGES.rst    2021-09-24 08:23:18.000000000 +0200
@@ -2,6 +2,12 @@
  Changelog
 ===========
 
+2.1.0 (2021-09-24)
+==================
+
+- Add support for Python 3.9.
+
+
 2.0.0 (2019-11-13)
 ==================
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/MANIFEST.in 
new/zodbpickle-2.1.0/MANIFEST.in
--- old/zodbpickle-2.0.0/MANIFEST.in    2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/MANIFEST.in    2021-09-24 08:23:18.000000000 +0200
@@ -1,11 +1,13 @@
-include *.py
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 include *.rst
 include *.txt
+include buildout.cfg
 include tox.ini
 include appveyor.yml
-include buildout.cfg
-include patches/*.diff
 include .coveragerc
-include *.sh
 
+recursive-include src *.py
+include *.sh
+recursive-include patches *.diff
 recursive-include src *.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/PKG-INFO 
new/zodbpickle-2.1.0/PKG-INFO
--- old/zodbpickle-2.0.0/PKG-INFO       2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/PKG-INFO       2021-09-24 08:23:19.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zodbpickle
-Version: 2.0.0
+Version: 2.1.0
 Summary: Fork of Python 2 and 3 pickle module.
 Home-page: https://github.com/zopefoundation/zodbpickle
 Author: Python and Zope Foundation
@@ -9,8 +9,8 @@
 Description: ``zodbpickle`` README
         =====================
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zodbpickle.svg?branch=master
-                :target: https://travis-ci.org/zopefoundation/zodbpickle
+        .. image:: 
https://travis-ci.com/zopefoundation/zodbpickle.svg?branch=master
+                :target: https://travis-ci.com/zopefoundation/zodbpickle
         
         .. image:: 
https://coveralls.io/repos/github/zopefoundation/zodbpickle/badge.svg
            :target: https://coveralls.io/github/zopefoundation/zodbpickle
@@ -177,6 +177,12 @@
          Changelog
         ===========
         
+        2.1.0 (2021-09-24)
+        ==================
+        
+        - Add support for Python 3.9.
+        
+        
         2.0.0 (2019-11-13)
         ==================
         
@@ -365,6 +371,7 @@
 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: Programming Language :: Python :: Implementation :: Jython
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/README.rst 
new/zodbpickle-2.1.0/README.rst
--- old/zodbpickle-2.0.0/README.rst     2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/README.rst     2021-09-24 08:23:18.000000000 +0200
@@ -1,8 +1,8 @@
 ``zodbpickle`` README
 =====================
 
-.. image:: https://travis-ci.org/zopefoundation/zodbpickle.svg?branch=master
-        :target: https://travis-ci.org/zopefoundation/zodbpickle
+.. image:: https://travis-ci.com/zopefoundation/zodbpickle.svg?branch=master
+        :target: https://travis-ci.com/zopefoundation/zodbpickle
 
 .. image:: 
https://coveralls.io/repos/github/zopefoundation/zodbpickle/badge.svg
    :target: https://coveralls.io/github/zopefoundation/zodbpickle
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/appveyor.yml 
new/zodbpickle-2.1.0/appveyor.yml
--- old/zodbpickle-2.0.0/appveyor.yml   2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/appveyor.yml   2021-09-24 08:23:18.000000000 +0200
@@ -1,8 +1,12 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 environment:
+  # Currently the builds use @mgedmin's Appveyor account.  The PyPI token 
belongs
+  # to zope.wheelbuilder, which is managed by @mgedmin and @dataflake.
   global:
-    TWINE_USERNAME: zope.wheelbuilder
+    TWINE_USERNAME: __token__
     TWINE_PASSWORD:
-      secure: UcdTh6W78cRLVGfKRFoa5A==
+      secure: 
aoZC/+rvJKg8B5GMGIxd1YzSugYzr1vrR0NzX+NBCGjc64YaTc/K4kIRj4eqD0p11Nhl2aGUgHF6qMUcHIAAUybaKU/3Kyp+BwxU5eGX/NZv9S6AsBGVyiHD4oourkczzeB/HGrICEm9TeTcR3lc70SrpxSpYwnDyLv8CUpk0D/iUgQyFT/BERDsBTJEPI3HV/ngmMQrj9g2H7PkfF0yR5ss8AclYcIdWOKTvTapcGLerlK+mFm5muturTCT2njYMP2cv+NV3+Ih6OxSpQlWjw==
 
   matrix:
     - python: 27
@@ -15,8 +19,11 @@
     - python: 37-x64
     - python: 38
     - python: 38-x64
+    - python: 39
+    - python: 39-x64
 
 install:
+  - "SET PYTHONVERSION=%PYTHON%"
   - "SET PATH=C:\\Python%PYTHON%;c:\\Python%PYTHON%\\scripts;%PATH%"
   - ps: |
       $env:PYTHON = "C:\\Python${env:PYTHON}"
@@ -26,21 +33,23 @@
       }
   - 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"
-  - pip install -e .
+  - python -m pip install -U pip
+  - pip install -U setuptools wheel
+  - pip install -U -e .[test]
+
+matrix:
+  fast_finish: true
 
 build_script:
-  - python -m pip install -U pip
-  - pip install wheel
   - python -W ignore setup.py -q bdist_wheel
 
 test_script:
-  - python setup.py -q test
-
+  - zope-testrunner --test-path=src -m zodbpickle.tests.test_pickle$
 artifacts:
   - path: 'dist\*.whl'
     name: wheel
 
 deploy_script:
-  - ps: if ($env:APPVEYOR_REPO_TAG -eq $TRUE) { pip install twine; twine 
upload --skip-existing dist/* }
+  - ps: if ($env:APPVEYOR_REPO_TAG -eq $TRUE) { pip install twine; twine 
upload --skip-existing dist\*.whl }
 
 deploy: on
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/bootstrap.py 
new/zodbpickle-2.1.0/bootstrap.py
--- old/zodbpickle-2.0.0/bootstrap.py   2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/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/zodbpickle-2.0.0/setup.cfg 
new/zodbpickle-2.1.0/setup.cfg
--- old/zodbpickle-2.0.0/setup.cfg      2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/setup.cfg      2021-09-24 08:23:19.000000000 +0200
@@ -1,10 +1,23 @@
 [bdist_wheel]
-universal = 0
+universal = 1
+
+[zest.releaser]
+create-wheel = no
+
+[flake8]
+doctests = 1
+per-file-ignores = 
+       src/zodbpickle/fastpickle.py: F401 F403
+       src/zodbpickle/pickle.py: F401 F403
+       src/zodbpickle/pickle_2.py: E221 E262
+       src/zodbpickle/pickle_3.py: E221 E225 E262
+       src/zodbpickle/pickletools_3.py: E221
+       src/zodbpickle/slowpickle.py: F401 F403
 
 [check-manifest]
 ignore = 
-       bootstrap.py
-       buildout.cfg
+       .editorconfig
+       .meta.toml
 
 [egg_info]
 tag_build = 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/setup.py 
new/zodbpickle-2.1.0/setup.py
--- old/zodbpickle-2.0.0/setup.py       2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/setup.py       2021-09-24 08:23:18.000000000 +0200
@@ -19,10 +19,13 @@
 from setuptools import Extension, find_packages, setup
 
 here = os.path.abspath(os.path.dirname(__file__))
+
+
 def read(fname):
     with open(os.path.join(here, fname)) as f:
         return f.read()
 
+
 README = read('README.rst') + '\n\n' + read('CHANGES.rst')
 
 if sys.version_info[:1] < (3,):
@@ -34,7 +37,7 @@
 py_impl = getattr(platform, 'python_implementation', lambda: None)
 is_pypy = py_impl() == 'PyPy'
 is_jython = py_impl() == 'Jython'
-is_pure = 'PURE_PYTHON' in os.environ
+is_pure = int(os.environ.get('PURE_PYTHON', '0'))
 if is_pypy or is_jython:
     ext_modules = []
 else:
@@ -44,7 +47,7 @@
 
 setup(
     name='zodbpickle',
-    version='2.0.0',
+    version='2.1.0',
     description='Fork of Python 2 and 3 pickle module.',
     author='Python and Zope Foundation',
     author_email='zodb-...@zope.org',
@@ -63,6 +66,7 @@
         'Programming Language :: Python :: 3.6',
         'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
+        'Programming Language :: Python :: 3.9',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: PyPy',
         'Programming Language :: Python :: Implementation :: Jython',
@@ -79,7 +83,7 @@
     package_dir={'': 'src'},
     ext_modules=ext_modules,
     extras_require={
-        'test': [],
+        'test': ['zope.testrunner'],
     },
     test_suite='zodbpickle.tests.test_pickle.test_suite',
     install_requires=[
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/src/zodbpickle/pickletools_3.py 
new/zodbpickle-2.1.0/src/zodbpickle/pickletools_3.py
--- old/zodbpickle-2.0.0/src/zodbpickle/pickletools_3.py        2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle/pickletools_3.py        2021-09-24 
08:23:18.000000000 +0200
@@ -2146,7 +2146,7 @@
     def __init__(self, value):
         self.value = value
 
-_dis_test = r"""
+_dis_test_3_6 = r"""
 >>> import pickle
 >>> x = [1, 2, (3, 4), {b'abc': "def"}]
 >>> pkl0 = pickle.dumps(x, 0)
@@ -2401,6 +2401,269 @@
 
 """
 
+_dis_test_3_7 = r"""
+>>> import pickle
+>>> x = [1, 2, (3, 4), {b'abc': "def"}]
+>>> pkl0 = pickle.dumps(x, 0)
+>>> dis(pkl0)
+    0: (    MARK
+    1: l        LIST       (MARK at 0)
+    2: p    PUT        0
+    5: I    INT        1
+    8: a    APPEND
+    9: I    INT        2
+   12: a    APPEND
+   13: (    MARK
+   14: I        INT        3
+   17: I        INT        4
+   20: t        TUPLE      (MARK at 13)
+   21: p    PUT        1
+   24: a    APPEND
+   25: (    MARK
+   26: d        DICT       (MARK at 25)
+   27: p    PUT        2
+   30: c    GLOBAL     '_codecs encode'
+   46: p    PUT        3
+   49: (    MARK
+   50: V        UNICODE    'abc'
+   55: p        PUT        4
+   58: V        UNICODE    'latin1'
+   66: p        PUT        5
+   69: t        TUPLE      (MARK at 49)
+   70: p    PUT        6
+   73: R    REDUCE
+   74: p    PUT        7
+   77: V    UNICODE    'def'
+   82: p    PUT        8
+   85: s    SETITEM
+   86: a    APPEND
+   87: .    STOP
+highest protocol among opcodes = 0
+
+Try again with a "binary" pickle.
+
+>>> pkl1 = pickle.dumps(x, 1)
+>>> dis(pkl1)
+    0: ]    EMPTY_LIST
+    1: q    BINPUT     0
+    3: (    MARK
+    4: K        BININT1    1
+    6: K        BININT1    2
+    8: (        MARK
+    9: K            BININT1    3
+   11: K            BININT1    4
+   13: t            TUPLE      (MARK at 8)
+   14: q        BINPUT     1
+   16: }        EMPTY_DICT
+   17: q        BINPUT     2
+   19: c        GLOBAL     '_codecs encode'
+   35: q        BINPUT     3
+   37: (        MARK
+   38: X            BINUNICODE 'abc'
+   46: q            BINPUT     4
+   48: X            BINUNICODE 'latin1'
+   59: q            BINPUT     5
+   61: t            TUPLE      (MARK at 37)
+   62: q        BINPUT     6
+   64: R        REDUCE
+   65: q        BINPUT     7
+   67: X        BINUNICODE 'def'
+   75: q        BINPUT     8
+   77: s        SETITEM
+   78: e        APPENDS    (MARK at 3)
+   79: .    STOP
+highest protocol among opcodes = 1
+
+Exercise the INST/OBJ/BUILD family.
+
+>>> import pickletools
+>>> dis(pickle.dumps(pickletools.dis, 0))
+    0: c    GLOBAL     'pickletools dis'
+   17: p    PUT        0
+   20: .    STOP
+highest protocol among opcodes = 0
+
+>>> from pickletools import _Example
+>>> x = [_Example(42)] * 2
+>>> dis(pickle.dumps(x, 0))
+    0: (    MARK
+    1: l        LIST       (MARK at 0)
+    2: p    PUT        0
+    5: c    GLOBAL     'copy_reg _reconstructor'
+   30: p    PUT        1
+   33: (    MARK
+   34: c        GLOBAL     'pickletools _Example'
+   56: p        PUT        2
+   59: c        GLOBAL     '__builtin__ object'
+   79: p        PUT        3
+   82: N        NONE
+   83: t        TUPLE      (MARK at 33)
+   84: p    PUT        4
+   87: R    REDUCE
+   88: p    PUT        5
+   91: (    MARK
+   92: d        DICT       (MARK at 91)
+   93: p    PUT        6
+   96: V    UNICODE    'value'
+  103: p    PUT        7
+  106: I    INT        42
+  110: s    SETITEM
+  111: b    BUILD
+  112: a    APPEND
+  113: g    GET        5
+  116: a    APPEND
+  117: .    STOP
+highest protocol among opcodes = 0
+
+>>> dis(pickle.dumps(x, 1))
+    0: ]    EMPTY_LIST
+    1: q    BINPUT     0
+    3: (    MARK
+    4: c        GLOBAL     'copy_reg _reconstructor'
+   29: q        BINPUT     1
+   31: (        MARK
+   32: c            GLOBAL     'pickletools _Example'
+   54: q            BINPUT     2
+   56: c            GLOBAL     '__builtin__ object'
+   76: q            BINPUT     3
+   78: N            NONE
+   79: t            TUPLE      (MARK at 31)
+   80: q        BINPUT     4
+   82: R        REDUCE
+   83: q        BINPUT     5
+   85: }        EMPTY_DICT
+   86: q        BINPUT     6
+   88: X        BINUNICODE 'value'
+   98: q        BINPUT     7
+  100: K        BININT1    42
+  102: s        SETITEM
+  103: b        BUILD
+  104: h        BINGET     5
+  106: e        APPENDS    (MARK at 3)
+  107: .    STOP
+highest protocol among opcodes = 1
+
+Try "the canonical" recursive-object test.
+
+>>> L = []
+>>> T = L,
+>>> L.append(T)
+>>> L[0] is T
+True
+>>> T[0] is L
+True
+>>> L[0][0] is L
+True
+>>> T[0][0] is T
+True
+>>> dis(pickle.dumps(L, 0))
+    0: (    MARK
+    1: l        LIST       (MARK at 0)
+    2: p    PUT        0
+    5: (    MARK
+    6: g        GET        0
+    9: t        TUPLE      (MARK at 5)
+   10: p    PUT        1
+   13: a    APPEND
+   14: .    STOP
+highest protocol among opcodes = 0
+
+>>> dis(pickle.dumps(L, 1))
+    0: ]    EMPTY_LIST
+    1: q    BINPUT     0
+    3: (    MARK
+    4: h        BINGET     0
+    6: t        TUPLE      (MARK at 3)
+    7: q    BINPUT     1
+    9: a    APPEND
+   10: .    STOP
+highest protocol among opcodes = 1
+
+Note that, in the protocol 0 pickle of the recursive tuple, the disassembler
+has to emulate the stack in order to realize that the POP opcode at 16 gets
+rid of the MARK at 0.
+
+>>> dis(pickle.dumps(T, 0))
+    0: (    MARK
+    1: (        MARK
+    2: l            LIST       (MARK at 1)
+    3: p        PUT        0
+    6: (        MARK
+    7: g            GET        0
+   10: t            TUPLE      (MARK at 6)
+   11: p        PUT        1
+   14: a        APPEND
+   15: 0        POP
+   16: 0        POP        (MARK at 0)
+   17: g    GET        1
+   20: .    STOP
+highest protocol among opcodes = 0
+
+>>> dis(pickle.dumps(T, 1))
+    0: (    MARK
+    1: ]        EMPTY_LIST
+    2: q        BINPUT     0
+    4: (        MARK
+    5: h            BINGET     0
+    7: t            TUPLE      (MARK at 4)
+    8: q        BINPUT     1
+   10: a        APPEND
+   11: 1        POP_MARK   (MARK at 0)
+   12: h    BINGET     1
+   14: .    STOP
+highest protocol among opcodes = 1
+
+Try protocol 2.
+
+>>> dis(pickle.dumps(L, 2))
+    0: \x80 PROTO      2
+    2: ]    EMPTY_LIST
+    3: q    BINPUT     0
+    5: h    BINGET     0
+    7: \x85 TUPLE1
+    8: q    BINPUT     1
+   10: a    APPEND
+   11: .    STOP
+highest protocol among opcodes = 2
+
+>>> dis(pickle.dumps(T, 2))
+    0: \x80 PROTO      2
+    2: ]    EMPTY_LIST
+    3: q    BINPUT     0
+    5: h    BINGET     0
+    7: \x85 TUPLE1
+    8: q    BINPUT     1
+   10: a    APPEND
+   11: 0    POP
+   12: h    BINGET     1
+   14: .    STOP
+highest protocol among opcodes = 2
+
+Try protocol 3 with annotations:
+
+>>> dis(pickle.dumps(T, 3), annotate=1)
+    0: \x80 PROTO      3 Protocol version indicator.
+    2: ]    EMPTY_LIST   Push an empty list.
+    3: q    BINPUT     0 Store the stack top into the memo.  The stack is not 
popped.
+    5: h    BINGET     0 Read an object from the memo and push it on the stack.
+    7: \x85 TUPLE1       Build a one-tuple out of the topmost item on the 
stack.
+    8: q    BINPUT     1 Store the stack top into the memo.  The stack is not 
popped.
+   10: a    APPEND       Append an object to a list.
+   11: 0    POP          Discard the top stack item, shrinking the stack by 
one item.
+   12: h    BINGET     1 Read an object from the memo and push it on the stack.
+   14: .    STOP         Stop the unpickling machine.
+highest protocol among opcodes = 2
+
+"""
+
+# There are some slight differences since 3.7 - for now copied
+# the whole test - this can be removed if py3.6 support is dropped.
+_dis_test = _dis_test_3_7
+
+if sys.version_info[1] < 7:
+    _dis_test = _dis_test_3_6
+
+
 _memo_test = r"""
 >>> import pickle
 >>> import io
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/src/zodbpickle/tests/__init__.py 
new/zodbpickle-2.1.0/src/zodbpickle/tests/__init__.py
--- old/zodbpickle-2.0.0/src/zodbpickle/tests/__init__.py       2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle/tests/__init__.py       2021-09-24 
08:23:18.000000000 +0200
@@ -4,4 +4,4 @@
 py_impl = getattr(platform, 'python_implementation', lambda: None)
 _is_pypy = py_impl() == 'PyPy'
 _is_jython = py_impl() == 'Jython'
-_is_pure = 'PURE_PYTHON' in os.environ
+_is_pure = int(os.environ.get('PURE_PYTHON', '0'))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/src/zodbpickle/tests/test_pickle.py 
new/zodbpickle-2.1.0/src/zodbpickle/tests/test_pickle.py
--- old/zodbpickle-2.0.0/src/zodbpickle/tests/test_pickle.py    2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle/tests/test_pickle.py    2021-09-24 
08:23:18.000000000 +0200
@@ -1,24 +1,43 @@
+from . import _is_pypy
+import sys
+import types
 import unittest
 
+if _is_pypy:
+    function_type = types.FunctionType
+elif sys.version_info[0] >= 3:
+    function_type = types.BuiltinFunctionType
+else:
+    function_type = types.FunctionType
+del sys
+del _is_pypy
+
+
 class TestImportability(unittest.TestCase):
 
     def test_Pickler(self):
         from zodbpickle.pickle import Pickler
+        self.assertIsInstance(Pickler, object)
 
     def test_Unpickler(self):
         from zodbpickle.pickle import Unpickler
+        self.assertIsInstance(Unpickler, object)
 
     def test_load(self):
         from zodbpickle.pickle import load
+        self.assertIsInstance(load, function_type)
 
     def test_loads(self):
-        from zodbpickle.pickle import load
+        from zodbpickle.pickle import loads
+        self.assertIsInstance(loads, function_type)
 
     def test_dump(self):
-        from zodbpickle.pickle import dumps
+        from zodbpickle.pickle import dump
+        self.assertIsInstance(dump, function_type)
 
     def test_dumps(self):
         from zodbpickle.pickle import dumps
+        self.assertIsInstance(dumps, function_type)
 
 
 def test_suite():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zodbpickle-2.0.0/src/zodbpickle/tests/test_pickle_3.py 
new/zodbpickle-2.1.0/src/zodbpickle/tests/test_pickle_3.py
--- old/zodbpickle-2.0.0/src/zodbpickle/tests/test_pickle_3.py  2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle/tests/test_pickle_3.py  2021-09-24 
08:23:18.000000000 +0200
@@ -16,6 +16,7 @@
 from . import _is_pypy
 from . import _is_pure
 from zodbpickle import pickle_3 as pickle
+from zodbpickle import pickletools_3 as pickletools
 
 try:
     from zodbpickle import _pickle
@@ -184,6 +185,7 @@
         unittest.makeSuite(t) for t in choose_tests()
     ] + [
         doctest.DocTestSuite(pickle),
+        doctest.DocTestSuite(pickletools),
     ])
 
 if __name__ == '__main__':
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/src/zodbpickle.egg-info/PKG-INFO 
new/zodbpickle-2.1.0/src/zodbpickle.egg-info/PKG-INFO
--- old/zodbpickle-2.0.0/src/zodbpickle.egg-info/PKG-INFO       2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle.egg-info/PKG-INFO       2021-09-24 
08:23:19.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: zodbpickle
-Version: 2.0.0
+Version: 2.1.0
 Summary: Fork of Python 2 and 3 pickle module.
 Home-page: https://github.com/zopefoundation/zodbpickle
 Author: Python and Zope Foundation
@@ -9,8 +9,8 @@
 Description: ``zodbpickle`` README
         =====================
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zodbpickle.svg?branch=master
-                :target: https://travis-ci.org/zopefoundation/zodbpickle
+        .. image:: 
https://travis-ci.com/zopefoundation/zodbpickle.svg?branch=master
+                :target: https://travis-ci.com/zopefoundation/zodbpickle
         
         .. image:: 
https://coveralls.io/repos/github/zopefoundation/zodbpickle/badge.svg
            :target: https://coveralls.io/github/zopefoundation/zodbpickle
@@ -177,6 +177,12 @@
          Changelog
         ===========
         
+        2.1.0 (2021-09-24)
+        ==================
+        
+        - Add support for Python 3.9.
+        
+        
         2.0.0 (2019-11-13)
         ==================
         
@@ -365,6 +371,7 @@
 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: Programming Language :: Python :: Implementation :: Jython
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/src/zodbpickle.egg-info/SOURCES.txt 
new/zodbpickle-2.1.0/src/zodbpickle.egg-info/SOURCES.txt
--- old/zodbpickle-2.0.0/src/zodbpickle.egg-info/SOURCES.txt    2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle.egg-info/SOURCES.txt    2021-09-24 
08:23:19.000000000 +0200
@@ -6,7 +6,6 @@
 MANIFEST.in
 README.rst
 appveyor.yml
-bootstrap.py
 buildout.cfg
 setup.cfg
 setup.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zodbpickle-2.0.0/src/zodbpickle.egg-info/requires.txt 
new/zodbpickle-2.1.0/src/zodbpickle.egg-info/requires.txt
--- old/zodbpickle-2.0.0/src/zodbpickle.egg-info/requires.txt   2019-11-13 
13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/src/zodbpickle.egg-info/requires.txt   2021-09-24 
08:23:19.000000000 +0200
@@ -1,3 +1,4 @@
 setuptools
 
 [test]
+zope.testrunner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zodbpickle-2.0.0/tox.ini new/zodbpickle-2.1.0/tox.ini
--- old/zodbpickle-2.0.0/tox.ini        2019-11-13 13:40:47.000000000 +0100
+++ new/zodbpickle-2.1.0/tox.ini        2021-09-24 08:23:18.000000000 +0200
@@ -1,30 +1,56 @@
+# Generated from:
+# https://github.com/zopefoundation/meta/tree/master/config/c-code
 [tox]
-# Jython 2.7rc2 does work, but unfortunately has an issue running
-# with Tox 1.9.2 (http://bugs.jython.org/issue2325)
-envlist = py27,py35,py36,py37,py38,pypy,pypy3,coverage-report
+minversion = 3.18
+envlist =
+    lint
+    py27,py27-pure
+    py35,py35-pure
+    py36,py36-pure
+    py37,py37-pure
+    py38,py38-pure
+    py39,py39-pure
+    pypy
+    pypy3
+    coverage
 
 [testenv]
-usedevelop = True
+usedevelop = true
+deps =
+setenv =
+    pure: PURE_PYTHON=1
+    !pure-!pypy-!pypy3: PURE_PYTHON=0
 commands =
-    coverage run setup.py -q test
+    # there's test_pickle_2 for Python 2 and test_pickle_3 for Python 3
+    # different test files because metaclass syntax differs on Pythons
+    # test_pickle picks and returns the appropriate one
+    # without this we'd get an import error (actually syntax error) for one
+    # of them
+    zope-testrunner --test-path=src -m zodbpickle.tests.test_pickle$ 
{posargs:-vc}
+extras =
+    test
+
+[testenv:coverage]
+basepython = python3
+allowlist_externals =
+    mkdir
 deps =
     coverage
 setenv =
-    COVERAGE_FILE=.coverage.{envname}
-
-[testenv:jython]
+    PURE_PYTHON=1
 commands =
-   jython setup.py -q test -q
+    mkdir -p {toxinidir}/parts/htmlcov
+    coverage run -m zope.testrunner --test-path=src -m 
zodbpickle.tests.test_pickle$ {posargs:-vc}
+    coverage html -i
+    coverage report -i -m --fail-under=63
 
-[testenv:coverage-report]
-basepython = python3.6
-deps = coverage
-setenv =
-    COVERAGE_FILE=.coverage
+[testenv:lint]
+basepython = python3
 skip_install = true
+deps =
+    check-manifest
+    check-python-versions
+    wheel
 commands =
-    coverage erase
-    coverage combine
-    coverage html -i
-    coverage xml -i
-    coverage report -i --fail-under=83
+    check-manifest
+    check-python-versions

Reply via email to