Hello community,

here is the log from the commit of package python-zope.proxy for 
openSUSE:Factory checked in at 2019-04-08 20:53:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zope.proxy (Old)
 and      /work/SRC/openSUSE:Factory/.python-zope.proxy.new.3908 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-zope.proxy"

Mon Apr  8 20:53:27 2019 rev:6 rq:691814 version:4.3.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-zope.proxy/python-zope.proxy.changes      
2017-10-01 17:01:24.306165530 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-zope.proxy.new.3908/python-zope.proxy.changes
    2019-04-08 20:53:28.826565905 +0200
@@ -1,0 +2,17 @@
+Fri Apr  5 12:14:55 UTC 2019 - Marketa Calabkova <[email protected]>
+
+- update to version 4.3.1
+  * Add support for Python 3.7.
+  * Simplify the internal C handling of attribute names.
+  * Make building the C extension optional.
+  4.3.0
+  * Fix a potential rare crash when deallocating proxies.
+  * Drop support for Python 3.3.
+  * Drop support for “python setup.py test”.
+  * 100% test coverage.
+  * Fix indexing pure-Python proxies with slices under Python 3, 
+    and restore the use of __getslice__ (if implemented by the 
+    target’s type) under Python 2.
+- drop *-doc subpackage, use multibuild instead
+
+-------------------------------------------------------------------

Old:
----
  python-zope.proxy-doc.changes
  python-zope.proxy-doc.spec
  zope.proxy-4.2.1.tar.gz

New:
----
  _multibuild
  zope.proxy-4.3.1.tar.gz

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

Other differences:
------------------
++++++ python-zope.proxy.spec ++++++
--- /var/tmp/diff_new_pack.gWWIOa/_old  2019-04-08 20:53:29.574566454 +0200
+++ /var/tmp/diff_new_pack.gWWIOa/_new  2019-04-08 20:53:29.574566454 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-zope.proxy
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 # Copyright (c) 2013 LISA GmbH, Bingen, Germany.
 #
 # All modifications and additions to the file contributed by third parties
@@ -13,13 +13,21 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
-Name:           python-zope.proxy
-Version:        4.2.1
+%global flavor @BUILD_FLAVOR@%{nil}
+%if "%{flavor}" == "test"
+%define psuffix -test
+%bcond_without test
+%else
+%define psuffix %{nil}
+%bcond_with test
+%endif
+Name:           python-zope.proxy%{psuffix}
+Version:        4.3.1
 Release:        0
 Summary:        Generic Transparent Proxies
 License:        ZPL-2.1
@@ -31,6 +39,11 @@
 BuildRequires:  %{python_module zope.interface}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
+Requires:       python-zope.interface
+%if %{with test}
+BuildRequires:  %{python_module zope.security}
+BuildRequires:  %{python_module zope.testrunner}
+%endif
 %ifpython3
 Conflicts:      python3-zope-proxy < %{version}
 %endif
@@ -63,11 +76,19 @@
 %python_build
 
 %install
+%if !%{with test}
 %python_install
 %{python_expand rm 
%{buildroot}%{$python_sitearch}/zope/proxy/_zope_proxy_proxy.c
   %fdupes %{buildroot}%{$python_sitearch}
 }
+%endif
 
+%if %{with test}
+%check
+%python_expand PYTHONPATH=src %{_bindir}/zope-testrunner-%{$python_bin_suffix} 
-vvv --test-path src
+%endif
+
+%if !%{with test}
 %files %{python_files}
 %defattr(-,root,root,-)
 %doc COPYRIGHT.txt LICENSE.txt CHANGES.rst README.rst
