U
    ={fP9                     @   s   U d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZmZ erd d
lmZ G dd dZ er4d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( eee( eee)ef e&ee$ gef Z*ee* Z+ee)ee  f Z,e- Z.ee) e/d< dZ0dZ1ddddddde)e2e2e2e2ee2 e2eegdf dddZ3eeddddZ4edddde2e2e2eegdf dd dZ4dFddddee e2e2e2edeegdf f d!d"dZ4ee2dd#d$d%Z5G d&d' d'Z6ee)ef ee)ee  f d(d)d*Z7ee)ef eee eee2ef  f d(d+d,Z8d-d-d-d.d/d0Z9ed1d2d3d4Z:ee d5d6d7d8Z;d9d:d;hZ<ed<ee) d1d=d>d?Z=ed<ee) d1d=d@dAZ>dBee)df dCdDdEZ?dS )G    N)ChainMap)partialpartialmethodwraps)chain)FunctionType)TYPE_CHECKINGAnyCallableDictIterableListOptionalSetTupleTypeUnionoverload)ConfigError)AnyCallable)ROOT_KEY
in_ipython)AnyClassMethodc                   @   s*   e Zd ZdZdeeeeeedddZdS )	Validatorfuncpre	each_itemalwayscheck_fieldsskip_on_failureFc                 C   s(   || _ || _|| _|| _|| _|| _d S Nr   )selfr   r   r   r   r   r     r#   [/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/pydantic/v1/class_validators.py__init__   s    	zValidator.__init__N)FFFFF)__name__
__module____qualname__	__slots__r   boolr%   r#   r#   r#   r$   r      s        r   )	Signature)
BaseConfig)
ModelField)	ModelOrDc_FUNCSZ__validator_config__Z__root_validator_config__FT)r   r   r   r   wholeallow_reuser   )fieldsr   r   r   r   r0   r1   returnc                    s   st dn2td tr&t dntdd D s@t d|dk	rjtdt d	ksdtd
| tdd fdd}|S )a  
    Decorate methods on the class indicating that they should be used to validate fields
    :param fields: which field(s) the method should be called on
    :param pre: whether or not this validator should be called before the standard validators (else after)
    :param each_item: for complex objects (sets, lists etc.) whether to validate individual elements rather than the
      whole object
    :param always: whether this method and other validators should be called even if the value is missing
    :param check_fields: whether to check that the fields actually exist on the model
    :param allow_reuse: whether to track and raise an error if another validator refers to the decorated function
    z"validator with no fields specifiedr   z}validators should be used with fields and keyword arguments, not bare. E.g. usage should be `@validator('<field_name>', ...)`c                 s   s   | ]}t |tV  qd S r!   )
