U
    Q¹Öhÿ9  ã                   @   s  U d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZmZ ddlmZ ddlZddlZddlZddlmZ zddlZW n ek
rª   Y nXX eedœdd„Ze eje ¡  e¡¡ e ej e !d	j"ej#d
dde ¡  e¡¡¡ e ej$e %dd„ e&e'eƒƒD ƒ¡¡ d (ej)j*ej)j+ej)j,ej)j-ej)j.ej)j/f¡ 0ej)j1d¡ 0ej)j2d¡ 0ej)j3d¡Z4e ej)j5e 6e %e&ej)j7ƒ¡e 8e 9dd¡e 9dd¡e 9dd¡e :¡ e ;dd¡B e ;dd¡ <dj"¡B ¡ej#e4dd¡¡ eedœdd„Z=dZ>e ej?ej#d (e>¡dd <e=¡¡ e ej@ejAdd¡ e ejBejAdd¡ e ejCejAdd¡ e ejDejAdd¡ e ejEe F¡  <ejE¡¡ e ejGe H¡  <ejG¡¡ e ejIe J¡ ¡ e ejKe LejM¡e LejN¡B ¡ e ejOe LejP¡e LejQ¡B ¡ e ejRe S¡ ¡ e ejTe H¡ ¡ e ejUejVejW X¡ ejYdd d ¡ e ejZejVejW X¡ ejYdd d!¡ i Z[e
e\e	e\gej]f f e^d"< eeej_j` eej_j` d#œd$d%„ƒZaeej_jbej_jbd#œd&d%„ƒZaeeej_j` ej_jbf eeej_j` ej_jbf d#œd'd%„Zaee\ej_jbf e	e	d(ej]f ge	d(ej]f f d#œd)d*„Zcecejdƒd+d,„ ƒZeecejfƒd-d.„ ƒZgecejhƒd/d0„ ƒZiecejjƒd1d2„ ƒZkecejlƒd3d4„ ƒZmecejnƒd5d6„ ƒZoecejpƒd7d8„ ƒZqerej_jsƒD ]Zteaetƒ qÞeaej__ae ejuee¡ dS )9aÀ  
Register Hypothesis strategies for Pydantic custom types.

This enables fully-automatic generation of test data for most Pydantic classes.

Note that this module has *no* runtime impact on Pydantic itself; instead it
is registered as a setuptools entry point and Hypothesis will import it if
Pydantic is installed.  See also:

https://hypothesis.readthedocs.io/en/latest/strategies.html#registering-strategies-via-setuptools-entry-points
https://hypothesis.readthedocs.io/en/latest/data.html#hypothesis.strategies.register_type_strategy
https://hypothesis.readthedocs.io/en/latest/strategies.html#interaction-with-pytest-cov
https://docs.pydantic.dev/usage/types/#pydantic-types

Note that because our motivation is to *improve user experience*, the strategies
are always sound (never generate invalid data) but sacrifice completeness for
maintainability (ie may be unable to generate some tricky but valid data).

Finally, this module makes liberal use of `# type: ignore[<code>]` pragmas.
This is because Hypothesis annotates `register_type_strategy()` with
`(T, SearchStrategy[T])`, but in most cases we register e.g. `ConstrainedInt`
to generate instances of the builtin `int` type which match the constraints.
é    N)ÚFraction)ÚCallableÚDictÚTypeÚUnionÚcastÚoverload)Úlenient_issubclass)ÚsÚreturnc                 C   s2   zt j| dd W dS  t jk
r,   Y dS X d S )NF)Zcheck_deliverabilityT)Úemail_validatorZvalidate_emailZEmailNotValidError©r
   © r   úD./venv/lib/python3.8/site-packages/pydantic/v1/_hypothesis_plugin.pyÚis_valid_email:   s
    r   z{} <{}>z"[A-Za-z0-9_]+( [A-Za-z0-9_]+){0,5}T©Ú	fullmatchc                 C   s(   g | ] }|  d ¡sttjd|› ƒ‘qS )Ú_zmath.)Ú
startswithr   ÚpydanticÚPyObject)Ú.0Únamer   r   r   Ú
<listcomp>S   s     
 r   ú|z#(?:(\d\d?(?:\.\d+)?|100(?:\.0+)?)%)z+(?:(0(?:\.\d+)?|1(?:\.0+)?|\.\d+|\d{1,2}%))zB(?:((?:\d|\d\d|[01]\d\d|2[0-4]\d|25[0-4])(?:\.\d+)?|255(?:\.0+)?))éÿ   é   éd   z{}%)Úcard_numberr   c                 C   sP   dD ]>}t  t¡* tj | | ¡ | | W  5 Q R £   S Q R X qtdƒ‚d S )NÚ
