o
    Ú­jÿ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yT   Y n-w dedef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�¡¡ dedef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d$eej_j` deej_j` fd%d&„ƒZaed$ej_jbdej_jbfd'd&„ƒZad$eeej_j` ej_jbf deeej_j` ej_jbf fd(d&„Zad$ee\ej_jbf de	e	d)ej]f ge	d)ej]f f fd*d+„Zcecejdƒd,d-„ ƒZeecejfƒd.d/„ ƒZgecejhƒd0d1„ ƒZiecejjƒd2d3„ ƒZkecejlƒd4d5„ ƒZmecejnƒd6d7„ ƒZoecejpƒd8d9„ ƒZqerej_jsƒD ]Zteaetƒ �qteaej__ae ejuee¡ dS ):aÀ  
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   s,   z
t j| dd� W dS  t jy   Y dS w )NF)Úcheck_deliverabilityT)Úemail_validatorÚvalidate_emailÚEmailNotValidError©r
   © r   ú[/var/www/html/CropPilot/venv/lib/python3.10/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_numberc              	   C   sX   dD ]%}t  t¡� tj | | ¡ | | W  d   ƒ   S 1 s"w   Y  qtdƒ‚)NÚ
0123456789ÚUnreachable)Ú
contextlibÚsuppressÚ	Exceptionr   ÚPaymentCardNumberÚ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é   é   é   ©Údays)Ú	min_value)Ú	max_valueÚ	RESOLVERSÚtypc                 C   ó   d S ©Nr   ©r5   r   r   r   Ú_registered¸   ó   r9   c                 C   r6   r7   r   r8   r   r   r   r9   ½   r:   c                 C   sR   t jj | ¡ t ¡ D ]\}}t| |ƒr t | || ƒ¡ |   S qt	d| ›d�ƒ‚)NzUnknown type z has no resolver to register)
r   ÚtypesÚ_DEFINED_TYPESÚaddr4   ÚitemsÚ
issubclassÚstÚregister_type_strategyÚNotImplementedError)r5   Ú	supertypeÚresolverr   r   r   r9   Â   s   
þ.c                    s   ‡ fdd„}|S )Nc                    s   | t vsJ ‚| t ˆ < | S r7   )r4   )Úfr8   r   r   ÚinnerÓ   s   zresolves.<locals>.innerr   )r5   rF   r   r8   r   ÚresolvesÐ   s   rG   c                 C   sÂ   z| j d u r
t ¡ nt | j ¡}W n( ty9   tjddd�}tjt t ¡ t ¡ t 	¡ |t 
¡ ¡dd„ d�}Y nw t| dd ƒ}tjt|tjƒrL| j jntj|t ¡ t ¡ t 	dd¡B t ¡ d	�S )
NF)Úallow_infinityÚ	allow_nanc                 S   s   t  | ¡t  t  ¡ | ¡B S r7   )r@   ÚlistsÚdictionariesÚtext©Úxr   r   r   Ú<lambda>æ   s    zresolve_json.<locals>.<lambda>)ÚbaseÚextendÚ
inner_typer   é   )Úensure_asciiÚindentÚ	sort_keys)rR   r@   ÚnoneÚ	from_typer&   ÚfloatsÚ	recursiveÚone_ofÚbooleansÚintegersrL   ÚgetattrÚbuildsr	   r   Ú	BaseModelÚjsonÚdumps)ÚclsrF   ÚfiniterR   r   r   r   Úresolve_jsonÞ   s"   " 
þþûre   c                 C   sª   | j pd}| j}| jstj||d�S d |dkr|d nd|p ddkr'|d nd¡}|dkr5d|› d�}n|dkr@d	|› d
�}n|dksFJ ‚d|› d�}tj| ¡ dd�S )Nr   ©Úmin_sizeÚmax_sizeú	{{{},{}}}é   Ú ú\W.ú\Wr   ú\W(.ú\W)?ú(\W(.ú\W)?)?Tr   )Ú
min_lengthÚ
max_lengthÚstrip_whitespacer@   ÚbinaryÚformatÚ
from_regexÚencode)rc   rg   rh   ÚrepeatsÚpatternr   r   r   Úresolve_conbytesò   s   
þr{   c                    sœ   ˆ j }ˆ j}ˆ jd ur|d u sJ dƒ‚ˆ j}ˆ jd ur&|d u s#J dƒ‚ˆ j}tj||dˆ jd�}ˆ jd ur>| ‡ fdd„¡}ˆ jd urL| ‡ fdd„¡}|S )NúSet `gt` or `ge`, but not bothúSet `lt` or `le`, but not bothF)rI   Úplacesc                    s
   | ˆ j k S r7   )Últ©Úd©rc   r   r   rO     ó   
 z$resolve_condecimal.<locals>.<lambda>c                    s
   ˆ j | k S r7   )Úgtr€   r‚   r   r   rO     rƒ   )ÚgeÚler„   r   r@   ÚdecimalsÚdecimal_placesÚfilter)rc   r2   r3   r
   r   r‚   r   Úresolve_condecimal  s   