isinstancestr).0fieldr#   r#   r$   	<genexpr>N   s     zvalidator.<locals>.<genexpr>zvalidator fields should be passed as separate string args. E.g. usage should be `@validator('<field_name_1>', '<field_name_2>', ...)`NzdThe "whole" keyword argument is deprecated, use "each_item" (inverse meaning, default False) insteadFz0"each_item" and "whole" conflict, remove "whole"r   fr3   c                    s.   t |  }t|tt|jdf |S )N)r   r   r   r   r   )_prepare_validatorsetattrVALIDATOR_CONFIG_KEYr   __func__r:   f_clsr1   r   r   r   r2   r   r#   r$   dec\   s    
zvalidator.<locals>.dec)	r   r4   r   allwarningswarnDeprecationWarningAssertionErrorr   )r   r   r   r   r0   r1   r2   rB   r#   rA   r$   	validator4   s&    
rH   )_funcr3   c                 C   s   d S r!   r#   )rI   r#   r#   r$   root_validatork   s    rJ   r   r1   r    )r   r1   r    r3   c                 C   s   d S r!   r#   rK   r#   r#   r$   rJ   p   s    )rI   r   r1   r    r3   c                   sF   | r*t |  }t|tt|jd |S tdd fdd}|S )z
    Decorate methods on a model indicating that they should be used to validate (and perhaps modify) data either
    before or after standard model parsing/validation is performed.
    r   r   r    r   r9   c                    s&   t |  }t|tt|jd |S )NrL   )r;   r<   ROOT_VALIDATOR_CONFIG_KEYr   r>   r?   r1   r   r    r#   r$   rB      s    
  zroot_validator.<locals>.dec)r;   r<   rM   r   r>   r   )rI   r   r1   r    r@   rB   r#   rN   r$   rJ   w   s    
  )functionr1   r3   c                 C   st   t | tr| nt| }t sp|spt|jddd t|jddt|j d }|tkrftd| dt| |S )	z
    Avoid validators with duplicated names since without this, validators can be overwritten silently
    which generally isn't the intended behaviour, don't run in ipython (see #312) or if allow_reuse is False.
    r'   z<No __module__>.r(   z<No __qualname__: id:>zduplicate validator function "z."; if this is intended, set `allow_reuse=True`)	r4   classmethodr   getattrr>   idr/   r   add)rO   r1   r@   refr#   r#   r$   r;      s    

r;   c                   @   sF   e Zd ZdddddZeeeeef  dddZdd	d
dZ	dS )ValidatorGroupValidatorListDictN)
validatorsr3   c                 C   s   || _ dh| _d S )N*)rY   used_validators)r"   rY   r#   r#   r$   r%      s    zValidatorGroup.__init__)namer3   c                 C   sN   | j | | j|g }|tkr4|| jdg 7 }|rFdd |D S d S d S )NrZ   c                 S   s*   i | ]"}t |jd dt|j d|qS )r&   <No __name__: id:rQ   )rS   r   rT   r6   vr#   r#   r$   
<dictcomp>   s      z1ValidatorGroup.get_validators.<locals>.<dictcomp>)r[   rU   rY   getr   )r"   r\   rY   r#   r#   r$   get_validators   s    zValidatorGroup.get_validators)r3   c                    sJ   t t fdd j  j D }|rFd|}td| dd S )Nc                 3   s"   | ]}d d  j | D V  qdS )c                 s   s0   | ](}|j rt|jd dt|j dV  qdS )r&   r]   rQ   N)r   rS   r   rT   r^   r#   r#   r$   r8      s   z<ValidatorGroup.check_for_unused.<locals>.<genexpr>.<genexpr>N)rY   r6   r:   r"   r#   r$   r8      s   z2ValidatorGroup.check_for_unused.<locals>.<genexpr>z, z*Validators defined with incorrect fields: zO (use check_fields=False if you're inheriting from the model and intended this))setr   from_iterablerY   keysr[   joinr   )r"   Zunused_validatorsfnr#   rd   r$   check_for_unused   s    


zValidatorGroup.check_for_unused)
r&   r'   r(   r%   r5   r   r   r   rb   rj   r#   r#   r#   r$   rW      s   
rW   )	namespacer3   c                 C   s^   i }|   D ]L\}}t|td }|r|\}}|D ]&}||krL|| | q0|g||< q0q|S r!   )itemsrS   r=   append)rk   rY   var_namevaluevalidator_configr2   r_   r7   r#   r#   r$   extract_validators   s    rq   c           	      C   s   ddl m} g }g }|  D ]\}}t|td }|r||j}t|j }|d dkrnt	d| d| dt
|dkrt	d| d| d|jr||j q||j|jf q||fS )	Nr   	signaturer"   z%Invalid signature for root validator : zC, "self" not permitted as first argument, should be: (cls, values).   z, should be: (cls, values).)inspectrs   rl   rS   rM   r   list
parametersrg   r   lenr   rm   r    )	rk   rs   Zpre_validatorsZpost_validatorsr\   ro   rp   sigargsr#   r#   r$   extract_root_validators   s$    
r|   rX   )base_validatorsrY   r3   c                 C   s6   |   D ](\}}||kr g ||< ||  |7  < q|S r!   )rl   )r}   rY   r7   Zfield_validatorsr#   r#   r$   inherit_validators   s
    r~   ValidatorCallable)rH   r3   c                    s   ddl m} t ttfs2| }t|j }n(| j} fdd| jj D }|	d}|dkrt
d  d| dn@|d	krt t |t|d
d S t t |t|S dS )a  
    Make a generic function which calls a validator with the right arguments.

    Unfortunately other approaches (eg. return a partial of a function that builds the arguments) is slow,
    hence this laborious way of doing things.

    It's done like this so validators don't all need **kwargs in their signature, eg. any combination of
    the arguments "values", "fields" and/or "config" are permitted.
    r   rr   c                    s$   g | ]}| j  j B kr|qS r#   )r{   keywordsrg   )r6   krH   r#   r$   
