U
    nËjÖ\  ã                   @   sô  U d dl Zd dl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 d dlmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZm Z m!Z! d dl"m#Z# d d	l$m%Z%m&Z& d d
l'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; ddl<m=Z= dddddddiddigidœdddœd ddœd!œd"d#dgd$œZ>d%dd&d'dd(e&d idœid)œZ?d*d+d,d-d.d/d0œZ@eeAeAf eBd1< eeeeAef eeeAef  f d2œd3d4„ZCd5d6œee/eeee;d7 f ef eDeeeAef  d8œd9d:„ZEd5d6œee e/eeee;d7 f ef eDeeeAef  d;œd<d=„ZFejGeAeAd>œd?d@„ZHejGeAeAd>œdAdB„ZIejGeAe
eA eeAef dCœdDdE„ZJd5d6œejGe
eA e/eeee;d7 f ef eDeeeAef eeAef eeAef f dFœdGdH„ZKe	e9 ee dIœdJdK„ZLdLddddddddd5ddMœeAeAeAeeA eeA e	e9 ee	e9  eeeeAef   eeeeAeeAef f   eeA eeeAeeAef f  eeeAeeAef f  eDeeeAef  eeAef dNœdOdP„ZMdS )Qé    N)
ÚAnyÚDictÚListÚOptionalÚSequenceÚSetÚTupleÚTypeÚUnionÚcast)Úrouting)ÚJsonSchemaValueÚ
ModelFieldÚ	UndefinedÚget_compat_model_name_mapÚget_definitionsÚget_schema_from_model_fieldÚlenient_issubclass)ÚDefaultPlaceholder)Ú	Dependant)Ú_get_flat_fields_from_paramsÚget_flat_dependantÚget_flat_paramsÚget_validation_alias)Újsonable_encoder)ÚMETHODS_WITH_BODYÚ
REF_PREFIX)ÚOpenAPI)ÚBodyÚ
ParamTypes)ÚResponse)ÚModelNameMap)Údeep_dict_updateÚgenerate_operation_id_for_pathÚis_body_allowed_for_status_code)Ú	BaseModel)ÚJSONResponse)Ú	BaseRoute)ÚLiteralé   )Ú_is_model_fieldÚValidationErrorÚobjectZLocationÚarrayZanyOfÚtypeÚstringÚinteger)Útitler.   ÚitemsÚMessage)r1   r.   z
Error Type)ÚlocÚmsgr.   r4   r5   )r1   r.   Ú
propertiesÚrequiredÚHTTPValidationErrorZdetailZDetailú$ref)r1   r.   r6   ZInformationZSuccessZRedirectionzClient ErrorzServer ErrorzDefault Response)Z1XXZ2XXZ3XXÚ4XXZ5XXÚDEFAULTÚstatus_code_ranges)Úflat_dependantÚreturnc                 C   sŠ   i }i }| j D ]`}t|jjddd�}|jj}|||< ||krDg ||< |jpLg D ]}||| krN||  |¡ qNqdd„ | ¡ D ƒ}||fS )NT©Zby_aliasZexclude_nonec                 S   s   g | ]\}}||i‘qS © r@   )Ú.0ÚnameZscopesr@   r@   ú9/tmp/pip-unpacked-wheel-yktl02hi/fastapi/openapi/utils.pyÚ
<listcomp>c   s    z4get_openapi_security_definitions.<locals>.<listcomp>)Z_security_dependenciesr   Z_security_schemeÚmodelZscheme_nameZoauth_scopesÚappendr2   )r=   Úsecurity_definitionsZoperation_security_dictZsecurity_dependencyZsecurity_definitionZsecurity_nameZscopeÚoperation_securityr@   r@   rC   Ú get_openapi_security_definitionsO   s&    
ýÿrI   T)Úseparate_input_output_schemas)Z
validationZserialization)Ú	dependantÚmodel_name_mapÚfield_mappingrJ   r>   c                 C   sš  g }t | dd�}t|jƒ}t|jƒ}t|jƒ}t|jƒ}	tj|ftj|ftj	|ftj
|	fg}
d}t|jƒdkr’|jd }t|jtƒr’t|jddƒ}|
D ]þ\}}|D ]ð}|j}t|ddƒsºq¢t||||d�}t|ƒ}t|jd|ƒ}|tj	k�r||jk�r|�r|j dd	¡}||j|j|d
œ}|j�r0|j|d< t|dd ƒ}t|dd ƒ}|�r\t|ƒ|d< n|tk�rrt|ƒ|d< t|dd ƒ�rˆd|d< | |¡ q¢q–|S )NT©Zskip_repeatsé   r   Úconvert_underscoresÚinclude_in_schema©ÚfieldrL   rM   rJ   Ú_ú-)rB   Úinr7   ÚschemaÚdescriptionÚopenapi_examplesÚexampleÚexamplesÚ
deprecated)r   r   Úpath_paramsÚquery_paramsÚheader_paramsÚcookie_paramsr   ÚpathÚqueryÚheaderÚcookieÚlenr   Útype_r%   ÚgetattrÚ
field_infor   r   rB   ÚreplaceÚvaluer7   rX   r   r   rF   )rK   rL   rM   rJ   Ú
parametersr=   r]   r^   r_   r`   Zparameter_groupsZdefault_convert_underscoresZfirst_fieldZ
param_typeZparam_groupÚparamrh   Zparam_schemarB   rP   Z	parameterrY   rZ   r@   r@   rC   Ú!_get_openapi_operation_parametersi   sz    	



