o
     dCU                     @   sX  d dl Z d dlmZmZmZmZmZmZmZ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mZmZmZ ddlmZ ddlmZmZ ddlm Z m!Z! erd dl"a"d dl#m$Z$ dd	l%m&Z& dd
l'm(Z( ddl
m)Z) ee)ddf Z*G dd de$ddZ+G dd de$ddZ,n
da"G dd de-Z+ee.e/e0eee.e/e0f ee.e0f f f Z1g dZ2da3da4da5da6da7dZ8dZ9dZ:dZ;dZ<dZ=dee. fddZ>dee. fddZ?dee. fdd Z@dee. fd!d"ZAdee. fd#d$ZBG d%d& d&e.ZCG d'd( d(eCZDG d)d* d*eDZEG d+d, d,eCZFG d-d. d.eCZGG d/d0 d0eGZHG d1d2 d2eCZIG d3d4 d4eCZJG d5d6 d6eCZKG d7d8 d8eCZLG d9d: d:eCZMd;dd<d;d;dd=d>eNd?e0d@e0dAeNdBeNdCeee.  deeC fdDdEZOdVdFdGZPG dHdI dIe.ZQG dJdK dKeZRG dLdM dMeZSG dNdO dOeZTG dPdQ dQe	ZUe VdRZWdSee. dee.e.f fdTdUZXdS )W    N)IPv4AddressIPv4InterfaceIPv4NetworkIPv6AddressIPv6InterfaceIPv6Network_BaseAddress_BaseNetwork)TYPE_CHECKINGAny
CollectionDict	GeneratorListMatchOptionalPatternSetTupleTypeUnioncastno_type_check   )errors)Representationupdate_not_none)constr_length_validatorstr_validator)	TypedDict)
BaseConfig)
ModelField)AnyCallablec                   @   s   e Zd ZU eed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed< ee ed	< ee ed
< dS )Partsschemeuserpasswordipv4ipv6domainportpathqueryfragmentN)__name__
__module____qualname__str__annotations__r    r3   r3   </usr/local/lib/python3.10/dist-packages/pydantic/networks.pyr#   ,   s   
 r#   F)totalc                   @   sB   e Zd ZU eed< ee ed< ee ed< ee ed< eed< dS )	HostPartshosttld	host_typer*   rebuildN)r.   r/   r0   r1   r2   r   boolr3   r3   r3   r4   r6   8   s   
 r6   c                   @   s   e Zd ZdS )r#   N)r.   r/   r0   r3   r3   r3   r4   r#   B   s    )AnyUrl
AnyHttpUrlFileUrlHttpUrl	stricturlEmailStr	NameEmailIPvAnyAddressIPvAnyInterfaceIPvAnyNetworkPostgresDsnCockroachDsnAmqpDsnRedisDsnMongoDsnKafkaDsnvalidate_emailz(?:(?P<ipv4>(?:\d{1,3}\.){3}\d{1,3})(?=$|[/:#?])|(?P<ipv6>\[[A-F0-9]*:[A-F0-9:]+\])(?=$|[/:#?])|(?P<domain>[^\s/:?#]+))?(?::(?P<port>\d+))?z&(?:(?P<scheme>[a-z][a-z0-9+\-.]+)://)?z3(?:(?P<user>[^\s:/]*)(?::(?P<password>[^\s/]*))?@)?z(?P<path>/[^\s?#]*)?z(?:\?(?P<query>[^\s#]*))?z(?:#(?P<fragment>[^\s#]*))?returnc                   C   s2   t d u rtt t t t t t tj	a t S N)
_url_regex_cacherecompile_scheme_regex_user_info_regex_host_regex_path_regex_query_regex_fragment_regex
IGNORECASEr3   r3   r3   r4   	url_regexq   s   rY   c                   C   s0   t du rtt t dt t t tja t S )z
    Compiled multi host url regex.

    Additionally to `url_regex` it allows to match multiple hosts.
    E.g. host1.db.net,host2.db.net
    Nz(?P<hosts>([^/]*)))	_multi_host_url_regex_cacherP   rQ   rR   rS   rU   rV   rW   rX   r3   r3   r3   r4   multi_host_url_regex{   s   
r[   c                  C   2   t d u rd} d}td|  d|  | tja t S )Nz'[_0-9a-z](?:[-_0-9a-z]{0,61}[_0-9a-z])?z(?P<tld>\.[a-z]{2,63})?\.?(?:\.)*?)_ascii_domain_regex_cacherP   rQ   rX   )ascii_chunkascii_domain_endingr3   r3   r4   ascii_domain_regex   s   rb   c                  C   r\   )NzB[_0-9a-\U00040000](?:[-_0-9a-\U00040000]{0,61}[_0-9a-\U00040000])?z<(?P<tld>(\.[^\W\d_]{2,63})|(\.(?:xn--)[_0-9a-z-]{2,63}))?\.?r]   r^   )_int_domain_regex_cacherP   rQ   rX   )	int_chunkint_domain_endingr3   r3   r4   int_domain_regex   s
   rf   c                   C   s   t d u rtttja t S rN   )_host_regex_cacherP   rQ   rT   rX   r3   r3   r3   r4   
