U
    eR                     @  s  U d Z ddlm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mZ ddlmZmZmZmZ ddlmZ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$ erddl%a%dZ&de'd< nda%dddddddddddddddd d!d"d#d$gZ(ej)G d%d dej*Z+eZ,eee+d&d'gd(f Z-eee+d)d&d'gd*f Z.eee+d+gd(f Z/eee+d,d-d.d/d0d1d2d3d4d5g	d6f Z0eee+d,d7d8d9gd6f Z1eee+d:d;gd(f Z2eee+d<d=gd>d?d@dAf Z3eee+dBdCgdDdEf Z4eee+dFgd>dGdHf Z5eee+dIdJdKgd>dLdHf Z6eee+dMdNdOdPdQdRdSdTgdUdEf Z7eee+dVdWdXgdUdEf Z8dYdZd[d\Z9eree:d]f Z;nG d^d dZ;G d_d dej<Z=G d`d dZ>G dad dZ?G dbd dZ@dcdZdddeZAeA ZBdfZCdgdhdidjd"ZDe eEZFdS )kzEThe networks module contains types for common network-related fields.    )annotationsN)version)IPv4AddressIPv4InterfaceIPv4NetworkIPv6AddressIPv6InterfaceIPv6Network)TYPE_CHECKINGAny)MultiHostUrlPydanticCustomErrorUrlcore_schema)	Annotated	TypeAlias   )_fields_repr_schema_generation_shared)getattr_migration)GetCoreSchemaHandler)JsonSchemaValuez7str | bytes | int | tuple[str | bytes | int, str | int]r   NetworkTypeAnyUrl
AnyHttpUrlFileUrlHttpUrlUrlConstraintsEmailStr	NameEmailIPvAnyAddressIPvAnyInterfaceIPvAnyNetworkPostgresDsnCockroachDsnAmqpDsnRedisDsnMongoDsnKafkaDsnNatsDsnvalidate_emailMySQLDsn
MariaDBDsnc                   @  sh   e Zd ZU dZdZded< dZded< dZded< dZd	ed
< dZ	ded< dZ
d	ed< ddddZdS )r   a  Url constraints.

    Attributes:
        max_length: The maximum length of the url. Defaults to `None`.
        allowed_schemes: The allowed schemes. Defaults to `None`.
        host_required: Whether the host is required. Defaults to `None`.
        default_host: The default host. Defaults to `None`.
        default_port: The default port. Defaults to `None`.
        default_path: The default path. Defaults to `None`.
    Nz
int | None
max_lengthzlist[str] | Noneallowed_schemeszbool | Nonehost_requiredz
str | Nonedefault_hostdefault_portdefault_pathintreturnc                 C  s2   t | j| jd k	rt| jnd | j| j| j| jfS N)hashr.   r/   tupler0   r1   r2   r3   self r<   5/tmp/pip-unpacked-wheel-6q_yhcy8/pydantic/networks.py__hash__G   s    zUrlConstraints.__hash__)__name__
__module____qualname____doc__r.   __annotations__r/   r0   r1   r2   r3   r>   r<   r<   r<   r=   r   3   s   
httphttps)r/   i#  )r.   r/   fileTZpostgresZ
postgresqlzpostgresql+asyncpgzpostgresql+pg8000zpostgresql+psycopgzpostgresql+psycopg2zpostgresql+psycopg2cffizpostgresql+py-postgresqlzpostgresql+pygresql)r0   r/   Zcockroachdbzcockroachdb+psycopg2zcockroachdb+asyncpgZamqpZamqpsZredisZrediss	localhosti  z/0)r/   r1   r2   r3   Zmongodbzmongodb+srvii  )r/   r2   Zkafkai#  )r/   r1   r2   ZnatsZtlswsi~  Zmysqlzmysql+mysqlconnectorzmysql+aiomysqlzmysql+asyncmyzmysql+mysqldbzmysql+pymysqlzmysql+cymysqlzmysql+pyodbci  Zmariadbzmariadb+mariadbconnectorzmariadb+pymysqlNoner5   c               
   C  s\   zdd l a W n, tk
r8 }  ztd| W 5 d } ~ X Y nX tddd dksXtdd S )Nr   zCemail-validator is not installed, run `pip install pydantic[email]`zemail-validator.2zKemail-validator version >= 2.0 required, run pip install -U email-validator)email_validatorImportErrorr   	partition)er<   r<   r=   import_email_validatori  s    rP   .c                   @  sP   e Zd ZdZeddddddZeddd	d
ddZedddddZdS )r   a   
        Info:
            To use this type, you need to install the optional
            [`email-validator`](https://github.com/JoshData/python-email-validator) package:

            ```bash
            pip install email-validator
            ```

        Validate email addresses.

        ```py
        from pydantic import BaseModel, EmailStr

        class Model(BaseModel):
            email: EmailStr

        print(Model(email='contact@mail.com'))
        #> email='contact@mail.com'
        ```
        	type[Any]r   core_schema.CoreSchema_source_handlerr6   c                 C  s   t   t| jt S r7   )rP   r    no_info_after_validator_function	_validate
