o
    SÊÆh   ã                   @   sR  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 d dlmZmZ d dlmZmZ d dl m!Z! d d	l"m#Z# ergd
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eeedddfde)dee de	ee)ef  de	e dee*ef dee de	e! de	e) 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%„Z.de)de)d&e)de)fd'd(„Z/d)d*de)fd+d,„Z0d-eeef d.eeef ddfd/d0„Z1d1eeef d2eeef deeef fd3d4„Z2d5e)defd6d7„Z3dS )8é    N)Úis_dataclass)	ÚTYPE_CHECKINGÚAnyÚDictÚMutableMappingÚOptionalÚSetÚTypeÚUnionÚcast)ÚWeakKeyDictionary)ÚPYDANTIC_V2Ú
BaseConfigÚ
ModelFieldÚPydanticSchemaGenerationErrorÚ	UndefinedÚUndefinedTypeÚ	ValidatorÚlenient_issubclass)ÚDefaultPlaceholderÚDefaultType)Ú	BaseModelÚcreate_model)Ú	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>   Ú1XXÚ2XXÚ3XXÚ4XXÚ5XXÚdefaultéÈ   >   é0  éÌ   )Úint)r   Úcurrent_status_code© r+   úZ/var/www/html/HyperOracle/crypto_trader/venv/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   r2   Ú
validationÚnameÚtype_Úclass_validatorsr%   ÚrequiredÚmodel_configÚ
field_infoÚaliasÚmode)r3   Úserializationc	           
   	   C   sš   |pi }t r|pt|||d�}n|ptƒ }| |dœ}	t r$|	 d|i¡ n|	 ||||||dœ¡ ztdi |	¤ŽW S  ttfyL   tj d|› d�¡d‚w )	zB
    Create a new response field. Raises if type_ is invalid.
    )Ú
annotationr%   r:   )r4   r9   r;   )r5   r6   r%   r7   r8   r:   z2Invalid args for response field! Hint: check that aY   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/Nr+   )	r   r   Úupdater   ÚRuntimeErrorr   ÚfastapiÚ
exceptionsÚFastAPIError)
r4   r5   r6   r%   r7   r8   r9   r:   r;   Úkwargsr+   r+   r,   Úcreate_response_field?   s:   ÿ

úÿ
ÿÿøÿrD   ©Úcloned_typesÚfieldrF   c                   sV  t r| S ˆ d u r
t‰ | j}t|ƒrt|dƒr|j}|}t|tƒrMtt	t |ƒ}ˆ  
|¡}|d u rMt|j|d�}|ˆ |< |j ¡ D ]}t|ˆ d�|j|j< q@t| j|d�}| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| j|_| jr†‡ fdd„| jD ƒ|_| jr‘t| jˆ d�|_| j|_| j|_| j|_| j |_ | j!|_!| "¡  |S )NÚ__pydantic_model__)Ú__base__rE   )r4   r5   c                    s   g | ]}t |ˆ d �‘qS )rE   )Úcreate_cloned_field)Ú.0Ú	sub_fieldrE   r+   r,   Ú
<listcomp>•   s    
ÿÿz'create_cloned_field.<locals>.<listcomp>)#r   r   r5   r   ÚhasattrrH   r   r   r   r	   Úgetr   Ú__name__Ú
__fields__ÚvaluesrJ   r4   rD   Ú	has_aliasr:   r6   r%   r7   r8   r9   Ú
allow_noneÚvalidate_alwaysÚ
sub_fieldsÚ	key_fieldÚ
validatorsÚpre_validatorsÚpost_validatorsÚ
parse_jsonÚshapeÚpopulate_validators)rG   rF   Úoriginal_typeÚuse_typeÚfÚ	new_fieldr+   rE   r,   rJ   p   sX   

ÿ
þþ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ÚDeprecationWarningr0   ÚsubÚlower)r4   r.   rb   Úoperation_idr+   r+   r,   Úgenerate_operation_id_for_path§   s   ürm   Úrouter   c                 C   sB   | j | j }t dd|¡}| jsJ ‚|d t| jƒd  ¡  }|S )Nre   rf   r   )r4   Úpath_formatr0   rj   ÚmethodsÚlistrk   )rn   rl   r+   r+   r,   Úgenerate_unique_id¶   s
   
rr   Ú	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)ÚitemsÚ
isinstanceÚdictÚdeep_dict_updaterq   )rs   rt   ÚkeyÚvaluer+   r+   r,   rx   ¾   s   ÿþÿþ
òrx   Ú
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.
    )rv   r   )r{   r|   ru   Úitemr+   r+   r,   Úget_value_or_defaultÐ   s   

ÿr~   Ú
error_typec                 C   s   ddl m} |d| › �d�S )Nr   )ÚIsStrz$^https://errors\.pydantic\.dev/.*/v/)Úregex)Údirty_equalsr€   )r   r€   r+   r+   r,   Úmatch_pydantic_error_urlâ   s   rƒ   )4r0   rg   Údataclassesr   Útypingr   r   r   r   r   r   r	   r
   r   Úweakrefr   r@   Úfastapi._compatr   r   r   r   r   r   r   r   Úfastapi.datastructuresr   r   Úpydanticr   r   Úpydantic.fieldsr   Útyping_extensionsr   Úroutingr   r   Ú__annotations__r)   ÚstrÚboolr-   r2   rD   rJ   rm   rr   rx   r~   rƒ   r+   r+   r+   r,   Ú<module>   s”   
 ,(
þÿ÷ÿþýü
ûúùø	÷

ö4ýÿý
ü7ÿÿÿ
þ&
ÿ
þ

ý