o
    ×•`é,  ã                   @   s†  d Z ddlmZmZmZ ddlZddlmZmZm	Z	m
Z
 ddlmZ g d¢Ze
dd	d	d
�G dd„ deƒƒZdd„ Ze
dd	d	d�G dd„ deƒƒZd,dd„Ze
dd	d	d
�G dd„ deƒƒZdd„ Ze
dd	d	d
�G dd„ deƒƒZdd„ Ze
dd	d	d
�G dd„ deƒƒZdd„ Ze
ddd	d
�G d d!„ d!eƒƒZd"d#„ Ze
dd	d	d
�G d$d%„ d%eƒƒZd-d&d'„Ze
dd	d	d
�G d(d)„ d)eƒƒZd-d*d+„ZdS ).z
Commonly useful validators.
é    )Úabsolute_importÚdivisionÚprint_functionNé   )Ú_AndValidatorÚand_ÚattribÚattrs)ÚNotCallableError)	r   Údeep_iterableÚdeep_mappingÚin_Úinstance_ofÚis_callableÚ
matches_reÚoptionalÚprovidesFT)ÚreprÚslotsÚhashc                   @   ó"   e Zd Zeƒ Zdd„ Zdd„ ZdS )Ú_InstanceOfValidatorc                 C   s4   t || jƒstdj|j| j|j|d�|| j|ƒ‚dS )úP
        We use a callable class to be able to change the ``__repr__``.
        z?'{name}' must be {type!r} (got {value!r} that is a {actual!r}).)ÚnameÚtypeÚactualÚvalueN)Ú
isinstancer   Ú	TypeErrorÚformatr   Ú	__class__©ÚselfÚinstÚattrr   © r%   ú1/usr/lib/python3/dist-packages/attr/validators.pyÚ__call__   s   ûöÿz_InstanceOfValidator.__call__c                 C   ó   dj | jd�S )Nz)<instance_of validator for type {type!r}>©r   )r   r   ©r"   r%   r%   r&   Ú__repr__0   ó   ÿz_InstanceOfValidator.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r'   r+   r%   r%   r%   r&   r      s    r   c                 C   ó   t | ƒS )aÒ  
    A validator that raises a `TypeError` if the initializer is called
    with a wrong type for this particular attribute (checks are performed using
    `isinstance` therefore it's also valid to pass a tuple of types).

    :param type: The type to check for.
    :type type: type or tuple of types

    :raises TypeError: With a human readable error message, the attribute
        (of type `attr.Attribute`), the expected type, and the value it
        got.
    )r   r)   r%   r%   r&   r   6   s   r   )r   Úfrozenr   c                   @   s.   e Zd Zeƒ Zeƒ Zeƒ Zdd„ Zdd„ ZdS )Ú_MatchesReValidatorc                 C   s0   |   |¡stdj|j| jj|d�|| j|ƒ‚dS )r   z7'{name}' must match regex {regex!r} ({value!r} doesn't))r   Úregexr   N)Ú
match_funcÚ
ValueErrorr   r   r3   Úpatternr!   r%   r%   r&   r'   L   s   
þùÿz_MatchesReValidator.__call__c                 C   r(   )Nz,<matches_re validator for pattern {regex!r}>)r3   )r   r3   r*   r%   r%   r&   r+   [   r,   z_MatchesReValidator.__repr__N)	r-   r.   r/   r   r3   Úflagsr4   r'   r+   r%   r%   r%   r&   r2   F   s    r2   c                 C   sª   t tddƒ}|dtjtjf}||vr%tdd tdd„ t|ƒD ƒƒ¡f ƒ‚t | |¡}|tju r4|j}n|tju r=|j}n|rC|j	}nt d 
| ¡|¡}|j}t|||ƒS )a}  
    A validator that raises `ValueError` if the initializer is called
    with a string that doesn't match *regex*.

    :param str regex: a regex string to match against
    :param int flags: flags that will be passed to the underlying re function
        (default 0)
    :param callable func: which underlying `re` function to call (options
        are `re.fullmatch`, `re.search`, `re.match`, default
        is ``None`` which means either `re.fullmatch` or an emulation of
        it on Python 2). For performance reasons, they won't be used directly
        but on a pre-`re.compile`\ ed pattern.

    .. versionadded:: 19.2.0
    Ú	fullmatchNz'func' must be one of %s.z, c                 s   s   � | ]
}|r	|j p
d V  qdS )ÚNoneN)r-   )Ú.0Úer%   r%   r&   Ú	<genexpr>x   s   € 
ÿzmatches_re.<locals>.<genexpr>z(?:{})\Z)ÚgetattrÚreÚsearchÚmatchr5   ÚjoinÚsortedÚsetÚcompiler8   r   r2   )r3   r7   Úfuncr8   Úvalid_funcsr6   r4   r%   r%   r&   r   a   s.   ÿÿÿÿÿ

r   c                   @   r   )Ú_ProvidesValidatorc                 C   s0   | j  |¡stdj|j| j |d�|| j |ƒ‚dS )r   z<'{name}' must provide {interface!r} which {value!r} doesn't.)r   Ú	interfacer   N)rH   Ú
providedByr   r   r   r!   r%   r%   r&   r'   ’   s   
þùÿz_ProvidesValidator.__call__c                 C   r(   )Nz0<provides validator for interface {interface!r}>©rH   )r   rH   r*   r%   r%   r&   r+   ¡   r,   z_ProvidesValidator.__repr__N)r-   r.   r/   r   rH   r'   r+   r%   r%   r%   r&   rG   Ž   s    rG   c                 C   r0   )a(  
    A validator that raises a `TypeError` if the initializer is called
    with an object that does not provide the requested *interface* (checks are
    performed using ``interface.providedBy(value)`` (see `zope.interface
    <https://zopeinterface.readthedocs.io/en/latest/>`_).

    :param interface: The interface to check for.
    :type interface: ``zope.interface.Interface``

    :raises TypeError: With a human readable error message, the attribute
        (of type `attr.Attribute`), the expected interface, and the
        value it got.
    )rG   rJ   r%   r%   r&   r   §   s   r   c                   @   r   )Ú_OptionalValidatorc                 C   s   |d u rd S |   |||¡ d S ©N©Ú	validatorr!   r%   r%   r&   r'   ¼   s   z_OptionalValidator.__call__c                 C   s   dj t| jƒd�S )Nz'<optional validator for {what} or None>)Úwhat)r   r   rN   r*   r%   r%   r&   r+   Â   s   ÿz_OptionalValidator.__repr__N)r-   r.   r/   r   rN   r'   r+   r%   r%   r%   r&   rK   ¸   s    rK   c                 C   s   t | tƒrtt| ƒƒS t| ƒS )aÂ  
    A validator that makes an attribute optional.  An optional attribute is one
    which can be set to ``None`` in addition to satisfying the requirements of
    the sub-validator.

    :param validator: A validator (or a list of validators) that is used for
        non-``None`` values.
    :type validator: callable or `list` of callables.

    .. versionadded:: 15.1.0
    .. versionchanged:: 17.1.0 *validator* can be a list of validators.
    )r   ÚlistrK   r   rM   r%   r%   r&   r   È   s   