host_regex   s   rh   c                       sh  e Zd ZU dZdZdZdZeee	  e
d< dZee
d< dZee
d< dZee
d	< e Zee	 e
d
< dZedee	 defddZdddddddddd	de	de	dee	 dee	 dee	 dee	 de	dee	 dee	 dee	 dee	 ddfddZedddddddde	dee	 dee	 de	dee	 dee	 dee	 dee	 de	de	fd d!Zed"ee	ef ddfd#d$ZedCd&d'Zed(ed)d*d+d,dd fd-d.Zed/ee	 de	d0d1dd fd2d3Ze de	deee	  fd4d5Z!e dee	 ddfd6d7Z"edDd0d1d8edd1fd9d:Z#ed0d1de$e	ee	 e	ef fd;d<Z%e dEd=d>Z&edEd?d@Z'de	f fdAdBZ(  Z)S )Fr<   Tr      Nallowed_schemesFtld_requireduser_requiredhost_requiredhidden_parts
r$   r%   r&   r7   r8   r9   r*   r+   r,   r-   urlrM   c                 K   s&   t | |d u r| jdi |S |S )Nr3   )r1   __new__build)clsrp   kwargsr3   r3   r4   rq      s   &zAnyUrl.__new__r)   )	r%   r&   r7   r8   r9   r*   r+   r,   r-   r$   r%   r&   r7   r8   r9   r*   r+   r,   r-   c       
         C   sJ   t | || _|| _|| _|| _|| _|| _|| _|	| _	|
| _
|| _d S rN   )r1   __init__r$   r%   r&   r7   r8   r9   r*   r+   r,   r-   )selfrp   r$   r%   r&   r7   r8   r9   r*   r+   r,   r-   r3   r3   r4   ru      s   

zAnyUrl.__init__)r%   r&   r*   r+   r,   r-   _kwargsc                K   s   t d||||||||d|	}
|d }|r||7 }|r"|d| 7 }|s&|r*|d7 }||7 }|rEd| jvs?| |
d|krE|d| 7 }|rK||7 }|rS|d| 7 }|r[|d| 7 }|S )	N)r$   r%   r&   r7   r*   r+   r,   r-   z://:@r*   ?#r3   )r#   rn   get_default_partsget)rs   r$   r%   r&   r7   r*   r+   r,   r-   rw   partsrp   r3   r3   r4   rr      s:   	"zAnyUrl.buildfield_schemac                 C   s   t || j| jdd d S )Nuri)	minLength	maxLengthformat)r   
min_length
max_lengthrs   r   r3   r3   r4   __modify_schema__  s   zAnyUrl.__modify_schema__CallableGeneratorc                 c       | j V  d S rN   validaters   r3   r3   r4   __get_validators__     zAnyUrl.__get_validators__valuefieldr!   configr    c                 C   s   |j | kr|S t|}| jr| }ttt|||}| |}|s&J dtd| }| 	|}| 
|}| t|krKtj|| d  d| |||S )NzURL regex failed unexpectedlyr#   )extra)	__class__r   strip_whitespacestripr   r1   r   
_match_url	groupdictapply_default_partsvalidate_partsendlenr   UrlExtraError
_build_url)rs   r   r   r   rp   moriginal_partsr~   r3   r3   r4   r   
  s   



zAnyUrl.validater   r~   r#   c                 C   sT   |  |\}}}}| |rdn||d |d |d ||||d |d |d |d d	S )
z
        Validate hosts and build the AnyUrl object. Split from `validate` so this method
        can be altered in `MultiHostDsn`.
        Nr$   r%   r&   r*   r+   r,   r-   ro   )validate_host)rs   r   rp   r~   r7   r8   r9   r:   r3   r3   r4   r      s   
zAnyUrl._build_urlc                 C      t  | S rN   )rY   matchrp   r3   r3   r4   r   6     zAnyUrl._match_urlc                 C   s$   | d urt | dkrt d S d S )Ni  )intr   UrlPortError)r*   r3   r3   r4   _validate_port:  s   zAnyUrl._validate_portvalidate_portc                 C   sp   |d }|du rt  | jr| | jvrt t| j|r'| |d  |d }| jr6|du r6t  |S )z
        A method used to validate parts of a URL.
        Could be overridden to set default values for parts if missing
        r$   Nr*   r%   )	r   UrlSchemeErrorrj   lowerUrlSchemePermittedErrorsetr   rl   UrlUserInfoError)rs   r~   r   r$   r%   r3   r3   r4   r   ?  s   zAnyUrl.validate_partsc           	      C   s   d\}}}dD ]}|| }|r|} nq|d u r | j rt nj|dkrd}t |}|d u r@t |}|d u r>t d}|d}|d u r^|s^t |}|d usWJ |d}d}|d uri|dd  }n| jrpt |rd}d}|	d	
d
}|d ur|	d	
d
}||||fS )N)NNF)r)   r'   r(   r)   FTr8   r   
int_domainidnaascii)rm   r   UrlHostErrorrb   	fullmatchrf   grouprk   UrlHostTldErrorencodedecode)	rs   r~   r8   r9   r:   fr7   is_internationaldr3   r3   r4   r   U  sH   


zAnyUrl.validate_hostc                 C   s   i S rN   r3   r~   r3   r3   r4   r|     s   zAnyUrl.get_default_partsc                 C   s,   |  | D ]\}}|| s|||< q|S rN   )r|   items)rs   r~   keyr   r3   r3   r4   r     s
   zAnyUrl.apply_default_partsc                    s:   d  fdd jD } jj dt   d| dS )Nz, c                 3   s2    | ]}t  |d ur| dt  |V  qd S )N=)getattr).0nrv   r3   r4   	<genexpr>  s   0 z"AnyUrl.__repr__.<locals>.<genexpr>())join	__slots__r   r.   super__repr__)rv   r   r   r   r4   r     s    zAnyUrl.__repr__rM   r   Tr~   r#   rM   r#   )*r.   r/   r0   r   r   r   rj   r   r   r1   r2   rk   r;   rl   rm   r   rn   r   r   r   objectrq   ru   classmethodrr   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r|   r   r   __classcell__r3   r3   r   r4   r<      s   
 	

	
+ $)r<   c                   @      e Zd ZddhZdZdS )r=   httphttpsr3   N)r.   r/   r0   rj   r   r3   r3   r3   r4   r=     s    r=   c                   @   s(   e Zd ZdZdZdhZed
ddZd	S )r?   Ti#  r*   r~   r#   rM   c                 C   s   d| d dkr
diS diS )Nr*   r$   r   80443r3   r   r3   r3   r4   r|     s   zHttpUrl.get_default_partsNr   )r.   r/   r0   rk   r   rn   r   r|   r3   r3   r3   r4   r?     s    r?   c                   @   s   e Zd ZdhZdZdZdS )r>   fileFr3   N)r.   r/   r0   rj   rm   r   r3   r3   r3   r4   r>     s    r>   c                	       s   e Zd Zejd Zdddedeed  def fddZe	d	e
d
eee
  fddZedddded
df fddZedee
 d	e