@@ -79,5 +100,6 @@
 %dir %{python_sysconfig_path include}/zope.proxy
 %{python_sysconfig_path include}/zope.proxy/*
 %{python_sitearch}/zope/proxy/proxy.h
+%endif
 
 %changelog

++++++ _multibuild ++++++
<multibuild>
  <package>test</package>
</multibuild>
++++++ zope.proxy-4.2.1.tar.gz -> zope.proxy-4.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/.coveragerc 
new/zope.proxy-4.3.1/.coveragerc
--- old/zope.proxy-4.2.1/.coveragerc    1970-01-01 01:00:00.000000000 +0100
+++ new/zope.proxy-4.3.1/.coveragerc    2018-08-09 16:31:21.000000000 +0200
@@ -0,0 +1,9 @@
+[run]
+source = zope.proxy
+
+[report]
+exclude_lines =
+    pragma: no cover
+    if __name__ == '__main__':
+    raise NotImplementedError
+    raise AssertionError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/.travis.yml 
new/zope.proxy-4.3.1/.travis.yml
--- old/zope.proxy-4.2.1/.travis.yml    1970-01-01 01:00:00.000000000 +0100
+++ new/zope.proxy-4.3.1/.travis.yml    2018-08-09 16:31:21.000000000 +0200
@@ -0,0 +1,35 @@
+language: python
+sudo: false
+python:
+    - 2.7
+    - 3.4
+    - 3.5
+    - 3.6
+    - pypy
+    - pypy3
+matrix:
+    include:
+        - python: "2.7"
+          env: PURE_PYTHON=1
+        - python: "3.7"
+          dist: xenial
+          sudo: true
+install:
+    - pip install -U pip
+    - pip install -U setuptools
+    - pip install -U coverage coveralls
+    - pip install -e .[test,docs]
+script:
+    - coverage run -m zope.testrunner --test-path=src
+    - sphinx-build                         -b html    -d docs/_build/doctrees 
docs docs/_build/html
+    - coverage run -a `which sphinx-build` -b doctest -d docs/_build/doctrees 
docs docs/_build/doctest
+
+after_success:
+    - coveralls
+
+notifications:
+    email: false
+
+cache: pip
+before_cache:
+    - rm -f $HOME/.cache/pip/log/debug.log
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/CHANGES.rst 
new/zope.proxy-4.3.1/CHANGES.rst
--- old/zope.proxy-4.2.1/CHANGES.rst    2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/CHANGES.rst    2018-08-09 16:31:21.000000000 +0200
@@ -1,6 +1,40 @@
 Changes
 =======
 
+4.3.1 (2018-08-09)
+------------------
+
+- Simplify the internal C handling of attribute names in
+  ``__getattribute__`` and ``__setattr__``.
+
+- Make building the C extension optional. We still attempt to build it
+  on supported platforms, but we allow it to fail in case of a missing
+  compiler or headers. See `issue 26
+  <https://github.com/zopefoundation/zope.proxy/issues/26>`_.
+
+- Test the PURE_PYTHON environment and PyPy3 on Travis CI.
+
+- Add support for Python 3.7.
+
+4.3.0 (2017-09-13)
+------------------
+
+- Fix a potential rare crash when deallocating proxies. See `issue 20
+  <https://github.com/zopefoundation/zope.proxy/issues/20>`_.
+
+- Drop support for Python 3.3.
+
+- Drop support for "python setup.py test".
+
+- 100% test coverage.
+
+- Fix indexing pure-Python proxies with slices under Python 3, and
+  restore the use of ``__getslice__`` (if implemented by the target's
+  type) under Python 2. Previously, pure-Python proxies would fail
+  with an AttributeError when given a slice on Python 3, and on Python
+  2, a custom ``__getslice__`` was ignored. See `issue 21
+  <https://github.com/zopefoundation/zope.proxy/issues/21>`_.
+
 4.2.1 (2017-04-23)
 ------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/MANIFEST.in 
new/zope.proxy-4.3.1/MANIFEST.in
--- old/zope.proxy-4.2.1/MANIFEST.in    2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/MANIFEST.in    2018-08-09 16:31:21.000000000 +0200
@@ -3,6 +3,8 @@
 include *.py
 include tox.ini
 include buildout.cfg
+include .travis.yml
+include .coveragerc
 
 recursive-include docs *
 recursive-include src *
@@ -11,3 +13,6 @@
 global-exclude *.pyc
 global-exclude *.pyo
 global-exclude *.so
+
+# added by check_manifest.py
+include *.yml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/PKG-INFO 
new/zope.proxy-4.3.1/PKG-INFO
--- old/zope.proxy-4.2.1/PKG-INFO       2017-04-23 18:54:32.000000000 +0200
+++ new/zope.proxy-4.3.1/PKG-INFO       2018-08-09 16:31:21.000000000 +0200
@@ -1,8 +1,8 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: zope.proxy
-Version: 4.2.1
+Version: 4.3.1
 Summary: Generic Transparent Proxies
-Home-page: http://pypi.python.org/pypi/zope.proxy
+Home-page: http://github.com/zopefoundation/zope.proxy
 Author: Zope Foundation and Contributors
 Author-email: [email protected]
 License: ZPL 2.1
@@ -13,7 +13,7 @@
             :target: https://pypi.python.org/pypi/zope.proxy/
             :alt: Latest Version
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zope.proxy.png?branch=master
+        .. image:: 
https://travis-ci.org/zopefoundation/zope.proxy.svg?branch=master
                 :target: https://travis-ci.org/zopefoundation/zope.proxy
         
         .. image:: 
https://readthedocs.org/projects/zopeproxy/badge/?version=latest
@@ -28,12 +28,48 @@
         zope.proxy is implemented via a C extension module, which lets it do 
things
         like lie about its own ``__class__`` that are difficult in pure Python 
(and
         were completely impossible before metaclasses).  It also proxies all 
the
-        internal slots (such as `__int__`/`__str__`/`__add__`).
+        internal slots (such as ``__int__``/``__str__``/``__add__``).
+        
+        Complete documentation is at https://zopeproxy.readthedocs.io
         
         
         Changes
         =======
         
+        4.3.1 (2018-08-09)
+        ------------------
+        
+        - Simplify the internal C handling of attribute names in
+          ``__getattribute__`` and ``__setattr__``.
+        
+        - Make building the C extension optional. We still attempt to build it
+          on supported platforms, but we allow it to fail in case of a missing
+          compiler or headers. See `issue 26
+          <https://github.com/zopefoundation/zope.proxy/issues/26>`_.
+        
+        - Test the PURE_PYTHON environment and PyPy3 on Travis CI.
+        
+        - Add support for Python 3.7.
+        
+        4.3.0 (2017-09-13)
+        ------------------
+        
+        - Fix a potential rare crash when deallocating proxies. See `issue 20
+          <https://github.com/zopefoundation/zope.proxy/issues/20>`_.
+        
+        - Drop support for Python 3.3.
+        
+        - Drop support for "python setup.py test".
+        
+        - 100% test coverage.
+        
+        - Fix indexing pure-Python proxies with slices under Python 3, and
+          restore the use of ``__getslice__`` (if implemented by the target's
+          type) under Python 2. Previously, pure-Python proxies would fail
+          with an AttributeError when given a slice on Python 3, and on Python
+          2, a custom ``__getslice__`` was ignored. See `issue 21
+          <https://github.com/zopefoundation/zope.proxy/issues/21>`_.
+        
         4.2.1 (2017-04-23)
         ------------------
         
@@ -229,12 +265,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 :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Framework :: Zope3
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
+Provides-Extra: test
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/README.rst 
new/zope.proxy-4.3.1/README.rst
--- old/zope.proxy-4.2.1/README.rst     2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/README.rst     2018-08-09 16:31:21.000000000 +0200
@@ -5,7 +5,7 @@
     :target: https://pypi.python.org/pypi/zope.proxy/
     :alt: Latest Version
 
-.. image:: https://travis-ci.org/zopefoundation/zope.proxy.png?branch=master
+.. image:: https://travis-ci.org/zopefoundation/zope.proxy.svg?branch=master
         :target: https://travis-ci.org/zopefoundation/zope.proxy
 
 .. image:: https://readthedocs.org/projects/zopeproxy/badge/?version=latest
@@ -20,4 +20,6 @@
 zope.proxy is implemented via a C extension module, which lets it do things
 like lie about its own ``__class__`` that are difficult in pure Python (and
 were completely impossible before metaclasses).  It also proxies all the
-internal slots (such as `__int__`/`__str__`/`__add__`).
+internal slots (such as ``__int__``/``__str__``/``__add__``).
+
+Complete documentation is at https://zopeproxy.readthedocs.io
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/appveyor.yml 
new/zope.proxy-4.3.1/appveyor.yml
--- old/zope.proxy-4.2.1/appveyor.yml   1970-01-01 01:00:00.000000000 +0100
+++ new/zope.proxy-4.3.1/appveyor.yml   2018-08-09 16:31:21.000000000 +0200
@@ -0,0 +1,38 @@
+environment:
+  global:
+    TWINE_USERNAME: zope.wheelbuilder
+    TWINE_PASSWORD:
+      secure: UcdTh6W78cRLVGfKRFoa5A==
+
+  matrix:
+    - python: 27
+    - python: 27-x64
+    - python: 34
+    - python: 34-x64
+    - python: 35
+    - python: 35-x64
+    - python: 36
+    - python: 36-x64
+    - python: 37
+    - python: 37-x64
+
+install:
+  - "SET PATH=C:\\Python%PYTHON%;c:\\Python%PYTHON%\\scripts;%PATH%"
+  - 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 .
+
+build_script:
+  - pip install wheel
+  - python -W ignore setup.py -q bdist_wheel
+
+test_script:
+  - python setup.py test -q
+
+artifacts:
+  - path: 'dist\*.whl'
+    name: wheel
+
+deploy_script:
+  - ps: if ($env:APPVEYOR_REPO_TAG -eq $TRUE) { pip install twine; twine 
upload dist/* }
+
+deploy: on
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/docs/narr.rst 
new/zope.proxy-4.3.1/docs/narr.rst
--- old/zope.proxy-4.2.1/docs/narr.rst  2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/docs/narr.rst  2018-08-09 16:31:21.000000000 +0200
@@ -147,7 +147,7 @@
    >>> try:
    ...     setProxiedObject(c1, None)
    ... except TypeError:
-   ...     print "TypeError raised"
+   ...     print("TypeError raised")
    ... else:
-   ...     print "Expected TypeError not raised"
+   ...     print("Expected TypeError not raised")
    TypeError raised
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/setup.py 
new/zope.proxy-4.3.1/setup.py
--- old/zope.proxy-4.2.1/setup.py       2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/setup.py       2018-08-09 16:31:21.000000000 +0200
@@ -18,38 +18,73 @@
 ##############################################################################
 """Setup for zope.proxy package
 """
+from __future__ import print_function
 import os
 import platform
 
-from setuptools import setup, Extension, Feature
+
+from distutils.errors import CCompilerError
+from distutils.errors import DistutilsExecError
+from distutils.errors import DistutilsPlatformError
+
+from setuptools import Extension
+from setuptools.command.build_ext import build_ext
+from setuptools import setup
+from setuptools import Feature
+
+
+class optional_build_ext(build_ext):
+    """This class subclasses build_ext and allows
+       the building of C extensions to fail.
+    """
+    def run(self):
+        try:
+            build_ext.run(self)
+        except DistutilsPlatformError as e:
+            self._unavailable(e)
+
+    def build_extension(self, ext):
+        try:
+            build_ext.build_extension(self, ext)
+        except (CCompilerError, DistutilsExecError, OSError) as e:
+            self._unavailable(e)
+
+    def _unavailable(self, e):
+        print('*' * 80)
+        print("""WARNING:
+        An optional code optimization (C extension) could not be compiled.
+        Optimizations for this package will not be available!""")
+        print()
+        print(e)
+        print('*' * 80)
+
 
 def read(*rnames):
     with open(os.path.join(os.path.dirname(__file__), *rnames)) as f:
         return f.read()
 
+
 Cwrapper = Feature(
     "C wrapper",
-    standard = True,
+    standard=True,
     headers=[os.path.join('src', 'zope', 'proxy', 'proxy.h')],
-    ext_modules=[Extension("zope.proxy._zope_proxy_proxy",
-                            [os.path.join('src', 'zope', 'proxy',
-                                        "_zope_proxy_proxy.c")
-                            ],
-                            extra_compile_args=['-g']),
-                ],
+    ext_modules=[
+        Extension(
+            "zope.proxy._zope_proxy_proxy",
+            [os.path.join('src', 'zope', 'proxy', "_zope_proxy_proxy.c")],
+        ),
+    ],
 )
 
 # PyPy won't build the extension.
-py_impl = getattr(platform, 'python_implementation', lambda: None)
-is_pypy = py_impl() == 'PyPy'
-is_pure = os.environ.get('PURE_PYTHON')
-if is_pypy or is_pure:
+is_pypy = platform.python_implementation() == 'PyPy'
+if is_pypy:
     features = {}
 else:
     features = {'Cwrapper': Cwrapper}
 
 setup(name='zope.proxy',
-      version='4.2.1',
+      version='4.3.1',
       author='Zope Foundation and Contributors',
       author_email='[email protected]',
       description='Generic Transparent Proxies',
@@ -57,10 +92,10 @@
           read('README.rst')
           + '\n\n' +
           read('CHANGES.rst')
-          ),
-      url='http://pypi.python.org/pypi/zope.proxy',
+      ),
+      url='http://github.com/zopefoundation/zope.proxy',
       license='ZPL 2.1',
-      classifiers = [
+      classifiers=[
           'Development Status :: 5 - Production/Stable',
           'Intended Audience :: Developers',
           'License :: OSI Approved :: Zope Public License',
@@ -68,10 +103,10 @@
           '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",
@@ -80,19 +115,26 @@
       ],
       keywords='proxy generic transparent',
       packages=['zope', 'zope.proxy'],
-      package_dir = {'': 'src'},
-      namespace_packages=['zope',],
+      package_dir={'': 'src'},
+      namespace_packages=['zope'],
+      cmdclass={
+          'build_ext': optional_build_ext,
+      },
       features=features,
-      test_suite = 'zope.proxy',
       install_requires=[
           'zope.interface',
           'setuptools',
       ],
-      include_package_data = True,
-      zip_safe = False,
-      extras_require = {
-          'test': ['zope.security',],
-          'testing': ['nose', 'coverage', 'zope.security',],
-          'docs': ['Sphinx', 'repoze.sphinx.autointerface',],
+      include_package_data=True,
+      zip_safe=False,
+      extras_require={
+          'test': [
+              'zope.security',  # We have a circular dependency for testing
+              'zope.testrunner',
+          ],
+          'docs': [
+              'Sphinx',
+              'repoze.sphinx.autointerface',
+          ],
       },
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope/proxy/__init__.py 
new/zope.proxy-4.3.1/src/zope/proxy/__init__.py
--- old/zope.proxy-4.2.1/src/zope/proxy/__init__.py     2017-04-23 
18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope/proxy/__init__.py     2018-08-09 
16:31:21.000000000 +0200
@@ -119,7 +119,7 @@
     def __unicode__(self):
         return unicode(self._wrapped)
 
-    def __reduce__(self): #pragma NO COVER  (__reduce_ex__ prevents normal)
+    def __reduce__(self): # pragma: no cover  (__reduce_ex__ prevents normal)
         raise pickle.PicklingError
 
     def __reduce_ex__(self, proto):
@@ -216,22 +216,23 @@
     def __len__(self):
         return len(self._wrapped)
 
+    def __getslice__(self, start, stop):
+        try:
+            getslice = type(self._wrapped).__getslice__
+        except AttributeError:
+            return self.__getitem__(slice(start, stop))
+        return getslice(self._wrapped, start, stop)
+
     def __getitem__(self, key):
-        if isinstance(key, slice):
-            if isinstance(self._wrapped, (list, tuple)):
-                return self._wrapped[key]
-            start, stop = key.start, key.stop
-            if start is None:
-                start = 0
-            if start < 0:
-                start += len(self._wrapped)
-            if stop is None:
-                stop = sys.maxint
-            if stop < 0:
-                stop += len(self._wrapped)
-            return operator.getslice(self._wrapped, start, stop)
         return self._wrapped[key]
 
+    def __setslice__(self, start, stop, value):
+        try:
+            setslice = type(self._wrapped).__setslice__
+        except AttributeError:
+            return self.__setitem__(slice(start, stop), value)
+        return setslice(self._wrapped, start, stop, value)
+
     def __setitem__(self, key, value):
         self._wrapped[key] = value
 
@@ -246,7 +247,7 @@
         # Called when we wrap an iterator itself.
         return self._wrapped.next()
 
-    def __next__(self): #pragma NO COVER Python3
+    def __next__(self): # pragma: no cover Python3
         return self._wrapped.__next__()
 
     # Python 2.7 won't let the C wrapper support __reversed__ :(
@@ -311,11 +312,11 @@
     def __floordiv__(self, other):
         return self._wrapped // other
 
-    def __truediv__(self, other): #pragma NO COVER
+    def __truediv__(self, other): # pragma: no cover
         # Only one of __truediv__ and __div__ is meaningful at any one time.
         return self._wrapped / other
 
-    def __div__(self, other): #pragma NO COVER
+    def __div__(self, other): # pragma: no cover
         # Only one of __truediv__ and __div__ is meaningful at any one time.
         return self._wrapped / other
 
@@ -342,11 +343,11 @@
     def __rfloordiv__(self, other):
         return other // self._wrapped
 
-    def __rtruediv__(self, other): #pragma NO COVER
+    def __rtruediv__(self, other): # pragma: no cover
         # Only one of __rtruediv__ and __rdiv__ is meaningful at any one time.
         return other / self._wrapped
 
-    def __rdiv__(self, other): #pragma NO COVER
+    def __rdiv__(self, other): # pragma: no cover
         # Only one of __rtruediv__ and __rdiv__ is meaningful at any one time.
         return other / self._wrapped
 
@@ -360,7 +361,7 @@
         if modulus is None:
             return pow(other, self._wrapped)
         # We can't actually get here, because we can't lie about our type()
-        return pow(other, self._wrapped, modulus) #pragma NO COVER
+        return pow(other, self._wrapped, modulus) # pragma: no cover
 
     # Numeric protocol:  binary bitwise operators
     def __lshift__(self, other):
@@ -406,12 +407,12 @@
         self._wrapped *= other
         return self
 
-    def __idiv__(self, other): #pragma NO COVER
+    def __idiv__(self, other): # pragma: no cover
         # Only one of __itruediv__ and __idiv__ is meaningful at any one time.
         self._wrapped /= other
         return self
 
-    def __itruediv__(self, other): #pragma NO COVER
+    def __itruediv__(self, other): # pragma: no cover
         # Only one of __itruediv__ and __idiv__ is meaningful at any one time.
         self._wrapped /= other
         return self
@@ -447,7 +448,7 @@
     def __ipow__(self, other, modulus=None):
         if modulus is None:
             self._wrapped **= other
-        else: #pragma NO COVER
+        else: # pragma: no cover
             # There is no syntax which triggers in-place pow w/ modulus
             self._wrapped = pow(self._wrapped, other, modulus)
         return self
@@ -514,12 +515,12 @@
 if 'PURE_PYTHON' not in os.environ:
     try:
         from zope.proxy._zope_proxy_proxy import ProxyBase as _c_available
-    except ImportError: #pragma NO COVER
+    except ImportError: # pragma: no cover
         pass
 
 class PyNonOverridable(object):
     "Deprecated, only for BWC."
-    def __init__(self, method_desc): #pragma NO COVER PyPy
+    def __init__(self, method_desc): # pragma: no cover PyPy
         self.desc = method_desc
 
 if _c_available:
@@ -536,7 +537,7 @@
     # API for proxy-using C extensions.
     from zope.proxy._zope_proxy_proxy import _CAPI
 
-else: #pragma NO COVER
+else: # pragma: no cover
     # no C extension available, fall back
     ProxyBase = PyProxyBase
     getProxiedObject = py_getProxiedObject
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope/proxy/_compat.py 
new/zope.proxy-4.3.1/src/zope/proxy/_compat.py
--- old/zope.proxy-4.2.1/src/zope/proxy/_compat.py      2017-04-23 
18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope/proxy/_compat.py      2018-08-09 
16:31:21.000000000 +0200
@@ -1,10 +1,3 @@
 import sys
 
 PY3 = sys.version_info[0] >= 3
-
-if PY3: # pragma NO COVER
-    def _u(s):
-        return s
-else:
-    def _u(s):
-        return unicode(s, 'unicode_escape')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope/proxy/_zope_proxy_proxy.c 
new/zope.proxy-4.3.1/src/zope/proxy/_zope_proxy_proxy.c
--- old/zope.proxy-4.2.1/src/zope/proxy/_zope_proxy_proxy.c     2017-04-23 
18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope/proxy/_zope_proxy_proxy.c     2018-08-09 
16:31:21.000000000 +0200
@@ -45,10 +45,6 @@
 
 // Compatibility with Python 2
 #if PY_MAJOR_VERSION < 3
-  #define IS_STRING PyString_Check
-
-  #define MAKE_STRING(name) PyString_AS_STRING(name)
-
   #define MOD_ERROR_VAL
 
   #define MOD_SUCCESS_VAL(val)
@@ -59,12 +55,6 @@
           ob = Py_InitModule3(name, methods, doc);
 
 #else
-
-  #define IS_STRING PyUnicode_Check
-
-  #define MAKE_STRING(name) PyBytes_AS_STRING( \
-          PyUnicode_AsUTF8String(name))
-
   #define MOD_ERROR_VAL NULL
 
   #define MOD_SUCCESS_VAL(val) val
@@ -182,6 +172,7 @@
 static void
 wrap_dealloc(PyObject *self)
 {
+    PyObject_GC_UnTrack(self);
     (void) wrap_clear(self);
     self->ob_type->tp_free(self);
 }
@@ -243,26 +234,15 @@
     const char *name_as_string;
     int maybe_special_name;
 
-#if PY_MAJOR_VERSION < 3 && defined(Py_USING_UNICODE)
-    /* The Unicode to string conversion is done here because the
-       existing tp_setattro slots expect a string object as name
-       (except under Python 3) and we wouldn't want to break those. */
-    if (PyUnicode_Check(name)) {
-        name = PyUnicode_AsEncodedString(name, NULL, NULL);
-        if (name == NULL)
-            return NULL;
-    }
-    else
+#if PY_MAJOR_VERSION < 3
+    name_as_string = PyString_AsString(name);
+#else
+    name_as_string = PyUnicode_AsUTF8(name);
 #endif
 
