Hello community,
here is the log from the commit of package python-zope.interface for
openSUSE:Factory checked in at 2019-12-11 12:10:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-zope.interface (Old)
and /work/SRC/openSUSE:Factory/.python-zope.interface.new.4691 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-zope.interface"
Wed Dec 11 12:10:28 2019 rev:23 rq:755107 version:4.7.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-zope.interface/python-zope.interface.changes
2019-04-09 20:17:43.545744015 +0200
+++
/work/SRC/openSUSE:Factory/.python-zope.interface.new.4691/python-zope.interface.changes
2019-12-11 12:11:39.792575344 +0100
@@ -1,0 +2,10 @@
+Mon Dec 9 05:21:39 UTC 2019 - Steve Kowalik <[email protected]>
+
+- update to 4.7.1:
+ * Use Python 3 syntax in the documentation. See issue 119.
+ * Drop support for Python 3.4.
+ * Fix queryTaggedValue, getTaggedValue, getTaggedValueTags subclass
+ inheritance. See PR 144.
+ * Add support for Python 3.8.
+
+-------------------------------------------------------------------
Old:
----
zope.interface-4.6.0.tar.gz
New:
----
zope.interface-4.7.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-zope.interface.spec ++++++
--- /var/tmp/diff_new_pack.71SJqG/_old 2019-12-11 12:11:42.164574346 +0100
+++ /var/tmp/diff_new_pack.71SJqG/_new 2019-12-11 12:11:42.164574346 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-zope.interface
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
%global modname zope.interface
%define oldpython python
Name: python-zope.interface
-Version: 4.6.0
+Version: 4.7.1
Release: 0
Summary: Interfaces for Python
License: ZPL-2.1
++++++ zope.interface-4.6.0.tar.gz -> zope.interface-4.7.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/.manylinux-install.sh
new/zope.interface-4.7.1/.manylinux-install.sh
--- old/zope.interface-4.6.0/.manylinux-install.sh 2018-10-23
22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/.manylinux-install.sh 2019-11-11
17:56:56.000000000 +0100
@@ -5,13 +5,13 @@
# Compile wheels
for PYBIN in /opt/python/*/bin; do
if [[ "${PYBIN}" == *"cp27"* ]] || \
- [[ "${PYBIN}" == *"cp34"* ]] || \
[[ "${PYBIN}" == *"cp35"* ]] || \
[[ "${PYBIN}" == *"cp36"* ]] || \
- [[ "${PYBIN}" == *"cp37"* ]]; then
+ [[ "${PYBIN}" == *"cp37"* ]] || \
+ [[ "${PYBIN}" == *"cp38"* ]]; then
"${PYBIN}/pip" install -e /io/
"${PYBIN}/pip" wheel /io/ -w wheelhouse/
- rm -rf /io/build /io/*.egg-info
+ rm -rf /io/build /io/*.egg-info
fi
done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/.manylinux.sh
new/zope.interface-4.7.1/.manylinux.sh
--- old/zope.interface-4.6.0/.manylinux.sh 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/.manylinux.sh 2019-11-11 17:56:56.000000000
+0100
@@ -2,8 +2,4 @@
set -e -x
-docker pull $DOCKER_IMAGE
-
-docker run --rm -v `pwd`:/io $DOCKER_IMAGE $PRE_CMD /io/.manylinux-install.sh
-
-pip install twine && twine upload -u zope.wheelbuilder -p $PYPIPASSWORD
wheelhouse/*
+docker run --rm -v "$(pwd)":/io $DOCKER_IMAGE $PRE_CMD
/io/.manylinux-install.sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/CHANGES.rst
new/zope.interface-4.7.1/CHANGES.rst
--- old/zope.interface-4.6.0/CHANGES.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/CHANGES.rst 2019-11-11 17:56:56.000000000
+0100
@@ -1,6 +1,25 @@
Changes
=======
+4.7.1 (2019-11-11)
+------------------
+
+- Use Python 3 syntax in the documentation. See `issue 119
+ <https://github.com/zopefoundation/zope.interface/issue/119>`_.
+
+
+4.7.0 (2019-11-11)
+------------------
+
+- Drop support for Python 3.4.
+
+- Fix ``queryTaggedValue``, ``getTaggedValue``, ``getTaggedValueTags``
+ subclass inheritance. See `PR 144
+ <https://github.com/zopefoundation/zope.interface/pull/144>`_.
+
+- Add support for Python 3.8.
+
+
4.6.0 (2018-10-23)
------------------
@@ -10,6 +29,7 @@
Python 3. See `issue 126
<https://github.com/zopefoundation/zope.interface/issues/126>`_.
+
4.5.0 (2018-04-19)
------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/PKG-INFO
new/zope.interface-4.7.1/PKG-INFO
--- old/zope.interface-4.6.0/PKG-INFO 2018-10-23 22:17:48.000000000 +0200
+++ new/zope.interface-4.7.1/PKG-INFO 2019-11-11 17:56:56.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: zope.interface
-Version: 4.6.0
+Version: 4.7.1
Summary: Interfaces for Python
Home-page: https://github.com/zopefoundation/zope.interface
Author: Zope Foundation and Contributors
@@ -40,6 +40,25 @@
Changes
=======
+ 4.7.1 (2019-11-11)
+ ------------------
+
+ - Use Python 3 syntax in the documentation. See `issue 119
+ <https://github.com/zopefoundation/zope.interface/issue/119>`_.
+
+
+ 4.7.0 (2019-11-11)
+ ------------------
+
+ - Drop support for Python 3.4.
+
+ - Fix ``queryTaggedValue``, ``getTaggedValue``, ``getTaggedValueTags``
+ subclass inheritance. See `PR 144
+ <https://github.com/zopefoundation/zope.interface/pull/144>`_.
+
+ - Add support for Python 3.8.
+
+
4.6.0 (2018-10-23)
------------------
@@ -49,6 +68,7 @@
Python 3. See `issue 126
<https://github.com/zopefoundation/zope.interface/issues/126>`_.
+
4.5.0 (2018-04-19)
------------------
@@ -574,15 +594,15 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Framework :: Zope :: 3
Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Provides-Extra: docs
Provides-Extra: test
Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/README.rst
new/zope.interface-4.7.1/docs/README.rst
--- old/zope.interface-4.6.0/docs/README.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/docs/README.rst 2019-11-11 17:56:56.000000000
+0100
@@ -64,7 +64,7 @@
.. doctest::
>>> IFoo.__module__
- '__builtin__'
+ 'builtins'
The interface defined two attributes:
@@ -175,13 +175,13 @@
Declaring implemented interfaces
--------------------------------
-The most common way to declare interfaces is using the implements
-function in a class statement:
+The most common way to declare interfaces is using the `implementer`
+decorator on a class:
.. doctest::
- >>> class Foo:
- ... zope.interface.implements(IFoo)
+ >>> @zope.interface.implementer(IFoo)
+ ... class Foo:
...
... def __init__(self, x=None):
... self.x = x
@@ -223,7 +223,7 @@
.. doctest::
>>> list(zope.interface.implementedBy(Foo))
- [<InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.IFoo>]
It's an error to ask for interfaces implemented by a non-callable
object:
@@ -245,24 +245,23 @@
.. doctest::
>>> list(zope.interface.providedBy(foo))
- [<InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.IFoo>]
>>> list(zope.interface.providedBy(Foo))
[]
We can declare interfaces implemented by other factories (besides
-classes). We do this using a Python-2.4-style decorator named
-`implementer`. In versions of Python before 2.4, this looks like:
+classes). We do this using the same `implementer` decorator.
.. doctest::
- >>> def yfoo(y):
+ >>> @zope.interface.implementer(IFoo)
+ ... def yfoo(y):
... foo = Foo()
... foo.y = y
... return foo
- >>> yfoo = zope.interface.implementer(IFoo)(yfoo)
>>> list(zope.interface.implementedBy(yfoo))
- [<InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.IFoo>]
Note that the implementer decorator may modify its argument. Callers
should not assume that a new object is created.
@@ -281,7 +280,7 @@
>>> yfoo = zope.interface.implementer(IFoo)(yfoo)
>>> list(zope.interface.implementedBy(yfoo))
- [<InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.IFoo>]
XXX: Double check and update these version numbers:
@@ -292,9 +291,9 @@
>>> Foo = zope.interface.implementer(IFoo)(Foo)
>>> list(zope.interface.providedBy(Foo()))
- [<InterfaceClass __builtin__.IFoo>]
-
-Note that class decorators using the ``@implementer(IFoo)`` syntax are only
+ [<InterfaceClass builtins.IFoo>]
+
+Note that class decorators using the ``@implementer(IFoo)`` syntax are only
supported in Python 2.6 and later.
@@ -330,19 +329,18 @@
.. doctest::
>>> list(zope.interface.providedBy(Foo))
- [<InterfaceClass __builtin__.IFooFactory>]
+ [<InterfaceClass builtins.IFooFactory>]
>>> IFooFactory.providedBy(Foo)
True
Declaring class interfaces is common enough that there's a special
-declaration function for it, `classProvides`, that allows the
-declaration from within a class statement:
+decorator for it, `provider`:
.. doctest::
- >>> class Foo2:
- ... zope.interface.implements(IFoo)
- ... zope.interface.classProvides(IFooFactory)
+ >>> @zope.interface.implementer(IFoo)
+ ... @zope.interface.provider(IFooFactory)
+ ... class Foo2:
...
... def __init__(self, x=None):
... self.x = x
@@ -354,7 +352,7 @@
... return "Foo(%s)" % self.x
>>> list(zope.interface.providedBy(Foo2))
- [<InterfaceClass __builtin__.IFooFactory>]
+ [<InterfaceClass builtins.IFooFactory>]
>>> IFooFactory.providedBy(Foo2)
True
@@ -401,14 +399,14 @@
>>> ISpecial.providedBy(foo)
True
>>> list(zope.interface.providedBy(foo))
- [<InterfaceClass __builtin__.ISpecial>, <InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.ISpecial>, <InterfaceClass builtins.IFoo>]
We can find out what interfaces are directly provided by an object:
.. doctest::
>>> list(zope.interface.directlyProvidedBy(foo))
- [<InterfaceClass __builtin__.ISpecial>]
+ [<InterfaceClass builtins.ISpecial>]
>>> newfoo = Foo()
>>> list(zope.interface.directlyProvidedBy(newfoo))
@@ -421,34 +419,34 @@
.. doctest::
- >>> class SpecialFoo(Foo):
- ... zope.interface.implements(ISpecial)
+ >>> @zope.interface.implementer(ISpecial)
+ ... class SpecialFoo(Foo):
... reason = 'I just am'
... def brag(self):
... return "I'm special because %s" % self.reason
>>> list(zope.interface.implementedBy(SpecialFoo))
- [<InterfaceClass __builtin__.ISpecial>, <InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.ISpecial>, <InterfaceClass builtins.IFoo>]
>>> list(zope.interface.providedBy(SpecialFoo()))
- [<InterfaceClass __builtin__.ISpecial>, <InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.ISpecial>, <InterfaceClass builtins.IFoo>]
Sometimes, you don't want to inherit declarations. In that case, you
-can use ``implementsOnly``, instead of ``implements``:
+can use ``implementer_only``, instead of ``implementer``:
.. doctest::
- >>> class Special(Foo):
- ... zope.interface.implementsOnly(ISpecial)
+ >>> @zope.interface.implementer_only(ISpecial)
+ ... class Special(Foo):
... reason = 'I just am'
... def brag(self):
... return "I'm special because %s" % self.reason
>>> list(zope.interface.implementedBy(Special))
- [<InterfaceClass __builtin__.ISpecial>]
+ [<InterfaceClass builtins.ISpecial>]
>>> list(zope.interface.providedBy(Special()))
- [<InterfaceClass __builtin__.ISpecial>]
+ [<InterfaceClass builtins.ISpecial>]
External declarations
---------------------
@@ -466,7 +464,7 @@
>>> zope.interface.classImplements(C, IFoo)
>>> list(zope.interface.implementedBy(C))
- [<InterfaceClass __builtin__.IFoo>]
+ [<InterfaceClass builtins.IFoo>]
We can use ``classImplementsOnly`` to exclude inherited interfaces:
@@ -477,7 +475,7 @@
>>> zope.interface.classImplementsOnly(C, ISpecial)
>>> list(zope.interface.implementedBy(C))
- [<InterfaceClass __builtin__.ISpecial>]
+ [<InterfaceClass builtins.ISpecial>]
@@ -499,23 +497,23 @@
.. doctest::
- >>> class Special2(Foo):
- ... zope.interface.implementsOnly(
- ... zope.interface.implementedBy(Foo),
- ... ISpecial,
- ... )
+ >>> @zope.interface.implementer_only(
+ ... zope.interface.implementedBy(Foo),
+ ... ISpecial,
+ ... )
+ ... class Special2(Foo):
... reason = 'I just am'
... def brag(self):
... return "I'm special because %s" % self.reason
The declaration here is almost the same as
-``zope.interface.implements(ISpecial)``, except that the order of
+``zope.interface.implementer(ISpecial)``, except that the order of
interfaces in the resulting declaration is different:
.. doctest::
>>> list(zope.interface.implementedBy(Special2))
- [<InterfaceClass __builtin__.IFoo>, <InterfaceClass __builtin__.ISpecial>]
+ [<InterfaceClass builtins.IFoo>, <InterfaceClass builtins.ISpecial>]
Interface Inheritance
@@ -543,7 +541,7 @@
...
>>> IBaz.__bases__
- (<InterfaceClass __builtin__.IFoo>, <InterfaceClass __builtin__.IBlat>)
+ (<InterfaceClass builtins.IFoo>, <InterfaceClass builtins.IBlat>)
>>> names = list(IBaz)
>>> names.sort()
@@ -656,12 +654,13 @@
.. doctest::
- >>> class Baz(object):
- ... zope.interface.implements(IBaz)
+ >>> @zope.interface.implementer(IBaz)
+ ... class Baz(object):
+ ... pass
>>> baz_implements = zope.interface.implementedBy(Baz)
>>> baz_implements.__bases__
- (<InterfaceClass __builtin__.IBaz>, <implementedBy ...object>)
+ (<InterfaceClass builtins.IBaz>, <implementedBy ...object>)
>>> baz_implements.extends(IFoo)
True
@@ -678,10 +677,10 @@
>>> from pprint import pprint
>>> pprint(baz_implements.__sro__)
- (<implementedBy __builtin__.Baz>,
- <InterfaceClass __builtin__.IBaz>,
- <InterfaceClass __builtin__.IFoo>,
- <InterfaceClass __builtin__.IBlat>,
+ (<implementedBy builtins.Baz>,
+ <InterfaceClass builtins.IBaz>,
+ <InterfaceClass builtins.IFoo>,
+ <InterfaceClass builtins.IBlat>,
<InterfaceClass zope.interface.Interface>,
<implementedBy ...object>)
@@ -718,7 +717,7 @@
... __call__.return_type = IBaz
>>> IBazFactory['__call__'].getTaggedValue('return_type')
- <InterfaceClass __builtin__.IBaz>
+ <InterfaceClass builtins.IBaz>
Tagged values can also be defined from within an interface definition:
@@ -763,9 +762,8 @@
.. doctest::
- >>> class Range(object):
- ... zope.interface.implements(IRange)
- ...
+ >>> @zope.interface.implementer(IRange)
+ ... class Range(object):
... def __init__(self, min, max):
... self.min, self.max = min, max
...
@@ -790,7 +788,7 @@
>>> errors = []
>>> try:
... IRange.validateInvariants(Range(2,1), errors)
- ... except Invalid, e:
+ ... except Invalid as e:
... str(e)
'[RangeError(Range(2, 1))]'
@@ -820,7 +818,7 @@
>>> I(0)
Traceback (most recent call last):
...
- TypeError: ('Could not adapt', 0, <InterfaceClass __builtin__.I>)
+ TypeError: ('Could not adapt', 0, <InterfaceClass builtins.I>)
unless an alternate value is provided as a second positional argument:
@@ -834,8 +832,9 @@
.. doctest::
- >>> class C(object):
- ... zope.interface.implements(I)
+ >>> @zope.interface.implementer(I)
+ ... class C(object):
+ ... pass
>>> obj = C()
>>> I(obj) is obj
@@ -845,8 +844,8 @@
.. doctest::
- >>> class C(object):
- ... zope.interface.implements(I)
+ >>> @zope.interface.implementer(I)
+ ... class C(object):
... def __conform__(self, proto):
... return 0
@@ -870,7 +869,7 @@
>>> I(0)
Traceback (most recent call last):
...
- TypeError: ('Could not adapt', 0, <InterfaceClass __builtin__.I>)
+ TypeError: ('Could not adapt', 0, <InterfaceClass builtins.I>)
``__adapt__``
-------------
@@ -898,8 +897,9 @@
.. doctest::
- >>> class C(object):
- ... zope.interface.implements(I)
+ >>> @zope.interface.implementer(I)
+ ... class C(object):
+ ... pass
>>> obj = C()
>>> I.__adapt__(obj) is obj
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/README.ru.rst
new/zope.interface-4.7.1/docs/README.ru.rst
--- old/zope.interface-4.6.0/docs/README.ru.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/docs/README.ru.rst 2019-11-11 17:56:56.000000000
+0100
@@ -102,7 +102,7 @@
>>> 'x' in IFoo
True
-Мы можем использовать итератор для интерфейсов что бы получить все имена
+Мы можем использовать итератор для интерфейсов чтобы получить все имена
которые интерфейсы определяют::
>>> names = list(IFoo)
@@ -310,7 +310,7 @@
... def brag():
... "Brag about being special"
-Мы можем сделать созданный экземпляр foo специальным предоставив атрибуты
+Мы можем сделать созданный экземпляр foo специальным, предоставив атрибуты
`reason` и `brag`::
>>> foo.reason = 'I just am'
@@ -403,7 +403,7 @@
Объекты объявлений
------------------
-Когда мы объявляем интерфейсы мы создаем объект *объявления*. Когда мы
+Когда мы объявляем интерфейсы, мы создаем объект *объявления*. Когда мы
запрашиваем объявления возвращается объект объявления::
>>> type(zope.interface.implementedBy(Special))
@@ -411,7 +411,7 @@
Объекты объявления и объекты интерфейсов во многом похожи друг на друга.
На самом деле они даже имеют общий базовый класс. Важно понять, что они могут
-использоваться там где в объявлениях ожидаются интерфейсы. Вот простой
+использоваться там, где в объявлениях ожидаются интерфейсы. Вот простой
пример::
>>> class Special2(Foo):
@@ -467,7 +467,7 @@
>>> IBaz['eek'].__doc__
'eek in baz blah'
-Мы были осторожны переопределяя eek совместимым путем. Когда интерфейс
+Мы были осторожны, переопределяя eek совместимым путем. Когда интерфейс
расширяется, расширенный интерфейс должен быть совместимым [#compat]_ с
расширяемыми интерфейсами.
@@ -483,8 +483,7 @@
>>> IBaz.extends(IBaz)
False
-Иногда мы можем хотеть что бы они расширяли сами себя, но вместо этого
-мы можем использовать `isOrExtends`::
+Если мы хотим видеть, что интерфейс расширяет сам себя,то мы можем
использовать `isOrExtends`::
>>> IBaz.isOrExtends(IBaz)
True
@@ -494,7 +493,7 @@
False
Когда мы применяем итерацию к интерфейсу мы получаем все имена которые он
-определяет включая имена определенные для базовых интерфейсов. Иногда
+определяет, включая имена определенные для базовых интерфейсов. Иногда
мы хотим получить *только* имена определенные интерфейсом напрямую.
Для этого мы используем метод `names`::
@@ -505,7 +504,7 @@
--------------------------------------------
Интерфейс может переопределять определения атрибутов из базовых интерфейсов.
-Если два базовых интерфейса определяют один и тот же атрибут атрибут
+Если два базовых интерфейса определяют один и тот же атрибут, то данный атрибут
наследуется от более специфичного интерфейса. Для примера::
>>> class IBase(zope.interface.Interface):
@@ -533,7 +532,7 @@
Заметим, что это отличается от поиска в глубину.
Иногда полезно узнать, что интерфейс определяет атрибут напрямую. Мы можем
-использовать метод direct для получения напрямую определенных атрибутов::
+использовать метод `direct` для получения напрямую определенных атрибутов::
>>> IBase.direct('foo').__doc__
'base foo doc'
@@ -577,8 +576,8 @@
Помеченные значения
===================
-Интерфейсы и описания атрибутов поддерживают механизм расширения
-заимствованный из UML и называемый "помеченные значения" который позволяет
+Интерфейсы и описания атрибутов поддерживают механизм расширения,
+заимствованный из UML и называемый "помеченные значения", который позволяет
сохранять дополнительные данные::
>>> IFoo.setTaggedValue('date-modified', '2004-04-01')
@@ -593,7 +592,7 @@
>>> tags
['author', 'date-modified']
-Атрибуты функций конвертируются в помеченные значения когда создаются
+Атрибуты функций конвертируются в помеченные значения, когда создаются
определения атрибутов метода::
>>> class IBazFactory(zope.interface.Interface):
@@ -615,10 +614,10 @@
Инварианты
==========
-Интерфейсы могут описывать условия которые должны быть соблюдены для объектов
-которые их предоставляют. Эти условия описываются используя один или более
-инвариантов. Инварианты - это вызываемые объекты которые будут вызваны
-с объектом предоставляющим интерфейс в качестве параметра. Инвариант
+Интерфейсы могут описывать условия, которые должны быть соблюдены для объектов,
+которые их предоставляют. Эти условия описываются одним или несколькими
+инвариантами. Инварианты - это вызываемые объекты, которые будут вызваны
+с объектом, предоставляющим интерфейс в качестве параметра. Инвариант
должен выкинуть исключение `Invalid` если условие не соблюдено. Например::
>>> class RangeError(zope.interface.Invalid):
@@ -630,7 +629,7 @@
... if ob.max < ob.min:
... raise RangeError(ob)
-Определив этот инвариант мы можем использовать его в определении интерфейсов::
+Определив этот инвариант, мы можем использовать его в определении интерфейсов::
>>> class IRange(zope.interface.Interface):
... min = zope.interface.Attribute("Lower bound")
@@ -657,7 +656,7 @@
RangeError: Range(2, 1)
В случае нескольких инвариантов мы можем захотеть остановить проверку после
-первой ошибки. Если мы передадим в `validateInvariants` пустой список тогда
+первой ошибки. Если мы передадим в `validateInvariants` пустой список, тогда
будет выкинуто единственное исключение `Invalid` со списком исключений
как аргументом::
@@ -680,7 +679,7 @@
=========
Интерфейсы могут быть вызваны для осуществления адаптации. Эта семантика
-основана на функции adapt из PEP 246. Если объект не может быть адаптирован
+основана на функции adapt из PEP 246. Если объект не может быть адаптирован,
будет выкинут TypeError::
>>> class I(zope.interface.Interface):
@@ -696,7 +695,7 @@
>>> I(0, 'bob')
'bob'
-Если объект уже реализует нужный интерфейс он будет возвращен::
+Если объект уже реализует нужный интерфейс, он будет возвращен::
>>> class C(object):
... zope.interface.implements(I)
@@ -745,7 +744,7 @@
Интерфейсы реализуют метод __adapt__ из PEP 246. Этот метод обычно не
вызывается напрямую. Он вызывается архитектурой адаптации из PEP 246 и методом
__call__ интерфейсов. Метод адаптации отвечает за адаптацию объекта к
-получателю. Версия по умолчанию возвращает None::
+получателю. Версия по умолчанию возвращает `None`::
>>> I.__adapt__(0)
@@ -761,7 +760,7 @@
Функции для вызова адаптации могут быть добавлены (или удалены) для
предоставления адаптации "на заказ". Мы установим глупую функцию которая
адаптирует 0 к 42. Мы устанавливаем функцию просто добавляя ее к списку
-adapter_hooks::
+`adapter_hooks`::
>>> from zope.interface.interface import adapter_hooks
>>> def adapt_0_to_42(iface, obj):
@@ -772,7 +771,7 @@
>>> I.__adapt__(0)
42
-Функции должны возвращать либо адаптер, либо None если адаптер не найден.
+Функции должны возвращать либо адаптер, либо `None`, если адаптер не найден.
Функции могут быть удалены удалением их из списка::
>>> adapter_hooks.remove(adapt_0_to_42)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/adapter.rst
new/zope.interface-4.7.1/docs/adapter.rst
--- old/zope.interface-4.6.0/docs/adapter.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/docs/adapter.rst 2019-11-11 17:56:56.000000000
+0100
@@ -67,8 +67,9 @@
.. doctest::
- >>> class C2:
- ... zope.interface.implements(IRequire2)
+ >>> @zope.interface.implementer(IRequire2)
+ ... class C2:
+ ... pass
>>> registry.lookup([zope.interface.implementedBy(C2)], IProvide2, '')
12
@@ -154,20 +155,20 @@
.. doctest::
- >>> print registry.registered([IRequire1], IProvide1)
+ >>> print(registry.registered([IRequire1], IProvide1))
11
- >>> print registry.registered([IRequire1], IProvide2)
+ >>> print(registry.registered([IRequire1], IProvide2))
12
- >>> print registry.registered([IRequire1], IProvide2, 'bob')
+ >>> print(registry.registered([IRequire1], IProvide2, 'bob'))
Bob's 12
- >>> print registry.registered([IRequire2], IProvide1)
+ >>> print(registry.registered([IRequire2], IProvide1))
21
- >>> print registry.registered([IRequire2], IProvide2)
+ >>> print(registry.registered([IRequire2], IProvide2))
None
In the last example, ``None`` was returned because nothing was registered
@@ -200,11 +201,12 @@
>>> class IR(zope.interface.Interface):
... pass
- >>> class X:
- ... zope.interface.implements(IR)
+ >>> @zope.interface.implementer(IR)
+ ... class X:
+ ... pass
- >>> class Y:
- ... zope.interface.implements(IProvide1)
+ >>> @zope.interface.implementer(IProvide1)
+ ... class Y:
... def __init__(self, context):
... self.context = context
@@ -248,8 +250,8 @@
... return 'adapter'
... return None
- >>> class Object(object):
- ... zope.interface.implements(IR)
+ >>> @zope.interface.implementer(IR)
+ ... class Object(object):
... name = 'object'
>>> registry.register([IR], IProvide1, 'conditional', factory)
@@ -385,8 +387,9 @@
.. doctest::
- >>> class Q:
- ... zope.interface.implements(IQ)
+ >>> @zope.interface.implementer(IQ)
+ ... class Q:
+ ... pass
As with single adapters, we register a factory, which is often a class:
@@ -394,8 +397,8 @@
>>> class IM(zope.interface.Interface):
... pass
- >>> class M:
- ... zope.interface.implements(IM)
+ >>> @zope.interface.implementer(IM)
+ ... class M:
... def __init__(self, x, q):
... self.x, self.q = x, q
>>> registry.register([IR, IQ], IM, '', M)
@@ -637,7 +640,7 @@
.. doctest::
>>> def handler(event):
- ... print 'handler', event
+ ... print('handler', event)
>>> registry.subscribe([IRequire1], None, handler)
>>> registry.subscriptions([IRequire1], None) == [handler]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/api/declarations.rst
new/zope.interface-4.7.1/docs/api/declarations.rst
--- old/zope.interface-4.6.0/docs/api/declarations.rst 2018-10-23
22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/docs/api/declarations.rst 2019-11-11
17:56:56.000000000 +0100
@@ -37,7 +37,7 @@
implements
----------
-(The `implementer` decorator is preferred to this.)
+.. caution:: Does not work on Python 3. Use the `implementer` decorator
instead.
.. autofunction:: implements
@@ -45,7 +45,7 @@
implementsOnly
--------------
-(The `implementer_only` decorator is preferred to this.)
+.. caution:: Does not work on Python 3. Use the `implementer_only` decorator
instead.
.. autofunction:: implementsOnly
@@ -61,7 +61,7 @@
.. doctest::
>>> from zope.interface import implementedBy
- >>> from zope.interface import implements
+ >>> from zope.interface import implementer
>>> from zope.interface import classImplementsOnly
>>> from zope.interface import Interface
>>> class I1(Interface): pass
@@ -72,10 +72,12 @@
...
>>> class I4(Interface): pass
...
- >>> class A(object):
- ... implements(I3)
- >>> class B(object):
- ... implements(I4)
+ >>> @implementer(I3)
+ ... class A(object):
+ ... pass
+ >>> @implementer(I4)
+ ... class B(object):
+ ... pass
>>> class C(A, B):
... pass
>>> classImplementsOnly(C, I1, I2)
@@ -107,10 +109,12 @@
...
>>> class I5(Interface): pass
...
- >>> class A(object):
- ... implements(I3)
- >>> class B(object):
- ... implements(I4)
+ >>> @implementer(I3)
+ ... class A(object):
+ ... pass
+ >>> @implementer(I4)
+ ... class B(object):
+ ... pass
>>> class C(A, B):
... pass
>>> classImplements(C, I1, I2)
@@ -149,12 +153,15 @@
...
>>> class IC(Interface): pass
...
- >>> class A(object):
- ... implements(IA1, IA2)
- >>> class B(object):
- ... implements(IB)
- >>> class C(A, B):
- ... implements(IC)
+ >>> @implementer(IA1, IA2)
+ ... class A(object):
+ ... pass
+ >>> @implementer(IB)
+ ... class B(object):
+ ... pass
+ >>> @implementer(IC)
+ ... class C(A, B):
+ ... pass
>>> ob = C()
>>> directlyProvides(ob, I1, I2)
>>> int(I1 in providedBy(ob))
@@ -236,12 +243,15 @@
...
>>> class IC(Interface): pass
...
- >>> class A(object):
- ... implements(IA1, IA2)
- >>> class B(object):
- ... implements(IB)
- >>> class C(A, B):
- ... implements(IC)
+ >>> @implementer(IA1, IA2)
+ ... class A(object):
+ ... pass
+ >>> @implementer(IB)
+ ... class B(object):
+ ... pass
+ >>> @implementer(IC)
+ ... class C(A, B):
+ ... pass
>>> ob = C()
>>> directlyProvides(ob, I1)
>>> int(I1 in providedBy(ob))
@@ -295,8 +305,9 @@
.. doctest::
- >>> class C(object):
- ... implements(I1)
+ >>> @implementer(I1)
+ ... class C(object):
+ ... pass
>>> c = C()
>>> alsoProvides(c, I2)
>>> I2.providedBy(c)
@@ -324,23 +335,31 @@
classProvides
-------------
+.. caution:: Does not work on Python 3. Use the `provider` decorator instead.
+
.. autofunction:: classProvides
+provider
+--------
+
+.. autoclass:: provider
+
For example:
.. doctest::
>>> from zope.interface import Interface
- >>> from zope.interface.declarations import implementer
- >>> from zope.interface import classProvides
+ >>> from zope.interface import implementer
+ >>> from zope.interface import provider
>>> class IFooFactory(Interface):
... pass
>>> class IFoo(Interface):
... pass
>>> @implementer(IFoo)
+ ... @provider(IFooFactory)
... class C(object):
- ... classProvides(IFooFactory)
+ ... pass
>>> [i.getName() for i in C.__provides__]
['IFooFactory']
>>> [i.getName() for i in C().__provides__]
@@ -365,12 +384,6 @@
['IFoo']
-provider
---------
-
-.. autoclass:: provider
-
-
moduleProvides
--------------
@@ -425,7 +438,7 @@
.. doctest::
>>> from zope.interface import Interface
- >>> from zope.interface import implements
+ >>> from zope.interface import implementer
>>> from zope.interface import classImplementsOnly
>>> from zope.interface import implementedBy
>>> class I1(Interface): pass
@@ -436,10 +449,12 @@
...
>>> class I4(Interface): pass
...
- >>> class A(object):
- ... implements(I3)
- >>> class B(object):
- ... implements(I4)
+ >>> @implementer(I3)
+ ... class A(object):
+ ... pass
+ >>> @implementer(I4)
+ ... class B(object):
+ ... pass
>>> class C(A, B):
... pass
>>> classImplementsOnly(C, I1, I2)
@@ -462,10 +477,12 @@
...
>>> class I4(I3): pass
...
- >>> class C1(object):
- ... implements(I2)
- >>> class C2(C1):
- ... implements(I3)
+ >>> @implementer(I2)
+ ... class C1(object):
+ ... pass
+ >>> @implementer(I3)
+ ... class C2(C1):
+ ... pass
>>> [i.getName() for i in implementedBy(C2)]
['I3', 'I2']
@@ -478,7 +495,7 @@
... def __call__(self):
... return self
>>> implementedBy(Callable())
- <implementedBy __builtin__.?>
+ <implementedBy builtins.?>
Note that the name of the spec ends with a '?', because the ``Callable``
instance does not have a ``__name__`` attribute.
@@ -659,10 +676,10 @@
.. doctest::
>>> from zope.interface import Interface
- >>> class IFooFactory(Interface): pass
- ...
+ >>> class IFooFactory(Interface):
+ ... pass
>>> class C(object):
- ... pass
+ ... pass
>>> from zope.interface.declarations import ProvidesClass
>>> C.__provides__ = ProvidesClass(C, IFooFactory)
>>> [i.getName() for i in C.__provides__]
@@ -701,10 +718,10 @@
>>> from zope.interface.declarations import InstanceDeclarations
>>> before = len(InstanceDeclarations)
>>> class C(object):
- ... pass
+ ... pass
>>> from zope.interface import Interface
>>> class I(Interface):
- ... pass
+ ... pass
>>> c1 = C()
>>> c2 = C()
>>> len(InstanceDeclarations) == before
@@ -736,7 +753,7 @@
.. doctest::
>>> from zope.interface import Interface
- >>> from zope.interface import implementsOnly
+ >>> from zope.interface import implementer_only
>>> class I1(Interface): pass
...
>>> class I2(Interface): pass
@@ -749,12 +766,14 @@
...
>>> class I5(Interface): pass
...
- >>> class A(object):
- ... implements(I1)
- >>> class B(object): __implemented__ = I2
- ...
- >>> class C(A, B):
- ... implements(I31)
+ >>> @implementer(I1)
+ ... class A(object):
+ ... pass
+ >>> class B(object):
+ ... __implemented__ = I2
+ >>> @implementer(I31)
+ ... class C(A, B):
+ ... pass
>>> c = C()
>>> directlyProvides(c, I4)
>>> [i.getName() for i in providedBy(c)]
@@ -771,10 +790,12 @@
1
>>> int(providedBy(c).extends(I5))
0
- >>> class COnly(A, B):
- ... implementsOnly(I31)
- >>> class D(COnly):
- ... implements(I5)
+ >>> @implementer_only(I31)
+ ... class COnly(A, B):
+ ... pass
+ >>> @implementer(I5)
+ ... class D(COnly):
+ ... pass
>>> c = D()
>>> directlyProvides(c, I4)
>>> [i.getName() for i in providedBy(c)]
@@ -809,8 +830,9 @@
>>> class IFooFactory(Interface): pass
...
>>> @implementer(IFoo)
+ ... @provider(IFooFactory)
... class C(object):
- ... classProvides(IFooFactory)
+ ... pass
>>> [i.getName() for i in C.__providedBy__]
['IFooFactory']
>>> [i.getName() for i in C().__providedBy__]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/api/specifications.rst
new/zope.interface-4.7.1/docs/api/specifications.rst
--- old/zope.interface-4.6.0/docs/api/specifications.rst 2018-10-23
22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/docs/api/specifications.rst 2019-11-11
17:56:56.000000000 +0100
@@ -55,8 +55,9 @@
>>> from zope.interface import *
>>> class I1(Interface):
... pass
- >>> class C(object):
- ... implements(I1)
+ >>> @implementer(I1)
+ ... class C(object):
+ ... pass
>>> c = C()
>>> class X(object):
... pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/human.rst
new/zope.interface-4.7.1/docs/human.rst
--- old/zope.interface-4.6.0/docs/human.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/docs/human.rst 2019-11-11 17:56:56.000000000
+0100
@@ -42,9 +42,9 @@
.. doctest::
- >>> class File(object):
+ >>> @zope.interface.implementer(IFile)
+ ... class File(object):
...
- ... zope.interface.implements(IFile)
... body = 'foo bar'
...
@@ -64,9 +64,9 @@
.. doctest::
- >>> class FileSize(object):
+ >>> @zope.interface.implementer(ISize)
+ ... class FileSize(object):
...
- ... zope.interface.implements(ISize)
... __used_for__ = IFile
...
... def __init__(self, context):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/docs/verify.rst
new/zope.interface-4.7.1/docs/verify.rst
--- old/zope.interface-4.6.0/docs/verify.rst 2018-10-23 22:17:47.000000000
+0200
+++ new/zope.interface-4.7.1/docs/verify.rst 2019-11-11 17:56:56.000000000
+0100
@@ -36,14 +36,14 @@
.. doctest::
- >>> from zope.interface import Interface, Attribute, implements
+ >>> from zope.interface import Interface, Attribute, implementer
>>> from zope.interface.exceptions import BrokenImplementation
>>> class IFoo(Interface):
... x = Attribute("The X attribute")
... y = Attribute("The Y attribute")
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... x = 1
... def __init__(self):
... self.y = 2
@@ -56,25 +56,25 @@
.. doctest::
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... x = 1
>>> try: #doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
... verifyObject(IFoo, Foo())
- ... except BrokenImplementation, e:
- ... print str(e)
+ ... except BrokenImplementation as e:
+ ... print(e)
An object has failed to implement interface <InterfaceClass ...IFoo>
<BLANKLINE>
The y attribute was not provided.
<BLANKLINE>
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... def __init__(self):
... self.y = 2
>>> try: #doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
... verifyObject(IFoo, Foo())
- ... except BrokenImplementation, e:
- ... print str(e)
+ ... except BrokenImplementation as e:
+ ... print(e)
An object has failed to implement interface <InterfaceClass ...IFoo>
<BLANKLINE>
The x attribute was not provided.
@@ -87,15 +87,15 @@
>>> class IFoo(Interface):
... x = Attribute('The X attribute')
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... @property
... def x(self):
... raise AttributeError
>>> try: #doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
... verifyObject(IFoo, Foo())
- ... except BrokenImplementation, e:
- ... print str(e)
+ ... except BrokenImplementation as e:
+ ... print(e)
An object has failed to implement interface <InterfaceClass ...IFoo>
<BLANKLINE>
The x attribute was not provided.
@@ -106,8 +106,8 @@
.. doctest::
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... @property
... def x(self):
... raise Exception
@@ -120,8 +120,8 @@
.. doctest::
- >>> class Foo(object):
- ... implements(IFoo)
+ >>> @implementer(IFoo)
+ ... class Foo(object):
... x = 1
... @property
... def y(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/setup.py
new/zope.interface-4.7.1/setup.py
--- old/zope.interface-4.6.0/setup.py 2018-10-23 22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/setup.py 2019-11-11 17:56:56.000000000 +0100
@@ -55,10 +55,11 @@
An optional code optimization (C extension) could not be compiled.
Optimizations for this package will not be available!""")
- print()
+ print("")
print(e)
print('*' * 80)
+
codeoptimization_c = os.path.join('src', 'zope', 'interface',
'_zope_interface_coptimizations.c')
codeoptimization = Feature(
@@ -90,14 +91,15 @@
with open(os.path.join(os.path.dirname(__file__), *rnames)) as f:
return f.read()
-long_description=(
+
+long_description = (
read('README.rst')
+ '\n' +
read('CHANGES.rst')
)
setup(name='zope.interface',
- version='4.6.0',
+ version='4.7.1',
url='https://github.com/zopefoundation/zope.interface',
license='ZPL 2.1',
description='Interfaces for Python',
@@ -113,10 +115,10 @@
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Framework :: Zope :: 3",
@@ -133,13 +135,14 @@
zip_safe=False,
tests_require=tests_require,
install_requires=['setuptools'],
- python_requires=', '.join((
+ python_requires=', '.join([
'>=2.7',
'!=3.0.*',
'!=3.1.*',
'!=3.2.*',
'!=3.3.*',
- )),
+ '!=3.4.*',
+ ]),
extras_require={
'docs': ['Sphinx', 'repoze.sphinx.autointerface'],
'test': tests_require,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/src/zope/interface/interface.py
new/zope.interface-4.7.1/src/zope/interface/interface.py
--- old/zope.interface-4.6.0/src/zope/interface/interface.py 2018-10-23
22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/src/zope/interface/interface.py 2019-11-11
17:56:56.000000000 +0100
@@ -452,6 +452,33 @@
if errors:
raise Invalid(errors)
+ def queryTaggedValue(self, tag, default=None):
+ """ Returns the value associated with 'tag'. """
+ value = Element.queryTaggedValue(self, tag, default=_marker)
+ if value is not _marker:
+ return value
+ for base in self.__bases__:
+ value = base.queryTaggedValue(tag, default=_marker)
+ if value is not _marker:
+ return value
+ return default
+
+ def getTaggedValue(self, tag):
+ """ Returns the value associated with 'tag'. """
+ value = self.queryTaggedValue(tag, default=_marker)
+ if value is _marker:
+ raise KeyError(tag)
+ return value
+
+ def getTaggedValueTags(self):
+ """ Returns a list of all tags. """
+ keys = list(Element.getTaggedValueTags(self))
+ for base in self.__bases__:
+ for key in base.getTaggedValueTags():
+ if key not in keys:
+ keys.append(key)
+ return keys
+
def __repr__(self): # pragma: no cover
try:
return self._v_repr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/zope.interface-4.6.0/src/zope/interface/tests/test_interface.py
new/zope.interface-4.7.1/src/zope/interface/tests/test_interface.py
--- old/zope.interface-4.6.0/src/zope/interface/tests/test_interface.py
2018-10-23 22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/src/zope/interface/tests/test_interface.py
2019-11-11 17:56:56.000000000 +0100
@@ -1744,11 +1744,20 @@
bar = Attribute('bar; must eval to Boolean True if foo does')
taggedValue('qux', 'Spam')
- class HasInvariant(object):
+ class IDerived(ITagged):
+ taggedValue('qux', 'Spam Spam')
+ taggedValue('foo', 'bar')
+
+ class IDerived2(IDerived):
pass
self.assertEqual(ITagged.getTaggedValue('qux'), 'Spam')
- self.assertTrue('qux' in ITagged.getTaggedValueTags())
+ self.assertRaises(KeyError, ITagged.getTaggedValue, 'foo')
+ self.assertEqual(ITagged.getTaggedValueTags(), ['qux'])
+
+ self.assertEqual(IDerived2.getTaggedValue('qux'), 'Spam Spam')
+ self.assertEqual(IDerived2.getTaggedValue('foo'), 'bar')
+ self.assertEqual(set(IDerived2.getTaggedValueTags()), set(['qux',
'foo']))
def test_description_cache_management(self):
# See https://bugs.launchpad.net/zope.interface/+bug/185974
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/zope.interface-4.6.0/src/zope.interface.egg-info/PKG-INFO
new/zope.interface-4.7.1/src/zope.interface.egg-info/PKG-INFO
--- old/zope.interface-4.6.0/src/zope.interface.egg-info/PKG-INFO
2018-10-23 22:17:48.000000000 +0200
+++ new/zope.interface-4.7.1/src/zope.interface.egg-info/PKG-INFO
2019-11-11 17:56:56.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: zope.interface
-Version: 4.6.0
+Version: 4.7.1
Summary: Interfaces for Python
Home-page: https://github.com/zopefoundation/zope.interface
Author: Zope Foundation and Contributors
@@ -40,6 +40,25 @@
Changes
=======
+ 4.7.1 (2019-11-11)
+ ------------------
+
+ - Use Python 3 syntax in the documentation. See `issue 119
+ <https://github.com/zopefoundation/zope.interface/issue/119>`_.
+
+
+ 4.7.0 (2019-11-11)
+ ------------------
+
+ - Drop support for Python 3.4.
+
+ - Fix ``queryTaggedValue``, ``getTaggedValue``, ``getTaggedValueTags``
+ subclass inheritance. See `PR 144
+ <https://github.com/zopefoundation/zope.interface/pull/144>`_.
+
+ - Add support for Python 3.8.
+
+
4.6.0 (2018-10-23)
------------------
@@ -49,6 +68,7 @@
Python 3. See `issue 126
<https://github.com/zopefoundation/zope.interface/issues/126>`_.
+
4.5.0 (2018-04-19)
------------------
@@ -574,15 +594,15 @@
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Framework :: Zope :: 3
Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
+Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*
Provides-Extra: docs
Provides-Extra: test
Provides-Extra: testing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/zope.interface-4.6.0/src/zope.interface.egg-info/requires.txt
new/zope.interface-4.7.1/src/zope.interface.egg-info/requires.txt
--- old/zope.interface-4.6.0/src/zope.interface.egg-info/requires.txt
2018-10-23 22:17:48.000000000 +0200
+++ new/zope.interface-4.7.1/src/zope.interface.egg-info/requires.txt
2019-11-11 17:56:56.000000000 +0100
@@ -8,6 +8,6 @@
zope.event
[testing]
-zope.event
-nose
coverage
+nose
+zope.event
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/zope.interface-4.6.0/tox.ini
new/zope.interface-4.7.1/tox.ini
--- old/zope.interface-4.6.0/tox.ini 2018-10-23 22:17:47.000000000 +0200
+++ new/zope.interface-4.7.1/tox.ini 2019-11-11 17:56:56.000000000 +0100
@@ -1,6 +1,8 @@
[tox]
envlist =
- py27,py27-pure,py34,py34-pure,py35,py36,py37,pypy,pypy3,coverage,docs
+ py27,py27-pure,py35,py35-pure,py36,py37,py38,pypy,pypy3,coverage,docs
+# NB: if you add new environments, please also add them to depends in
+# testenv:coverage so that parallel runs (tox -p auto) will work correctly
[testenv]
commands =
@@ -16,7 +18,7 @@
PURE_PYTHON=1
PIP_CACHE_DIR = {envdir}/.cache
-[testenv:py34-pure]
+[testenv:py35-pure]
setenv =
PURE_PYTHON=1
PIP_CACHE_DIR = {envdir}/.cache
@@ -36,10 +38,12 @@
coverage report
coverage html
coverage xml
+depends = py27,py27-pure,py35,py35-pure,py36,py37,py38,pypy,pypy3
+parallel_show_output = true
[testenv:docs]
basepython =
- python2.7
+ python3
commands =
sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest