�
��e� � �� � d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlm Z ddlm
Z
dd lmZ dd
lm
Z
mZmZ ddgZefZdd
�Zd� Zdd�Zdd�Zej e_ dZd� Zy)z!Verify interface implementations
� N)�FunctionType)�
MethodType)�BrokenImplementation)�BrokenMethodImplementation)�DoesNotImplement)�Invalid)�MultipleInvalid)�
fromMethod�fromFunction�Method�verifyObject�verifyClassc �t � |dk( r
| j }n| j }g }|s# ||� s|j t | |� � | j d�� D ] \ }} t | ||||� � |r t |� dk( r|d �t | ||� �y# t $ r}|j |� Y d}~�Zd}~ww xY w)a�
Verify that *candidate* might correctly provide *iface*.
This involves:
- Making sure the candidate claims that it provides the
interface using ``iface.providedBy`` (unless *tentative* is `True`,
in which case this step is skipped). This means that the candidate's class
declares that it `implements <zope.interface.implementer>` the interface,
or the candidate itself declares that it `provides <zope.interface.provider>`
the interface
- Making sure the candidate defines all the necessary methods
- Making sure the methods have the correct signature (to the
extent possible)
- Making sure the candidate defines all the necessary attributes
:return bool: Returns a true value if everything that could be
checked passed.
:raises zope.interface.Invalid: If any of the previous
conditions does not hold.
.. versionchanged:: 5.0
If multiple methods or attributes are invalid, all such errors
are collected and reported. Previously, only the first error was reported.
As a special case, if only one such error is present, it is raised
alone, like before.
�cT)�allN� r ) �
implementedBy�
providedBy�appendr �namesAndDescriptions�_verify_elementr �lenr ) �iface� candidate� tentative�vtype�tester�excs�name�desc�es �7/usr/lib/python3/dist-packages/zope/interface/verify.py�_verifyr# ' |