str_schemaclsrT   rU   r<   r<   r=   __get_pydantic_core_schema__  s    z%EmailStr.__get_pydantic_core_schema__._schema_generation_shared.GetJsonSchemaHandlerr   r   handlerr6   c                 C  s   ||}|j ddd |S )NstringemailtypeformatupdaterZ   r   r^   Zfield_schemar<   r<   r=   __get_pydantic_json_schema__  s    z%EmailStr.__get_pydantic_json_schema__str)_EmailStr__input_valuer6   c                 C  s   t |d S )Nr   )r+   )rZ   ri   r<   r<   r=   rW     s    zEmailStr._validateN)r?   r@   rA   rB   classmethodr[   rg   rW   r<   r<   r<   r=   r   w  s   c                   @  s   e Zd ZdZdZdddddZdddd	d
ZeddddddZeddddddZ	edd dddZ
ddddZdS )r    a  
    Info:
        To use this type, you need to install the optional
        [`email-validator`](https://github.com/JoshData/python-email-validator) package:

        ```bash
        pip install email-validator
        ```

    Validate a name and email address combination, as specified by
    [RFC 5322](https://datatracker.ietf.org/doc/html/rfc5322#section-3.4).

    The `NameEmail` has two properties: `name` and `email`.
    In case the `name` is not provided, it's inferred from the email address.

    ```py
    from pydantic import BaseModel, NameEmail

    class User(BaseModel):
        email: NameEmail

    user = User(email='Fred Bloggs <fred.bloggs@example.com>')
    print(user.email)
    #> Fred Bloggs <fred.bloggs@example.com>
    print(user.email.name)
    #> Fred Bloggs

    user = User(email='fred.bloggs@example.com')
    print(user.email)
    #> fred.bloggs <fred.bloggs@example.com>
    print(user.email.name)
    #> fred.bloggs
    ```
    namer`   rh   c                 C  s   || _ || _d S r7   rk   )r;   rl   r`   r<   r<   r=   __init__  s    zNameEmail.__init__r   bool)otherr6   c                 C  s"   t |to | j| jf|j|jfkS r7   )
isinstancer    rl   r`   )r;   ro   r<   r<   r=   __eq__  s    zNameEmail.__eq__rR   r\   r   r]   c                 C  s   ||}|j ddd |S )Nr_   z
name-emailra   rd   rf   r<   r<   r=   rg     s    z&NameEmail.__get_pydantic_json_schema__rQ   r   rS   c                 C  s6   t   tj| jtjt| t gdddt dS )NZname_email_typezInput is not a valid NameEmail)Zcustom_error_typeZcustom_error_messageZserialization)rP   r   rV   rW   Zunion_schemaZis_instance_schemarX   to_string_ser_schemarY   r<   r<   r=   r[     s    z&NameEmail.__get_pydantic_core_schema__zNameEmail | str)_NameEmail__input_valuer6   c                 C  s(   t || r|S t|\}}| ||S d S r7   )rp   r+   )rZ   rt   rl   r`   r<   r<   r=   rW     s    
zNameEmail._validater5   c                 C  s   | j  d| j dS )Nz <>rk   r:   r<   r<   r=   __str__  s    zNameEmail.__str__N)r?   r@   rA   rB   	__slots__rm   rq   rj   rg   r[   rW   rv   r<   r<   r<   r=   r      s   #c                   @  sd   e Zd ZdZdZdddddZedd	d
dddZeddddddZedddddZ	dS )r!   a  Validate an IPv4 or IPv6 address.

    ```py
    from pydantic import BaseModel
    from pydantic.networks import IPvAnyAddress

    class IpModel(BaseModel):
        ip: IPvAnyAddress

    print(IpModel(ip='127.0.0.1'))
    #> ip=IPv4Address('127.0.0.1')

    try:
        IpModel(ip='http://www.example.com')
    except ValueError as e:
        print(e.errors())
        '''
        [
            {
                'type': 'ip_any_address',
                'loc': ('ip',),
                'msg': 'value is not a valid IPv4 or IPv6 address',
                'input': 'http://www.example.com',
            }
        ]
        '''
    ```
    r<   r   zIPv4Address | IPv6Addressvaluer6   c                 C  sN   z
t |W S  tk
r   Y nX z
t|W S  tk
rH   tddY nX dS )z!Validate an IPv4 or IPv6 address.Zip_any_addressz)value is not a valid IPv4 or IPv6 addressN)r   
ValueErrorr   r   rZ   ry   r<   r<   r=   __new__  s    

