a
    ]gL`                     @  sh  d Z ddlmZ ddl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jrzd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ejdej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$dS )'z-Validation classes for various types of data.    )annotationsN)ABCabstractmethod)zip_longest)
attrgetter)ValidationError)ChangedInMarshmallow4Warning)types_Tc                   @  sN   e Zd ZU dZdZded< ddddZddd	d
Zedd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
str | Noneerrorstrreturnc                 C  s8   |   }|r| dnd}d| jj d| d| jdS )N,  <(zerror=z)>)
_repr_args	__class____name__r   )selfargs r   b/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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
typing.Anyvaluer   c                 C  s   d S Nr   r   r    r   r   r   __call__+   s    zValidator.__call__)
r   
__module____qualname____doc__r   __annotations__r   r   r   r#   r   r   r   r   r      s   
r   c                   @  sH   e Zd ZdZdZddddddd	Zd
dddZdd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   ztypes.Validatorr   )
validatorsr   c                G  s   t || _|p| j| _d S r!   )tupler*   default_error_messager   )r   r   r*   r   r   r   __init__F   s    
zAnd.__init__r   r   c                 C  s   d| j S )Nzvalidators=)r*   r   r   r   r   r   J   s    zAnd._repr_argsr   r   c                 C  s   g }i }| j D ]}z8||}t|tsH|du rHtjdtdd t| jW q ty } z>||j	 t|j
tr||j
 n||j
 W Y d }~qd }~0 0 q|rt|fi ||S )NFzTReturning `False` from a validator is deprecated. Raise a `ValidationError` instead.   )
stacklevel)r*   
isinstancer   warningswarnr   r   r   updatekwargsmessagesdictappendextend)r   r    errorsr4   	validatorrerrr   r   r   r#   M   s(    
$zAnd.__call__)r   r$   r%   r&   r,   r-   r   r#   r   r   r   r   r(   /   s
   r(   c                   @  s   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d
dd	ddZddddZ	ddddZ
dd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ddddZddddddd	Zd
S )zURL.RegexMemoizerc                 C  s
   i | _ d S r!   )	_memoizedr   r   r   r   r-   s   s    zURL.RegexMemoizer.__init__boolztyping.Pattern)relativeabsoluterequire_tldr   c                C  st   g d}|s| d ddddd|dd	f}d
}|rV|rLd|d|f}q`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)?^)r7   joinrecompile
IGNORECASE)r   r@   rA   rB   Zhostname_variantsZabsolute_partZrelative_partpartsr   r   r   _regex_generatorv   s.    


z"URL.RegexMemoizer._regex_generatorc                C  s4   |||f}|| j vr*| j|||d| j |< | j | S )Nr@   rA   rB   )r>   rL   )r   r@   rA   rB   keyr   r   r   r#      s    

zURL.RegexMemoizer.__call__N)r   r$   r%   r-   rL   r#   r   r   r   r   RegexMemoizerr   s   6rO   zNot a valid URL.>   ZftpshttphttpsftpFTN)r@   rA   schemesrB   r   r?   ztypes.StrSequenceOrSet | Noner   c                C  s>   |s|st d|| _|| _|p$| j| _|p0| j| _|| _d S )Nz>URL validation cannot set both relative and absolute to False.)
ValueErrorr@   rA   default_messager   default_schemesrS   rB   )r   r@   rA   rS   rB   r   r   r   r   r-      s    	zURL.__init__r   r   c                 C  s   d| j d| jS )Nz	relative=z, absolute=)r@   rA   r   r   r   r   r      s    zURL._repr_argsc                 C  s   | j j|dS N)inputr   formatr"   r   r   r   _format_error   s    zURL._format_errorr   c                 C  s   |  |}|st|d }d|v rF|dd  }|| jvrFt|| j| j| j| jd}|dkr|	dr|
|ddd}n
|
|}|st||S )Nz://r   rM   filezfile:///zfile://localhost/   )r[   r   splitlowerrS   _regexr@   rA   rB   
startswithsearchreplace)r   r    messageschemeregexZmatchedr   r   r   r#      s"    


