icemac: @d-maurer I added you as reviewer as #11 was originally written by you.
d-maurer: Jason Madden wrote at 2020-3-7 01:44 -0800:
>jamadden commented on this pull request.
>
>
>
>> +    mro = PyObject_CallMethodObjArgs(class_that_invoked_super, strmro, NULL);
>+    _NSCHECK(mro, NULL);
>+
>+    index = PySequence_Index(mro, class_that_invoked_super);
>
>I'm afraid you have that backwards. In `super(Class, self)` `__self_class__` is always the same as `type(self)`. It never changes and is the most derived class in the MRO (index 0).  It's `__thisclass__` that changes to reflect where in the MRO the new starting search point actually is.

I am aware of this. That's why I am (quite) sure that
what you need is

    mro = PyObject_CallMethodObjArgs(__self_class__, strmro, NULL);
    _NSCHECK(mro, NULL);

    index = PySequence_Index(mro, class_that_invoked_super);

With your code, `index` will always be 0 as for any class
it is the 0's element of its "mro".

d-maurer: Jason Madden wrote at 2020-3-7 02:05 -0800:
> ...
>It's not particularly useful because the `super` object cannot access instance variables of `self` (only class descriptors/methods), nor (as a consequence) can it discover any interfaces that are `directlyProvidedBy` the `self` object. It has no MRO or type and `super` doesn't work on it, so you'd only be able to try this trick for exactly one level of hierarchy. The receiving factory would need to unwrap `__self__` in short order to do any of those things��and at that point, you're writing an adapter that's customized to know it's working with `super`, which destroys reusability: given `class Base` and `class Derived(Base)` the same adapter can't work for `super(Derived, self)` *and* `Base()`.


I am convinced.
jamadden: CPython 3.5 is crashing on Travis/Linux, apparently hanging on Travis/Mac, and crashing locally for me on my Mac. 

The local crash occurs in `test_getMultiAdapter_hit_super (zope.interface.tests.test_registry.ComponentsTests)` and looks like an issue computing a hash code (?) when getting a key in a dictionary (compiled with `-g -O0`:

```bt
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
  * frame #0: 0x00007fff67191774 libsystem_malloc.dylib`large_malloc + 89
    frame #1: 0x00007fff67187357 libsystem_malloc.dylib`szone_malloc_should_clear + 235
    frame #2: 0x00007fff6718606a libsystem_malloc.dylib`malloc_zone_malloc + 104
    frame #3: 0x00007fff67185fe5 libsystem_malloc.dylib`malloc + 21
    frame #4: 0x000000010012f012 .Python`_PyObject_Alloc + 881
    frame #5: 0x0000000100120030 .Python`PyLong_FromDouble + 176
    frame #6: 0x00000001026f1f23 _zope_interface_coptimizations.cpython-35m-darwin.so`_lookup(self=0x000000010631cea8, required=0x0000000106322b08, provided=0x00000001060ff9a0, name=0x0000000100553ab0, default_=0x0000000000000000) at _zope_interface_coptimizations.c:1015:12
    frame #7: 0x00000001026f1b59 _zope_interface_coptimizations.cpython-35m-darwin.so`lookup_lookup(self=0x000000010631cea8, args=0x00000001063195e8, kwds=0x0000000000000000) at _zope_interface_coptimizations.c:1060:10
    frame #8: 0x000000010012c1f7 .Python`PyCFunction_Call + 107
```

where `_zope_interface_coptimizations.c:1015` is `result = PyDict_GetItem(cache, key);`
jamadden: The crash in 3.5 turned out to be a memory bug in ``tuple(map(func, it))`` when `func` could return temporary objects. The fix is to replace `map(func, it)` with `[func(i) for i in it]`. This turns out to be faster too.

The temporary objects in question are the objects created for `providedBy(super(C, c))`. Unlike `providedBy(c)`, those aren't currently cached anywhere else (in an instance or class dict). But they'll wind up cached somewhat invisibly in adapter registries. They'll be found again (hashcodes and eq match up) so we're just doing some extra work computing the RO each time. I'm wondering if we should cache that in the class dict to avoid that.

Right now, I'm thinking leave it simple and revisit if it becomes a bottleneck.
jamadden: > I am also worried that the use of tuple(map(func, it)) (over [func(i) for i in it]) could cause a crash. In my view, this indicates that something is deeply wrong and may hit people without the capabilities to find out why and how to work around it. Did the problem only affected Python 3.5 or other Python 3 versions as well (in other works, were the bug in Python 3.5 or somewhere in zope.interface).

Yeah, I was concerned about that too and kept looking into it. The crash only happened in CPython 3.5, and debugging showed that the call to `tuplefy(required)` resulted in the  dictionary stored in the `cache` C variable getting deallocated. Since `tuplefy` was iterating a lazy mapping that's calling arbitrary Python code, arbitrary side-effects are possible. In this case, it turns out that one such side-effect was eventually calling `components.changed(_)`, which drops the caches. Since `cache` contained a borrowed reference, its refcount went to 0 and it got deallocated. (This happened on every version of Python, but for some reason having to do with the `dict` implementation or memory management, it only crashed on CPython 3.5.)

The change to non-lazily iterate before calling into C is a sufficient fix *for this code* (although I can and will also eliminate the invoking of this side-effect in the first place). But this is a bug waiting to happen and the C code has been incorrect for a long time. The remainder of the fix is to not get the cache until we can be (more) sure there will be no more arbitrary side effects.

diff --git a/.travis.yml b/.travis.yml
index 8b5bd09..d77892f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,10 +27,6 @@ jobs:
         - sphinx-build -b doctest -d docs/_build/doctrees docs docs/_build/doctest
       after_success:
 
-    - name: PyPy C Extensions
-      env: PURE_PYTHON=0
-      python: pypy
-
     - name: CPython No C Extension
       env: PURE_PYTHON=1
       python: 3.8
diff --git a/CHANGES.rst b/CHANGES.rst
index f499162..2e66f43 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -134,6 +134,23 @@
   `dolmen.builtins <https://pypi.org/project/dolmen.builtins/>`_.
   See `issue 138 <https://github.com/zopefoundation/zope.interface/issues/138>`_.
 
+- Make ``providedBy()`` and ``implementedBy()`` respect ``super``
+  objects. For instance, if class ``Derived`` implements ``IDerived``
+  and extends ``Base`` which in turn implements ``IBase``, then
+  ``providedBy(super(Derived, derived))`` will return ``[IBase]``.
+  Previously it would have returned ``[IDerived]`` (in general, it
+  would previously have returned whatever would have been returned
+  without ``super``).
+
+  Along with this change, adapter registries will unpack ``super``
+  objects into their ``__self___`` before passing it to the factory.
+  Together, this means that ``component.getAdapter(super(Derived,
+  self), ITarget)`` is now meaningful.
+
+  See `issue 11 <https://github.com/zopefoundation/zope.interface/issues/11>`_.
+
+- Fix a potential interpreter crash in the low-level adapter
+  registry lookup functions. See issue 11.
 
 4.7.1 (2019-11-11)
 ==================
diff --git a/docs/adapter.rst b/docs/adapter.rst
index 6a728a3..50fcf8c 100644
--- a/docs/adapter.rst
+++ b/docs/adapter.rst
@@ -202,11 +202,11 @@ factories:
    ...     pass
 
    >>> @zope.interface.implementer(IR)
-   ... class X:
+   ... class X(object):
    ...     pass
 
    >>> @zope.interface.implementer(IProvide1)
-   ... class Y:
+   ... class Y(object):
    ...     def __init__(self, context):
    ...         self.context = context
 
@@ -238,6 +238,29 @@ We can register and lookup by name too:
   >>> y.context is x
   True
 
+Passing ``super`` objects works as expected to find less specific adapters:
+
+.. doctest::
+
+  >>> class IDerived(IR):
+  ...     pass
+  >>> @zope.interface.implementer(IDerived)
+  ... class Derived(X):
+  ...     pass
+  >>> class DerivedAdapter(Y):
+  ...     def query_next(self):
+  ...        return registry.queryAdapter(
+  ...            super(type(self.context), self.context),
+  ...            IProvide1)
+  >>> registry.register([IDerived], IProvide1, '', DerivedAdapter)
+  >>> derived = Derived()
+  >>> adapter = registry.queryAdapter(derived, IProvide1)
+  >>> adapter.__class__.__name__
+  'DerivedAdapter'
+  >>> adapter = adapter.query_next()
+  >>> adapter.__class__.__name__
+  'Y'
+
 When the adapter factory produces ``None``, then this is treated as if no
 adapter has been found. This allows us to prevent adaptation (when desired)
 and let the adapter factory determine whether adaptation is possible based on
diff --git a/docs/conf.py b/docs/conf.py
index 8a0f86a..464f652 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -17,7 +17,9 @@ import os
 import pkg_resources
 sys.path.append(os.path.abspath('../src'))
 rqmt = pkg_resources.require('zope.interface')[0]
-
+# Import and document the pure-python versions of things; they tend to have better
+# docstrings and signatures.
+os.environ['PURE_PYTHON'] = '1'
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
diff --git a/setup.py b/setup.py
index b5e87a8..9b8b4b8 100644
--- a/setup.py
+++ b/setup.py
@@ -69,10 +69,12 @@ codeoptimization = [
 ]
 
 is_jython = 'java' in sys.platform
+is_pypy = hasattr(sys, 'pypy_version_info')
 
-# Jython cannot build the C optimizations. Everywhere else,
-# including PyPy, defer the decision to runtime.
-if is_jython:
+# Jython cannot build the C optimizations. Nor, as of 7.3, can PyPy (
+# it doesn't have PySuper_Type) Everywhere else, defer the decision to
+# runtime.
+if is_jython or is_pypy:
     ext_modules = []
 else:
     ext_modules = codeoptimization
diff --git a/src/zope/interface/_zope_interface_coptimizations.c b/src/zope/interface/_zope_interface_coptimizations.c
index f4f9cce..180cdef 100644
--- a/src/zope/interface/_zope_interface_coptimizations.c
+++ b/src/zope/interface/_zope_interface_coptimizations.c
@@ -38,11 +38,12 @@
 static PyObject *str__dict__, *str__implemented__, *strextends;
 static PyObject *BuiltinImplementationSpecifications, *str__provides__;
 static PyObject *str__class__, *str__providedBy__;
-static PyObject *empty, *fallback, *str_implements;
+static PyObject *empty, *fallback;
 static PyObject *str__conform__, *str_call_conform, *adapter_hooks;
 static PyObject *str_uncached_lookup, *str_uncached_lookupAll;
 static PyObject *str_uncached_subscriptions;
 static PyObject *str_registry, *strro, *str_generation, *strchanged;
+static PyObject *str__self__;
 
 static PyTypeObject *Implements;
 
@@ -91,6 +92,7 @@ import_declarations(void)
   return 0;
 }
 
