B
    hbA                 @   st  d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	m
Z
mZmZ ddlmZ y
ejZW n" ek
r   eedZY nX d	d
ddddddddddddddddgZdd Zdd Zedd Zedddd G d!d" d"Zd#d Zedddd$G d%d& d&ZdFd'dZedddd G d(d) d)Zd*d Zedddd G d+d, d,Zd-d Zedddd G d.d/ d/Zd0d Z edddd G d1d2 d2Z!d3d Z"edddd G d4d5 d5Z#dGd6d
Z$edddd G d7d8 d8Z%dHd9dZ&edddd$G d:d; d;Z'd<d Z(d=d Z)d>d Z*d?d Z+edddd$G d@dA dAZ,dBd Z-edddd$G dCdD dDZ.dEd Z/dS )Iz
Commonly useful validators.
    N)contextmanager   )get_run_validatorsset_run_validators)_AndValidatorand_attribattrs)NotCallableError r   deep_iterabledeep_mappingdisabledgeget_disabledgtin_instance_ofis_callablelelt
matches_remax_lenmin_lenoptionalprovidesset_disabledc             C   s   t |   dS )a  
    Globally disable or enable running validators.

    By default, they are run.

    :param disabled: If ``True``, disable running all validators.
    :type disabled: bool

    .. warning::

        This function is not thread-safe!

    .. versionadded:: 21.3.0
    N)r   )r    r   .lib/python3.7/site-packages/attr/validators.pyr   .   s    c               C   s   t   S )z
    Return a bool indicating whether validators are currently disabled or not.

    :return: ``True`` if validators are currently disabled.
    :rtype: bool

    .. versionadded:: 21.3.0
    )r   r   r   r   r   r   @   s    	c               c   s"   t d z
dV  W dt d X dS )z
    Context manager that disables running validators within its context.

    .. warning::

        This context manager is not thread-safe!

    .. versionadded:: 21.3.0
    FNT)r   r   r   r   r   r   L   s    
FT)reprslotshashc               @   s"   e Zd Ze Zdd Zdd ZdS )_InstanceOfValidatorc             C   s4   t || js0tdj|j| j|j|d|| j|dS )zP
        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   r   r   __call__b   s    z_InstanceOfValidator.__call__c             C   s   dj | jdS )Nz)<instance_of validator for type {type!r}>)r$   )r)   r$   )r+   r   r   r   __repr__t   s    z_InstanceOfValidator.__repr__N)__name__
__module____qualname__r   r$   r.   r/   r   r   r   r   r"   ^   s   r"   c             C   s   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 `attrs.Attribute`), the expected type, and the value it
        got.
    )r"   )r$   r   r   r   r   z   s    )r   frozenr    c               @   s(   e Zd 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 )zP
        We use a callable class to be able to change the ``__repr__``.
        z9'{name}' must match regex {pattern!r} ({value!r} doesn't))r#   patternr&   N)
match_func
ValueErrorr)   r#   r5   )r+   r,   r-   r&   r   r   r   r.      s    
z_MatchesReValidator.__call__c             C   s   dj | jdS )Nz.<matches_re validator for pattern {pattern!r}>)r5   )r)   r5   )r+   r   r   r   r/      s    z_MatchesReValidator.__repr__N)r0   r1   r2   r   r5   r6   r.   r/   r   r   r   r   r4      s   r4   c          	   C   s   t jdt jt jf}||kr@tddtdd t|D t	| t
r\|rVtd| }nt | |}|t jkrz|j}n|t jkr|j}n|j}t||S )a  
    A validator that raises `ValueError` if the initializer is called
    with a string that doesn't match *regex*.

    :param regex: a regex string or precompiled pattern 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. Valid options
        are `re.fullmatch`, `re.search`, and `re.match`; the default ``None``
        means `re.fullmatch`. For performance reasons, the pattern is always
        precompiled using `re.compile`.

    .. versionadded:: 19.2.0
    .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern.
    Nz'func' must be one of {}.z, c             s   s   | ]}|r|j pd V  qdS )NoneN)r0   ).0er   r   r   	<genexpr>   s    zmatches_re.<locals>.<genexpr>zR'flags' can only be used with a string pattern; pass flags to re.compile() instead)re	fullmatchsearchmatchr7   r)   joinsortedsetr'   Patternr(   compiler4   )ZregexflagsfuncZvalid_funcsr5   r6   r   r   r   r      s&    


