U
    Rh]                     @   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mZ d dlmZ d dlmZ d dlmZm Z m!Z! d dl"m#Z# d d	l$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/m0Z0 d dl1m2Z2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9m: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-d.Z?ee@e@f eAd/< eeee@ef eee@ef  f d0d1d2ZBd3d4eee0eeee<d5 f ef eCeee@ef  d6d7d8ZDd3d4ee ee0eeee<d5 f ef eCeee@ef  d9d:d;ZEejFe@e@d<d=d>ZGejFe@e@d<d?d@ZHejFe@e
e@ ee@ef dAdBdCZId3d4ejFe
e@ ee0eeee<d5 f ef eCeee@ef ee@ef ee@ef f dDdEdFZJe	e: ee dGdHdIZKdJddddddddd3ddKe@e@e@ee@ ee@ e	e: ee	e:  eeee@ef   eeee@ee@ef f   ee@ eee@ee@ef f  eee@ee@ef f  eCeee@ef  ee@ef dLdMdNZLdS )O    N)
AnyDictListOptionalSequenceSetTupleTypeUnioncast)routing)GenerateJsonSchema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)jsonable_encoder)METHODS_WITH_BODY
REF_PREFIXREF_TEMPLATE)OpenAPI)Body
ParamTypes)Response)ModelNameMap)deep_dict_updategenerate_operation_id_for_pathis_body_allowed_for_status_code)	BaseModel)JSONResponse)	BaseRoute)LiteralValidationErrorobjectZLocationZarrayZanyOftypestringZinteger)titler,   itemsZMessage)r.   r,   z
Error Type)locmsgr,   r0   r1   )r.   r,   
propertiesrequiredHTTPValidationErrorZdetailZDetail$ref)r.   r,   r2   ZInformationZSuccessZRedirectionzClient ErrorzServer ErrorzDefault Response)Z1XXZ2XXZ3XX4XXZ5XXDEFAULTstatus_code_ranges)flat_dependantreturnc                 C   sN   i }g }| j D ]6}t|jjddd}|jj}|||< |||ji q||fS )NTZby_aliasZexclude_none)Zsecurity_requirementsr   Zsecurity_schememodelZscheme_nameappendZscopes)r9   security_definitionsoperation_securityZsecurity_requirementZsecurity_definitionZsecurity_name r@   ;./venv/lib/python3.8/site-packages/fastapi/openapi/utils.py get_openapi_security_definitionsM   s    
rB   T)separate_input_output_schemas)Z
validationZserialization)	dependantschema_generatormodel_name_mapfield_mappingrC   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rt|jdd}|D ] \}}|D ]}|j}t|ddsqt|||||d}|j}t|jd|}|tj	kr|j|jkr|r|jdd	}||j|j|d
}|jr4|j|d< t|dd }t|dd }|r`t||d< n|tkrvt||d< t|dd rd|d< || qq|S )NTZskip_repeats   r   convert_underscoresinclude_in_schemafieldrE   rF   rG   rC   _-)nameinr3   schemadescriptionopenapi_examplesexampleexamples
deprecated)r   r   path_paramsquery_paramsheader_paramscookie_paramsr    pathZqueryheaderZcookielenr   Ztype_r&   getattr
field_infor   aliasrP   replacevaluer3   rS   r   r   r=   )rD   rE   rF   rG   rC   
parametersr9   rX   rY   rZ   r[   Zparameter_groupsZdefault_convert_underscoresZfirst_fieldZ
param_typeZparam_groupparamr`   Zparam_schemarP   rJ   Z	parameterrT   rU   r@   r@   rA   !_get_openapi_operation_parameters^   s|    





  


rf   )
body_fieldrE   rF   rG   rC   r:   c                 C   s   | sd S t | tstt| ||||d}tt| j}|j}| j}i }	|rP||	d< d|i}
|j	rnt
|j	|
d< n|jtkrt
|j|
d< ||
i|	d< |	S )NrL   r3   rR   rV   rU   content)
isinstancer   AssertionErrorr   r   r   r`   
media_typer3   rT   r   rU   r   )rg   rE   rF   rG   rC   Zbody_schemar`   Zrequest_media_typer3   request_body_oaiZrequest_media_contentr@   r@   rA   "get_openapi_operation_request_body   s2    


rm   )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 soon   
stacklevel)rP   r\   ro   )warningswarnDeprecationWarningoperation_idpath_formatr$   rP   )rn   ro   r\   r@   r@   rA   generate_operation_id   s    rx   c                 C   s   | j r| j S | jdd S )NrN    )summaryrP   rb   r.   rn   ro   r@   r@   rA   generate_operation_summary   s    r|   )rn   ro   operation_idsr:   c                 C   s   i }| j r| j |d< t| |d|d< | jr4| j|d< | jp>| j}||krd| d| jj  }t| jdi d}|r|d	| 7 }t	j
|d
d || ||d< | jr| j|d< |S )Ntagsr{   rz   rS   zDuplicate Operation ID z for function __globals____file__z at rI   rq   ZoperationIdrW   )r~   r|   rS   rv   Z	unique_idZendpoint__name__r_   getrs   rt   addrW   )rn   ro   r}   	operationrv   message	file_namer@   r@   rA   get_openapi_operation_metadata   s*    




r   )rn   r}   rE   rF   rG   rC   r:   c           +   
      s<  i }i }i }| j d k	stdt| jtr4| jj}	n| j}	|	sFtd|	j}