+
 static PyTypeObject SpecType;   /* Forward */
 
 static PyObject *
@@ -111,6 +113,12 @@ implementedBy(PyObject *ignored, PyObject *cls)
 
   PyObject *dict = NULL, *spec;
 
+  if (PyObject_TypeCheck(cls, &PySuper_Type))
+  {
+      // Let merging be handled by Python.
+      return implementedByFallback(cls);
+  }
+
   if (PyType_Check(cls))
     {
       dict = TYPE(cls)->tp_dict;
@@ -168,6 +176,7 @@ getObjectSpecification(PyObject *ignored, PyObject *ob)
   if (result != NULL && PyObject_TypeCheck(result, &SpecType))
     return result;
 
+
   PyErr_Clear();
 
   /* We do a getattr here so as not to be defeated by proxies */
@@ -176,11 +185,11 @@ getObjectSpecification(PyObject *ignored, PyObject *ob)
     {
       PyErr_Clear();
       if (imported_declarations == 0 && import_declarations() < 0)
-        return NULL;
+          return NULL;
+
       Py_INCREF(empty);
       return empty;
     }
-
   result = implementedBy(NULL, cls);
   Py_DECREF(cls);
 
@@ -192,7 +201,15 @@ providedBy(PyObject *ignored, PyObject *ob)
 {
   PyObject *result, *cls, *cp;
 
+  result = NULL;
+
+  if (PyObject_TypeCheck(ob, &PySuper_Type))
+  {
+      return implementedBy(NULL, ob);
+  }
+
   result = PyObject_GetAttr(ob, str__providedBy__);
+
   if (result == NULL)
     {
       PyErr_Clear();
@@ -947,27 +964,14 @@ _getcache(lookup *self, PyObject *provided, PyObject *name)
 
         return result
 */
-static PyObject *
-tuplefy(PyObject *v)
-{
-  if (! PyTuple_Check(v))
-    {
-      v = PyObject_CallFunctionObjArgs(OBJECT(&PyTuple_Type), v, NULL);
-      if (v == NULL)
-        return NULL;
-    }
-  else
-    Py_INCREF(v);
 
-  return v;
-}
 static PyObject *
 _lookup(lookup *self,
         PyObject *required, PyObject *provided, PyObject *name,
         PyObject *default_)
 {
   PyObject *result, *key, *cache;
-
+  result = key = cache = NULL;
 #ifdef PY3K
   if ( name && !PyUnicode_Check(name) )
 #else
@@ -978,14 +982,19 @@ _lookup(lookup *self,
                     "name is not a string or unicode");
     return NULL;
   }
-  cache = _getcache(self, provided, name);
-  if (cache == NULL)
-    return NULL;
 
-  required = tuplefy(required);
+  /* If `required` is a lazy sequence, it could have arbitrary side-effects,
+     such as clearing our caches. So we must not retreive the cache until
+     after resolving it. */
+  required = PySequence_Tuple(required);
   if (required == NULL)
     return NULL;
 
+
+  cache = _getcache(self, provided, name);
+  if (cache == NULL)
+    return NULL;
+
   if (PyTuple_GET_SIZE(required) == 1)
     key = PyTuple_GET_ITEM(required, 0);
   else
@@ -1032,7 +1041,7 @@ lookup_lookup(lookup *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"required", "provided", "name", "default", NULL};
   PyObject *required, *provided, *name=NULL, *default_=NULL;
 
-  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
+  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.lookup", kwlist,
                                     &required, &provided, &name, &default_))
     return NULL;
 
@@ -1104,7 +1113,7 @@ lookup_lookup1(lookup *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"required", "provided", "name", "default", NULL};
   PyObject *required, *provided, *name=NULL, *default_=NULL;
 
-  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
+  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.lookup1", kwlist,
                                     &required, &provided, &name, &default_))
     return NULL;
 
