U
    kufL                     @   s  d Z ddlZddlZddlm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 dd	lmZ d
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dPd)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 d0d1 d1Zd2d Zed d d!d"G d3d4 d4Z d5d Z!ed d!d!d"G d6d7 d7Z"dQd8dZ#ed d!d!d"G d9d: d:Z$dRd;dZ%ed d!d!d&G d<d= d=Z&d>d Z'd?d Z(d@d Z)dAd Z*ed d!d!d&G dBdC dCZ+dDd Z,ed d!d!d&G dEdF dFZ-dGd Z.ed d!d!d"G dHdI dIZ/dJdK Z0ed d!d!d"G dLdM dMZ1de2e3fdNdOdZ4dS )Sz
Commonly useful validators.
    N)contextmanager)Pattern   )get_run_validatorsset_run_validators)_AndValidatorand_attribattrs)default_if_none)NotCallableErrorr   deep_iterabledeep_mappingdisabledgeget_disabledgtin_instance_ofis_callablelelt
matches_remax_lenmin_lennot_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    3/tmp/pip-unpacked-wheel-563mi0su/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 5 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
    FTNr   r    r    r    r!   r   I   s    
FT)reprslotshashc                   @   s"   e Zd Ze Zdd Zdd ZdS )_InstanceOfValidatorc                 C   s8   t || js4dj|j| j|j|d}t||| 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(   formatr'   	__class__	TypeErrorselfinstattrr*   msgr    r    r!   __call___   s    z_InstanceOfValidator.__call__c                 C   s   d| j dS )Nz <instance_of validator for type >r(   r0   r    r    r!   __repr__q   s    z_InstanceOfValidator.__repr__N__name__
__module____qualname__r	   r(   r4   r8   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 type

    :raises TypeError: With a human readable error message, the attribute
        (of type `attrs.Attribute`), the expected type, and the value it
        got.
    )r%   r6   r    r    r!   r   u   s    )r"   frozenr#   c                   @   s(   e Zd Ze Ze Zdd Zdd ZdS )_MatchesReValidatorc                 C   s4   |  |s0dj|j| jj|d}t||| j|dS )r&   z9'{name}' must match regex {pattern!r} ({value!r} doesn't))r'   patternr*   N)
match_funcr,   r'   r?   
ValueErrorr/   r    r    r!   r4      s    
  z_MatchesReValidator.__call__c                 C   s   d| j dS )Nz"<matches_re validator for pattern r5   )r?   r7   r    r    r!   r8      s    z_MatchesReValidator.__repr__N)r:   r;   r<   r	   r?   r@   r4   r8   r    r    r    r!   r>      s   r>   c                 C   s   t jdt jt jf}||krDddtdd t|D }t|t	| t
rd|r^d}t|| }nt | |}|t jkr|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)r:   ).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matchr,   joinsortedsetrA   r+   r   r.   compiler>   )regexflagsfuncZvalid_funcsr3   r?   r@   r    r    r!   r      s(    


c                   @   s"   e Zd Ze Zdd Zdd ZdS )_ProvidesValidatorc                 C   s4   | j |s0dj|j| j |d}t||| j |dS )r&   z<'{name}' must provide {interface!r} which {value!r} doesn't.)r'   	interfacer*   N)rR   Z
providedByr,   r'   r.   r/   r    r    r!   r4      s      z_ProvidesValidator.__call__c                 C   s   d| j dS )Nz"<provides validator for interface r5   )rR   r7   r    r    r!   r8      s    z_ProvidesValidator.__repr__N)r:   r;   r<   r	   rR   r4   r8   r    r    r    r!   rQ      s   rQ   c                 C   s    ddl }|jdtdd t| S )aE  
    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.

    .. deprecated:: 23.1.0
    r   NzZattrs's zope-interface support is deprecated and will be removed in, or after, April 2024.   )
stacklevel)warningswarnDeprecationWarningrQ   )rR   rU   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r0   r1   r2   r*   r    r    r!   r4      s    z_OptionalValidator.__call__c                 C   s   d| j dS )Nz<optional validator for z	 or None>rY   r7   r    r    r!   r8     s    z_OptionalValidator.__repr__N)r:   r;   r<   r	   rZ   r4   r8   r    r    r    r!   rX      s   rX   c                 C   s"   t | ttf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 Callable | tuple[Callable] | list[Callable] validator: A validator
        (or validators) that is used for non-``None`` values.

    .. versionadded:: 15.1.0
    .. versionchanged:: 17.1.0 *validator* can be a list of validators.
    .. versionchanged:: 23.1.0 *validator* can also be a tuple of validators.
    )r+   listtuplerX   r   rY   r    r    r!   r     s    c                   @   s"   e Zd Ze Zdd Zdd ZdS )_InValidatorc                 C   s\   z|| j k}W n tk
