U
    nËjÀ#  ã                   @   s*  U d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlZd dlmZmZmZmZmZmZmZmZmZmZ d dl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& eƒ Z'eee  ee  f e(d< ee)e*df e+dœdd„Z,e*e
e* dœdd„Z-dZ.deedddddfe*ee	ee*ef  e	e ee+ef eee df e	e" e	e* e$d e$d edœdd„Z/ddœee	eee  ee  f  edœdd„Z0e*e*e*e*dœd d!„Z1d"e*d#œd$d%„Z2eeef eeef dd&œd'd(„Z3eeef eeef eeef d)œd*d+„Z4dS ),é    N)Úis_dataclass)	ÚTYPE_CHECKINGÚAnyÚDictÚMutableMappingÚOptionalÚSetÚTypeÚUnionÚcast)ÚWeakKeyDictionary)
ÚPYDANTIC_V2Ú
BaseConfigÚ
ModelFieldÚPydanticSchemaGenerationErrorÚ	UndefinedÚUndefinedTypeÚ	ValidatorÚannotation_is_pydantic_v1Úlenient_issubclassÚmay_v1)ÚDefaultPlaceholderÚDefaultType)Ú	BaseModel)Ú	FieldInfo)ÚLiteralé   )ÚAPIRouteÚ_CLONED_TYPES_CACHE)Ústatus_codeÚreturnc                 C   s2   | d krdS | dkrdS t | ƒ}|dk p.|dk S )NT>   Ú5XXÚ1XXÚdefaultÚ4XXÚ2XXÚ3XXéÈ   >   é0  éÌ   éÍ   )Úint)r   Zcurrent_status_code© r,   ú1/tmp/pip-unpacked-wheel-yktl02hi/fastapi/utils.pyÚis_body_allowed_for_status_code,   s    r.   )Úpathr    c                 C   s   t t d| ¡ƒS )Nz{(.*?)})ÚsetÚreÚfindall)r/   r,   r,   r-   Úget_path_param_names=   s    r3   a’  Invalid args for response field! Hint: check that {type_} is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/Ú
validationÚauto)r4   Zserialization)Ú1r5   )ÚnameÚtype_Úclass_validatorsr#   ÚrequiredÚmodel_configÚ
field_infoÚaliasÚmodeÚversionr    c
              	   C   sL  |pi }t j}
|pt  ¡ }| ||||||
|dœ}t|ƒsLt|t jƒsL|	dkr”ddlm} z|jf |ŽW S  tk
r�   t	j
 tj|d�¡d ‚Y nX nlt�r ddlm} |p¶t|||d�}|| |d	œ}z|jf |ŽW S  tk
� rþ   t	j
 tj|d�¡d ‚Y nX ddlm} z|jf |ŽW S  tk
�rF   t	j
 tj|d�¡d ‚Y nX d S )
N)r7   r<   r8   r9   r#   r:   r;   r=   r6   r   ©Úv1)r8   r   ©Úv2)Ú
annotationr#   r=   )r>   r7   r<   )r   r   r   r   Ú
isinstanceÚfastapi._compatrA   r   ÚRuntimeErrorÚfastapiÚ
exceptionsZFastAPIErrorÚ_invalid_args_messageÚformatr   Ú_compatrC   r   )r7   r8   r9   r#   r:   r;   r<   r=   r>   r?   Zv1_model_configZv1_field_infoZ	v1_kwargsrA   rC   Úkwargsr,   r,   r-   Úcreate_model_fieldL   sh    øÿ
þý
ÿþ
  ÿ
ÿþ
ÿþrN   ©Úcloned_types)ÚfieldrP   r    c                   sŽ  t r ddlm} t| |jƒr | S ddlm} ˆ d kr8t‰ | j}t	|ƒrVt
|dƒrV|j}|}t||jƒrÄtt|j |ƒ}ˆ  |¡}|d krÄ|j|j|d�}|ˆ |< |j ¡ D ]}t|ˆ d�|j|j< qªt| j|dd	�}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j |_ | j!|_!| j"�rB‡ fd
d„| j"D ƒ|_"| j#�rZt| j#ˆ d�|_#| j$|_$| j%|_%| j&|_&| j'|_'| j(|_(| )¡  |S )Nr   rB   r   r@   Ú__pydantic_model__)Ú__base__rO   r6   )r7   r8   r?   c                    s   g | ]}t |ˆ d �‘qS )rO   )Úcreate_cloned_field)Ú.0Z	sub_fieldrO   r,   r-   Ú
<listcomp>º   s   ÿz'create_cloned_field.<locals>.<listcomp>)*r   rL   rC   rE   r   rF   rA   r   r8   r   ÚhasattrrR   r   r   r   r	   ÚgetZcreate_modelÚ__name__Z
__fields__ÚvaluesrT   r7   rN   Z	has_aliasr=   r9   r#   Údefault_factoryr:   r;   r<   Ú
allow_noneZvalidate_alwaysZ
sub_fieldsZ	key_fieldZ
validatorsZpre_validatorsZpost_validatorsZ
parse_jsonÚshapeZpopulate_validators)rQ   rP   rC   rA   Úoriginal_typeZuse_typeÚfZ	new_fieldr,   rO   r-   rT   �   sb    
þ
þþrT   )r7   r/   Úmethodr    c                 C   s@   t jdtdd� | › |› �}t dd|¡}|› d| ¡ › �}|S )Nzrfastapi.utils.generate_operation_id_for_path() was deprecated, it is not used internally, and will be removed sooné   )Ú
stacklevelú\WÚ_)ÚwarningsÚwarnÚDeprecationWarningr1   ÚsubÚlower)r7   r/   r`   Úoperation_idr,   r,   r-   Úgenerate_operation_id_for_pathÌ   s    ürk   r   )Úrouter    c                 C   sH   | j › | j› �}t dd|¡}| js(t‚|› dt| jƒd  ¡ › �}|S )Nrc   rd   r   )r7   Zpath_formatr1   rh   ÚmethodsÚAssertionErrorÚlistri   )rl   rj   r,   r,   r-   Úgenerate_unique_idÛ   s
    
rp   )Ú	main_dictÚupdate_dictr    c                 C   sˆ   |  ¡ D ]z\}}|| kr@t| | tƒr@t|tƒr@t| | |ƒ q|| krzt| | tƒrzt|| tƒrz| | ||  | |< q|| |< qd S )N)ÚitemsrE   ÚdictÚdeep_dict_updatero   )rq   rr   ÚkeyÚvaluer,   r,   r-   ru   ã   s     ÿþýÿþýru   )Ú
first_itemÚextra_itemsr    c                 G   s*   | f| }|D ]}t |tƒs|  S q| S )z×
    Pass items or `DefaultPlaceholder`s by descending priority.

    The first one to _not_ be a `DefaultPlaceholder` will be returned.

    Otherwise, the first item (a `DefaultPlaceholder`) will be returned.
    )rE   r   )rx   ry   rs   Úitemr,   r,   r-   Úget_value_or_defaultõ   s
    


r{   )5r1   re   Zdataclassesr   Útypingr   r   r   r   r   r   r	   r
   r   Úweakrefr   rH   rF   r   r   r   r   r   r   r   r   r   r   Zfastapi.datastructuresr   r   Zpydanticr   Zpydantic.fieldsr   Ztyping_extensionsr   Zroutingr   r   Ú__annotations__r+   ÚstrÚboolr.   r3   rJ   rN   rT   rk   rp   ru   r{   r,   r,   r,   r-   Ú<module>   sr    ,0ÿÿö
õDýü@  þ"


ý