r   c                   @   r   )Ú_InValidatorc                 C   sF   z|| j v }W n ty   d}Y nw |s!tdj|j| j |d�ƒ‚d S )NFz/'{name}' must be in {options!r} (got {value!r}))r   Úoptionsr   )rR   r   r5   r   r   )r"   r#   r$   r   Ú
in_optionsr%   r%   r&   r'   Þ   s   ÿ
ÿÿÿz_InValidator.__call__c                 C   r(   )Nz(<in_ validator with options {options!r}>©rR   )r   rR   r*   r%   r%   r&   r+   ë   r,   z_InValidator.__repr__N)r-   r.   r/   r   rR   r'   r+   r%   r%   r%   r&   rQ   Ú   s    rQ   c                 C   r0   )aÛ  
    A validator that raises a `ValueError` if the initializer is called
    with a value that does not belong in the options provided.  The check is
    performed using ``value in options``.

    :param options: Allowed options.
    :type options: list, tuple, `enum.Enum`, ...

    :raises ValueError: With a human readable error message, the attribute (of
       type `attr.Attribute`), the expected options, and the value it
       got.

    .. versionadded:: 17.1.0
    )rQ   rT   r%   r%   r&   r   ñ   s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_IsCallableValidatorc                 C   s,   t |ƒsd}t|j|j||jd�|d�‚dS )r   z?'{name}' must be callable (got {value!r} that is a {actual!r}).)r   r   r   )Úmsgr   N)Úcallabler
   r   r   r    )r"   r#   r$   r   Úmessager%   r%   r&   r'     s   ÿ