zURL.__call__)r   r$   r%   r&   rO   r`   rU   rV   r-   r   r[   r#   r   r   r   r   r=   f   s   Er=   c                   @  st   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	d
ZdddddZdd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)rC   zNot a valid email address.Nr)   r   c                C  s   |p| j | _d S r!   )rU   r   )r   r   r   r   r   r-     s    zEmail.__init__r   r   c                 C  s   | j j|dS rW   rY   r"   r   r   r   r[     s    zEmail._format_errorc                 C  s   |  |}|rd|vrt||dd\}}| j|sBt||| jvr| j|sz|dd}W n t	y~   Y n0 | j|r|S t||S )N@r]   idnaascii)
r[   r   rsplit
USER_REGEXmatchDOMAIN_WHITELISTDOMAIN_REGEXencodedecodeUnicodeError)r   r    rd   Z	user_partZdomain_partr   r   r   r#     s     

zEmail.__call__)r   r$   r%   r&   rH   rI   rJ   UNICODErl   ro   rn   rU   r-   r[   r#   r   r   r   r   rg      s   


rg   c                   @  sz   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dddZddddZddddddZdd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?   r   c                C  s   || _ || _|| _|| _|| _| jj| jr0| jn| jd| _| j	j| jrN| j
n| jd| _	| jj| jrl| jn| j| jr|| j
n| jd| _d S )N)min_op)max_op)rw   rx   )minmaxr   ru   rv   message_minrZ   message_gte
message_gtmessage_maxmessage_lte
message_ltmessage_all)r   ry   rz   ru   rv   r   r   r   r   r-   J  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=)ry   rz   ru   rv   r   r   r   r   r   e  s    zRange._repr_argsr
   r    rd   r   c                 C  s   | j p|j|| j| jdS )N)rX   ry   rz   )r   rZ   ry   rz   r   r    rd   r   r   r   r[   h  s    zRange._format_errorr   c                 C  s   | j d urL| jr|| j k rLn
|| j krL| jd u r6| jn| j}t| ||| jd ur| jrh|| jkrn
|| jkr| j d u r| jn| j}t| |||S r!   )	ry   ru   rz   r{   r   r   r[   rv   r~   r   r   r   r   r#   k  s&    

zRange.__call__)NN)r   r$   r%   r&   r{   r~   r   r|   r}   r   r   r-   r   r[   r#   r   r   r   r   rt   .  s$     rt   _SizedT)boundc                   @  sn   e Zd ZdZdZdZdZdZdddddddd	d
ddZddddZ	ddddddZ
dd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   z
int | Noner   )ry   rz   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.)anyrT   ry   rz   r   r   )r   ry   rz   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=)ry   rz   r   r   r   r   r   r     s    zLength._repr_argsr   r   c                 C  s   | j p|j|| j| j| jdS )N)rX   ry   rz   r   )r   rZ   ry   rz   r   r   r   r   r   r[     s    
zLength._format_errorr   c                 C  s   t |}| jd ur2|| jkr.t| || j|S | jd url|| jk rl| jd u rV| jn| j}t| ||| jd ur|| jkr| jd u r| j	n| j}t| |||S r!   )
lenr   r   r[   message_equalry   rz   r{   r   r~   )r   r    lengthrd   r   r   r   r#     s    

zLength.__call__)NN)r   r$   r%   r&   r{   r~   r   r   r-   r   r[   r#   r   r   r   r   r   ~  s     r   c                   @  sV   e Zd ZdZdZddddddZdd	d
dZdddddZdd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   c                C  s   || _ |p| j| _d S r!   )
comparablerU   r   )r   r   r   r   r   r   r-     s    zEqual.__init__r   r   c                 C  s   d| j S )Nzcomparable=)r   r   r   r   r   r     s    zEqual._repr_argsr
   r   c                 C  s   | j j|| jdS )N)rX   other)r   rZ   r   r"   r   r   r   r[     s    zEqual._format_errorc                 C  s   || j krt| ||S r!   )r   r   r[   r"   r   r   r   r#     s    
zEqual.__call__	r   r$   r%   r&   rU   r-   r   r[   r#   r   r   r   r   r     s   r   c                   @  s   e Zd ZdZdZddddddd	d
dZddddZdddddZej	dddddZ
ej	dd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)   zstr | bytes | typing.Patternintr   )rf   flagsr   c                C  s0   t |ttfrt||n|| _|p(| j| _d S r!   )r0   r   bytesrH   rI   rf   rU   r   )r   rf   r   r   r   r   r   r-     s    zRegexp.__init__r   r   c                 C  s   d| j S )Nzregex=)rf   r   r   r   r   r     s    zRegexp._repr_argszstr | bytesr   c                 C  s   | j j|| jjdS )N)rX   rf   )r   rZ   rf   patternr"   r   r   r   r[     s    zRegexp._format_errorc                 C  s   d S r!   r   r"   r   r   r   r#     s    zRegexp.__call__r   c                 C  s   d S r!   r   r"   r   r   r   r#     s    c                 C  s"   | j |d u rt| ||S r!   )rf   rm   r   r[   r"   r   r   r   r#     s    )r   )r   r$   r%   r&   rU   r-   r   r[   typingoverloadr#   r   r   r   r   r     s    r   c                   @  sX   e Zd ZdZdZddddddd	Zdd
ddZdddddZdd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)   r   r   )methodr   c                K  s   || _ |p| j| _|| _d S r!   )r   rU   r   r4   )r   r   r   r4   r   r   r   r-     s    zPredicate.__init__r   c                 C  s   d| j d| jS )Nzmethod=z	, kwargs=)r   r4   r   r   r   r   r     s    zPredicate._repr_argsr   r   c                 C  s   | j j|| jdS )N)rX   r   )r   rZ   r   r"   r   r   r   r[   !  s    zPredicate._format_errorr
   c                 C  s.   t || j}|f i | js*t| ||S r!   )getattrr   r4   r   r[   )r   r    r   r   r   r   r#   $  s    zPredicate.__call__r   r   r   r   r   r     s   r   c                   @  sV   e Zd ZdZdZddddddd	Zd
dddZd
dddZdd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)   typing.Iterabler   )iterabler   c                C  s.   || _ ddd | j D | _|p&| j| _d S )Nr   c                 s  s   | ]}t |V  qd S r!   r   ).0Zeachr   r   r   	<genexpr>9      z"NoneOf.__init__.<locals>.<genexpr>)r   rG   values_textrU   r   )r   r   r   r   r   r   r-   7  s    zNoneOf.__init__r   r   c                 C  s   d| j S )Nz	iterable=)r   r   r   r   r   r   <  s    zNoneOf._repr_argsc                 C  s   | j j|| jdS )N)rX   values)r   rZ   r   r"   r   r   r   r[   ?  s    zNoneOf._format_errorr   r   c                 C  s4   z|| j v rt| |W n ty.   Y n0 |S r!   )r   r   r[   	TypeErrorr"   r   r   r   r#   B  s    
zNoneOf.__call__r   r   r   r   r   r   -  s   r   c                   @  sn   e Zd ZdZdZdddddddd	d
ZddddZddddZdddddZe	fdd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)   r   ztyping.Iterable[str] | Noner   )choiceslabelsr   c                C  sX   || _ ddd | j D | _|d ur*|ng | _ddd | jD | _|pP| j| _d S )Nr   c                 s  s   | ]}t |V  qd S r!   r   )r   choicer   r   r   r   _  r   z!OneOf.__init__.<locals>.<genexpr>c                 s  s   | ]}t |V  qd S r!   r   )r   labelr   r   r   r   a  r   )r   rG   choices_textr   labels_textrU   r   )r   r   r   r   r   r   r   r-   W  s
    zOneOf.__init__r   r   c                 C  s   d| j d| jS )Nzchoices=z	, labels=)r   r   r   r   r   r   r   d  s    zOneOf._repr_argsc                 C  s   | j j|| j| jdS )N)rX   r   r   )r   rZ   r   r   r"   r   r   r   r[   g  s    
zOneOf._format_errorr   r   c              
   C  sV   z|| j vrt| |W n4 tyP } zt| ||W Y d }~n
d }~0 0 |S r!   )r   r   r[   r   )r   r    r   r   r   r   r#   l  s    
&zOneOf.__call__z/str | typing.Callable[[typing.Any], typing.Any]z'typing.Iterable[tuple[typing.Any, str]])valuegetterr   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     r   z OneOf.options.<locals>.<genexpr>)callabler   r   r   r   )r   r   pairsr   r   r   optionsu  s    zOneOf.options)N)r   r$   r%   r&   rU   r-   r   r[   r#   r   r   r   r   r   r   r   L  s    r   c                      s:   e Zd ZdZdZdd fddZdddd	d
Z  ZS )ContainsOnlya1  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 choices: Same as :class:`OneOf`.
    :param labels: Same as :class:`OneOf`.
    :param 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                   s    d dd |D }t |S )Nr   c                 s  s   | ]}t |V  qd S r!   r   r   valr   r   r   r     r   z-ContainsOnly._format_error.<locals>.<genexpr>rG   superr[   r   r    Z
value_textr   r   r   r[     s    zContainsOnly._format_errortyping.Sequence[_T]r   c                 C  s&   |D ]}|| j vrt| |q|S r!   )r   r   r[   r   r    r   r   r   r   r#     s    
zContainsOnly.__call__r   r$   r%   r&   rU   r[   r#   __classcell__r   r   r   r   r     s   r   c                      s:   e Zd ZdZdZdd fddZdddd	d
Z  ZS )ContainsNoneOfa)  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: Same as :class:`NoneOf`.
    :param error: Same as :class:`NoneOf`.

    .. versionadded:: 3.6.0
    z5One or more of the choices you made was in: {values}.r   r   c                   s    d dd |D }t |S )Nr   c                 s  s   | ]}t |V  qd S r!   r   r   r   r   r   r     r   z/ContainsNoneOf._format_error.<locals>.<genexpr>r   r   r   r   r   r[     s    zContainsNoneOf._format_errorr   r   c                 C  s&   |D ]}|| j v rt| |q|S r!   )r   r   r[   r   r   r   r   r#     s    
zContainsNoneOf.__call__r   r   r   r   r   r     s   
r   )%r&   
__future__r   rH   r   r1   abcr   r   	itertoolsr   operatorr   Zmarshmallow.exceptionsr   Zmarshmallow.warningsr   TYPE_CHECKINGZmarshmallowr	   TypeVarr
   r   r(   r=   rg   rt   Sizedr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s6   
7 <MB0"=