@@ -1120,6 +1129,8 @@ lookup_lookup1(lookup *self, PyObject *args, PyObject *kwds)
             factory = self.lookup((required, ), provided, name)
 
         if factory is not None:
+            if isinstance(object, super):
+                object = object.__self__
             result = factory(object)
             if result is not None:
                 return result
@@ -1154,12 +1165,23 @@ _adapter_hook(lookup *self,
     return NULL;
 
   if (factory != Py_None)
-    {
+  {
+      if (PyObject_TypeCheck(object, &PySuper_Type)) {
+          PyObject* self = PyObject_GetAttr(object, str__self__);
+          if (self == NULL)
+          {
+              Py_DECREF(factory);
+              return NULL;
+          }
+          // Borrow the reference to self
+          Py_DECREF(self);
+          object = self;
+      }
       result = PyObject_CallFunctionObjArgs(factory, object, NULL);
       Py_DECREF(factory);
       if (result == NULL || result != Py_None)
         return result;
-    }
+  }
   else
     result = factory; /* None */
 
@@ -1177,7 +1199,7 @@ lookup_adapter_hook(lookup *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"provided", "object", "name", "default", NULL};
   PyObject *object, *provided, *name=NULL, *default_=NULL;
 
-  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
+  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.adapter_hook", kwlist,
                                     &provided, &object, &name, &default_))
     return NULL;
 
@@ -1190,7 +1212,7 @@ lookup_queryAdapter(lookup *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"object", "provided", "name", "default", NULL};
   PyObject *object, *provided, *name=NULL, *default_=NULL;
 
-  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist,
+  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO:LookupBase.queryAdapter", kwlist,
                                     &object, &provided, &name, &default_))
     return NULL;
 
@@ -1217,15 +1239,16 @@ _lookupAll(lookup *self, PyObject *required, PyObject *provided)
 {
   PyObject *cache, *result;
 
+  /* resolve before getting cache. See note in _lookup. */
+  required = PySequence_Tuple(required);
+  if (required == NULL)
+    return NULL;
+
   ASSURE_DICT(self->_mcache);
   cache = _subcache(self->_mcache, provided);
   if (cache == NULL)
     return NULL;
 
-  required = tuplefy(required);
-  if (required == NULL)
-    return NULL;
-
   result = PyDict_GetItem(cache, required);
   if (result == NULL)
     {
@@ -1260,7 +1283,7 @@ lookup_lookupAll(lookup *self, PyObject *args, PyObject *kwds)
   static char *kwlist[] = {"required", "provided", NULL};
   PyObject *required, *provided;
 
-  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist,
+  if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO:LookupBase.lookupAll", kwlist,
                                     &required, &provided))
     return NULL;
 