-    if (!IS_STRING(name)){
-        PyErr_SetString(PyExc_TypeError, "attribute name must be string");
+    if (name_as_string == NULL) {
         return NULL;
     }
-    else
-        Py_INCREF(name);
-
-    name_as_string = MAKE_STRING(name);
 
     wrapped = Proxy_GET_OBJECT(self);
     if (wrapped == NULL) {
@@ -314,7 +294,6 @@
     res = PyObject_GetAttr(wrapped, name);
 
 finally:
-    Py_DECREF(name);
     return res;
 }
 
@@ -326,25 +305,15 @@
     const char *name_as_string;
     int res = -1;
 
-#if PY_MAJOR_VERSION < 3 && defined(Py_USING_UNICODE)
-    /* The Unicode to string conversion is done here because the
-       existing tp_setattro slots expect a string object as name
-       (except under Python 3) and we wouldn't want to break those. */
-
-    if (PyUnicode_Check(name)) {
-        name = PyUnicode_AsEncodedString(name, NULL, NULL);
-        if (name == NULL)
-            return -1;
-    }
-    else
+#if PY_MAJOR_VERSION < 3
+    name_as_string = PyString_AsString(name);
+#else
+    name_as_string = PyUnicode_AsUTF8(name);
 #endif
 
-    if (!IS_STRING(name)){
-        PyErr_SetString(PyExc_TypeError, "attribute name must be string");
-        return -1;
+    if (name_as_string == NULL) {
+        return NULL;
     }
-    else
-        Py_INCREF(name);
 
     descriptor = WrapperType_Lookup(self->ob_type, name);
 
@@ -358,8 +327,6 @@
         goto finally;
       }
 
-    name_as_string = MAKE_STRING(name);
-
     wrapped = Proxy_GET_OBJECT(self);
     if (wrapped == NULL) {
         PyErr_Format(PyExc_RuntimeError,
@@ -370,7 +337,6 @@
     res = PyObject_SetAttr(wrapped, name, value);
 
 finally:
-    Py_DECREF(name);
     return res;
 }
 
@@ -705,16 +671,22 @@
 static PyObject *
 wrap_slice(PyObject *self, Py_ssize_t start, Py_ssize_t end)
 {
+    /*
+     * Note that we have arrived here through PySequence_GetSlice
+     * once already, which on Python 2 adjusted indices. We can't call
+     * PySequence_GetSlice again or they will be wrong. So we directly
+     * call the slice method the type provides.
+     */
     PyObject *obj = Proxy_GET_OBJECT(self);
-    if (PyList_Check(obj)) {
-        return PyList_GetSlice(obj, start, end);
-    }
-    else if (PyTuple_Check(obj)) {
-        return PyTuple_GetSlice(obj, start, end);
-    }
-    else {
-        return PySequence_GetSlice(obj, start, end);
+#if PY_MAJOR_VERSION < 3
+    PySequenceMethods *m;
+
+    m = obj->ob_type->tp_as_sequence;
+    if (m && m->sq_slice) {
+        return m->sq_slice(obj, start, end);
     }
+#endif
+       return PySequence_GetSlice(obj, start, end);
 }
 
 static int
@@ -1251,4 +1223,3 @@
     return MOD_SUCCESS_VAL(m);
 
 }
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope/proxy/tests/test_proxy.py 
new/zope.proxy-4.3.1/src/zope/proxy/tests/test_proxy.py
--- old/zope.proxy-4.2.1/src/zope/proxy/tests/test_proxy.py     2017-04-23 
18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope/proxy/tests/test_proxy.py     2018-08-09 
16:31:21.000000000 +0200
@@ -17,11 +17,12 @@
 
 try:
     import zope.security
-except ImportError:
+except ImportError: # pragma: no cover
     _HAVE_ZOPE_SECURITY = False
 else:
     _HAVE_ZOPE_SECURITY = True
 
+from zope.proxy._compat import PY3
 
 class ModuleConformanceCase(unittest.TestCase):
 
@@ -34,6 +35,11 @@
 
 class PyProxyBaseTestCase(unittest.TestCase):
 
+    # Names of special methods
+    getslice = '__getitem__' if PY3 else '__getslice__'
+    setslice = '__setitem__' if PY3 else '__setslice__'
+
+
     def _getTargetClass(self):
         from zope.proxy import PyProxyBase
         return PyProxyBase
@@ -82,11 +88,6 @@
         proxy = MyProxy3('notused')
         self.assertEqual(list(proxy), list('another'))
 
-    def test_string_to_int(self):
-        # Strings don't have the tp_number.tp_int pointer
-        proxy = self._makeOne("14")
-        self.assertEqual(14, int(proxy))
-
     def test_custom_int_to_int(self):
         class CustomClass(object):
             def __int__(self):
@@ -113,31 +114,24 @@
         proxy = self._makeOne(CustomClass())
         self.assertEqual(42.0, float(proxy))
 
+    @unittest.skipIf(PY3, "Gone in Py3")
     def test___unicode__of_unicode(self):
-        from zope.proxy._compat import PY3, _u
-        if PY3: # Gone in Python 3:
-            return
-        s = _u('Hello, \u2603')
+        s = u'Hello, \u2603'
         proxy = self._makeOne(s)
         self.assertEqual(unicode(proxy), s)
 
+    @unittest.skipIf(PY3, "Gone in Py3")
     def test___unicode__of_custom_class(self):
-        from zope.proxy._compat import PY3, _u
-        if PY3: # Gone in Python 3:
-            return
         class CustomClass(object):
             def __unicode__(self):
-                return _u('Hello, \u2603')
+                return u'Hello, \u2603'
         cc = CustomClass()
-        self.assertEqual(unicode(cc), _u('Hello, \u2603'))
+        self.assertEqual(unicode(cc), u'Hello, \u2603')
         proxy = self._makeOne(cc)
-        self.assertEqual(unicode(proxy), _u('Hello, \u2603'))
+        self.assertEqual(unicode(proxy), u'Hello, \u2603')
 
+    @unittest.skipIf(PY3, "Gone in Py3")
     def test___unicode__of_custom_class_no_unicode(self):
-        # The default behaviour should be preserved
-        from zope.proxy._compat import PY3, _u
-        if PY3: # Gone in Python 3:
-            return
         class CustomClass(object):
             pass
         cc = CustomClass()
@@ -152,43 +146,40 @@
         proxy = self._makeOne(_foo)
         self.assertEqual(proxy(), 'FOO')
 
+    @unittest.skipIf(PY3, "Gone in Py3")
     def test_callable(self):
-        from zope.proxy._compat import PY3
-        if not PY3: # Gone in Python 3:
-            w = self._makeOne({}.get)
-            self.assertTrue(callable(w))
+        w = self._makeOne({}.get)
+        self.assertTrue(callable(w))
 
     def test___repr__(self):
         def _foo():
-            return 'FOO'
+            raise AssertionError("Not called")
         proxy = self._makeOne(_foo)
         self.assertEqual(repr(proxy), repr(_foo))
 
     def test___str__(self):
         def _foo():
-            return 'FOO'
+            raise AssertionError("Not called")
         proxy = self._makeOne(_foo)
         self.assertEqual(str(proxy), str(_foo))
 
+    @unittest.skipIf(PY3, "Gone in Py3")
     def test___unicode__(self):
-        from zope.proxy._compat import PY3
-        if PY3: # Gone in Python 3:
-            return
         def _foo():
-            return 'FOO'
+            raise AssertionError("Not called")
         proxy = self._makeOne(_foo)
         self.assertTrue(unicode(proxy).startswith('<function _foo'))
 
+    @unittest.skipIf(PY3, "No old-style classes in Python 3")
     def test___reduce___via_pickling(self):
         import pickle
-        from zope.proxy._compat import PY3
+
         # Proxies of old-style classes can't be pickled.
-        if not PY3: # No old-style classes in Python 3.
-            class Thing:
-                """This class is expected to be a classic class."""
-            w = self._makeOne(Thing())
-            self.assertRaises(pickle.PicklingError,
-                              pickle.dumps, w)
+        class Thing:
+            """This class is expected to be a classic class."""
+        w = self._makeOne(Thing())
+        self.assertRaises(pickle.PicklingError,
+                          pickle.dumps, w)
 
     def test___eq___and___ne__(self):
         w = self._makeOne('foo')
@@ -270,7 +261,7 @@
     def test___getattr__delegates_to_wrapped_when_conflict(self):
         class Proxy(self._getTargetClass()):
             def foo(self):
-                return 'PROXY'
+                raise AssertionError("Not called")
         class Foo(object):
             def foo(self):
                 return 'FOO'
@@ -352,36 +343,73 @@
         self.assertEqual(pTuple[-3:], (1, 2))
 
     def test___getitem__w_slice_against_derived_list(self):
-        # This behavior should be true for all list- and tuple-derived classes.
+        data = [1, 2]
         class DerivedList(list):
-            def __getslice__(self, start, end, step=None):
-                return (start, end, step)
+            def __getslice__(self, start, stop):
+                return list.__getslice__(self, start, stop)
 
-        pList = self._makeOne(DerivedList([1, 2]))
-        self.assertEqual(pList[-1:], [2])
-        self.assertEqual(pList[-2:], [1, 2])
-        self.assertEqual(pList[-3:], [1, 2])
+        pList = self._makeOne(DerivedList(data))
+
+        self.assertEqual(pList[-1:], data[-1:])
+        self.assertEqual(pList[-2:], data[-2:])
+        self.assertEqual(pList[-3:], data[-3:])
 
     def test___getitem__w_slice_against_class_w_custom___getslice__(self):
-        # moot under Python 3, where __getslice__ isn't supported.
-        from zope.proxy._compat import PY3
-        if not PY3:
-            class Slicer(object):
-                def __len__(self):
-                    return 2
-                def __getslice__(self, start, end, step=None):
-                    return (start, end, step)
-
-            pSlicer = self._makeOne(Slicer())
-            self.assertEqual(pSlicer[:1][0], 0)
-            self.assertEqual(pSlicer[:1][1], 1)
-            self.assertEqual(pSlicer[:-1][0], 0)
-            self.assertEqual(pSlicer[:-1][1], 1)
-            self.assertEqual(pSlicer[-1:][0], 1)
-            self.assertEqual(pSlicer[-2:][0], 0)
-            # Note that for non-lists and non-tuples the slice is computed
-            # differently
-            self.assertEqual(pSlicer[-3:][0], 1)
+        import sys
+        test = self
+        class Slicer(object):
+            def __len__(self):
+                return 2
+
+            def __getslice__(self, start, end):
+                return (start, end)
+
+            def __getitem__(self, a_slice): # pragma: no cover
+                test.assertTrue(PY3)
+                # On Python 3, we basically just return what the test expects.
+                # Mostly that's the computed indices (yay!) but there are
+                # a few special cases.
+                indices = a_slice.indices(len(self))
+                return (indices[0] if a_slice.start != -3 else -1,
+                        indices[-1] if a_slice.stop is not None else 
sys.maxsize)
+
+        pSlicer = self._makeOne(Slicer())
+        self.assertEqual(pSlicer[:1][0], 0)
+        self.assertEqual(pSlicer[:1][1], 1)
+        self.assertEqual(pSlicer[:-1][0], 0)
+        self.assertEqual(pSlicer[:-1][1], 1)
+        self.assertEqual(pSlicer[-1:][0], 1)
+        self.assertEqual(pSlicer[-2:][0], 0)
+        self.assertEqual(pSlicer[-3:], (-1, sys.maxsize))
+
+    def test___getslice___dne_uses_getitem(self):
+        class Missing(Exception):
+            pass
+        class Get(object):
+            def __getitem__(self, x):
+                raise Missing('__getitem__')
+
+        target = Get()
+        proxy = self._makeOne(target)
+        with self.assertRaisesRegexp(Missing,
+                                     '__getitem__'):
+            proxy[1:2]
+
+    def test___getslice___error_propagates(self):
+        test = self
+        class Missing(Exception):
+            pass
+        class Get(object):
+            def __getitem__(self, x): # pragma: no cover (only py3)
+                test.assertTrue(PY3)
+                raise Missing('__getitem__')
+            def __getslice__(self, start, stop):
+                raise Missing("__getslice__")
+        target = Get()
+        proxy = self._makeOne(target)
+        with self.assertRaisesRegexp(Missing,
+                                     self.getslice):
+            proxy[1:2]
 
     def test___setslice___against_list(self):
         # Lists have special slicing bahvior for assignment as well.
@@ -410,6 +438,34 @@
         pList[-3:] = [3, 4]
         self.assertEqual(pList, [3, 4])
 
+    def test___setslice___error_propagates(self):
+        class Missing(Exception):
+            pass
+        class Set(object):
+            def __setitem__(self, k, v):
+                raise Missing('__setitem__') # pragma: no cover (only py3)
+            def __setslice__(self, start, stop, value):
+                raise Missing("__setslice__")
+        target = Set()
+        proxy = self._makeOne(target)
+        with self.assertRaisesRegexp(Missing,
+                                     self.setslice):
+            proxy[1:2] = 1
+
+    def test___setslice___dne_uses_setitem(self):
+        class Missing(Exception):
+            pass
+        class Set(object):
+            def __setitem__(self, k, v):
+                raise Missing('__setitem__')
+
+        target = Set()
+        proxy = self._makeOne(target)
+        with self.assertRaisesRegexp(Missing,
+                                     '__setitem__'):
+            proxy[1:2] = 1
+
+
     def test___iter___w_wrapped_iterable(self):
         a = [1, 2, 3]
         b = []
@@ -434,7 +490,7 @@
             def __iter__(self):
                 return self
             def __next__(self):
-                return 42
+                raise AssertionError("Not called")
             next = __next__
         myIter = MyIter()
         p = self._makeOne(myIter)
@@ -478,7 +534,6 @@
 
     @property
     def unops(self):
-        from zope.proxy._compat import PY3
         ops = [
             "-x",
             "+x",
@@ -502,7 +557,6 @@
                              "x=%r; expr=%r" % (x, expr))
 
     def test_odd_unops(self):
-        from zope.proxy._compat import PY3
         # unops that don't return a proxy
         funcs = (lambda x: not x,)
         if not PY3:
@@ -576,10 +630,8 @@
         pa ^= 2
         self.assertEqual(pa, 20)
 
+    @unittest.skipIf(PY3, "No coercion in Py3")
     def test_coerce(self):
-        from zope.proxy._compat import PY3
-        if PY3: # No coercion in Python 3
-            return
         # Before 2.3, coerce() of two proxies returns them unchanged
 
         x = self._makeOne(1)
@@ -592,7 +644,7 @@
         a, b = coerce(x, y)
         self.assertTrue(isinstance(a, float)) # a was coerced
         self.assertFalse(a is x)
-        self.assertEqual(a,  float(x))
+        self.assertEqual(a, float(x))
         self.assertTrue(b is y)
 
         x = self._makeOne(1.1)
@@ -601,7 +653,7 @@
         self.assertTrue(a is x)
         self.assertTrue(isinstance(b, float)) # b was coerced
         self.assertFalse(b is y)
-        self.assertEqual(b,  float(y))
+        self.assertEqual(b, float(y))
 
         x = self._makeOne(1)
         y = 2
@@ -614,7 +666,7 @@
         a, b = coerce(x, y)
         self.assertTrue(isinstance(a, float)) # a was coerced
         self.assertFalse(a is x)
-        self.assertEqual(a,  float(x))
+        self.assertEqual(a, float(x))
         self.assertTrue(b is y)
 
         x = self._makeOne(1.1)
@@ -623,7 +675,7 @@
         self.assertTrue(a is x)
         self.assertTrue(isinstance(b, float)) # b was coerced
         self.assertFalse(b is y)
-        self.assertEqual(b,  float(y))
+        self.assertEqual(b,float(y))
 
         x = 1
         y = self._makeOne(2)
@@ -741,19 +793,13 @@
             provided_instance = providedBy(proxy_instance)
             self.assertTrue(IFoo in list(provided_instance))
 
-            # XXX: PyPy 2.5.0 has a bug where proxys around types
-            # aren't correctly hashable, which breaks this part of the
-            # test. This is fixed in 2.5.1, but as of 2015-05-28,
-            # TravisCI still uses 2.5.0.
             proxy_type = proxy_class(builtin_type)
             from zope.interface.declarations import 
BuiltinImplementationSpecifications
-            if proxy_type in BuiltinImplementationSpecifications \
-               and BuiltinImplementationSpecifications.get(proxy_type, self) 
is not self:
-                provided_type = implementedBy(proxy_type)
-                self.assertTrue(IFoo in list(provided_type))
-            else:
-                import sys
-                self.assertEqual((2,5,0), sys.pypy_version_info[:3])
+            self.assertIn(proxy_type, BuiltinImplementationSpecifications)
+            
self.assertIsNot(BuiltinImplementationSpecifications.get(proxy_type, self),
+                             self)
+            provided_type = implementedBy(proxy_type)
+            self.assertTrue(IFoo in list(provided_type))
         finally:
             classImplementsOnly(builtin_type, *impl_before)
 
@@ -767,7 +813,7 @@
         self._check_wrapping_builtin_returns_correct_provided_by(Proxy, 
builtin_type)
         # Our new class did not gain an __implemented__ attribute, unless we're
         # the pure-python version
-        if hasattr(Proxy, '__implemented__'):
+        if hasattr(Proxy, '__implemented__'): # pragma: no cover
             from zope.proxy import PyProxyBase
             self.assertTrue(self._getTargetClass() is PyProxyBase)
 
@@ -787,15 +833,8 @@
         self.assertNotEqual(getattr(proxy, '__getitem__'), self)
 
     def test_string_to_int(self):
-        # XXX Implementation difference: This works in the
-        # Pure-Python version, but fails in CPython.
-        # See https://github.com/zopefoundation/zope.proxy/issues/4
         proxy = self._makeOne("14")
-        try:
-            self.assertEqual(14, int(proxy))
-        except TypeError:
-            from zope.proxy import PyProxyBase
-            self.assertNotEqual(self._getTargetClass(), PyProxyBase)
+        self.assertEqual(14, int(proxy))
 
 class ProxyBaseTestCase(PyProxyBaseTestCase):
 
@@ -874,14 +913,14 @@
 class Test_py_subclass__module(Test_py__module):
 
     def _getTargetClass(self):
-        class 
ProxySubclass(super(Test_py_subclass__module,self)._getTargetClass()):
+        class ProxySubclass(super(Test_py_subclass__module, 
self)._getTargetClass()):
             pass
         return ProxySubclass
 
 class Test_subclass__module(Test__module):
 
     def _getTargetClass(self):
-        class 
ProxySubclass(super(Test_subclass__module,self)._getTargetClass()):
+        class ProxySubclass(super(Test_subclass__module, 
self)._getTargetClass()):
             pass
         return ProxySubclass
 
@@ -1287,7 +1326,7 @@
         self.assertTrue(self._callFUT(proxy3, P2, 42) is proxy2)
 
 
-class Test_queryInnerProxy(unittest.TestCase):
+class Test_queryInnerProxy(Test_py_queryInnerProxy):
 
     def _callFUT(self, *args):
         from zope.proxy import queryInnerProxy
@@ -1340,9 +1379,9 @@
             pass
         c = C()
         proxy = self._makeSecurityProxy(c)
-        self.assertTrue(self._callFUT(proxy) is c)
+        self.assertIs(self._callFUT(proxy), c)
 
-class Test_removeAllProxies(unittest.TestCase):
+class Test_removeAllProxies(Test_py_removeAllProxies):
 
     def _callFUT(self, *args):
         from zope.proxy import removeAllProxies
@@ -1352,6 +1391,11 @@
         from zope.proxy import ProxyBase
         return ProxyBase(obj)
 
+    def _makeSecurityProxy(self, obj):
+        from zope.security.proxy import Proxy
+        checker = object()
+        return Proxy(obj, checker)
+
 class Test_ProxyIterator(unittest.TestCase):
 
     def _callFUT(self, *args):
@@ -1392,7 +1436,7 @@
         from zope.proxy import non_overridable
         class Proxy(ProxyBase):
             def who(self):
-                return 'PROXY'
+                raise AssertionError("Not called")
             @non_overridable
             def what(self):
                 return 'PROXY'
@@ -1409,6 +1453,31 @@
         self.assertEqual(proxy.what(), 'PROXY')
 
 
+class TestEmptyInterfaceDescriptor(unittest.TestCase):
+
+    def _makeOne(self):
+        from zope.proxy import _EmptyInterfaceDescriptor
+        class It(object):
+            feature = _EmptyInterfaceDescriptor()
+        return It()
+
+    def test_set(self):
+        it = self._makeOne()
+        with self.assertRaises(TypeError):
+            it.feature = 42
+
+    def test_delete(self):
+        it = self._makeOne()
+        del it.feature
+        with self.assertRaises(AttributeError):
+            getattr(it, 'feature')
+
+    def test_iter(self):
+        it = type(self._makeOne())
+        feature = it.__dict__['feature']
+        self.assertEqual([], list(feature))
+
+
 class Comparable(object):
     def __init__(self, value):
         self.value = value
@@ -1431,7 +1500,7 @@
     def __gt__(self, other):
         return not self.__le__(other)
 
-    def __repr__(self):
+    def __repr__(self): # pragma: no cover
         return "<Comparable: %r>" % self.value
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope.proxy.egg-info/PKG-INFO 
new/zope.proxy-4.3.1/src/zope.proxy.egg-info/PKG-INFO
--- old/zope.proxy-4.2.1/src/zope.proxy.egg-info/PKG-INFO       2017-04-23 
18:54:32.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope.proxy.egg-info/PKG-INFO       2018-08-09 
16:31:21.000000000 +0200
@@ -1,8 +1,8 @@
-Metadata-Version: 1.1
+Metadata-Version: 2.1
 Name: zope.proxy
-Version: 4.2.1
+Version: 4.3.1
 Summary: Generic Transparent Proxies
-Home-page: http://pypi.python.org/pypi/zope.proxy
+Home-page: http://github.com/zopefoundation/zope.proxy
 Author: Zope Foundation and Contributors
 Author-email: [email protected]
 License: ZPL 2.1
@@ -13,7 +13,7 @@
             :target: https://pypi.python.org/pypi/zope.proxy/
             :alt: Latest Version
         
-        .. image:: 
https://travis-ci.org/zopefoundation/zope.proxy.png?branch=master
+        .. image:: 
https://travis-ci.org/zopefoundation/zope.proxy.svg?branch=master
                 :target: https://travis-ci.org/zopefoundation/zope.proxy
         
         .. image:: 
https://readthedocs.org/projects/zopeproxy/badge/?version=latest
@@ -28,12 +28,48 @@
         zope.proxy is implemented via a C extension module, which lets it do 
things
         like lie about its own ``__class__`` that are difficult in pure Python 
(and
         were completely impossible before metaclasses).  It also proxies all 
the
-        internal slots (such as `__int__`/`__str__`/`__add__`).
+        internal slots (such as ``__int__``/``__str__``/``__add__``).
+        
+        Complete documentation is at https://zopeproxy.readthedocs.io
         
         
         Changes
         =======
         
+        4.3.1 (2018-08-09)
+        ------------------
+        
+        - Simplify the internal C handling of attribute names in
+          ``__getattribute__`` and ``__setattr__``.
+        
+        - Make building the C extension optional. We still attempt to build it
+          on supported platforms, but we allow it to fail in case of a missing
+          compiler or headers. See `issue 26
+          <https://github.com/zopefoundation/zope.proxy/issues/26>`_.
+        
+        - Test the PURE_PYTHON environment and PyPy3 on Travis CI.
+        
+        - Add support for Python 3.7.
+        
+        4.3.0 (2017-09-13)
+        ------------------
+        
+        - Fix a potential rare crash when deallocating proxies. See `issue 20
+          <https://github.com/zopefoundation/zope.proxy/issues/20>`_.
+        
+        - Drop support for Python 3.3.
+        
+        - Drop support for "python setup.py test".
+        
+        - 100% test coverage.
+        
+        - Fix indexing pure-Python proxies with slices under Python 3, and
+          restore the use of ``__getslice__`` (if implemented by the target's
+          type) under Python 2. Previously, pure-Python proxies would fail
+          with an AttributeError when given a slice on Python 3, and on Python
+          2, a custom ``__getslice__`` was ignored. See `issue 21
+          <https://github.com/zopefoundation/zope.proxy/issues/21>`_.
+        
         4.2.1 (2017-04-23)
         ------------------
         
@@ -229,12 +265,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 :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
 Classifier: Framework :: Zope3
 Classifier: Natural Language :: English
 Classifier: Operating System :: OS Independent
+Provides-Extra: test
+Provides-Extra: docs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/src/zope.proxy.egg-info/SOURCES.txt 
new/zope.proxy-4.3.1/src/zope.proxy.egg-info/SOURCES.txt
--- old/zope.proxy-4.2.1/src/zope.proxy.egg-info/SOURCES.txt    2017-04-23 
18:54:32.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope.proxy.egg-info/SOURCES.txt    2018-08-09 
16:31:21.000000000 +0200
@@ -1,8 +1,11 @@
+.coveragerc
+.travis.yml
 CHANGES.rst
 COPYRIGHT.txt
 LICENSE.txt
 MANIFEST.in
 README.rst
+appveyor.yml
 bootstrap.py
 buildout.cfg
 rtd.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/zope.proxy-4.2.1/src/zope.proxy.egg-info/requires.txt 
new/zope.proxy-4.3.1/src/zope.proxy.egg-info/requires.txt
--- old/zope.proxy-4.2.1/src/zope.proxy.egg-info/requires.txt   2017-04-23 
18:54:32.000000000 +0200
+++ new/zope.proxy-4.3.1/src/zope.proxy.egg-info/requires.txt   2018-08-09 
16:31:21.000000000 +0200
@@ -7,8 +7,4 @@
 
 [test]
 zope.security
-
-[testing]
-nose
-coverage
-zope.security
+zope.testrunner
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/zope.proxy-4.2.1/tox.ini new/zope.proxy-4.3.1/tox.ini
--- old/zope.proxy-4.2.1/tox.ini        2017-04-23 18:54:31.000000000 +0200
+++ new/zope.proxy-4.3.1/tox.ini        2018-08-09 16:31:21.000000000 +0200
@@ -1,47 +1,25 @@
 [tox]
 envlist =
-# Jython support pending 2.7 support, due 2012-07-15 or so.  See:
-# http://fwierzbicki.blogspot.com/2012/03/adconion-to-fund-jython-27.html
-#   py27,jython,pypy,coverage
-    py27,py27-pure,py33,py33-pure,py34,py35,py36,pypy,coverage,docs
+    py27,py27-pure,py34,py35,py36,py36-pure,py37,pypy,coverage,docs
 
 [testenv]
-commands =
-    zope-testrunner --test-path=src
 deps =
-     .[test]
-     zope.testrunner
-
-[testenv:py27-pure]
-basepython =
-    python2.7
-setenv =
-    PURE_PYTHON = 1
-    PIP_CACHE_DIR = {envdir}/.cache
-
-[testenv:py33-pure]
-basepython =
-    python3.3
-setenv =
-    PURE_PYTHON = 1
-    PIP_CACHE_DIR = {envdir}/.cache
-
-[testenv:jython]
+    .[test,docs]
 commands =
-   jython setup.py test -q
+    zope-testrunner --test-path=src
+    sphinx-build -b doctest -d {envdir}/doctrees docs {envdir}/doctest
 
 [testenv:coverage]
+usedevelop = true
 basepython =
     python2.7
 commands =
-#   The installed version messes up nose's test discovery / coverage reporting
-#   So, we uninstall that from the environment, and then install the editable
-#   version, before running nosetests.
-    pip uninstall -y zope.proxy
-    pip install -e .
-    nosetests --with-xunit --with-xcoverage
+    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
 deps =
-    .[testing]
+    {[testenv]deps}
+    coverage
 
 [testenv:docs]
 basepython =
@@ -50,5 +28,16 @@
     sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
     sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
 deps =
-    Sphinx
-    repoze.sphinx.autointerface
+    .[test,docs]
+
+[testenv:py27-pure]
+basepython =
+    python2.7
+setenv =
+    PURE_PYTHON = 1
+
+[testenv:py36-pure]
+basepython =
+    python3.6
+setenv =
+    PURE_PYTHON = 1


Reply via email to