ÿüûz_IsCallableValidator.__call__c                 C   s   dS )Nz<is_callable validator>r%   r*   r%   r%   r&   r+     s   z_IsCallableValidator.__repr__N)r-   r.   r/   r'   r+   r%   r%   r%   r&   rU     s    rU   c                   C   s   t ƒ S )aw  
    A validator that raises a `attr.exceptions.NotCallableError` if the
    initializer is called with a value for this particular attribute
    that is not callable.

    .. versionadded:: 19.1.0

    :raises `attr.exceptions.NotCallableError`: With a human readable error
        message containing the attribute (`attr.Attribute`) name,
        and the value it got.
    )rU   r%   r%   r%   r&   r     s   r   c                   @   s:   e Zd Zeeƒ d�Zedeeƒ ƒd�Zdd„ Zdd„ Z	dS )Ú_DeepIterablerM   N©ÚdefaultrN   c                 C   s4   | j dur|   |||¡ |D ]	}|  |||¡ qdS ©r   N)Úiterable_validatorÚmember_validator)r"   r#   r$   r   Úmemberr%   r%   r&   r'   /  s
   
ÿz_DeepIterable.__call__c                 C   s,   | j d u rdndj| j d�}dj|| jd�S )NÚ z {iterable!r})ÚiterablezJ<deep_iterable validator for{iterable_identifier} iterables of {member!r}>)Úiterable_identifierr_   )r]   r   r^   )r"   rb   r%   r%   r&   r+   9  s   
ÿýûz_DeepIterable.__repr__)
r-   r.   r/   r   r   r^   r   r]   r'   r+   r%   r%   r%   r&   rY   (  s    
ÿ
rY   c                 C   s
   t | |ƒS )a1  
    A validator that performs deep validation of an iterable.

    :param member_validator: Validator to apply to iterable members
    :param iterable_validator: Validator to apply to iterable itself
        (optional)

    .. versionadded:: 19.1.0

    :raises TypeError: if any sub-validators fail
    )rY   )r^   r]   r%   r%   r&   r   H  s   
r   c                   @   sF   e Zd Zeeƒ d�Zeeƒ d�Zedeeƒ ƒd�Zdd„ Z	dd„ Z
dS )Ú_DeepMappingrM   NrZ   c                 C   sF   | j dur|   |||¡ |D ]}|  |||¡ |  |||| ¡ qdS r\   )Úmapping_validatorÚkey_validatorÚvalue_validator)r"   r#   r$   r   Úkeyr%   r%   r&   r'   ]  s   
þz_DeepMapping.__call__c                 C   s   dj | j| jd�S )NzA<deep_mapping validator for objects mapping {key!r} to {value!r}>)rg   r   )r   re   rf   r*   r%   r%   r&   r+   h  s   
þz_DeepMapping.__repr__)r-   r.   r/   r   r   re   rf   r   rd   r'   r+   r%   r%   r%   r&   rc   W  s    rc   c                 C   s   t | ||ƒS )a}  
    A validator that performs deep validation of a dictionary.

    :param key_validator: Validator to apply to dictionary keys
    :param value_validator: Validator to apply to dictionary values
    :param mapping_validator: Validator to apply to top-level mapping
        attribute (optional)

    .. versionadded:: 19.1.0

    :raises TypeError: if any sub-validators fail
    )rc   )re   rf   rd   r%   r%   r&   r   n  s   r   )r   NrL   )Ú__doc__Ú
__future__r   r   r   r>   Ú_maker   r   r   r	   Ú
exceptionsr
   Ú__all__Úobjectr   r   r2   r   rG   r   rK   r   rQ   r   rU   r   rY   r   rc   r   r%   r%   r%   r&   Ú<module>   s<    
-
