o
    $if1]                     @  s>  d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ed	ZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG d d! d!eZG d"d# d#eZdS )$z-Validation classes for various types of data.    )annotationsN)ABCabstractmethod)zip_longest)
attrgetter)types)ValidationError_Tc                   @  s6   e Zd ZdZdZdddZdddZedddZdS )	ValidatorzAbstract base class for validators.

    .. note::
        This class does not provide any validation behavior. It is only used to
        add a useful `__repr__` implementation for validators.
    Nreturnstrc                 C  s8   |   }|r| dnd}d| jj d| d| jdS )N,  <(zerror=z)>)
_repr_args	__class____name__error)selfargs r   M/var/www/html/corbot_env/lib/python3.10/site-packages/marshmallow/validate.py__repr__   s   zValidator.__repr__c                 C  s   dS )zbA string representation of the args passed to this validator. Used by
        `__repr__`.
        r   r   r   r   r   r   r   !   s   zValidator._repr_argsvalue
typing.Anyc                 C     d S Nr   r   r   r   r   r   __call__'      zValidator.__call__r   r   r   r   r   r   )	r   
__module____qualname____doc__r   r   r   r   r    r   r   r   r   r
      s    

r
   c                   @  s8   e Zd ZdZdZdddd	d
ZdddZdddZdS )Anda3  Compose multiple validators and combine their error messages.

    Example: ::

        from marshmallow import validate, ValidationError


        def is_even(value):
            if value % 2 != 0:
                raise ValidationError("Not an even value.")


        validator = validate.And(validate.Range(min=0), is_even)
        validator(-1)
        # ValidationError: ['Must be greater than or equal to 0.', 'Not an even value.']

    :param validators: Validators to combine.
    :param error: Error message to use when a validator returns ``False``.
    zInvalid value.Nr   
validatorstypes.Validatorr   
str | Nonec                G  s   t || _|p	| j| _d S r   )tupler)   default_error_messager   )r   r   r)   r   r   r   __init__B   s   
zAnd.__init__r   r   c                 C     d| j S )Nzvalidators=)r)   r   r   r   r   r   F      zAnd._repr_argsr   r   c                 C  s   g }i }| j D ]E}z||}t|ts|du rt| jW q tyL } z#||j t|jtr8|	|j n
|
tt|j W Y d }~qd }~ww |rWt|fi ||S )NF)r)   
isinstancer
   r   r   updatekwargsmessagesdictappendextendtypingcastlist)r   r   errorsr3   	validatorrerrr   r   r   r    I   s$   

zAnd.__call__)r)   r*   r   r+   r"   r#   )r   r$   r%   r&   r-   r.   r   r    r   r   r   r   r'   +   s    
r'   c                   @  sf   e Zd ZdZG dd dZe ZdZh dZdddddd	dddZdddZ	dddZ
dddZdS ) URLa  Validate a URL.

    :param relative: Whether to allow relative URLs.
    :param absolute: Whether to allow absolute URLs.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`.
    :param schemes: Valid schemes. By default, ``http``, ``https``,
        ``ftp``, and ``ftps`` are allowed.
    :param require_tld: Whether to reject non-FQDN hostnames.
    c                   @  s(   e Zd Zdd Zdd	d
ZdddZdS )zURL.RegexMemoizerc                 C  s
   i | _ d S r   )	_memoizedr   r   r   r   r.   j   s   
zURL.RegexMemoizer.__init__relativeboolabsoluterequire_tldr   typing.Patternc                 C  st   g d}|s| d ddddd|dd	f}d
}|r+|r&d|d|f}n
d|f}nd||f}td|tjS )N)zM(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)	localhostz"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}z\[[A-F0-9]*:[A-F0-9:]+\]z+(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.?)r   z(?:[a-z0-9\.\-\+]*)://z1(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?z(?:|)z	(?::\d+)?z(?:/?|[/?]\S+)\Zz^(z)?^)r6   joinrecompile
IGNORECASE)r   rA   rC   rD   hostname_variantsabsolute_partrelative_partpartsr   r   r   _regex_generatorm   s.   


z"URL.RegexMemoizer._regex_generatorc                 C  s2   |||f}|| j vr| |||| j |< | j | S r   )r@   rR   )r   rA   rC   rD   keyr   r   r   r       s   



zURL.RegexMemoizer.__call__N)rA   rB   rC   rB   rD   rB   r   rE   )r   r$   r%   r.   rR   r    r   r   r   r   RegexMemoizeri   s    
6rT   zNot a valid URL.>   ftpftpshttphttpsFTN)rA   rC   schemesrD   r   rA   rB   rC   rY   types.StrSequenceOrSet | NonerD   r   r+   c                C  s>   |s|st d|| _|| _|p| j| _|p| j| _|| _d S )Nz>URL validation cannot set both relative and absolute to False.)
ValueErrorrA   rC   default_messager   default_schemesrY   rD   )r   rA   rC   rY   rD   r   r   r   r   r.      s   	
zURL.__init__r   r   c                 C     d| j d| jS )Nz	relative=z, absolute=)rA   rC   r   r   r   r   r         zURL._repr_argsc                 C     | j j|dS N)inputr   formatr   r   r   r   _format_error      zURL._format_errorr   c                 C  sl   |  |}|st|d|v r!|dd  }|| jvr!t|| | j| j| j}|	|s4t||S )Nz://r   )
re   r   splitlowerrY   _regexrA   rC   rD   search)r   r   messageschemeregexr   r   r   r       s   


zURL.__call__)
rA   rB   rC   rB   rY   rZ   rD   rB   r   r+   r"   r   r   r   r   )r   r$   r%   r&   rT   ri   r\   r]   r.   r   re   r    r   r   r   r   r?   ]   s    E

r?   c                   @  sd   e Zd ZdZedejejB ZedejejB Z	dZ
dZdddd
dZdddZdddZdS )EmailzValidate an email address.

    :param error: Error message to raise in case of a validation error. Can be
        interpolated with `{input}`.
    z(^[-!#$%&'*+/=?^`{}|~\w]+(\.[-!#$%&'*+/=?^`{}|~\w]+)*\Z|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)z(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,})\Z|^\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]\Z)rF   zNot a valid email address.Nr(   r   r+   c                C  s   |p| j | _d S r   )r\   r   )r   r   r   r   r   r.      s   zEmail.__init__r   r   r   c                 C  r`   ra   rc   r   r   r   r   re      rf   zEmail._format_errorc                 C  s   |  |}|rd|vrt||dd\}}| j|s!t||| jvrO| j|sOz
|dd}W n t	yB   Y t|w | j|rK|S t||S )N@   idnaascii)
re   r   rsplit
USER_REGEXmatchDOMAIN_WHITELISTDOMAIN_REGEXencodedecodeUnicodeError)r   r   rk   	user_partdomain_partr   r   r   r      s$   

zEmail.__call__r   r+   rn   )r   r$   r%   r&   rK   rL   rM   UNICODEru   rx   rw   r\   r.   re   r    r   r   r   r   ro      s    



ro   c                   @  sd   e Zd ZdZdZdZdZdZdZdZ	dZ
				dd
d
d	ddddZd ddZd!ddZd"ddZd	S )#Rangea-  Validator which succeeds if the value passed to it is within the specified
    range. If ``min`` is not specified, or is specified as `None`,
    no lower bound exists. If ``max`` is not specified, or is specified as `None`,
    no upper bound exists. The inclusivity of the bounds (if they exist) is configurable.
    If ``min_inclusive`` is not specified, or is specified as `True`, then
    the ``min`` bound is included in the range. If ``max_inclusive`` is not specified,
    or is specified as `True`, then the ``max`` bound is included in the range.

    :param min: The minimum value (lower bound). If not provided, minimum
        value will not be checked.
    :param max: The maximum value (upper bound). If not provided, maximum
        value will not be checked.
    :param min_inclusive: Whether the `min` bound is included in the range.
    :param max_inclusive: Whether the `max` bound is included in the range.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`, `{min}` and `{max}`.
    zMust be {min_op} {{min}}.zMust be {max_op} {{max}}.z.Must be {min_op} {{min}} and {max_op} {{max}}.zgreater than or equal tozgreater thanzless than or equal toz	less thanNT)min_inclusivemax_inclusiver   r   rB   r   r   r+   c                C  s   || _ || _|| _|| _|| _| jj| jr| jn| jd| _| j	j| jr'| j
n| jd| _	| jj| jr6| jn| j| jr>| j
n| jd| _d S )N)min_op)max_op)r   r   )minmaxr   r   r   message_minrd   message_gte
message_gtmessage_maxmessage_lte
message_ltmessage_all)r   r   r   r   r   r   r   r   r   r.   7  s   	zRange.__init__r   r   c                 C  s$   d| j d| jd| jd| jS )Nmin=, max=z, min_inclusive=z, max_inclusive=)r   r   r   r   r   r   r   r   r   R  s   $zRange._repr_argsr   r	   rk   c                 C  s   | j p|j|| j| jdS )N)rb   r   r   )r   rd   r   r   r   r   rk   r   r   r   re   U  s   zRange._format_errorc                 C  s   | j d ur&| jr|| j k r&n|| j kr&| jd u r| jn| j}t| ||| jd urL| jr4|| jkrLn|| jkrL| j d u rA| jn| j}t| |||S r   )	r   r   r   r   r   r   re   r   r   r   r   r   r   r    X  s   

zRange.__call__NN)r   rB   r   rB   r   r+   r"   )r   r	   rk   r   r   r   r   r	   r   r	   )r   r$   r%   r&   r   r   r   r   r   r   r   r.   r   re   r    r   r   r   r   r     s&    

r   c                   @  sV   e Zd ZdZdZdZdZdZ		dddddddZdddZ	dddZ
dddZdS ) Lengthah  Validator which succeeds if the value passed to it has a
    length between a minimum and maximum. Uses len(), so it
    can work for strings, lists, or anything with length.

    :param min: The minimum length. If not provided, minimum length
        will not be checked.
    :param max: The maximum length. If not provided, maximum length
        will not be checked.
    :param equal: The exact length. If provided, maximum and minimum
        length will not be checked.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}`, `{min}` and `{max}`.
    z"Shorter than minimum length {min}.z!Longer than maximum length {max}.z'Length must be between {min} and {max}.zLength must be {equal}.N)equalr   r   
int | Noner   r   r   r+   c                C  s8   |d urt ||grtd|| _|| _|| _|| _d S )NzVThe `equal` parameter was provided, maximum or minimum parameter must not be provided.)anyr[   r   r   r   r   )r   r   r   r   r   r   r   r   r.   |  s   
zLength.__init__r   r   c                 C  s   d| j d| jd| jS )Nr   r   z, equal=)r   r   r   r   r   r   r   r     s   zLength._repr_argsr   typing.Sizedrk   c                 C  s   | j p|j|| j| j| jdS )N)rb   r   r   r   )r   rd   r   r   r   r   r   r   r   re     s   
zLength._format_errorc                 C  s   t |}| jd ur|| jkrt| || j|S | jd ur6|| jk r6| jd u r+| jn| j}t| ||| jd urS|| jkrS| jd u rH| j	n| j}t| |||S r   )
lenr   r   re   message_equalr   r   r   r   r   )r   r   lengthrk   r   r   r   r      s   

zLength.__call__r   )r   r   r   r   r   r   r   r+   r"   )r   r   rk   r   r   r   )r   r   r   r   )r   r$   r%   r&   r   r   r   r   r.   r   re   r    r   r   r   r   r   h  s    

r   c                   @  sB   e Zd ZdZdZdddddZdddZdddZdddZdS )Equala  Validator which succeeds if the ``value`` passed to it is
    equal to ``comparable``.

    :param comparable: The object to compare to.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{other}`.
    zMust be equal to {other}.Nr(   r   r+   c                C  s   || _ |p| j| _d S r   )
comparabler\   r   )r   r   r   r   r   r   r.     s   zEqual.__init__r   r   c                 C  r/   )Nzcomparable=)r   r   r   r   r   r     r0   zEqual._repr_argsr   r	   c                 C     | j j|| jdS )N)rb   other)r   rd   r   r   r   r   r   re        zEqual._format_errorc                 C  s   || j krt| ||S r   )r   r   re   r   r   r   r   r      s   
zEqual.__call__r~   r"   )r   r	   r   r   r   	r   r$   r%   r&   r\   r.   r   re   r    r   r   r   r   r     s    

r   c                   @  sd   e Zd ZdZdZ	ddddddZdddZdddZej	dddZ
ej	d ddZ
dd Z
dS )!Regexpa  Validator which succeeds if the ``value`` matches ``regex``.

    .. note::

        Uses `re.match`, which searches for a match at the beginning of a string.

    :param regex: The regular expression string to use. Can also be a compiled
        regular expression pattern.
    :param flags: The regexp flags to use, for example re.IGNORECASE. Ignored
        if ``regex`` is not a string.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{regex}`.
    z'String does not match expected pattern.r   Nr(   rm   str | bytes | typing.Patternflagsintr   r+   c                C  s0   t |ttfrt||n|| _|p| j| _d S r   )r1   r   bytesrK   rL   rm   r\   r   )r   rm   r   r   r   r   r   r.     s   zRegexp.__init__r   r   c                 C  r/   )Nzregex=)rm   r   r   r   r   r     r0   zRegexp._repr_argsr   str | bytesc                 C  s   | j j|| jjdS )N)rb   rm   )r   rd   rm   patternr   r   r   r   re     r_   zRegexp._format_errorc                 C  r   r   r   r   r   r   r   r      r!   zRegexp.__call__r   c                 C  r   r   r   r   r   r   r   r      r!   c                 C  s"   | j |d u rt| ||S r   )rm   rv   r   re   r   r   r   r   r      s   )r   )rm   r   r   r   r   r+   r"   )r   r   r   r   rn   )r   r   r   r   )r   r$   r%   r&   r\   r.   r   re   r8   overloadr    r   r   r   r   r     s    

r   c                   @  sB   e Zd ZdZdZdddd	d
ZdddZdddZdddZdS )	Predicatea  Call the specified ``method`` of the ``value`` object. The
    validator succeeds if the invoked method returns an object that
    evaluates to True in a Boolean context. Any additional keyword
    argument will be passed to the method.

    :param method: The name of the method to invoke.
    :param error: Error message to raise in case of a validation error.
        Can be interpolated with `{input}` and `{method}`.
    :param kwargs: Additional keyword arguments to pass to the method.
    Invalid input.Nr(   methodr   r   r+   c                K  s   || _ |p| j| _|| _d S r   )r   r\   r   r3   )r   r   r   r3   r   r   r   r.     s   
zPredicate.__init__r   c                 C  r^   )Nzmethod=z	, kwargs=)r   r3   r   r   r   r   r     r_   zPredicate._repr_argsr   r   c                 C  r   )N)rb   r   )r   rd   r   r   r   r   r   re     r   zPredicate._format_errorc                 C  s.   t || j}|di | jst| ||S )Nr   )getattrr   r3   r   re   )r   r   r   r   r   r   r      s   zPredicate.__call__)r   r   r   r+   r"   )r   r   r   r   r#   r   r   r   r   r   r     s    

r   c                   @  sB   e Zd ZdZdZdddd	d
ZdddZdddZdddZdS )NoneOfzValidator which fails if ``value`` is a member of ``iterable``.

    :param iterable: A sequence of invalid values.
    :param error: Error message to raise in case of a validation error. Can be
        interpolated using `{input}` and `{values}`.
    r   Nr(   iterabletyping.Iterabler   r+   c                C  s.   || _ ddd | j D | _|p| j| _d S )Nr   c                 s      | ]}t |V  qd S r   r   ).0eachr   r   r   	<genexpr>#      z"NoneOf.__init__.<locals>.<genexpr>)r   rJ   values_textr\   r   )r   r   r   r   r   r   r.   !  s   zNoneOf.__init__r   r   c                 C  r/   )Nz	iterable=)r   r   r   r   r   r   &  r0   zNoneOf._repr_argsc                 C  r   )N)rb   values)r   rd   r   r   r   r   r   re   )  r   zNoneOf._format_errorr   r   c                 C  s4   z|| j v rt| |W |S  ty   Y |S w r   )r   r   re   	TypeErrorr   r   r   r   r    ,  s   
zNoneOf.__call__)r   r   r   r+   r"   r#   r   r   r   r   r   r     s    