ü
  ÿüýÿþýü

rm   )Ú
body_fieldrL   rM   rJ   r>   c           
      C   s’   | sd S t | ƒst‚t| |||d�}tt| jƒ}|j}| j}i }|rL||d< d|i}	|jrjt	|jƒ|	d< n|j
tkr‚t	|j
ƒ|	d< ||	i|d< |S )NrR   r7   rW   r[   rZ   Úcontent)r*   ÚAssertionErrorr   r   r   rh   Ú
media_typer7   rY   r   rZ   r   )
rn   rL   rM   rJ   Zbody_schemarh   Zrequest_media_typer7   Úrequest_body_oaiZrequest_media_contentr@   r@   rC   Ú"get_openapi_operation_request_body²   s0    	üÿ

rs   )ÚrouteÚmethodr>   c                 C   s2   t jdtdd� | jr| jS | j}t| j||d�S )Nzqfastapi.openapi.utils.generate_operation_id() was deprecated, it is not used internally, and will be removed soonr)   ©Ú
stacklevel)rB   ra   ru   )ÚwarningsÚwarnÚDeprecationWarningÚoperation_idÚpath_formatr#   rB   )rt   ru   ra   r@   r@   rC   Úgenerate_operation_idÕ   s    ür}   c                 C   s   | j r| j S | j dd¡ ¡ S )NrT   ú )ÚsummaryrB   ri   r1   ©rt   ru   r@   r@   rC   Úgenerate_operation_summaryä   s    r�   )rt   ru   Úoperation_idsr>   c                 C   s¸   i }| j r| j |d< t| |d�|d< | jr4| j|d< | jp>| j}||kr’d|› d�| jj›  }t| jdi ƒ d¡}|r„|d	|› �7 }t	j
|d
d� | |¡ ||d< | jr´| j|d< |S )NÚtagsr€   r   rX   zDuplicate Operation ID z for function Ú__globals__Ú__file__z at rO   rv   ZoperationIdr\   )rƒ   r�   rX   r{   Z	unique_idZendpointÚ__name__rg   Úgetrx   ry   Úaddr\   )rt   ru   r‚   Ú	operationr{   ÚmessageÚ	file_namer@   r@   rC   Úget_openapi_operation_metadataê   s*    


ÿÿ

rŒ   )rt   r‚   rL   rM   rJ   r>   c           *   	      s2  i }i }i }| j d k	stdƒ‚t| jtƒr4| jj}n| j}|sFtdƒ‚|j}	| j�r(| j D �]Ê}
t| |
|d�‰ g }t	| j
dd�}t|d�\}}|r¤ˆ  dg ¡ |¡ |r²| |¡ t| j
|||d�}| |¡ |�r
d	d
„ |D ƒ}dd
„ |D ƒ}| |¡ t| ¡ ƒˆ d< |
tk�r4t| j|||d�}|�r4|ˆ d< | j�rŒi }| jD ]<}t|tjƒ�rFt|||||d�\}}}|j|i||j< �qF|ˆ d< | jd k	�r¤t| jƒ}n:t |j¡}|j  !d¡}|d k	�rÞt|j"t#ƒ�rÞt|j"ƒ}| j$ˆ  di ¡ |i ¡d< |	�rft%| jƒ�rfddi}t&|t'ƒ�r>| j(�r:t)| j(|||d�}ni }|ˆ  di ¡ |i ¡ di ¡ |	i ¡d< | j*�r�ˆ  di ¡}| j* +¡ D �]\}}| ,¡ }| -dd ¡ t|ƒ .¡ } | dk�r¼d} | | i ¡}!t|t/ƒ�sÜtdƒ‚| j0 !|¡}"d }#|"�r2t)|"|||d�}#|	�p
d}$| di ¡ |$i ¡ di ¡}%t1|%|#ƒ t2 !t|ƒ .¡ ¡�pVt3j4j* !t#|ƒ¡}&| !d¡�px|! !d¡�px|&�pxd}'t1|!|ƒ |'|!d< �q„d}(t5| j
ƒ})|)�s¬| j�rt6‡ fd d!„|(d"dfD ƒƒ�sd#ddd$t7d% iiid&œˆ d |(< d'|k�r| t8t9d(œ¡ | j:�rt1ˆ | j:ƒ ˆ ||
 ;¡ < qZ|||fS ))NzMethods must be a listz.A response class is needed to generate OpenAPI)rt   ru   r‚   TrN   )r=   Úsecurity)rK   rL   rM   rJ   c                 S   s   i | ]}|d  |d f|“qS )rV   rB   r@   ©rA   rl   r@   r@   rC   Ú