<listcomp>  s   z*make_generic_validator.<locals>.<listcomp>r"    Invalid signature for validator rt   z, "self" not permitted as first argument, should be: (cls, value, values, config, field), "values", "config" and "field" are all optional.cls   N)rv   rs   r4   r   r   rw   rx   rg   r   popr   r   _generic_validator_clsre   _generic_validator_basic)rH   rs   rz   r{   Z	first_argr#   r   r$   make_generic_validator   s     



 r   ValidatorsList)v_funcsr3   c                 C   s   dd | D S )Nc                 S   s   g | ]}|rt |qS r#   )r   rc   r#   r#   r$   r     s      z#prep_validators.<locals>.<listcomp>r#   )r   r#   r#   r$   prep_validators  s    r   valuesr7   configr+   )rH   rz   r{   r3   c                    s   d}d|krd}|dh8 }| ts:td  d| d|rJ fddS |t kr` fd	dS |d
hkrv fddS |dhkr fddS |dhkr fddS |d
dhkr fddS |d
dhkr҇ fddS |ddhkr fddS  fddS d S )NFkwargsTr   rt   zb, should be: (cls, value, values, config, field), "values", "config" and "field" are all optional.c                    s    | ||||dS N)r   r7   r   r#   r   r_   r   r7   r   r   r#   r$   <lambda>.      z(_generic_validator_cls.<locals>.<lambda>c                    s
    | |S r!   r#   r   r   r#   r$   r   0  r   r   c                    s    | ||dS N)r   r#   r   r   r#   r$   r   2  r   r7   c                    s    | ||dS N)r7   r#   r   r   r#   r$   r   4  r   r   c                    s    | ||dS N)r   r#   r   r   r#   r$   r   6  r   c                    s    | |||dS N)r   r7   r#   r   r   r#   r$   r   8  r   c                    s    | |||dS N)r   r   r#   r   r   r#   r$   r   :  r   c                    s    | |||dS N)r7   r   r#   r   r   r#   r$   r   <  r   c                    s    | ||||dS r   r#   r   r   r#   r$   r   ?  r   issubset
all_kwargsr   re   rH   rz   r{   Z
has_kwargsr#   r   r$   r      s2    





r   c                    s   d}d|krd}|dh8 }| ts:td  d| d|rJ fddS |t kr` fd	dS |d
hkrv fddS |dhkr fddS |dhkr fddS |d
dhkr fddS |d
dhkr҇ fddS |ddhkr fddS  fddS d S )NFr   Tr   rt   z], should be: (value, values, config, field), "values", "config" and "field" are all optional.c                    s    ||||dS r   r#   r   r   r#   r$   r   O  r   z*_generic_validator_basic.<locals>.<lambda>c                    s    |S r!   r#   r   r   r#   r$   r   Q  r   r   c                    s    ||dS r   r#   r   r   r#   r$   r   S  r   r7   c                    s    ||dS r   r#   r   r   r#   r$   r   U  r   r   c                    s    ||dS r   r#   r   r   r#   r$   r   W  r   c                    s    |||dS r   r#   r   r   r#   r$   r   Y  r   c                    s    |||dS r   r#   r   r   r#   r$   r   [  r   c                    s    |||dS r   r#   r   r   r#   r$   r   ]  r   c                    s    ||||dS r   r#   r   r   r#   r$   r   `  r   r   r   r#   r   r$   r   B  s2    





r   r.   )type_r3   c                 C   s&   t dd | jD  }dd | D S )Nc                 S   s   g | ]
}|j qS r#   )__dict__)r6   r   r#   r#   r$   r   d  s     z)gather_all_validators.<locals>.<listcomp>c                 S   s*   i | ]"\}}t |ts t |tr||qS r#   )hasattrr=   rM   )r6   r   r_   r#   r#   r$   r`   e  s
   
 
 z)gather_all_validators.<locals>.<dictcomp>)r   __mro__rl   )r   Zall_attributesr#   r#   r$   gather_all_validatorsc  s    r   )N)@rD   collectionsr   	functoolsr   r   r   	itertoolsr   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   Zpydantic.v1.errorsr   Zpydantic.v1.typingr   Zpydantic.v1.utilsr   r   r   r   rv   r+   Zpydantic.v1.configr,   Zpydantic.v1.fieldsr-   Zpydantic.v1.typesr.   r5   r   r   rX   re   r/   __annotations__r=   rM   r*   rH   rJ   r;   rW   rq   r|   r~   r   r   r   r   r   r   r#   r#   r#   r$   <module>   s    8&7          "$0'
"!