o
    	h"                     @   sV  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rid
dl%m&Z& e Z'eee  ee  f e(d< dee)e*df de+fddZ,de*de
e* fddZ-dZ.deedddddfde*dede	ee*ef  de	e dee+ef deee df de	e" de	e* de$d  d!e$d" defd#d$Z/dd%d&ed'e	eee  ee  f  defd(d)Z0de*de*d*e*de*fd+d,Z1d-d.de*fd/d0Z2d1eeef d2eeef ddfd3d4Z3d5eeef d6eeef deeef fd7d8Z4dS )9    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v1)DefaultPlaceholderDefaultType)	BaseModel)	FieldInfo)Literal   )APIRoute_CLONED_TYPES_CACHEstatus_codereturnc                 C   s2   | d u rdS | dv rdS t | }|dk p|dv  S )NT>   Z5XXdefaultZ1XXZ2XXZ3XXZ4XX   >   i0        )int)r   Zcurrent_status_code r&   8/usr/local/lib/python3.10/site-packages/fastapi/utils.pyis_body_allowed_for_status_code,   s   r(   pathc                 C   s   t td| S )Nz{(.*?)})setrefindall)r)   r&   r&   r'   get_path_param_names=   s   r-   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nametype_class_validatorsr!   requiredmodel_config
field_infoaliasmode)r.   Zserializationversion)1r/   c
              	   C   s
  |pi }t j}
|pt  }| ||||||
|d}t|s&t|t js&|	dkr>z	t jdi |W S  ty=   tj	t
d w trmddlm} |pNt|||d}|| |d}z	|jdi |W S  tyl   tj	t
d w z	t jdi |W S  ty   tj	t
d w )N)r0   r5   r1   r2   r!   r3   r4   r6   r9   r   v2)
annotationr!   r6   )r7   r0   r5   r&   )r   r   r   r   
isinstancer   RuntimeErrorfastapi
exceptionsZFastAPIError_invalid_args_messager   _compatr;   r   )r0   r1   r2   r!   r3   r4   r5   r6   r7   r8   Zv1_model_configZv1_field_infoZ	v1_kwargsr;   kwargsr&   r&   r'   create_model_fieldL   sL   
rD   cloned_typesfieldrF   c                   s~  t rddlm} t| |jr| S  d u rt | j}t|r%t|dr%|j	}|}t
|tjr\tttj |} |}|d u r\tj|j|d}| |< |j D ]}t| d|j|j< qOt| j|dd}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j |_ | j!r fdd	| j!D |_!| j"rt| j" d|_"| j#|_#| j$|_$| j%|_%| j&|_&| j'|_'|(  |S )
Nr   r:   __pydantic_model__)__base__rE   r9   )r0   r1   r8   c                    s   g | ]}t | d qS )rE   )create_cloned_field).0Z	sub_fieldrE   r&   r'   
<listcomp>   s    
z'create_cloned_field.<locals>.<listcomp>))r   rB   r;   r=   r   r   r1   r   hasattrrH   r   r   r   r   r	   getZcreate_model__name__Z
__fields__valuesrJ   r0   rD   Z	has_aliasr6   r2   r!   default_factoryr3   r4   r5   
allow_noneZvalidate_alwaysZ
sub_fieldsZ	key_fieldZ
validatorsZpre_validatorsZpost_validatorsZ
parse_jsonshapeZpopulate_validators)rG   rF   r;   Zoriginal_typeZuse_typefZ	new_fieldr&   rE   r'   rJ      s`   

rJ   methodc                 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DeprecationWarningr+   sublower)r0   r)   rU   operation_idr&   r&   r'   generate_operation_id_for_path   s   r`   router   c                 C   sH   | j  | j }tdd|}| jsJ | dt| jd   }|S )NrX   rY   r   )r0   Zpath_formatr+   r]   methodslistr^   )ra   r_   r&   r&   r'   generate_unique_id   s
   
rd   	main_dictupdate_dictc                 C   s   |  D ]=\}}|| v r t| | tr t|tr t| | | q|| v r=t| | tr=t|| tr=| | ||  | |< q|| |< qd S )N)itemsr=   dictdeep_dict_updaterc   )re   rf   keyvaluer&   r&   r'   ri      s   
ri   
first_itemextra_itemsc                 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.
    )r=   r   )rl   rm   rg   itemr&   r&   r'   get_value_or_default   s   

ro   )5r+   rZ   dataclassesr   typingr   r   r   r   r   r   r	   r
   r   weakrefr   r?   Zfastapi._compatr   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(   r-   rA   rD   rJ   r`   rd   ri   ro   r&   r&   r&   r'   <module>   s   
 ,0
	

:
<
&


