U
    Ze9                     @   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jWX ejYdd d  eejZejVejWX 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 qeae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   B/tmp/pip-unpacked-wheel-bnbn73p_/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         days)	min_value)	max_value	RESOLVERS)typr   c                 C   s   d S Nr   r0   r   r   r   _registered   s    r3   c                 C   s   d S r1   r   r2   r   r   r   r3      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)r0   Z	supertyperesolverr   r   r   r3      s    

.c                    s    fdd}|S )Nc                    s   | t kst| t  < | S r1   )r/   r$   )fr2   r   r   inner   s    zresolves.<locals>.innerr   )r0   r>   r   r2   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 r1   )r9   listsZdictionariestextxr   r   r   <lambda>       zresolve_json.<locals>.<lambda>)baseextend
inner_typer      )ensure_asciiindent	sort_keys)rI   r9   none	from_typer"   floats	recursiveone_ofbooleansintegersrB   getattrbuildsr	   r   Z	BaseModeljsondumps)clsr>   ZfiniterI   r   r   r   resolve_json   s     " rZ   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rd	| d
}n|dkstd| d}tj| ddS )Nr   min_sizemax_size	{{{},{}}}    \W.\Wr   \W(.\W)?(\W(.\W)?)?Tr   )	
min_length
max_lengthstrip_whitespacer9   binaryformatr$   
from_regexencode)rY   r\   r]   repeatspatternr   r   r   resolve_conbytes   s    
rp   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 r1   )ltdrY   r   r   rE     rF   z$resolve_condecimal.<locals>.<lambda>c                    s
    j | k S r1   )gtrt   rv   r   r   rE     rF   )	gelerw   r$   rs   r9   ZdecimalsZdecimal_placesfilter)rY   r-   r.   r
   r   rv   r   resolve_condecimal  s    



r{   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	rt	| j }|r|d }|d k	r| jkstdt
| j }|r|d }t|| fdd	S )
NFrq   Trr   )exclude_minexclude_maxr@   r   z:Cannot build model with max value smaller than multiple ofc                    s
   |  j  S r1   multiple_ofrC   rv   r   r   rE   6  rF   z"resolve_confloat.<locals>.<lambda>)rx   ry   rw   r$   rs   r   r9   rP   mathceilfloorrT   map)rY   r-   r.   r|   r}   r   rv   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	rt	t
|t
 j }|d k	rtt
|t
 j }t|| fddS )Nrq   r   rr   c                    s
   |  j  S r1   r~   rC   rv   r   r   rE   M  rF   z resolve_conint.<locals>.<lambda>)rx   ry   rw   r$   rs   r   r9   rT   r   r   r   r   r   rY   r-   r.   r   rv   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 )Nrq   r   r+   rr   )rx   rw   r$   datetime	timedeltadateminry   rs   maxr9   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rddkrtd nd p|ddkr d nd}dkrtd| d	}n:d
krtd| d}ndkst	td| d}dkr d kr|S  d kr|fddS | fddS )Nr   r[   c                 S   s   | |   kS r1   )stripr   r   r   r   rE   n  rF   z resolve_constr.<locals>.<lambda>r^   r_   r`   ra   rb   r   rc   rd   re   rf   c                    s    t | kS r1   lenr   )r\   r   r   rE     rF   c                    s   t |   ko kS   S r1   r   r   r]   r\   r   r   rE     rF   )
rg   rh   regexri   r9   rB   rl   rz   rk   r$   )rY   Zstrategyrn   r   r   r   resolve_constrc  s0    


r   )v__doc__r    r   	ipaddressrW   r   Z	fractionsr   typingr   r   r   r   r   r   Zhypothesis.strategiesZ
strategiesr9   r   Zpydantic.colorZpydantic.typesZpydantic.utilsr	   r   ImportErrorstrboolr   r:   ZEmailStrZemailsrz   Z	NameEmailrV   rk   rl   r   Zsampled_fromsortedvarsjoincolorZr_hex_shortZ
r_hex_longZr_rgbZr_rgbaZr_hslZr_hslareplaceZ_r_slZ_r_alphaZ_r_255Z_color_regexesZColorrR   ZCOLORS_BY_NAMEZtuplesrT   rN   rP   r   r&   Zcard_patternsr#   ZUUID1ZuuidsZUUID3ZUUID4ZUUID5ZSecretBytesrj   Z	SecretStrrB   ZIPvAnyAddressZip_addressesZIPvAnyInterfacerO   IPv4InterfaceIPv6InterfaceZIPvAnyNetworkIPv4NetworkIPv6NetworkZ
StrictBoolrS   Z	StrictStrZ
FutureDater   r   todayr   ZPastDater/   typeZSearchStrategy__annotations__r4   Tr3   ZConstrainedNumberMetar?   ZJsonWrapperrZ   ZConstrainedBytesrp   ZConstrainedDecimalr{   ZConstrainedFloatr   ZConstrainedIntr   ZConstrainedDater   ZConstrainedStrr   listr5   r0   ZJsonr   r   r   r   <module>   s    
	   


&	(( " 






 