@@ -1287,15 +1310,16 @@ _subscriptions(lookup *self, PyObject *required, PyObject *provided)
 {
   PyObject *cache, *result;
 
+  /* resolve before getting cache. See note in _lookup. */
+  required = PySequence_Tuple(required);
+  if (required == NULL)
+    return NULL;
+
   ASSURE_DICT(self->_scache);
   cache = _subcache(self->_scache, provided);
   if (cache == NULL)
     return NULL;
 
-  required = tuplefy(required);
-  if (required == NULL)
-    return NULL;
-
   result = PyDict_GetItem(cache, required);
   if (result == NULL)
     {
@@ -1726,7 +1750,6 @@ init(void)
   DEFINE_STRING(__class__);
   DEFINE_STRING(__providedBy__);
   DEFINE_STRING(extends);
-  DEFINE_STRING(_implements);
   DEFINE_STRING(__conform__);
   DEFINE_STRING(_call_conform);
   DEFINE_STRING(_uncached_lookup);
@@ -1736,6 +1759,7 @@ init(void)
   DEFINE_STRING(_generation);
   DEFINE_STRING(ro);
   DEFINE_STRING(changed);
+  DEFINE_STRING(__self__);
 #undef DEFINE_STRING
   adapter_hooks = PyList_New(0);
   if (adapter_hooks == NULL)
diff --git a/src/zope/interface/adapter.py b/src/zope/interface/adapter.py
index 40b2921..e9ca06f 100644
--- a/src/zope/interface/adapter.py
+++ b/src/zope/interface/adapter.py
@@ -30,6 +30,22 @@ __all__ = [
     'VerifyingAdapterRegistry',
 ]
 
+# ``tuple`` and ``list`` cooperate so that ``tuple([some list])``
+# directly allocates and iterates at the C level without using a
+# Python iterator. That's not the case for
+# ``tuple(generator_expression)`` or ``tuple(map(func, it))``.
+##
+# 3.8
+# ``tuple([t for t in range(10)])``      -> 610ns
+# ``tuple(t for t in range(10))``        -> 696ns
+# ``tuple(map(lambda t: t, range(10)))`` -> 881ns
+##
+# 2.7
+# ``tuple([t fon t in range(10)])``      -> 625ns
+# ``tuple(t for t in range(10))``        -> 665ns
+# ``tuple(map(lambda t: t, range(10)))`` -> 958ns
+#
+# All three have substantial variance.
 
 class BaseAdapterRegistry(object):
 
@@ -114,7 +130,7 @@ class BaseAdapterRegistry(object):
             self.unregister(required, provided, name, value)
             return
 
-        required = tuple(map(_convert_None_to_Interface, required))
+        required = tuple([_convert_None_to_Interface(r) for r in required])
         name = _normalize_name(name)
         order = len(required)
         byorder = self._adapters
@@ -143,7 +159,7 @@ class BaseAdapterRegistry(object):
         self.changed(self)
 
     def registered(self, required, provided, name=u''):
-        required = tuple(map(_convert_None_to_Interface, required))
+        required = tuple([_convert_None_to_Interface(r) for r in required])
         name = _normalize_name(name)
         order = len(required)
         byorder = self._adapters
@@ -162,7 +178,7 @@ class BaseAdapterRegistry(object):
         return components.get(name)
 
     def unregister(self, required, provided, name, value=None):
-        required = tuple(map(_convert_None_to_Interface, required))
+        required = tuple([_convert_None_to_Interface(r) for r in required])
         order = len(required)
         byorder = self._adapters
         if order >= len(byorder):
@@ -210,7 +226,7 @@ class BaseAdapterRegistry(object):
         self.changed(self)
 
     def subscribe(self, required, provided, value):
-        required = tuple(map(_convert_None_to_Interface, required))
+        required = tuple([_convert_None_to_Interface(r) for r in required])
         name = u''
         order = len(required)
         byorder = self._subscribers
@@ -237,7 +253,7 @@ class BaseAdapterRegistry(object):
         self.changed(self)
 
     def unsubscribe(self, required, provided, value=None):
-        required = tuple(map(_convert_None_to_Interface, required))
+        required = tuple([_convert_None_to_Interface(r) for r in required])
         order = len(required)
         byorder = self._subscribers
         if order >= len(byorder):
@@ -378,6 +394,8 @@ class LookupBase(object):
             factory = self.lookup((required, ), provided, name)
 
         if factory is not None:
+            if isinstance(object, super):
+                object = object.__self__
             result = factory(object)
             if result is not None:
                 return result
@@ -539,11 +557,11 @@ class AdapterLookupBase(object):
         return result
 
     def queryMultiAdapter(self, objects, provided, name=u'', default=None):
-        factory = self.lookup(map(providedBy, objects), provided, name)
+        factory = self.lookup([providedBy(o) for o in objects], provided, name)
         if factory is None:
             return default
 
-        result = factory(*objects)
+        result = factory(*[o.__self__ if isinstance(o, super) else o for o in objects])
         if result is None:
             return default
 
@@ -594,7 +612,7 @@ class AdapterLookupBase(object):
         return result
 
     def subscribers(self, objects, provided):
-        subscriptions = self.subscriptions(map(providedBy, objects), provided)
+        subscriptions = self.subscriptions([providedBy(o) for o in objects], provided)
         if provided is None:
             result = ()
             for subscription in subscriptions:
diff --git a/src/zope/interface/declarations.py b/src/zope/interface/declarations.py
index 3118593..9c15b9b 100644
--- a/src/zope/interface/declarations.py
+++ b/src/zope/interface/declarations.py
@@ -54,6 +54,16 @@ _ADVICE_ERROR = ('Class advice impossible in Python3.  '
 _ADVICE_WARNING = ('The %s API is deprecated, and will not work in Python3  '
                    'Use the @%s class decorator instead.')
 
+def _next_super_class(ob):
+    # When ``ob`` is an instance of ``super``, return
+    # the next class in the MRO that we should actually be
+    # looking at. Watch out for diamond inheritance!
+    self_class = ob.__self_class__
+    class_that_invoked_super = ob.__thisclass__
+    complete_mro = self_class.__mro__
+    next_class = complete_mro[complete_mro.index(class_that_invoked_super) + 1]
+    return next_class
+
 class named(object):
 
     def __init__(self, name):
@@ -69,8 +79,8 @@ class Declaration(Specification):
 
     __slots__ = ()
 
-    def __init__(self, *interfaces):
-        Specification.__init__(self, _normalizeargs(interfaces))
+    def __init__(self, *bases):
+        Specification.__init__(self, _normalizeargs(bases))
 
     def __contains__(self, interface):
         """Test whether an interface is in the specification
@@ -195,10 +205,14 @@ class Implements(Declaration):
     # interfaces actually declared for a class
     declared = ()
 
+    # Weak cache of {class: <implements>} for super objects.
+    # Created on demand.
+    _super_cache = None
+
     __name__ = '?'
 
     @classmethod
-    def named(cls, name, *interfaces):
+    def named(cls, name, *bases):
         # Implementation method: Produce an Implements interface with
         # a fully fleshed out __name__ before calling the constructor, which
         # sets bases to the given interfaces and which may pass this object to
@@ -206,9 +220,13 @@ class Implements(Declaration):
         # by name, this needs to be set.
         inst = cls.__new__(cls)
         inst.__name__ = name
-        inst.__init__(*interfaces)
+        inst.__init__(*bases)
         return inst
 
+    def changed(self, originally_changed):
+        self._super_cache = None
+        return super(Implements, self).changed(originally_changed)
+
     def __repr__(self):
         return '<implementedBy %s>' % (self.__name__)
 
@@ -276,6 +294,53 @@ def _implements_name(ob):
         '.' + (getattr(ob, '__name__', '?') or '?')
 
 
+def _implementedBy_super(sup):
+    # TODO: This is now simple enough we could probably implement
+    # in C if needed.
+
+    # If the class MRO is strictly linear, we could just
+    # follow the normal algorithm for the next class in the
+    # search order (e.g., just return
+    # ``implemented_by_next``). But when diamond inheritance
+    # or mixins + interface declarations are present, we have
+    # to consider the whole MRO and compute a new Implements
+    # that excludes the classes being skipped over but
+    # includes everything else.
+    implemented_by_self = implementedBy(sup.__self_class__)
+    cache = implemented_by_self._super_cache
+    if cache is None:
+        cache = implemented_by_self._super_cache = weakref.WeakKeyDictionary()
+
+    key = sup.__thisclass__
+    try:
+        return cache[key]
+    except KeyError:
+        pass
+
+    next_cls = _next_super_class(sup)
+    # For ``implementedBy(cls)``:
+    # .__bases__ is .declared + [implementedBy(b) for b in cls.__bases__]
+    # .inherit is cls
+
+    implemented_by_next = implementedBy(next_cls)
+    mro = sup.__self_class__.__mro__
+    ix_next_cls = mro.index(next_cls)
+    classes_to_keep = mro[ix_next_cls:]
+    new_bases = [implementedBy(c) for c in classes_to_keep]
+
+    new = Implements.named(
+        implemented_by_self.__name__ + ':' + implemented_by_next.__name__,
+        *new_bases
+    )
+    new.inherit = implemented_by_next.inherit
+    new.declared = implemented_by_next.declared
+    # I don't *think* that new needs to subscribe to ``implemented_by_self``;
+    # it auto-subscribed to its bases, and that should be good enough.
+    cache[key] = new
+
+    return new
+
+
 @_use_c_impl
 def implementedBy(cls):
     """Return the interfaces implemented for a class' instances
@@ -283,6 +348,11 @@ def implementedBy(cls):
       The value returned is an `~zope.interface.interfaces.IDeclaration`.
     """
     try:
+        if isinstance(cls, super):
+            # Yes, this needs to be inside the try: block. Some objects
+            # like security proxies even break isinstance.
+            return _implementedBy_super(cls)
+
         spec = cls.__dict__.get('__implemented__')
     except AttributeError:
 
@@ -449,6 +519,8 @@ class implementer(object):
 
     def __call__(self, ob):
         if isinstance(ob, DescriptorAwareMetaClasses):
+            # This is the common branch for new-style (object) and
+            # on Python 2 old-style classes.
             classImplements(ob, *self.interfaces)
             return ob
 
@@ -890,12 +962,22 @@ def getObjectSpecification(ob):
 
 @_use_c_impl
 def providedBy(ob):
+    """
+    Return the interfaces provided by *ob*.
 
+    If *ob* is a :class:`super` object, then only interfaces implemented
+    by the remainder of the classes in the method resolution order are
+    considered. Interfaces directly provided by the object underlying *ob*
+    are not.
+    """
     # Here we have either a special object, an old-style declaration
     # or a descriptor
 
     # Try to get __providedBy__
     try:
+        if isinstance(ob, super): # Some objects raise errors on isinstance()
+            return implementedBy(ob)
+
         r = ob.__providedBy__
     except:
         # Not set yet. Fall back to lower-level thing that computes it
@@ -943,7 +1025,7 @@ def providedBy(ob):
 class ObjectSpecificationDescriptor(object):
     """Implement the `__providedBy__` attribute
 
-    The `__providedBy__` attribute computes the interfaces peovided by
+    The `__providedBy__` attribute computes the interfaces provided by
     an object.
     """
 

`providedBy` does not respect `super`
In https://bugs.launchpad.net/zope.interface/+bug/448712, Dieter Maurer reported:

> In some places, the implementation of a subclass adapter may take advantage of that defined for a base class. In such cases, "super" comes to mind. Unfortunately, "providedBy" (implicitely during in adapter lookup) does not respect "super" as shown by the folloging transscript:

```
>>> from zope.interface import Interface, implements
>>> class I1(Interface): pass
...
>>> class B(object): implements(Interface)
...
>>> class C(B): implements(I1)
...
>>> c=C()
>>> from zope.interface import providedBy
>>> list(providedBy(c))
[<InterfaceClass __main__.I1>, <InterfaceClass zope.interface.Interface>]
>>> list(providedBy(super(C,c)))
[<InterfaceClass __main__.I1>, <InterfaceClass zope.interface.Interface>]
```

diff --git a/src/zope/interface/tests/test_adapter.py b/src/zope/interface/tests/test_adapter.py
index 6703a48..0456b1c 100644
--- a/src/zope/interface/tests/test_adapter.py
+++ b/src/zope/interface/tests/test_adapter.py
@@ -499,9 +499,23 @@ class LookupBaseFallbackTests(unittest.TestCase):
         req, prv, _default = object(), object(), object()
         lb = self._makeOne(uc_lookup=_lookup)
         adapted = lb.adapter_hook(prv, req, 'C', _default)
-        self.assertTrue(adapted is _adapter)
+        self.assertIs(adapted, _adapter)
         self.assertEqual(_f_called_with, [req])
 
+    def test_adapter_hook_super_unwraps(self):
+        _f_called_with = []
+        def _factory(context):
+            _f_called_with.append(context)
+            return context
+        def _lookup(self, required, provided, name=''):
+            return _factory
+        required = super(LookupBaseFallbackTests, self)
+        provided = object()
+        lb = self._makeOne(uc_lookup=_lookup)
+        adapted = lb.adapter_hook(provided, required)
+        self.assertIs(adapted, self)
+        self.assertEqual(_f_called_with, [self])
+
     def test_queryAdapter(self):
         _f_called_with = []
         _adapter = object()
@@ -1073,6 +1087,29 @@ class AdapterLookupBaseTests(unittest.TestCase):
         self.assertTrue(result is _expected)
         self.assertEqual(_called_with, [foo])
 
+    def test_queryMultiAdapter_super_unwraps(self):
+        alb = self._makeOne(self._makeRegistry())
+        def lookup(*args):
+            return factory
+        def factory(*args):
+            return args
+        alb.lookup = lookup
+
+        objects = [
+            super(AdapterLookupBaseTests, self),
+            42,
+            "abc",
+            super(AdapterLookupBaseTests, self),
+        ]
+
+        result = alb.queryMultiAdapter(objects, None)
+        self.assertEqual(result, (
+            self,
+            42,
+            "abc",
+            self,
+        ))
+
     def test__uncached_lookupAll_empty_ro(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 5256b07..ccf4dde 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -529,6 +529,177 @@ class Test_implementedByFallback(unittest.TestCase):
             __implemented__ = impl
         self.assertTrue(self._callFUT(Foo) is impl)
 
+    def test_super_when_base_implements_interface(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        self.assertEqual(list(self._callFUT(Derived)), [IDerived, IBase])
+        sup = super(Derived, Derived)
+        self.assertEqual(list(self._callFUT(sup)), [IBase])
+
+    def test_super_when_base_implements_interface_diamond(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        class Child1(Base):
+            pass
+
+        class Child2(Base):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Child1, Child2):
+            pass
+
+        self.assertEqual(list(self._callFUT(Derived)), [IDerived, IBase])
+        sup = super(Derived, Derived)
+        self.assertEqual(list(self._callFUT(sup)), [IBase])
+
+    def test_super_when_parent_implements_interface_diamond(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+
+        class Base(object):
+            pass
+
+        class Child1(Base):
+            pass
+
+        @implementer(IBase)
+        class Child2(Base):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Child1, Child2):
+            pass
+
+        self.assertEqual(Derived.__mro__, (Derived, Child1, Child2, Base, object))
+        self.assertEqual(list(self._callFUT(Derived)), [IDerived, IBase])
+        sup = super(Derived, Derived)
+        fut = self._callFUT(sup)
+        self.assertEqual(list(fut), [IBase])
+        self.assertIsNone(fut._dependents)
+
+    def test_super_when_base_doesnt_implement_interface(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        self.assertEqual(list(self._callFUT(Derived)), [IDerived])
+
+        sup = super(Derived, Derived)
+        self.assertEqual(list(self._callFUT(sup)), [])
+
+    def test_super_when_base_is_object(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IDerived)
+        class Derived(object):
+            pass
+
+        self.assertEqual(list(self._callFUT(Derived)), [IDerived])
+
+        sup = super(Derived, Derived)
+        self.assertEqual(list(self._callFUT(sup)), [])
+    def test_super_multi_level_multi_inheritance(self):
+        from zope.interface.declarations import implementer
+        from zope.interface import Interface
+
+        class IBase(Interface):
+            pass
+
+        class IM1(Interface):
+            pass
+
+        class IM2(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class IUnrelated(Interface):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IM1)
+        class M1(Base):
+            pass
+
+        @implementer(IM2)
+        class M2(Base):
+            pass
+
+        @implementer(IDerived, IUnrelated)
+        class Derived(M1, M2):
+            pass
+
+        d = Derived
+        sd = super(Derived, Derived)
+        sm1 = super(M1, Derived)
+        sm2 = super(M2, Derived)
+
+        self.assertEqual(list(self._callFUT(d)),
+                         [IDerived, IUnrelated, IM1, IBase, IM2])
+        self.assertEqual(list(self._callFUT(sd)),
+                         [IM1, IBase, IM2])
+        self.assertEqual(list(self._callFUT(sm1)),
+                         [IM2, IBase])
+        self.assertEqual(list(self._callFUT(sm2)),
+                         [IBase])
+
 
 class Test_implementedBy(Test_implementedByFallback,
                          OptimizationTestMixin):
@@ -1575,6 +1746,155 @@ class Test_providedByFallback(unittest.TestCase):
         spec = self._callFUT(foo)
         self.assertEqual(list(spec), [IFoo])
 
+    def test_super_when_base_implements_interface(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        derived = Derived()
+        self.assertEqual(list(self._callFUT(derived)), [IDerived, IBase])
+
+        sup = super(Derived, derived)
+        fut = self._callFUT(sup)
+        self.assertIsNone(fut._dependents)
+        self.assertEqual(list(fut), [IBase])
+
+    def test_super_when_base_doesnt_implement_interface(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        derived = Derived()
+        self.assertEqual(list(self._callFUT(derived)), [IDerived])
+
+        sup = super(Derived, derived)
+        self.assertEqual(list(self._callFUT(sup)), [])
+
+    def test_super_when_base_is_object(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IDerived)
+        class Derived(object):
+            pass
+
+        derived = Derived()
+        self.assertEqual(list(self._callFUT(derived)), [IDerived])
+
+        sup = super(Derived, derived)
+        fut = self._callFUT(sup)
+        self.assertIsNone(fut._dependents)
+        self.assertEqual(list(fut), [])
+
+    def test_super_when_object_directly_provides(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+        from zope.interface.declarations import directlyProvides
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        class Derived(Base):
+            pass
+
+        derived = Derived()
+        self.assertEqual(list(self._callFUT(derived)), [IBase])
+
+        directlyProvides(derived, IDerived)
+        self.assertEqual(list(self._callFUT(derived)), [IDerived, IBase])
+
+        sup = super(Derived, derived)
+        fut = self._callFUT(sup)
+        self.assertIsNone(fut._dependents)
+        self.assertEqual(list(fut), [IBase])
+
+    def test_super_multi_level_multi_inheritance(self):
+        from zope.interface.declarations import implementer
+        from zope.interface import Interface
+
+        class IBase(Interface):
+            pass
+
+        class IM1(Interface):
+            pass
+
+        class IM2(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class IUnrelated(Interface):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IM1)
+        class M1(Base):
+            pass
+
+        @implementer(IM2)
+        class M2(Base):
+            pass
+
+        @implementer(IDerived, IUnrelated)
+        class Derived(M1, M2):
+            pass
+
+        d = Derived()
+        sd = super(Derived, d)
+        sm1 = super(M1, d)
+        sm2 = super(M2, d)
+
+        self.assertEqual(list(self._callFUT(d)),
+                         [IDerived, IUnrelated, IM1, IBase, IM2])
+        self.assertEqual(list(self._callFUT(sd)),
+                         [IM1, IBase, IM2])
+        self.assertEqual(list(self._callFUT(sm1)),
+                         [IM2, IBase])
+        self.assertEqual(list(self._callFUT(sm2)),
+                         [IBase])
+
 
 class Test_providedBy(Test_providedByFallback,
                       OptimizationTestMixin):
diff --git a/src/zope/interface/tests/test_registry.py b/src/zope/interface/tests/test_registry.py
index e5a8eb0..db91c52 100644
--- a/src/zope/interface/tests/test_registry.py
+++ b/src/zope/interface/tests/test_registry.py
@@ -1332,8 +1332,102 @@ class ComponentsTests(unittest.TestCase):
         comp = self._makeOne()
         comp.registerAdapter(_Factory, (ibar,), ifoo)
         adapter = comp.getAdapter(_context, ifoo)
-        self.assertTrue(isinstance(adapter, _Factory))
-        self.assertTrue(adapter.context is _context)
+        self.assertIsInstance(adapter, _Factory)
+        self.assertIs(adapter.context, _context)
+
+    def test_getAdapter_hit_super(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class IFoo(Interface):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        class AdapterBase(object):
+            def __init__(self, context):
+                self.context = context
+
+        class AdapterDerived(object):
+            def __init__(self, context):
+                self.context = context
+
+        comp = self._makeOne()
+        comp.registerAdapter(AdapterDerived, (IDerived,), IFoo)
+        comp.registerAdapter(AdapterBase, (IBase,), IFoo)
+        self._should_not_change(comp)
+
+        derived = Derived()
+        adapter = comp.getAdapter(derived, IFoo)
+        self.assertIsInstance(adapter, AdapterDerived)
+        self.assertIs(adapter.context, derived)
+
+        supe = super(Derived, derived)
+        adapter = comp.getAdapter(supe, IFoo)
+        self.assertIsInstance(adapter, AdapterBase)
+        self.assertIs(adapter.context, derived)
+
+    def test_getAdapter_hit_super_when_parent_implements_interface_diamond(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class IFoo(Interface):
+            pass
+
+        class Base(object):
+            pass
+
+        class Child1(Base):
+            pass
+
+        @implementer(IBase)
+        class Child2(Base):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Child1, Child2):
+            pass
+
+        class AdapterBase(object):
+            def __init__(self, context):
+                self.context = context
+
+        class AdapterDerived(object):
+            def __init__(self, context):
+                self.context = context
+
+        comp = self._makeOne()
+        comp.registerAdapter(AdapterDerived, (IDerived,), IFoo)
+        comp.registerAdapter(AdapterBase, (IBase,), IFoo)
+        self._should_not_change(comp)
+
+        derived = Derived()
+        adapter = comp.getAdapter(derived, IFoo)
+        self.assertIsInstance(adapter, AdapterDerived)
+        self.assertIs(adapter.context, derived)
+
+        supe = super(Derived, derived)
+        adapter = comp.getAdapter(supe, IFoo)
+        self.assertIsInstance(adapter, AdapterBase)
+        self.assertIs(adapter.context, derived)
 
     def test_queryMultiAdapter_miss(self):
         from zope.interface.declarations import InterfaceClass
@@ -1448,6 +1542,63 @@ class ComponentsTests(unittest.TestCase):
         self.assertTrue(isinstance(adapter, _Factory))
         self.assertEqual(adapter.context, (_context1, _context2))
 
+    def _should_not_change(self, comp):
+        # Be sure that none of the underlying structures
+        # get told that they have changed during this process
+        # because that invalidates caches.
+        def no_changes(*args):
+            self.fail("Nothing should get changed")
+        comp.changed = no_changes
+        comp.adapters.changed = no_changes
+        comp.adapters._v_lookup.changed = no_changes
+
+    def test_getMultiAdapter_hit_super(self):
+        from zope.interface import Interface
+        from zope.interface.declarations import implementer
+
+        class IBase(Interface):
+            pass
+
+        class IDerived(IBase):
+            pass
+
+        class IFoo(Interface):
+            pass
+
+        @implementer(IBase)
+        class Base(object):
+            pass
+
+        @implementer(IDerived)
+        class Derived(Base):
+            pass
+
+        class AdapterBase(object):
+            def __init__(self, context1, context2):
+                self.context1 = context1
+                self.context2 = context2
+
+        class AdapterDerived(AdapterBase):
+            pass
+
+        comp = self._makeOne()
+        comp.registerAdapter(AdapterDerived, (IDerived, IDerived), IFoo)
+        comp.registerAdapter(AdapterBase, (IBase, IDerived), IFoo)
+        self._should_not_change(comp)
+
+        derived = Derived()
+        adapter = comp.getMultiAdapter((derived, derived), IFoo)
+        self.assertIsInstance(adapter, AdapterDerived)
+        self.assertIs(adapter.context1, derived)
+        self.assertIs(adapter.context2, derived)
+
+        supe = super(Derived, derived)
+        adapter = comp.getMultiAdapter((supe, derived), IFoo)
+        self.assertIsInstance(adapter, AdapterBase)
+        self.assertNotIsInstance(adapter, AdapterDerived)
+        self.assertIs(adapter.context1, derived)
+        self.assertIs(adapter.context2, derived)
+
     def test_getAdapters_empty(self):
         from zope.interface.declarations import InterfaceClass
         from zope.interface.declarations import implementer

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pytest==7.1.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work
-e git+https://github.com/zopefoundation/zope.interface.git@c931999371b106ca4638a5cfb40fe0e431840358#egg=zope.interface

name: zope.interface
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
prefix: /opt/conda/envs/zope.interface

src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_super_unwraps src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdapter_super_unwraps src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_object_directly_provides
src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_super_unwraps src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_object_directly_provides src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapter_hit_super src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapter_hit_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_registry.py::ComponentsTests::test_getMultiAdapter_hit_super src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapter_hit_super src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapter_hit_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getMultiAdapter_hit_super
src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_after_calling_changed src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_after_changing___bases__ src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_on_first_creation src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_lookup_delegation src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_invalid_name src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_same_value src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_value_None_unregisters src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_non_empty_hit src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_non_empty_miss src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_hit_clears_empty_subcomponents src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_non_empty_miss_on_name src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_non_empty_miss_on_required src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_with_value_not_None_miss src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_after_multiple src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_hit src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_instance_method src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_non_empty_miss_on_required src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_non_empty_miss_on_value src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_w_None_after_multiple src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_with_value_not_None_miss src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_hit_factory_returns_None src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_hit_factory_returns_adapter src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_w_default_negative_cache src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookupAll_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookupAll_uncached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_subscriptions_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_subscriptions_uncached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_hit_factory_returns_None src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_hit_factory_returns_adapter src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_w_default_negative_cache src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookupAll_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookupAll_uncached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_optimizations src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_subscriptions_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_subscriptions_uncached src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_adapter_hook src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookup src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookup1 src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookupAll src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_subscriptions src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_adapter_hook src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookup src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookup1 src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookupAll src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_optimizations src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_subscriptions src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_components_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_components_miss_wrong_iface src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_components_miss_wrong_name src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_repeated_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_components_miss_wrong_iface src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_components_miss_wrong_name src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_add_extendor src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_changed_empty_required src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_changed_w_required src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_ctor_empty_registry src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_ctor_w_registry_provided src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_init_extendors_after_registry_update src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_names src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdapter_errors_on_attribute_access src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_factory_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_factory_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_lookup_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_remove_extendor src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_subscribers_w_provided src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_subscribers_wo_provided src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_removing_existing_subregistry src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_w_existing_entry_continuing src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_wo_stray_entry src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_changed_w_subregistries src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_ctor_no_bases src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_ctor_w_bases src/zope/interface/tests/test_adapter.py::Test_utils::test__convert_None_to_Interface_w_None src/zope/interface/tests/test_adapter.py::Test_utils::test__convert_None_to_Interface_w_other src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_other src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_str src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_unicode src/zope/interface/tests/test_declarations.py::NamedTests::test_class src/zope/interface/tests/test_declarations.py::NamedTests::test_function src/zope/interface/tests/test_declarations.py::NamedTests::test_instance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_base_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_self src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_unrelated_iface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface_by_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_w_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_wo_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_implements_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_interface_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_change__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_changed src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_dependents src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_always_false src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_get_always_default src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_pickle src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_singleton src/zope/interface/tests/test_declarations.py::TestImplements::test___reduce__ src/zope/interface/tests/test_declarations.py::TestImplements::test___repr__ src/zope/interface/tests/test_declarations.py::TestImplements::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::TestImplements::test_proxy_equality src/zope/interface/tests/test_declarations.py::TestImplements::test_sort src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements_w_bases src/zope/interface/tests/test_declarations.py::Test__implements_advice::test_no_existing_implements src/zope/interface/tests/test_declarations.py::Test_implementer::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_can_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_cannot_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_function src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_method src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_called_once_from_class_w_bases src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_simple src/zope/interface/tests/test_declarations.py::Test_implements::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_implements::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_implements::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___instance src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test_simple_class_one_interface src/zope/interface/tests/test_declarations.py::Test_Provides::test_no_cached_spec src/zope/interface/tests/test_declarations.py::Test_Provides::test_w_cached_spec src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_class src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_classless_object src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_normal_object src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_w_existing_provides src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_hit src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_miss src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_iface_implemented_by_class src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_optimizations src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test_w_simple_metaclass src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_class_but_not_instance src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_and_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_but_not_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_wo_declarations_in_class_or_instance src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::Test_provider::test_w_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_once_from_module_scope src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_twice_from_module_scope src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_optimizations src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_optimizations src/zope/interface/tests/test_registry.py::ComponentsTests::test___repr__ src/zope/interface/tests/test_registry.py::ComponentsTests::test_assign_to___bases__ src/zope/interface/tests/test_registry.py::ComponentsTests::test_ctor_no_bases src/zope/interface/tests/test_registry.py::ComponentsTests::test_ctor_w_base src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapter_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapter_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapters_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapters_factory_returns_None src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAdapters_non_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAllUtilitiesRegisteredFor_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_getAllUtilitiesRegisteredFor_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_getMultiAdapter_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_getMultiAdapter_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_getUtilitiesFor_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_getUtilitiesFor_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_getUtility_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_getUtility_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_handle_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_handle_non_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryAdapter_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryAdapter_miss_no_default src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryAdapter_miss_w_default src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryMultiAdapter_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryMultiAdapter_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryMultiAdapter_miss_w_default src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryUtility_hit src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryUtility_miss_no_default src/zope/interface/tests/test_registry.py::ComponentsTests::test_queryUtility_miss_w_default src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_no_provided_available src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_no_required_available src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_w_invalid_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_w_required_containing_None src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_w_required_containing_class src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_w_required_containing_junk src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_with_component_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_wo_event src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerHandler_w_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerHandler_w_nonblank_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerHandler_wo_explicit_required_no_event src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerSubscriptionAdapter_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerSubscriptionAdapter_w_nonblank_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerSubscriptionAdapter_wo_event src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerSubscriptionAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerSubscriptionAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_both_factory_and_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_changes_object_identity_after src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_changes_object_identity_before src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_duplicates_existing_reg src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_no_provided_available src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_replaces_existing_reg src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_w_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_w_different_info src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_w_different_names_same_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_w_existing_subscr src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_w_factory src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_with_component_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_wo_event src/zope/interface/tests/test_registry.py::ComponentsTests::test_registerUtility_wo_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredAdapters_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredAdapters_notempty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredHandlers_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredHandlers_non_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredSubscriptionAdapters_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredSubscriptionAdapters_notempty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredUtilities_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_registeredUtilities_notempty src/zope/interface/tests/test_registry.py::ComponentsTests::test_subscribers_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_subscribers_non_empty src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_hit_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_neither_factory_nor_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_neither_factory_nor_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_hit_w_factory_and_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_hit_w_only_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_neither_factory_nor_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_w_nonblank_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterHandler_wo_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_hit_w_factory src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_hit_wo_factory src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_neither_factory_nor_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_neither_factory_nor_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_w_nonblank_name src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterSubscriptionAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_both_factory_and_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_neither_factory_nor_component_nor_provided src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_component_miss src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable_fresh_cache src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable_reinitted src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr_other_component src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_existing_subscr_other_component_mixed_hash src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_w_factory src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_wo_component_or_factory src/zope/interface/tests/test_registry.py::ComponentsTests::test_unregisterUtility_wo_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test___repr__ src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_assign_to___bases__ src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_ctor_no_bases src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_ctor_w_base src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapter_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapter_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapters_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapters_factory_returns_None src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAdapters_non_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAllUtilitiesRegisteredFor_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getAllUtilitiesRegisteredFor_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getMultiAdapter_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getMultiAdapter_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getUtilitiesFor_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getUtilitiesFor_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getUtility_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_getUtility_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_handle_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_handle_non_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryAdapter_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryAdapter_miss_no_default src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryAdapter_miss_w_default src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryMultiAdapter_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryMultiAdapter_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryMultiAdapter_miss_w_default src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryUtility_hit src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryUtility_miss_no_default src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_queryUtility_miss_w_default src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_no_provided_available src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_no_required_available src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_w_invalid_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_w_required_containing_None src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_w_required_containing_class src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_w_required_containing_junk src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_with_component_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_wo_event src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerHandler_w_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerHandler_w_nonblank_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerHandler_wo_explicit_required_no_event src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerSubscriptionAdapter_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerSubscriptionAdapter_w_nonblank_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerSubscriptionAdapter_wo_event src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerSubscriptionAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerSubscriptionAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_both_factory_and_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_changes_object_identity_after src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_changes_object_identity_before src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_duplicates_existing_reg src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_no_provided_available src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_replaces_existing_reg src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_w_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_w_different_info src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_w_different_names_same_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_w_existing_subscr src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_w_factory src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_with_component_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_wo_event src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registerUtility_wo_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredAdapters_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredAdapters_notempty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredHandlers_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredHandlers_non_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredSubscriptionAdapters_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredSubscriptionAdapters_notempty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredUtilities_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_registeredUtilities_notempty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_subscribers_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_subscribers_non_empty src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_hit_w_explicit_provided_and_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_neither_factory_nor_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_neither_factory_nor_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_hit_w_factory_and_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_hit_w_only_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_neither_factory_nor_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_w_nonblank_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterHandler_wo_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_hit_w_factory src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_hit_wo_factory src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_neither_factory_nor_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_neither_factory_nor_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_w_nonblank_name src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_wo_explicit_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterSubscriptionAdapter_wo_explicit_required src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_both_factory_and_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_neither_factory_nor_component_nor_provided src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_component_miss src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable_fresh_cache src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr_non_hashable_reinitted src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr_other_component src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_existing_subscr_other_component_mixed_hash src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_w_factory src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_wo_component_or_factory src/zope/interface/tests/test_registry.py::UnhashableComponentsTests::test_unregisterUtility_wo_explicit_provided src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___eq___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___eq___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___eq___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ge___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ge___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ge___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___gt___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___gt___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___gt___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___hash__ src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___le___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___le___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___le___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___lt___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___lt___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___lt___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ne___hit src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ne___identity src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___ne___miss src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___repr__ src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___repr___component_wo_name src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test___repr___provided_wo_name src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test_class_conforms_to_IUtilityRegistration src/zope/interface/tests/test_registry.py::UtilityRegistrationTests::test_instance_conforms_to_IUtilityRegistration src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___eq___hit src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___eq___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___eq___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ge___hit src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ge___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ge___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___gt___hit src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___gt___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___gt___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___hash__ src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___le___hit src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___le___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___le___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___lt___hit src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___lt___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___lt___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ne___hit_component src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ne___hit_provided src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ne___hit_required src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ne___identity src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___ne___miss src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___repr__ src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___repr___component_wo_name src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test___repr___provided_wo_name src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test_class_conforms_to_IAdapterRegistration src/zope/interface/tests/test_registry.py::AdapterRegistrationTests::test_instance_conforms_to_IAdapterRegistration src/zope/interface/tests/test_registry.py::SubscriptionRegistrationTests::test_class_conforms_to_ISubscriptionAdapterRegistration src/zope/interface/tests/test_registry.py::SubscriptionRegistrationTests::test_instance_conforms_to_ISubscriptionAdapterRegistration src/zope/interface/tests/test_registry.py::HandlerRegistrationTests::test___repr___factory_w_name src/zope/interface/tests/test_registry.py::HandlerRegistrationTests::test___repr___factory_wo_name src/zope/interface/tests/test_registry.py::HandlerRegistrationTests::test_class_conforms_to_IHandlerRegistration src/zope/interface/tests/test_registry.py::HandlerRegistrationTests::test_instance_conforms_to_IHandlerRegistration src/zope/interface/tests/test_registry.py::HandlerRegistrationTests::test_properties src/zope/interface/tests/test_registry.py::TestPersistentComponents::test_pickles_empty src/zope/interface/tests/test_registry.py::TestPersistentComponents::test_pickles_with_utility_registration src/zope/interface/tests/test_registry.py::TestPersistentDictComponents::test_pickles_empty src/zope/interface/tests/test_registry.py::TestPersistentDictComponents::test_pickles_with_utility_registration src/zope/interface/tests/test_registry.py::TestPersistentComponentsDict::test_pickles_empty src/zope/interface/tests/test_registry.py::TestPersistentComponentsDict::test_pickles_with_utility_registration
docs/conf.py setup.py src/zope/interface/_zope_interface_coptimizations.c src/zope/interface/declarations.py .travis.yml CHANGES.rst docs/adapter.rst src/zope/interface/adapter.py
docs/conf.py setup.py src/zope/interface/_zope_interface_coptimizations.c src/zope/interface/declarations.py .travis.yml CHANGES.rst docs/adapter.rst src/zope/interface/adapter.py