ddd
d fddZ  ZS )MultiHostDsn)hostsNargsr   r6   rt   c                   s   t  j|i | || _d S rN   )r   ru   r   )rv   r   r   rt   r   r3   r4   ru     s   
zMultiHostDsn.__init__rp   rM   c                 C   r   rN   )r[   r   r   r3   r3   r4   r     r   zMultiHostDsn._match_urlTr~   r#   r   c                    s   t  j|ddS )NF)r   )r   r   )rs   r~   r   r   r3   r4   r     s   zMultiHostDsn.validate_partsr   c                 C   s  g }t  }| d dD ]'}|| }| |\}}}	}
|d}| | |||	||
|d qt|dkr`| t	dd |D rHd n||d |d	 |d
 |d |d |d d |d	S |d }| |d rkd n||d |d	 |d
 |d |d |d |d|d |d |d dS )Nr   ,r*   )r7   r9   r8   r:   r*   r   c                 S   s   g | ]}|d  qS )r:   r3   )r   hpr3   r3   r4   
<listcomp>  s    z+MultiHostDsn._build_url.<locals>.<listcomp>r$   r%   r&   r+   r,   r-   )r$   r%   r&   r+   r,   r-   r9   r   r   r:   r7   r8   r9   ro   )
rh   r   splitr   r   r}   r   appendr   any)rs   r   rp   r~   hosts_partshost_rer7   r   r8   r9   r:   r*   	host_partr3   r3   r4   r     sR   


zMultiHostDsn._build_urlr   )r.   r/   r0   r<   r   r   r   r   ru   r   r1   r   r   r   r;   r   r   r   r3   r3   r   r4   r     s    
((r   c                   @   s   e Zd Zh dZdZdZdS )rF   >	   postgresql+pg8000postgresql+asyncpgpostgresql+psycopgpostgresql+psycopg2postgresql+pygresqlpostgresql+psycopg2cffipostgresql+py-postgresqlpostgres
postgresqlTr3   N)r.   r/   r0   rj   rl   r   r3   r3   r3   r4   rF     s    rF   c                   @   s   e Zd Zh dZdZdS )rG   >   cockroachdb+asyncpgcockroachdb+psycopg2cockroachdbTN)r.   r/   r0   rj   rl   r3   r3   r3   r4   rG     s    rG   c                   @   r   )rH   amqpamqpsFN)r.   r/   r0   rj   rm   r3   r3   r3   r4   rH     s    rH   c                   @   s*   e Zd ZdZddhZdZeddd	Zd
S )rI   r3   redisredissFr~   r#   rM   c                 C   s    | d s
| d s
dnddddS )Nr'   r(   	localhost 6379z/0)r)   r*   r+   r3   r   r3   r3   r4   r|     s   zRedisDsn.get_default_partsNr   )r.   r/   r0   r   rj   rm   r   r|   r3   r3   r3   r4   rI     s    rI   c                   @       e Zd ZdhZedddZdS )	rJ   mongodbr~   r#   rM   c                 C   s   ddiS )Nr*   27017r3   r   r3   r3   r4   r|     s   zMongoDsn.get_default_partsNr   r.   r/   r0   rj   r   r|   r3   r3   r3   r4   rJ     s    rJ   c                   @   r   )	rK   kafkar~   r#   rM   c                 C   s
   dddS )Nr   9092)r)   r*   r3   r   r3   r3   r4   r|   "  s   zKafkaDsn.get_default_partsNr   r   r3   r3   r3   r4   rK     s    rK   Tri   r   r   r   rk   rm   rj   r   r   r   rk   rm   rj   c                 C   s"   t | |||||d}tdtf|S )Nr   UrlValue)dicttyper<   )r   r   r   rk   rm   rj   	namespacer3   r3   r4   r@   *  s   
r@   c               
   C   s2   zdd l a W d S  ty }  ztd| d } ~ ww )Nr   zCemail-validator is not installed, run `pip install pydantic[email]`)email_validatorImportError)er3   r3   r4   import_email_validator?  s   
r  c                   @   sR   e Zd Zedeeef ddfddZedddZed	e	e defd
dZ
dS )rA   r   rM   Nc                 C      |j ddd d S )Nstringemailr   r   updater   r3   r3   r4   r   H     zEmailStr.__modify_schema__r   c                 c   s    t   tV  | jV  d S rN   )r  r   r   r   r3   r3   r4   r   L  s   zEmailStr.__get_validators__r   c                 C   s   t |d S )Nr   )rL   rs   r   r3   r3   r4   r   T  r   zEmailStr.validater   )r.   r/   r0   r   r   r1   r   r   r   r   r   r3   r3   r3   r4   rA   G  s    rA   c                   @   s   e Zd ZdZdedefddZdedefdd	Ze	d
e
eef ddfddZe	dddZe	dedd fddZdefddZdS )rB   namer  r  r  c                 C   s   || _ || _d S rN   r  )rv   r  r  r3   r3   r4   ru   \  s   
zNameEmail.__init__otherrM   c                 C   s"   t |to| j| jf|j|jfkS rN   )
isinstancerB   r  r  )rv   r  r3   r3   r4   __eq__`  s   "zNameEmail.__eq__r   Nc                 C   r  )Nr  z
name-emailr  r	  r   r3   r3   r4   r   c  r  zNameEmail.__modify_schema__r   c                 c   s    t   | jV  d S rN   )r  r   r   r3   r3   r4   r   g  s   zNameEmail.__get_validators__r   c                 C   s"   |j | kr|S t|}| t| S rN   )r   r   rL   r  r3   r3   r4   r   m  s   
zNameEmail.validatec                 C   s   | j  d| j dS )Nz <>r  r   r3   r3   r4   __str__t  s   zNameEmail.__str__r   )r.   r/   r0   r   r1   ru   r   r;   r  r   r   r   r   r   r  r3   r3   r3   r4   rB   Y  s    rB   c                   @   sd   e Zd ZdZedeeef ddfddZeddd	Z	ed
e
eeef de
eef fddZdS )rC   r3   r   rM   Nc                 C   r  )Nr  ipvanyaddressr  r	  r   r3   r3   r4   r   {  r  zIPvAnyAddress.__modify_schema__r   c                 c   r   rN   r   r   r3   r3   r4   r     r   z IPvAnyAddress.__get_validators__r   c                 C   @   zt |W S  ty   Y nw zt|W S  ty   t w rN   )r   
ValueErrorr   r   IPvAnyAddressErrorr  r3   r3   r4   r        

