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


Reply via email to