r&   d}Y nX |sXd|j d| j d|d}t||| j |d S )NF'z' must be in  (got ))optionsr.   r'   rA   )r0   r1   r2   r*   Z
in_optionsr3   r    r    r!   r4     s    
z_InValidator.__call__c                 C   s   d| j dS )Nz<in_ validator with options r5   rb   r7   r    r    r!   r8   .  s    z_InValidator.__repr__N)r:   r;   r<   r	   rb   r4   r8   r    r    r    r!   r^     s   r^   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.
    )r^   rc   r    r    r!   r   2  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 )r&   z?'{name}' must be callable (got {value!r} that is a {actual!r}).)r'   r*   r)   )r3   r*   N)callabler   r,   r'   r-   )r0   r1   r2   r*   messager    r    r!   r4   J  s      z_IsCallableValidator.__call__c                 C   s   dS )Nz<is_callable validator>r    r7   r    r    r!   r8   Z  s    z_IsCallableValidator.__repr__N)r:   r;   r<   r4   r8   r    r    r    r!   rd   H  s   rd   c                   C   s   t  S )ax  
    A validator that raises a `attrs.exceptions.NotCallableError` if the
    initializer is called with a value for this particular attribute
    that is not callable.

    .. versionadded:: 19.1.0

    :raises attrs.exceptions.NotCallableError: With a human readable error
        message containing the attribute (`attrs.Attribute`) name,
        and the value it got.
    )rd   r    r    r    r!   r   ^  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 )_DeepIterablerY   NdefaultrZ   c                 C   s4   | j dk	r|  ||| |D ]}| ||| qdS r&   Niterable_validatormember_validator)r0   r1   r2   r*   memberr    r    r!   r4   t  s    
z_DeepIterable.__call__c                 C   s.   | j d krdn
d| j }d| d| jdS )N  z<deep_iterable validator forz iterables of r5   rk   )r0   Ziterable_identifierr    r    r!   r8   ~  s    
z_DeepIterable.__repr__)
r:   r;   r<   r	   r   rm   r   rl   r4   r8   r    r    r    r!   rg   m  s    
rg   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+   r\   r]   r   rg   rm   rl   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 )_DeepMappingrY   Nrh   c                 C   sF   | j dk	r|  ||| |D ]$}| ||| | ||||  qdS rj   )mapping_validatorkey_validatorvalue_validator)r0   r1   r2   r*   keyr    r    r!   r4     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}>)rv   r*   )r,   rt   ru   r7   r    r    r!   r8     s
     z_DeepMapping.__repr__)r:   r;   r<   r	   r   rt   ru   r   rs   r4   r8   r    r    r    r!   rr     s
   rr   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
    )rr   )rt   ru   rs   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s8d|j d| j d| j d| }t|dS )r&   r_   z
' must be rp   : N)compare_funcboundr'   
compare_oprA   r/   r    r    r!   r4     s    "z_NumberValidator.__call__c                 C   s   d| j  d| j dS )Nz<Validator for x rp   r5   )r{   rz   r7   r    r    r!   r8     s    z_NumberValidator.__repr__N)	r:   r;   r<   r	   rz   r{   ry   r4   r8   r    r    r    r!   rw     s
   rw   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
    <)rw   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<=)rw   r}   r   r~   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>=)rw   r}   r   r~   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
    r5   )rw   r}   r   r~   r    r    r!   r     s    	c                   @   s"   e Zd Ze Zdd Zdd ZdS )_MaxLengthValidatorc                 C   s8   t || jkr4d|j d| j dt | }t|dS )r&   Length of 'z' must be <= rx   N)len