c               @   s"   e Zd Ze Zdd Zdd ZdS )_ProvidesValidatorc             C   s0   | j |s,tdj|j| j |d|| j |dS )zP
        We use a callable class to be able to change the ``__repr__``.
        z<'{name}' must provide {interface!r} which {value!r} doesn't.)r#   	interfacer&   N)rH   Z
providedByr(   r)   r#   )r+   r,   r-   r&   r   r   r   r.      s    z_ProvidesValidator.__call__c             C   s   dj | jdS )Nz0<provides validator for interface {interface!r}>)rH   )r)   rH   )r+   r   r   r   r/      s    z_ProvidesValidator.__repr__N)r0   r1   r2   r   rH   r.   r/   r   r   r   r   rG      s   rG   c             C   s   t | S )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 `attrs.Attribute`), the expected interface, and the
        value it got.
    )rG   )rH   r   r   r   r      s    c               @   s"   e Zd Ze Zdd Zdd ZdS )_OptionalValidatorc             C   s   |d krd S |  ||| d S )N)	validator)r+   r,   r-   r&   r   r   r   r.     s    z_OptionalValidator.__call__c             C   s   dj t| jdS )Nz'<optional validator for {what} or None>)Zwhat)r)   r   rJ   )r+   r   r   r   r/     s    z_OptionalValidator.__repr__N)r0   r1   r2   r   rJ   r.   r/   r   r   r   r   rI      s   rI   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'   listrI   r   )rJ   r   r   r   r     s    
c               @   s"   e Zd Ze Zdd Zdd ZdS )_InValidatorc             C   sP   y|| j k}W n tk
r&   d}Y nX |sLtdj|j| j |d|| j |d S )NFz/'{name}' must be in {options!r} (got {value!r}))r#   optionsr&   )rM   r(   r7   r)   r#   )r+   r,   r-   r&   Z
in_optionsr   r   r   r.   $  s    
z_InValidator.__call__c             C   s   dj | jdS )Nz(<in_ validator with options {options!r}>)rM   )r)   rM   )r+   r   r   r   r/   4  s    z_InValidator.__repr__N)r0   r1   r2   r   rM   r.   r/   r   r   r   r   rL      s   rL   c             C   s   t | S )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 `attrs.Attribute`), the expected options, and the value it
       got.

    .. versionadded:: 17.1.0
    .. versionchanged:: 22.1.0
       The ValueError was incomplete until now and only contained the human
       readable error message. Now it contains all the information that has
       been promised since 17.1.0.
    )rL   )rM   r   r   r   r   :  s    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 )zP
        We use a callable class to be able to change the ``__repr__``.
        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.   R  s    z_IsCallableValidator.__call__c             C   s   dS )Nz<is_callable validator>r   )r+   r   r   r   r/   b  s    z_IsCallableValidator.__repr__N)r0   r1   r2   r.   r/   r   r   r   r   rN   P  s   rN   c               C   s   t  S )ax  
    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 (`attrs.Attribute`) name,
        and the value it got.
    )rN   r   r   r   r   r   f  s    c               @   s:   e Zd Zee dZedee dZdd Zdd Z	dS )_DeepIterable)rJ   N)defaultrJ   c             C   s8   | j dk	r|  ||| x|D ]}| ||| qW dS )zP
        We use a callable class to be able to change the ``__repr__``.
        N)iterable_validatormember_validator)r+   r,   r-   r&   memberr   r   r   r.   |  s    

z_DeepIterable.__call__c             C   s,   | j d krdndj| j d}dj|| jdS )Nr   z {iterable!r})iterablezJ<deep_iterable validator for{iterable_identifier} iterables of {member!r}>)iterable_identifierrV   )rT   r)   rU   )r+   rX   r   r   r   r/     s
    z_DeepIterable.__repr__)
r0   r1   r2   r   r   rU   r   rT   r.   r/   r   r   r   r   rR   u  s
   
rR   c             C   s    t | ttfrt|  } t| |S )a4  
    A validator that performs deep validation of an iterable.

    :param member_validator: Validator(s) 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
    )r'   rK   tupler   rR   )rU   rT   r   r   r   r     s    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 )_DeepMapping)rJ   N)rS   rJ   c             C   sJ   | j dk	r|  ||| x,|D ]$}| ||| | ||||  qW dS )zP
        We use a callable class to be able to change the ``__repr__``.
        N)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}>)r^   r&   )r)   r\   r]   )r+   r   r   r   r/     s    z_DeepMapping.__repr__)r0   r1   r2   r   r   r\   r]   r   r[   r.   r/   r   r   r   r   rZ     s
   rZ   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
    )rZ   )r\   r]   r[   r   r   r   r     s    c               @   s.   e Zd Ze Ze Ze Zdd Zdd ZdS )_NumberValidatorc             C   s.   |  || js*tdj|j| j| j|ddS )zP
        We use a callable class to be able to change the ``__repr__``.
        z&'{name}' must be {op} {bound}: {value})r#   opboundr&   N)compare_funcra   r7   r)   r#   