<dictcomp>.  s     z$get_openapi_path.<locals>.<dictcomp>c                 S   s(   i | ] }|  d ¡r|d |d f|“qS )r7   rV   rB   )r‡   rŽ   r@   r@   rC   r�   1  s   
þ rk   )rn   rL   rM   rJ   ZrequestBody©rt   r‚   rL   rM   rJ   Ú	callbacksÚstatus_codeÚ	responsesrX   r.   r/   rR   ro   rW   rE   r;   Údefaultz%An additional response must be a dictzapplication/jsonzAdditional ResponseZ422c                 3   s   | ]}|ˆ d  kV  qdS )r“   Nr@   )rA   Ústatus©r‰   r@   rC   Ú	<genexpr>¥  s   ÿz#get_openapi_path.<locals>.<genexpr>r:   zValidation Errorr9   r8   )rX   ro   r+   )r+   r8   )<Úmethodsrp   Ú
isinstanceÚresponse_classr   rj   rq   rQ   rŒ   r   rK   rI   Ú
setdefaultÚextendÚupdaterm   ÚlistÚvaluesr   rs   rn   r‘   r   ÚAPIRouteÚget_openapi_pathra   rB   r’   ÚstrÚinspectÚ	signatureÚ__init__rk   r‡   r”   ÚintZresponse_descriptionr$   r   r&   Úresponse_fieldr   r“   r2   ÚcopyÚpopÚupperÚdictÚresponse_fieldsr"   r<   ÚhttpÚclientr   Úanyr   Úvalidation_error_definitionÚ$validation_error_response_definitionZopenapi_extraÚlower)*rt   r‚   rL   rM   rJ   ra   Úsecurity_schemesÚdefinitionsZcurrent_response_classZroute_response_media_typeru   rk   r=   rG   rH   Zoperation_parametersZall_parametersZrequired_parametersrr   r‘   ÚcallbackZcb_pathZcb_security_schemesZcb_definitionsr’   Zresponse_signatureZstatus_code_paramZresponse_schemaZoperation_responsesZadditional_status_codeZadditional_responseÚprocess_responseZstatus_code_keyZopenapi_responserS   Zadditional_field_schemarq   Zadditional_schemaZstatus_textrX   Zhttp422Zall_route_paramsr@   r–   rC   r¡     sb   

  ÿÿ

ü
ÿþ

ü
ûü

