U
    ={f                     @  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rpd	d
lmZ ddddddZdddddZdddddddZd!dddddddd ZdS )"    )annotationsN)	Parameter	Signature	signature)TYPE_CHECKINGAnyCallable)PydanticUndefined   )ConfigWrapper)is_valid_identifier   	FieldInfostrr   )
field_name
field_inforeturnc                 C  s(   ddddd}||j p&||jp&| 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 validation_alias, then the 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.
    r   z
str | None)xr   c                 S  s   t | trt| r| S dS )zBReturn the alias if it is a valid alias and identifier, else None.N)
isinstancer   r   )r    r   \/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/pydantic/_internal/_signature.py_alias_if_valid   s    z2_field_name_for_signature.<locals>._alias_if_valid)aliasZvalidation_alias)r   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]r   zdict[str, Parameter])initr   config_wrapperr   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|r8|j}	| D ]z\}
}t	|
|}|
|ks||krqt|s|	r|
}nd}q| ri nd|jddi}t|tjfd| i|||< q|jdkrHd}|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   )Zcall_default_factoryr   Z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   r+   VAR_KEYWORDZpopulate_by_nameitemsr   Zis_requiredget_defaultr   KEYWORD_ONLYZrebuild_annotationextraPOSITIONAL_ONLY)r&   r   r'   r(   Zpresent_paramsmerged_paramsZvar_kwZ
use_var_kwr   Zallow_namesr   field
param_namekwargsZdefault_model_signatureZvar_kw_namer   r   r   _generate_signature_parametersG   sb    

 
r@   Fboolr   )r&   r   r'   is_dataclassr   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%   )r,   kvr   r   r   
<dictcomp>   s      z/generate_pydantic_signature.<locals>.<dictcomp>N)r2   return_annotation)r@   r7   r   listr3   )r&   r   r'   rB   r<   r   r   r   generate_pydantic_signature   s    rH   )F)
__future__r   r"   inspectr   r   r   typingr   r   r   Zpydantic_corer	   _configr   _utilsr   r   r   r   r%   r@   rH   r   r   r   r   <module>   s   "K 