U
    nËj{  ã                   @  sÚ   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	m
Z
 d dlmZ ddlmZ erpdd	lmZ dd
lmZ G dd„ dƒZeƒ Zddddœdd„Zdddœdd„Zddddddœdd„Zd#ddddddd œd!d"„ZdS )$é    )ÚannotationsN)Ú	ParameterÚ	SignatureÚ	signature)ÚTYPE_CHECKINGÚAnyÚCallable)ÚPydanticUndefinedé   )Úis_valid_identifieré   )ÚExtraValues©Ú	FieldInfoc                   @  s   e Zd Zdd„ ZdS )Ú_HAS_DEFAULT_FACTORY_CLASSc                 C  s   dS )Nz	<factory>© )Úselfr   r   úA/tmp/pip-unpacked-wheel-zvl9l234/pydantic/_internal/_signature.pyÚ__repr__   s    z#_HAS_DEFAULT_FACTORY_CLASS.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s   r   Ústrr   )Ú
field_nameÚ
field_infoÚreturnc                 C  s<   t |jtƒrt|jƒr|jS t |jtƒr8t|jƒr8|jS | S )aÒ  Extract the correct name to use for the field when generating a signature.

    Assuming the field has a valid alias, this will return the alias. Otherwise, it will return the field name.
    First priority is given to the alias, then the validation_alias, then the field name.

    Args:
        field_name: The name of the field
        field_info: The corresponding FieldInfo object.

    Returns:
        The correct name to use when generating a signature.
    )Ú
isinstanceÚaliasr   r   Zvalidation_alias)r   r   r   r   r   Ú_field_name_for_signature   s
    r   r   )Úparamr   c                 C  sp   ddl m} | j}t||ƒrl| j}|dkr.t}|j}|tkrT|jtkrNtj	}nt
j}| j|t| j|ƒ|d�S | S )zÝModify the signature for a parameter in a dataclass where the default value is a FieldInfo instance.

    Args:
        param (Parameter): The parameter

    Returns:
        Parameter: The custom processed parameter
    r   r   r   )Ú
annotationÚnameÚdefault)Úfieldsr   r"   r   r    r   r	   Údefault_factoryr   ÚemptyÚdataclassesÚ_HAS_DEFAULT_FACTORYÚreplacer   r!   )r   r   Zparam_defaultr    r"   r   r   r   Ú_process_param_defaults.   s"    	

 
 ÿr)   zCallable[(Ellipsis, None)]zdict[str, FieldInfo]ÚboolzExtraValues | Nonezdict[str, Parameter])Úinitr#   Úpopulate_by_nameÚextrar   c                 C  s´  ddl m} t| ƒj ¡ }i }d}d}||ddƒD ]t}	| |	j¡rtt||	j ddƒdkrZq2|	jt	|	j||	j ƒd�}	|	j
d	krŠ|	jtd
�}	|	j|	jkrœ|	}q2|	||	j< q2|�r<|}
| ¡ D ]€\}}t	||ƒ}||ksº||krÞqºt|ƒsö|
rð|}nd}qº| ¡ �rtj}n|jdk	�rt}n|j}t|tj| ¡ |d�||< qº|dk�rJd}|�r°|�r°dtjfdtjfg}dd„ |D ƒ|k�r„d}n|j}||k�r |d7 }�qŠ|j|d�||< |S )zaGenerate a mapping of parameter names to Parameter objects for a pydantic BaseModel or dataclass.r   )ÚisliceNFr
   r+   T)r!   r   )r    )r    r"   Zallowr   Údatac                 S  s   g | ]}|j |jf‘qS r   )r!   Úkind)Ú.0Úpr   r   r   Ú
<listcomp>•   s     z2_generate_signature_parameters.<locals>.<listcomp>Ú
extra_dataÚ_)Ú	itertoolsr.   r   Ú
parametersÚvaluesÚgetr!   Úgetattrr(   r   r    r   r0   ÚVAR_KEYWORDÚitemsr   Zis_requiredr   r%   r$   r'   r"   ÚKEYWORD_ONLYZrebuild_annotationÚPOSITIONAL_ONLY)r+   r#   r,   r-   r.   Zpresent_paramsÚmerged_paramsZvar_kwZ
use_var_kwr   Zallow_namesr   ÚfieldÚ
param_namer"   Zdefault_model_signatureZvar_kw_namer   r   r   Ú_generate_signature_parametersP   sf    


ü
þ
rB   Fr   )r+   r#   r,   r-   Úis_dataclassr   c                 C  s8   t | |||ƒ}|r$dd„ | ¡ D ƒ}tt| ¡ ƒdd�S )ay  Generate signature for a pydantic BaseModel or dataclass.

    Args:
        init: The class init.
        fields: The model fields.
        populate_by_name: The `populate_by_name` value of the config.
        extra: The `extra` value of the config.
        is_dataclass: Whether the model is a dataclass.

    Returns:
        The dataclass/BaseModel subclass signature.
    c                 S  s   i | ]\}}|t |ƒ“qS r   )r)   )r1   ÚkÚvr   r   r   Ú
<dictcomp>º   s      z/generate_pydantic_signature.<locals>.<dictcomp>N)r7   Úreturn_annotation)rB   r<   r   Úlistr8   )r+   r#   r,   r-   rC   r?   r   r   r   Úgenerate_pydantic_signature¤   s    rI   )F)Ú
__future__r   r&   Úinspectr   r   r   Útypingr   r   r   Zpydantic_corer	   Ú_utilsr   Úconfigr   r#   r   r   r'   r   r)   rB   rI   r   r   r   r   Ú<module>   s   "Y û