U
    EZh{                     @  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   d/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/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 )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   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rqt|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|rdtjfdtjfg}dd |D |krd}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	   Z_utilsr   configr   r#   r   r   r'   r   r)   rB   rI   r   r   r   r   <module>   s   "Y 