r   c                   @  sT   e Zd ZdZdZ	ddddddZdddZdddZdddZe	fd ddZ
dS )!OneOfaP  Validator which succeeds if ``value`` is a member of ``choices``.

    :param choices: A sequence of valid values.
    :param labels: Optional sequence of labels to pair with the choices.
    :param error: Error message to raise in case of a validation error. Can be
        interpolated with `{input}`, `{choices}` and `{labels}`.
    zMust be one of: {choices}.Nr(   choicesr   labelstyping.Iterable[str] | Noner   r+   c                C  sX   || _ ddd | j D | _|d ur|ng | _ddd | jD | _|p(| j| _d S )Nr   c                 s  r   r   r   )r   choicer   r   r   r   I  r   z!OneOf.__init__.<locals>.<genexpr>c                 s  r   r   r   )r   labelr   r   r   r   K  r   )r   rJ   choices_textr   labels_textr\   r   )r   r   r   r   r   r   r   r.   A  s
   zOneOf.__init__r   r   c                 C  r^   )Nzchoices=z	, labels=)r   r   r   r   r   r   r   N  r_   zOneOf._repr_argsc                 C  s   | j j|| j| jdS )N)rb   r   r   )r   rd   r   r   r   r   r   r   re   Q  s   
zOneOf._format_errorr   r   c              
   C  sH   z|| j vrt| |W |S  ty# } zt| ||d }~ww r   )r   r   re   r   )r   r   r   r   r   r   r    V  s   
zOneOf.__call__valuegetter/str | typing.Callable[[typing.Any], typing.Any]'typing.Iterable[tuple[typing.Any, str]]c                   s8   t  r nt  t| j| jdd} fdd|D S )a  Return a generator over the (value, label) pairs, where value
        is a string associated with each choice. This convenience method
        is useful to populate, for instance, a form select field.

        :param valuegetter: Can be a callable or a string. In the former case, it must
            be a one-argument callable which returns the value of a
            choice. In the latter case, the string specifies the name
            of an attribute of the choice objects. Defaults to `str()`
            or `str()`.
        r   )	fillvaluec                 3  s     | ]\}} ||fV  qd S r   r   )r   r   r   r   r   r   r   p  s    z OneOf.options.<locals>.<genexpr>)callabler   r   r   r   )r   r   pairsr   r   r   options_  s   zOneOf.optionsr   )r   r   r   r   r   r+   r"   r#   )r   r   r   r   )r   r$   r%   r&   r\   r.   r   re   r    r   r   r   r   r   r   r   6  s    


r   c                      0   e Zd ZdZdZd fddZdd	d
Z  ZS )ContainsOnlyaG  Validator which succeeds if ``value`` is a sequence and each element
    in the sequence is also in the sequence passed as ``choices``. Empty input
    is considered valid.

    :param iterable choices: Same as :class:`OneOf`.
    :param iterable labels: Same as :class:`OneOf`.
    :param str error: Same as :class:`OneOf`.

    .. versionchanged:: 3.0.0b2
        Duplicate values are considered valid.
    .. versionchanged:: 3.0.0b2
        Empty input is considered valid. Use `validate.Length(min=1) <marshmallow.validate.Length>`
        to validate against empty inputs.
    z:One or more of the choices you made was not in: {choices}.r   r   c                       d dd |D }t |S )Nr   c                 s  r   r   r   r   valr   r   r   r     r   z-ContainsOnly._format_error.<locals>.<genexpr>rJ   superre   r   r   
value_textr   r   r   re        zContainsOnly._format_errorr   typing.Sequence[_T]c                 C  s&   |D ]}|| j vrt| |q|S r   )r   r   re   r   r   r   r   r   r   r      s
   
zContainsOnly.__call__r"   r   r   r   r   r   r$   r%   r&   r\   re   r    __classcell__r   r   r   r   r   s  s
    r   c                      r   )ContainsNoneOfa6  Validator which fails if ``value`` is a sequence and any element
    in the sequence is a member of the sequence passed as ``iterable``. Empty input
    is considered valid.

    :param iterable iterable: Same as :class:`NoneOf`.
    :param str error: Same as :class:`NoneOf`.

    .. versionadded:: 3.6.0
    z5One or more of the choices you made was in: {values}.r   r   c                   r   )Nr   c                 s  r   r   r   r   r   r   r   r     r   z/ContainsNoneOf._format_error.<locals>.<genexpr>r   r   r   r   r   re     r   zContainsNoneOf._format_errorr   r   c                 C  s&   |D ]}|| j v rt| |q|S r   )r   r   re   r   r   r   r   r      s
   
zContainsNoneOf.__call__r"   r   r   r   r   r   r   r     s
    
r   )r&   
__future__r   rK   r8   abcr   r   	itertoolsr   operatorr   marshmallowr   marshmallow.exceptionsr   TypeVarr	   r
   r'   r?   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s0    
2 <MB0"=