rŠ   c                    sî   ˆ j }ˆ j}d}d}ˆ jd ur|d u sJ dƒ‚ˆ j}d}ˆ jd ur.|d u s)J dƒ‚ˆ j}d}ˆ jd u r=tj||||dd�S |d urOt |ˆ j ¡}|rO|d }|d urj|ˆ jks\J dƒ‚t 	|ˆ j ¡}|rj|d }t 
||¡ ‡ fdd	„¡S )
NFr|   Tr}   )Úexclude_minÚexclude_maxrI   r   z:Cannot build model with max value smaller than multiple ofc                    ó
   | ˆ j  S r7   ©Úmultiple_ofrM   r‚   r   r   rO   6  rƒ   z"resolve_confloat.<locals>.<lambda>)r…   r†   r„   r   r�   r@   rY   ÚmathÚceilÚfloorr]   Úmap)rc   r2   r3   r‹   rŒ   r   r‚   r   Úresolve_confloat  s0   


r”   c                    sÎ   ˆ j }ˆ j}ˆ jd ur|d u sJ dƒ‚ˆ jd }ˆ jd ur*|d u s%J dƒ‚ˆ jd }ˆ jd u s4ˆ jdkr:t ||¡S |d urJt t	|ƒt	ˆ jƒ ¡}|d urZt 
t	|ƒt	ˆ jƒ ¡}t ||¡ ‡ fdd„¡S )Nr|   r   r}   c                    r�   r7   rŽ   rM   r‚   r   r   rO   M  rƒ   z resolve_conint.<locals>.<lambda>)r…   r†   r„   r   r�   r@   r]   r�   r‘   r   r’   r“   ©rc   r2   r3   r   r‚   r   Úresolve_conint9  s   



r–   c                 C   s    | j d ur| jd u sJ dƒ‚| j }n| jd ur!| jtjdd� }ntjj}| jd ur7| jd u s3J dƒ‚| j}n| jd urF| jtjdd� }ntjj}t	 
||¡S )Nr|   r   r0   r}   )r…   r„   ÚdatetimeÚ	timedeltaÚdateÚminr†   r   Úmaxr@   Údatesr•   r   r   r   Úresolve_condateP  s   



r�   c                    s(  | j pd‰| j‰ | jd u r| jstjˆˆ d�S | jd ur-t | j¡}| jr,| dd„ ¡}nF| jrsd ˆdkr:ˆd ndˆ p>ddkrEˆ d nd¡}ˆdkrVt d|› d	�¡}nˆd
krdt d|› d�¡}nˆdksjJ ‚t d|› d�¡}ˆdkr}ˆ d u r}|S ˆ d u rŠ| ‡fdd„¡S | ‡ ‡fdd„¡S )Nr   rf   c                 S   s   | |   ¡ kS r7   )Ústripr   r   r   r   rO   n  ó    z resolve_constr.<locals>.<lambda>ri   rj   rk   rl   rm   r   rn   ro   rp   rq   c                    s   ˆ t | ƒkS r7   ©Úlenr   )rg   r   r   rO     rŸ   c                    s   ˆt | ƒ  koˆ kS   S r7   r    r   ©rh   rg   r   r   rO   €  s    )	rr   rs   Úregexrt   r@   rL   rw   r‰   rv   )rc   Ústrategyry   r   r¢   r   Úresolve_constrc  s2   

€þr¥   )vÚ__doc__r$   r—   Ú	ipaddressra   r�   Ú	fractionsr   Útypingr   r   r   r   r   r   Úhypothesis.strategiesÚ
strategiesr@   r   Úpydantic.colorÚpydantic.typesÚpydantic.v1.utilsr	   r   ÚImportErrorÚstrÚboolr   rA   ÚEmailStrÚemailsr‰   Ú	NameEmailr_   rv   rw   r   Úsampled_fromÚsortedÚvarsÚjoinÚcolorÚr_hex_shortÚ
r_hex_longÚr_rgbÚr_rgbaÚr_hslÚr_hslaÚreplaceÚ_r_slÚ_r_alphaÚ_r_255Ú_color_regexesÚColorr[   ÚCOLORS_BY_NAMEÚtuplesr]   rW   rY   r“   r+   Úcard_patternsr'   ÚUUID1ÚuuidsÚUUID3ÚUUID4ÚUUID5ÚSecretBytesru   Ú	SecretStrrL   ÚIPvAnyAddressÚip_addressesÚIPvAnyInterfacerX   ÚIPv4InterfaceÚIPv6InterfaceÚIPvAnyNetworkÚIPv4NetworkÚIPv6NetworkÚ
StrictBoolr\   Ú	StrictStrÚ
FutureDaterœ   r™   Útodayr˜   ÚPastDater4   ÚtypeÚSearchStrategyÚ__annotations__r;   ÚTr9   ÚConstrainedNumberMetarG   ÚJsonWrapperre   ÚConstrainedBytesr{   ÚConstrainedDecimalrŠ   ÚConstrainedFloatr”   ÚConstrainedIntr–   ÚConstrainedDater�   ÚConstrainedStrr¥   Úlistr<   r5   ÚJsonr   r   r   r   Ú<module>   sì     ÿýþ
ÿþ	úÿò


&üøþ	þþþ(( $ÿ
þÿ 
þ






 