zIPvAnyAddress.validater   )r.   r/   r0   r   r   r   r1   r   r   r   r   bytesr   r   r   r   r3   r3   r3   r4   rC   x  s    *rC   c                   @   sZ   e Zd ZdZedeeef ddfddZeddd	Z	ed
e
deeef fddZdS )rD   r3   r   rM   Nc                 C   r  )Nr  ipvanyinterfacer  r	  r   r3   r3   r4   r     r  z!IPvAnyInterface.__modify_schema__r   c                 c   r   rN   r   r   r3   r3   r4   r     r   z"IPvAnyInterface.__get_validators__r   c                 C   r  rN   )r   r  r   r   IPvAnyInterfaceErrorr  r3   r3   r4   r     r  zIPvAnyInterface.validater   )r.   r/   r0   r   r   r   r1   r   r   r   NetworkTyper   r   r   r   r3   r3   r3   r4   rD     s     rD   c                   @   sV   e Zd Zedeeef ddfddZedddZed	e	de
eef fd
dZdS )rE   r   rM   Nc                 C   r  )Nr  ipvanynetworkr  r	  r   r3   r3   r4   r     r  zIPvAnyNetwork.__modify_schema__r   c                 c   r   rN   r   r   r3   r3   r4   r     r   z IPvAnyNetwork.__get_validators__r   c                 C   r  rN   )r   r  r   r   IPvAnyNetworkErrorr  r3   r3   r4   r     s   

zIPvAnyNetwork.validater   )r.   r/   r0   r   r   r1   r   r   r   r  r   r   r   r   r3   r3   r3   r4   rE     s     rE   z([\w ]*?) *<(.*)> *r   c              
   C   s   t du rt  t| }d}|r| \}} |  }z	t j|dd W n t jy5 } zt	 |d}~ww |
d}|d| }||d  }|pL||| fS )aS  
    Brutally simple email address validation. Note unlike most email address validation
    * raw ip address (literal) domain parts are not allowed.
    * "John Doe <local_part@domain.com>" style "pretty" email addresses are processed
    * the local part check is extremely basic. This raises the possibility of unicode spoofing, but no better
        solution is really possible.
    * spaces are striped from the beginning and end of addresses but no error is raised

    See RFC 5322 but treat it with suspicion, there seems to exist no universally acknowledged test for a valid email!
    NF)check_deliverabilityry   )r  r  pretty_email_regexr   groupsr   rL   EmailNotValidErrorr   
EmailErrorindexr   )r   r   r  r  r  at_index
local_partglobal_partr3   r3   r4   rL     s"   


rL   )rM   N)YrP   	ipaddressr   r   r   r   r   r   r   r	   typingr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   utilsr   r   
validatorsr   r   r  typing_extensionsr   r   r    fieldsr!   r"   r   r#   r6   r   r1   r  r   r  __all__rO   rZ   r_   rc   rg   rT   rR   rS   rU   rV   rW   rY   r[   rb   rf   rh   r<   r=   r?   r>   r   rF   rG   rH   rI   rJ   rK   r;   r@   r  rA   rB   rC   rD   rE   rQ   r   rL   r3   r3   r3   r4   <module>   s    (D
*
	
 e@	



"