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
+
+- 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: zope-dev@zope.org
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='zope-dev@zope.org',
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('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 "" % 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: zope-dev@zope.org
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