| jr2| 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r8t| j||||d}|r8| d< | jri }| jD ]>}t|tjrJt||||||d\}}}|j|i||j< qJ| d< | jd k	rt| j}n:t|	j}|j !d}|d k	rt|j"t#rt|j"}| j$ di |i d< |
rnt%| jrnddi}t&|	t'rF| j(rBt)| j(||||d}ni }| di |i di |
i d< | j*r di }| j*+ D ]
\}}|, } | -dd  t|. }!|!dkrd}!||!i }"t| t/std| j0!|}#d }$|#r<t)|#||||d}$|
pd}%| di |%i di }&t1|&|$ t2!t|. p`t3j4j*!t#|}'| !dp|"!dp|'pd}(t1|"|  |(|"d< qd})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)rn   ro   r}   TrH   )r9   Zsecurity)rD   rE   rF   rG   rC   c                 S   s   i | ]}|d  |d f|qS )rQ   rP   r@   .0re   r@   r@   rA   
<dictcomp>)  s     z$get_openapi_path.<locals>.<dictcomp>c                 S   s(   i | ] }| d r|d |d f|qS )r3   rQ   rP   )r   r   r@   r@   rA   r   ,  s   
 rd   )rg   rE   rF   rG   rC   ZrequestBodyrn   r}   rE   rF   rG   rC   	callbacksstatus_code	responsesrS   r,   r-   rL   rh   rR   r<   r7   defaultz%An additional response must be a dictzapplication/jsonzAdditional ResponseZ422c                 3   s   | ]}| d  kV  qdS )r   Nr@   )r   statusr   r@   rA   	<genexpr>  s   z#get_openapi_path.<locals>.<genexpr>r6   zValidation Errorr5   r4   )rS   rh   r*   )r*   r4   )<methodsrj   ri   Zresponse_classr   rc   rk   rK   r   r   rD   rB   
setdefaultextendupdaterf   listvaluesr   rm   rg   r   r   APIRouteget_openapi_pathr\   rP   r   strinspectZ	signature__init__rd   r   r   intZresponse_descriptionr%   r   r'   response_fieldr   r   r/   copypopupperdictresponse_fieldsr#   r8   httpZclientr   anyr   validation_error_definition$validation_error_response_definitionZopenapi_extralower)+rn   r}   rE   rF   rG   rC   r\   security_schemesdefinitionsZcurrent_response_classZroute_response_media_typero   rd   r9   r>   r?   Zoperation_parametersZall_parametersZrequired_parametersrl   r   callbackZcb_pathZcb_security_schemesZcb_definitionsr   Zresponse_signatureZstatus_code_paramZresponse_schemaZoperation_responsesZadditional_status_codeZadditional_responseZprocess_responseZstatus_code_keyZopenapi_responserM   Zadditional_field_schemark   Zadditional_schemaZstatus_textrS   Zhttp422Zall_route_paramsr@   r   rA   r      sl   
  





	

   
 
  




 

r   )routesr:   c                 C   s   g }g }g }g }| D ]}t |dd rt|tjr|jrVt|jtsJtd||j |jrh||j |j	r~|
|j	  |jr|
t|j t|j}|
| q|t|| |  }|S )NrK   z'A request body must be a Pydantic Field)r_   ri   r   r   rg   r   rj   r=   r   r   r   r   r   get_fields_from_routesr   rD   r   )r   Zbody_fields_from_routesZresponses_from_routesZrequest_fields_from_routesZcallback_flat_modelsrn   paramsZflat_modelsr@   r@   rA   r     s4     

r   z3.1.0)openapi_versionrz   rS   webhooksr~   serversterms_of_servicecontactlicense_inforC   external_docs)r.   versionr   rz   rS   r   r   r~   r   r   r   r   rC   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|pg  }t|}ttd	}t||||d
\} |pg D ]r}t|tj	rt
||||||d}|r|\}}}|r||ji | |r|di | |r | q|p4g D ]z}t|tj	r6t
||||||d}|r6|\}}}|r||ji | |r|di | |r6 | q6 r҇ fddt D |d< |r||d< ||d< |r||d< |r||d< |r||d< ttf |dddS )N)r.   r   rz   rS   ZtermsOfServicer   license)Zopenapiinfor   )Zref_template)ZfieldsrE   rF   rC   r   ZsecuritySchemesc                    s   i | ]}| | qS r@   r@   )r   kr   r@   rA   r   1  s      zget_openapi.<locals>.<dictcomp>Zschemas
componentspathsr   r~   ZexternalDocsTr;   )setr   r   r   r   r   r   ri   r   r   r   r   rw   r   sortedr   r   )r.   r   r   rz   rS   r   r   r~   r   r   r   r   rC   r   r   outputr   r   Zwebhook_pathsr}   Z
all_fieldsrF   rE   rG   rn   resultr\   r   Zpath_definitionsZwebhookr@   r   rA   get_openapi  s    





r   )MZhttp.clientr   r   rs   typingr   r   r   r   r   r   r   r	   r
   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   r   r   Zfastapi.datastructuresr   Zfastapi.dependencies.modelsr   Zfastapi.dependencies.utilsr   r   r   Zfastapi.encodersr   Zfastapi.openapi.constantsr   r   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)   r   r   r8   r   __annotations__rB   boolrf   rm   r   rx   r|   r   r   r   r   r@   r@   r@   rA   <module>   s    0(
	
S&   
#$ B#