0123456789ZUnreachable)Ú
contextlibÚsuppressÚ	Exceptionr   ÚPaymentCardNumberZvalidate_luhn_check_digitÚAssertionError)r   Údigitr   r   r   Úadd_luhn_digitz   s
     r&   )z
4[0-9]{14}z5[12345][0-9]{13}z3[47][0-9]{12}z[0-26-9][0-9]{10,17})Úversioné   é   é   ©Zdays)Ú	min_value)Ú	max_valueÚ	RESOLVERS)Útypr   c                 C   s   d S ©Nr   ©r/   r   r   r   Ú_registered¸   s    r2   c                 C   s   d S r0   r   r1   r   r   r   r2   ½   s    c                 C   sV   t jj | ¡ t ¡ D ]*\}}t| |ƒrt | || ƒ¡ |   S qt	d| ›dƒ‚d S )NzUnknown type z has no resolver to register)
r   ÚtypesÚ_DEFINED_TYPESÚaddr.   ÚitemsÚ
issubclassÚstÚregister_type_strategyÚNotImplementedError)r/   Z	supertypeZresolverr   r   r   r2   Â   s    

.c                    s   ‡ fdd„}|S )Nc                    s   | t kst‚| t ˆ < | S r0   )r.   r$   )Úfr1   r   r   ÚinnerÓ   s    zresolves.<locals>.innerr   )r/   r<   r   r1   r   ÚresolvesÐ   s    r=   c                 C   sÄ   z"| j d krt ¡ n
t | j ¡}W nR tk
rt   tjddd}tjt t ¡ t ¡ t 	¡ |t 
¡ ¡dd„ d}Y nX t| dd ƒ}tjt|tjƒrš| j jntj|t ¡ t ¡ t 	dd¡B t ¡ d	S )
NF)Zallow_infinityÚ	allow_nanc                 S   s   t  | ¡t  t  ¡ | ¡B S r0   )r8   ZlistsZdictionariesÚtext©Úxr   r   r   Ú<lambda>æ   ó    zresolve_json.<locals>.<lambda>)ÚbaseÚextendÚ
inner_typer   é   )Zensure_asciiÚindentZ	sort_keys)rF   r8   ÚnoneÚ	from_typer"   ÚfloatsÚ	recursiveÚone_ofÚbooleansÚintegersr?   ÚgetattrÚbuildsr	   r   Z	BaseModelÚjsonÚdumps)Úclsr<   ZfiniterF   r   r   r   Úresolve_jsonÞ   s     " þûrU   c                 C   sª   | j pd}| j}| js$tj||dS d |dkr8|d nd|p@ddkrN|d nd¡}|dkrjd|› d}n.|dkr€d	|› d
}n|dksŒt‚d|› d}tj| ¡ ddS )Nr   ©Úmin_sizeÚmax_sizeú	{{{},{}}}é   Ú ú\W.ú\Wr   ú\W(.ú\W)?ú(\W(.ú\W)?)?Tr   )	Ú
min_lengthÚ
max_lengthÚstrip_whitespacer8   ÚbinaryÚformatr$   Ú
from_regexÚencode)rT   rW   rX   ÚrepeatsÚpatternr   r   r   Úresolve_conbytesò   s    
þrk   c                    sœ   ˆ j }ˆ j}ˆ jd k	r,|d ks&tdƒ‚ˆ j}ˆ jd k	rL|d ksFtdƒ‚ˆ j}tj||dˆ jd}ˆ jd k	r|| ‡ fdd„¡}ˆ jd k	r˜| ‡ fdd„¡}|S )NúSet `gt` or `ge`, but not bothúSet `lt` or `le`, but not bothF)r>   Zplacesc                    s
   | ˆ j k S r0   )Últ©Úd©rT   r   r   rB     rC   z$resolve_condecimal.<locals>.<lambda>c                    s
   ˆ j | k S r0   )Úgtro   rq   r   r   rB     rC   )	ÚgeÚlerr   r$   rn   r8   ZdecimalsZdecimal_placesÚfilter)rT   r,   r-   r
   r   rq   r   Úresolve_condecimal  s    



rv   c                    sî   ˆ j }ˆ j}d}d}ˆ jd k	r8|d ks.tdƒ‚ˆ j}d}ˆ jd k	r\|d ksRtdƒ‚ˆ j}d}ˆ jd krztj||||ddS |d k	ržt 	|ˆ j ¡}|rž|d }|d k	rÔ|ˆ jks¸tdƒ‚t 
|ˆ j ¡}|rÔ|d }t ||¡ ‡ fdd	„¡S )
NFrl   Trm   )Úexclude_minÚexclude_maxr>   r   z:Cannot build model with max value smaller than multiple ofc                    s
   | ˆ j  S r0   ©Úmultiple_ofr@   rq   r   r   rB   6  rC   z"resolve_confloat.<locals>.<lambda>)rs   rt   rr   r$   rn   rz   r8   rK   ÚmathÚceilÚfloorrO   Úmap)rT   r,   r-   rw   rx   r   rq   r   Úresolve_confloat  s0    


