
    RPf                        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rd	d
lmZ ddZddZ	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 ddZy)    )annotationsN)	Parameter	Signature	signature)TYPE_CHECKINGAnyCallable)PydanticUndefined   )ConfigWrapper)is_valid_identifier   	FieldInfoc                ^    dd} ||j                         xs  ||j                        x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 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.
    c                @    t        | t              rt        |       r| S dS )zBReturn the alias if it is a valid alias and identifier, else None.N)
isinstancestrr   )xs    W/var/www/fastapitest/venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py_alias_if_validz2_field_name_for_signature.<locals>._alias_if_valid   s    q#&+>q+AqKtK    )r   r   returnz
str | None)aliasvalidation_alias)
field_name
field_infor   s      r   _field_name_for_signaturer      s1    L :++,j
@[@[0\j`jjr   c                N   ddl m} | j                  }t        ||      r| j                  }|dk(  rt
        }|j                  }|t        u r3|j                  t        u rt        j                  }nt        j                  }| j                  |t        | j                  |      |      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!   )paramr   param_defaultr    r"   s        r   _process_param_defaultsr+   %   s     #MMM-+%%
 J  '''',,0AA#// &::}}!(A%**m(\fm  
 	
 Lr   c                l   ddl m} t        |       j                  j	                         }i }d}d} ||dd      D ]  }|j                  |j                        rPt        ||j                     dd      du r;|j                  t        |j                  ||j                                 }|j                  d	k(  r|j                  t        
      }|j                  |j                  u r|}|||j                  <    |r|j                  }	|j                         D ]  \  }
}t        |
|      }|
|v s||v rt!        |      s|	r|
}nd}.|j#                         ri nd|j%                  d      i}t'        |t&        j(                  fd|j+                         i|||<    |j,                  dk(  rd}|r|rdt&        j.                  fdt&        j                  fg}|D cg c]  }|j                  |j                  f c}|k(  rd}n|j                  }||v r
|dz  }||v r
|j                  |      ||<   |S c c}w )zaGenerate a mapping of parameter names to Parameter objects for a pydantic BaseModel or dataclass.r   )isliceNFr   initT)r!   r   )r    r"   )call_default_factoryr    allowselfdata
extra_data_)	itertoolsr-   r   
parametersvaluesgetr!   getattrr(   r   r    r   kindVAR_KEYWORDpopulate_by_nameitemsr   is_requiredget_defaultr   KEYWORD_ONLYrebuild_annotationextraPOSITIONAL_ONLY)r.   r#   config_wrapperr-   present_paramsmerged_paramsvar_kw
use_var_kwr)   allow_namesr   field
param_namekwargsdefault_model_signaturepvar_kw_names                    r   _generate_signature_parametersrP   G   sM    !t_//668N*,MFJ40 * ::ejj!vejj)648EAMM'@VTYT^T^M_'`MaEu$MMSM1E::***F$)ejj!* $55!' 	J2:uEJ]*jM.I&z2!+J!%J ,,.RY@Q@Qgl@Q@m4nF(1I22)?D?W?W?Y)]c)M*%	& w&
* Y../Y**+#
 '55QVVQVV59PP&K !++K V#3K V#%+^^^%Ek" 6s   H1c                    t        | ||      }|r,|j                         D ci c]  \  }}|t        |       }}}t        t	        |j                               d      S c c}}w )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.
    N)r6   return_annotation)rP   r=   r+   r   listr7   )r.   r#   rD   is_dataclassrF   kvs          r   generate_pydantic_signaturerW      sb     34PMCPCVCVCXY41a3A66YY]%9%9%; <PTUU Zs   A )r   r   r   r   r   r   )r)   r   r   r   )r.   Callable[..., None]r#   dict[str, FieldInfo]rD   r   r   zdict[str, Parameter])F)
r.   rX   r#   rY   rD   r   rT   boolr   r   )
__future__r   r&   inspectr   r   r   typingr   r   r	   pydantic_corer
   _configr   _utilsr   r#   r   r   r+   rP   rW    r   r   <module>rb      s    "  3 3 / / + " '"k*DG
G G "G 	GV rwV
V';VMZVjnVVr   