compare_op)r+   r,   r-   r&   r   r   r   r.     s    z_NumberValidator.__call__c             C   s   dj | j| jdS )Nz<Validator for x {op} {bound}>)r`   ra   )r)   rc   ra   )r+   r   r   r   r/     s    z_NumberValidator.__repr__N)	r0   r1   r2   r   ra   rc   rb   r.   r/   r   r   r   r   r_     s
   r_   c             C   s   t | dtjS )z
    A validator that raises `ValueError` if the initializer is called
    with a number larger or equal to *val*.

    :param val: Exclusive upper bound for values

    .. versionadded:: 21.3.0
    <)r_   operatorr   )valr   r   r   r     s    	c             C   s   t | dtjS )z
    A validator that raises `ValueError` if the initializer is called
    with a number greater than *val*.

    :param val: Inclusive upper bound for values

    .. versionadded:: 21.3.0
    z<=)r_   re   r   )rf   r   r   r   r     s    	c             C   s   t | dtjS )z
    A validator that raises `ValueError` if the initializer is called
    with a number smaller than *val*.

    :param val: Inclusive lower bound for values

    .. versionadded:: 21.3.0
    z>=)r_   re   r   )rf   r   r   r   r     s    	c             C   s   t | dtjS )z
    A validator that raises `ValueError` if the initializer is called
    with a number smaller or equal to *val*.

    :param val: Exclusive lower bound for values

    .. versionadded:: 21.3.0
    >)r_   re   r   )rf   r   r   r   r     s    	c               @   s"   e Zd Ze Zdd Zdd ZdS )_MaxLengthValidatorc             C   s.   t || jkr*tdj|j| jt |ddS )zP
        We use a callable class to be able to change the ``__repr__``.
        z*Length of '{name}' must be <= {max}: {len})r#   maxlenN)rj   
max_lengthr7   r)   r#   )r+   r,   r-   r&   r   r   r   r.     s    z_MaxLengthValidator.__call__c             C   s   dj | jdS )Nz<max_len validator for {max}>)ri   )r)   rk   )r+   r   r   r   r/   &  s    z_MaxLengthValidator.__repr__N)r0   r1   r2   r   rk   r.   r/   r   r   r   r   rh     s   rh   c             C   s   t | S )z
    A validator that raises `ValueError` if the initializer is called
    with a string or iterable that is longer than *length*.

    :param int length: Maximum length of the string or iterable

    .. versionadded:: 21.3.0
    )rh   )lengthr   r   r   r   *  s    	c               @   s"   e Zd Ze Zdd Zdd ZdS )_MinLengthValidatorc             C   s.   t || jk r*tdj|j| jt |ddS )zP
        We use a callable class to be able to change the ``__repr__``.
        z*Length of '{name}' must be => {min}: {len})r#   minrj   N)rj   
min_lengthr7   r)   r#   )r+   r,   r-   r&   r   r   r   r.   :  s    z_MinLengthValidator.__call__c             C   s   dj | jdS )Nz<min_len validator for {min}>)rn   )r)   ro   )r+   r   r   r   r/   E  s    z_MinLengthValidator.__repr__N)r0   r1   r2   r   ro   r.   r/   r   r   r   r   rm   6  s   rm   c             C   s   t | S )z
    A validator that raises `ValueError` if the initializer is called
    with a string or iterable that is shorter than *length*.

    :param int length: Minimum length of the string or iterable

    .. versionadded:: 22.1.0
    )rm   )rl   r   r   r   r   I  s    	)r   N)N)N)0__doc__re   r<   
contextlibr   Z_configr   r   _maker   r   r   r	   
exceptionsr
   rC   AttributeErrorr$   rD   __all__r   r   r   r"   r   r4   r   rG   r   rI   r   rL   r   rN   r   rR   r   rZ   r   r_   r   r   r   r   rh   r   rm   r   r   r   r   r   <module>   sp   

0 