r   c                    sÎ   ˆ j }ˆ j}ˆ jd k	r0|d ks&tdƒ‚ˆ jd }ˆ jd k	rT|d ksJtdƒ‚ˆ jd }ˆ jd kshˆ jdkrtt ||¡S |d k	r”t 	t
|ƒt
ˆ jƒ ¡}|d k	r´t t
|ƒt
ˆ jƒ ¡}t ||¡ ‡ fdd„¡S )Nrl   r   rm   c                    s
   | ˆ j  S r0   ry   r@   rq   r   r   rB   M  rC   z resolve_conint.<locals>.<lambda>)rs   rt   rr   r$   rn   rz   r8   rO   r{   r|   r   r}   r~   ©rT   r,   r-   r   rq   r   Úresolve_conint9  s    



r   c                 C   s    | j d k	r$| jd kstdƒ‚| j }n&| jd k	rB| jtjdd }ntjj}| jd k	rn| jd ksftdƒ‚| j}n&| jd k	rŒ| jtjdd }ntjj	}t
 ||¡S )Nrl   r   r+   rm   )rs   rr   r$   ÚdatetimeÚ	timedeltaÚdateÚminrt   rn   Úmaxr8   Údatesr€   r   r   r   Úresolve_condateP  s    



rˆ   c                    s*  | j pd‰| j‰ | jd kr.| js.tjˆˆ dS | jd k	rZt | j¡}| jræ| dd„ ¡}nŒ| jræd ˆdkrtˆd ndˆ p|ddkrŠˆ d nd¡}ˆdkr¬t d|› d	¡}n:ˆd
krÈt d|› d¡}nˆdksÔt	‚t d|› d¡}ˆdkrúˆ d krú|S ˆ d kr| ‡fdd„¡S | ‡ ‡fdd„¡S )Nr   rV   c                 S   s   | |   ¡ kS r0   )Ústripr   r   r   r   rB   n  rC   z resolve_constr.<locals>.<lambda>rY   rZ   r[   r\   r]   r   r^   r_   r`   ra   c                    s   ˆ t | ƒkS r0   ©Úlenr   )rW   r   r   rB     rC   c                    s   ˆt | ƒ  koˆ kS   S r0   rŠ   r   ©rX   rW   r   r   rB   €  rC   )
rb   rc   Zregexrd   r8   r?   rg   ru   rf   r$   )rT   Zstrategyri   r   rŒ   r   Úresolve_constrc  s0    

þ
r   )vÚ__doc__r    r‚   Z	ipaddressrR   r{   Z	fractionsr   Útypingr   r   r   r   r   r   Zhypothesis.strategiesZ
strategiesr8   r   Zpydantic.colorZpydantic.typesZpydantic.v1.utilsr	   r   ÚImportErrorÚstrÚboolr   r9   ZEmailStrZemailsru   Z	NameEmailrQ   rf   rg   r   Zsampled_fromÚsortedÚvarsÚjoinZcolorZr_hex_shortZ
r_hex_longZr_rgbZr_rgbaZr_hslZr_hslaÚreplaceZ_r_slZ_r_alphaZ_r_255Z_color_regexesZColorrM   ZCOLORS_BY_NAMEZtuplesrO   rI   rK   r~   r&   Zcard_patternsr#   ZUUID1ZuuidsZUUID3ZUUID4ZUUID5ZSecretBytesre   Z	SecretStrr?   ZIPvAnyAddressZip_addressesZIPvAnyInterfacerJ   ZIPv4InterfaceZIPv6InterfaceZIPvAnyNetworkZIPv4NetworkZIPv6NetworkZ
StrictBoolrN   Z	StrictStrZ
FutureDater‡   r„   Ztodayrƒ   ZPastDater.   ÚtypeZSearchStrategyÚ__annotations__r3   ÚTr2   ZConstrainedNumberMetar=   ZJsonWrapperrU   ZConstrainedBytesrk   ZConstrainedDecimalrv   ZConstrainedFloatr   ZConstrainedIntr   ZConstrainedDaterˆ   ZConstrainedStrr   Úlistr4   r/   ZJsonr   r   r   r   Ú<module>   sì    ýþ
ÿþ	úÿ õ ô óÿ


&üøþ	þþþ(( "þ þ






 