o
    ?Hh|                     @  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 ddlmZ er8d	d
lmZ d%ddZd&ddZd'ddZ	d(d)d#d$ZdS )*    )annotationsN)	Parameter	Signature	signature)TYPE_CHECKINGAnyCallable)PydanticUndefined   )ConfigWrapper)is_valid_identifier   	FieldInfo
field_namestr
field_infor   returnc                 C  s<   t |jtrt|jr|jS t |jtrt|jr|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   validation_alias)r   r    r   ]/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/pydantic/_internal/_signature.py_field_name_for_signature   s
   r   paramr   c                 C  sp   ddl m} | j}t||r6| j}|dkrt}|j}|tu r*|jtu r'tj	}nt
j}| j|t| j||dS | S )zModify 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   param_defaultr   r   r   r   r   _process_param_defaults%   s   	

r%   initCallable[..., None]r   dict[str, FieldInfo]config_wrapperr   dict[str, Parameter]c                 C  s  ddl m} t| j }i }d}d}||ddD ]:}||jr:t||j dddu r-q|jt	|j||j d}|j
d	krE|jtd
}|j|ju rN|}q|||j< q|r|j}	| D ]<\}
}t	|
|}|
|v sn||v roq]t|s{|	rx|
}nd}q]| ri nd|jddi}t|tjfd| i|||< q]|jdkrd}|r|rdtjfdtjfg}dd |D |krd}n|j}||v r|d7 }||v s|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   )call_default_factoryr   allowself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populate_by_nameitemsr   is_requiredget_defaultr   KEYWORD_ONLYrebuild_annotationextraPOSITIONAL_ONLY)r&   r   r)   r+   present_paramsmerged_paramsvar_kw
use_var_kwr   allow_namesr   field
param_namekwargsdefault_model_signaturevar_kw_namer   r   r   _generate_signature_parametersG   sb   


rN   Fis_dataclassboolr   c                 C  s6   t | ||}|rdd | D }tt| ddS )a8  Generate signature for a pydantic BaseModel or dataclass.

    Args:
        init: The class init.
        fields: The model fields.
        config_wrapper: The config wrapper instance.
        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)rN   r=   r   listr8   )r&   r   r)   rO   rE   r   r   r   generate_pydantic_signature   s   rV   )r   r   r   r   r   r   )r   r   r   r   )r&   r'   r   r(   r)   r   r   r*   )F)
r&   r'   r   r(   r)   r   rO   rP   r   r   )
__future__r   r!   inspectr   r   r   typingr   r   r   pydantic_corer	   _configr   _utilsr   r   r   r   r%   rN   rV   r   r   r   r   <module>   s    


"K