zIPvAnyAddress.__new__rR   r\   r   r]   c                 C  s   i }|j ddd |S )Nr_   Zipvanyaddressra   rd   rf   r<   r<   r=   rg   "  s    z*IPvAnyAddress.__get_pydantic_json_schema__rQ   r   rS   c                 C  s   t j| jt  dS Nrr   r   Z no_info_plain_validator_functionrW   rs   rY   r<   r<   r=   r[   *  s     z*IPvAnyAddress.__get_pydantic_core_schema__)_IPvAnyAddress__input_valuer6   c                 C  s   | |S r7   r<   )rZ   r   r<   r<   r=   rW   4  s    zIPvAnyAddress._validateN
r?   r@   rA   rB   rw   r|   rj   rg   r[   rW   r<   r<   r<   r=   r!     s   	c                   @  sd   e Zd ZdZdZdddddZedd	d
dddZeddddddZedddddZ	dS )r"   #Validate an IPv4 or IPv6 interface.r<   r   zIPv4Interface | IPv6Interfacerx   c                 C  sN   z
t |W S  tk
r   Y nX z
t|W S  tk
rH   tddY nX dS )r   Zip_any_interfacez+value is not a valid IPv4 or IPv6 interfaceN)r   rz   r   r   r{   r<   r<   r=   r|   >  s    

zIPvAnyInterface.__new__rR   r\   r   r]   c                 C  s   i }|j ddd |S )Nr_   Zipvanyinterfacera   rd   rf   r<   r<   r=   rg   J  s    z,IPvAnyInterface.__get_pydantic_json_schema__rQ   r   rS   c                 C  s   t j| jt  dS r}   r~   rY   r<   r<   r=   r[   R  s     z,IPvAnyInterface.__get_pydantic_core_schema__)_IPvAnyInterface__input_valuer6   c                 C  s   | |S r7   r<   )rZ   r   r<   r<   r=   rW   \  s    zIPvAnyInterface._validateNr   r<   r<   r<   r=   r"   9  s   	c                   @  sd   e Zd ZdZdZdddddZedd	d
dddZeddddddZedddddZ	dS )r#   !Validate an IPv4 or IPv6 network.r<   r   zIPv4Network | IPv6Networkrx   c                 C  sN   z
t |W S  tk
r   Y nX z
t|W S  tk
rH   tddY nX dS )r   Zip_any_networkz)value is not a valid IPv4 or IPv6 networkN)r   rz   r	   r   r{   r<   r<   r=   r|   f  s    

zIPvAnyNetwork.__new__rR   r\   r   r]   c                 C  s   i }|j ddd |S )Nr_   Zipvanynetworkra   rd   rf   r<   r<   r=   rg   t  s    z*IPvAnyNetwork.__get_pydantic_json_schema__rQ   r   rS   c                 C  s   t j| jt  dS r}   r~   rY   r<   r<   r=   r[   |  s     z*IPvAnyNetwork.__get_pydantic_core_schema__)_IPvAnyNetwork__input_valuer6   c                 C  s   | |S r7   r<   )rZ   r   r<   r<   r=   rW     s    zIPvAnyNetwork._validateNr   r<   r<   r<   r=   r#   a  s   	zre.Pattern[str]c               	   C  s<   d} d|  d|  d}d}d}t d| d| d	| d
S )Nz[\w!#$%&\'*+\-/=?^_`{|}~]z((?:z+\s+)*z+)z"((?:[^"]|\")+)"z<\s*(.+)\s*>z\s*(?:|z)?\s*z\s*)recompile)Z
name_charsZunquoted_name_groupZquoted_name_groupZemail_groupr<   r<   r=   _build_pretty_email_regex  s
    r   i   rh   ztuple[str, str]rx   c              
   C  s   t dkrt  t| tkr2tddddt dit| }d}|rZ| \}}} |pX|}|  }zt j	|dd}W n@ t j
k
r } z tdddt|jd	 i|W 5 d}~X Y nX |j}|dk	st|p|j}||fS )
a|  Email address validation using [email-validator](https://pypi.org/project/email-validator/).

    Note:
        Note that:

        * Raw IP address (literal) domain parts are not allowed.
        * `"John Doe <local_part@domain.com>"` style "pretty" email addresses are processed.
        * Spaces are striped from the beginning and end of addresses, but no error is raised.
    NZvalue_errorz,value is not a valid email address: {reason}reasonzLength must not exceed z charactersF)Zcheck_deliverabilityr   )rL   rP   lenMAX_EMAIL_LENGTHr   pretty_email_regex	fullmatchgroupsstripr+   ZEmailNotValidErrorrh   args
normalizedAssertionErrorZ
local_part)ry   mrl   Zunquoted_nameZquoted_namer`   partsrO   r<   r<   r=   r+     s8    

  
)GrB   
__future__r   Z_annotationsZdataclassesZ_dataclassesr   importlib.metadatar   	ipaddressr   r   r   r   r   r	   typingr
   r   Zpydantic_corer   r   r   r   Ztyping_extensionsr   r   	_internalr   r   r   Z
_migrationr   Zannotated_handlersr   Zjson_schemar   rL   r   rC   __all__Z	dataclassZPydanticMetadatar   r   r   r   r   r$   r%   r&   r'   r(   r)   r*   r,   r-   rP   rh   r   ZRepresentationr    r!   r"   r#   r   r   r   r+   r?   __getattr__r<   r<   r<   r=   <module>   s     KL



-RC(*)