þÿÿüü ÿ þ þýý
 ÿÿü
 ÿ þÿ

ÿþÿþü

þ
 
ÿÿþ
þÿr¡   )Úroutesr>   c                 C   sÀ   g }g }g }g }| D ]’}t |dd ƒrt|tjƒr|jrTt|jƒsHtdƒ‚| |j¡ |jrf| |j¡ |j	r|| 
|j	 ¡ ¡ |jr’| 
t|jƒ¡ t|jƒ}| 
|¡ q|t|| | ƒ }|S )NrQ   z'A request body must be a Pydantic Field)rg   r™   r   r    rn   r*   rp   rF   r§   r¬   rœ   rŸ   r‘   Úget_fields_from_routesr   rK   rž   )r·   Zbody_fields_from_routesZresponses_from_routesZrequest_fields_from_routesZcallback_flat_modelsrt   ÚparamsZflat_modelsr@   r@   rC   r¸   ¾  s4     ÿÿ

ÿr¸   z3.1.0)Úopenapi_versionr   rX   Úwebhooksrƒ   ÚserversÚterms_of_serviceÚcontactÚlicense_inforJ   Úexternal_docs)r1   Úversionrº   r   rX   r·   r»   rƒ   r¼   r½   r¾   r¿   rJ   rÀ   r>   c                    s  | |dœ}|r||d< |r"||d< |	r.|	|d< |
r:|
|d< |rF||d< ||dœ}|r\||d< i }i }i }t ƒ }tt|pxg ƒt|p‚g ƒ ƒ}t|ƒ}t|||d	�\}‰ |pªg D ]n}t|tjƒr¬t|||||d
�}|r¬|\}}}|rô| 	|j
i ¡ |¡ |�r| 	di ¡ |¡ |r¬ˆ  |¡ q¬|�p$g D ]x}t|tjƒ�r&t|||||d
�}|�r&|\}}}|�rt| 	|j
i ¡ |¡ |�rŒ| 	di ¡ |¡ |�r&ˆ  |¡ �q&ˆ �rÀ‡ fdd„tˆ ƒD ƒ|d< |�rÎ||d< ||d< |�rä||d< |�rò||d< |�r ||d< ttf |Žddd�S )N)r1   rÁ   r   rX   ZtermsOfServicer¾   Úlicense)ZopenapiÚinfor¼   )ÚfieldsrL   rJ   r�   ZsecuritySchemesc                    s   i | ]}|ˆ | “qS r@   r@   )rA   Úk©r´   r@   rC   r�   .  s      zget_openapi.<locals>.<dictcomp>ZschemasÚ
componentsÚpathsr»   rƒ   ZexternalDocsTr?   )Úsetr¸   rž   r   r   r™   r   r    r¡   r›   r|   r�   Úsortedr   r   )r1   rÁ   rº   r   rX   r·   r»   rƒ   r¼   r½   r¾   r¿   rJ   rÀ   rÃ   ÚoutputrÇ   rÈ   Zwebhook_pathsr‚   Z
all_fieldsrL   rM   rt   Úresultra   r³   Zpath_definitionsZwebhookr@   rÆ   rC   Úget_openapiÝ  s–    

ý
û
ÿû
ÿrÍ   )NÚhttp.clientr­   r£   rx   Útypingr   r   r   r   r   r   r   r	   r
   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   r   Zfastapi.datastructuresr   Zfastapi.dependencies.modelsr   Zfastapi.dependencies.utilsr   r   r   r   Zfastapi.encodersr   Zfastapi.openapi.constantsr   r   Zfastapi.openapi.modelsr   Zfastapi.paramsr   r   Zfastapi.responsesr    Zfastapi.typesr!   Zfastapi.utilsr"   r#   r$   Zpydanticr%   Zstarlette.responsesr&   Zstarlette.routingr'   Ztyping_extensionsr(   Ú_compatr*   r°   r±   r<   r¢   Ú__annotations__rI   Úboolrm   rs   r    r}   r�   rŒ   r¡   r¸   rÍ   r@   r@   r@   rC   Ú<module>   sø    0$	ýù	ô
ýÿýúþ!ùÿøPùÿø$ þ  
þ"øÿ$÷ <þ#ñ

ð