max_lengthr'   rA   r/   r    r    r!   r4     s    z_MaxLengthValidator.__call__c                 C   s   d| j  dS )Nz<max_len validator for r5   )r   r7   r    r    r!   r8     s    z_MaxLengthValidator.__repr__N)r:   r;   r<   r	   r   r4   r8   r    r    r    r!   r     s   r   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
    )r   lengthr    r    r!   r     s    	c                   @   s"   e Zd Ze Zdd Zdd ZdS )_MinLengthValidatorc                 C   s8   t || jk r4d|j d| j dt | }t|dS )r&   r   z' must be >= rx   N)r   
min_lengthr'   rA   r/   r    r    r!   r4   $  s    z_MinLengthValidator.__call__c                 C   s   d| j  dS )Nz<min_len validator for r5   )r   r7   r    r    r!   r8   ,  s    z_MinLengthValidator.__repr__N)r:   r;   r<   r	   r   r4   r8   r    r    r    r!   r      s   r   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
    )r   r   r    r    r!   r   0  s    	c                   @   s"   e Zd Ze Zdd Zdd ZdS )_SubclassOfValidatorc                 C   s<   t || js8d|j d| jd|d}t||| j|dS )r&   r_   z' must be a subclass of r`   z).N)
issubclassr(   r'   r.   r/   r    r    r!   r4   @  s    z_SubclassOfValidator.__call__c                 C   s   d| j dS )Nz <subclass_of validator for type r5   r6   r7   r    r    r!   r8   M  s    z_SubclassOfValidator.__repr__Nr9   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
    `issubclass` 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   r6   r    r    r!   _subclass_ofQ  s    r   c                   @   sJ   e Zd Ze ZeeddZeeee	e
eddZdd Zdd Zd	S )
_NotValidatorzCnot_ validator child '{validator!r}' did not raise a captured error)	converterrq   rY   c                 C   sR   z|  ||| W n | jk
r(   Y n&X t| jj| j | jd|| j || jd S )N)rZ   	exc_types)rZ   r   rA   r3   r,   r[   r    r    r!   r4   q  s    z_NotValidator.__call__c                 C   s   dj | j| jdS )Nz;<not_ validator wrapping {what!r}, capturing {exc_types!r}>)whatr   )r,   rZ   r   r7   r    r    r!   r8     s
    z_NotValidator.__repr__N)r:   r;   r<   r	   rZ   r   r3   r   r   	Exceptionr   r]   r   r4   r8   r    r    r    r!   r   a  s   r   )r3   r   c                C   s4   zt |}W n tk
r&   |f}Y nX t| ||S )a  
    A validator that wraps and logically 'inverts' the validator passed to it.
    It will raise a `ValueError` if the provided validator *doesn't* raise a
    `ValueError` or `TypeError` (by default), and will suppress the exception
    if the provided validator *does*.

    Intended to be used with existing validators to compose logic without
    needing to create inverted variants, for example, ``not_(in_(...))``.

    :param validator: A validator to be logically inverted.
    :param msg: Message to raise if validator fails.
        Formatted with keys ``exc_types`` and ``validator``.
    :type msg: str
    :param exc_types: Exception type(s) to capture.
        Other types raised by child validators will not be intercepted and
        pass through.

    :raises ValueError: With a human readable error message,
        the attribute (of type `attrs.Attribute`),
        the validator that failed to raise an exception,
        the value it got,
        and the expected exception types.

    .. versionadded:: 22.2.0
    )r]   r.   r   )rZ   r3   r   r    r    r!   r     s
    )r   N)N)N)5__doc__r}   rF   
contextlibr   r   _configr   r   _maker   r   r	   r
   
convertersr   
exceptionsr   __all__r   r   r   r%   r   r>   r   rQ   r   rX   r   r^   r   rd   r   rg   r   rr   r   rw   r   r   r   r   r   r   r   r   r   r   r   rA   r.   r   r    r    r    r!   <module>   s   

+

)