o
    ɝiZ                  !   @   s6  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  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l/m0Z0m1Z1m2Z2 d dl3m4Z4 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!g d!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/< d0ed1eee@ef eee@ef  f fd2d3ZBd4d5d6ed7e.d8eeee:d9 f ef d:eCd1eee@ef  f
d;d<ZDd4d5d=ee d7e.d8eeee:d9 f ef d:eCd1eee@ef  f
d>d?ZEd@ejFdAe@d1e@fdBdCZGd@ejFdAe@d1e@fdDdEZHd@ejFdAe@dFe
e@ d1ee@ef fdGdHZId4d5d@ejFdFe
e@ d7e.d8eeee:d9 f ef d:eCd1eee@ef ee@ef ee@ef f fdIdJZJdKe	e8 d1ee fdLdMZKdNddddddddd4ddOdPe@dQe@dRe@dSee@ dTee@ dKe	e8 dUee	e8  dVeeee@ef   dWeeee@ee@ef f   dXee@ dYeee@ee@ef f  dZeee@ee@ef f  d:eCd[eee@ef  d1ee@ef fd\d]ZLdS )^    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)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objectLocationarrayanyOftypestringinteger)titler/   itemsMessage)r2   r/   z
Error Type)locmsgr/   )r2   r/   
propertiesrequiredHTTPValidationErrordetailDetail$ref)r2   r/   r7   InformationSuccessRedirectionzClient ErrorzServer ErrorzDefault Response)1XX2XX3XX4XX5XXDEFAULTstatus_code_rangesflat_dependantreturnc                 C   sN   i }g }| j D ]}t|jjddd}|jj}|||< |||ji q||fS )NTby_aliasexclude_none)security_requirementsr   security_schememodelscheme_nameappendscopes)rG   security_definitionsoperation_securitysecurity_requirementsecurity_definitionsecurity_name rW   Q/var/www/html/ocr-read/venv/lib/python3.10/site-packages/fastapi/openapi/utils.py get_openapi_security_definitionsN   s   
rY   T)separate_input_output_schemas	dependantmodel_name_mapfield_mapping)
validationserializationrZ   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rI|jd }t|jtrIt|jdd}|
D ]x\}}|D ]q}|j}t|dds]qQt||||d}|j}t|jd|}|tj	kr|j|jkr|r|jdd	}||j|j|d
}|jr|j|d< t|dd }t|dd }|rt||d< n
|tkrt||d< t|dd rd|d< || qQqK|S )NTskip_repeats   r   convert_underscoresinclude_in_schemafieldr\   r]   rZ   _-)nameinr8   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   aliasri   replacevaluer8   rl   r   r   rP   )r[   r\   r]   rZ   
parametersrG   rq   rr   rs   rt   parameter_groupsdefault_convert_underscoresfirst_field
param_typeparam_groupparamr|   param_schemari   rc   	parameterrm   rn   rW   rW   rX   !_get_openapi_operation_parameters_   st   	






)r   
body_fieldc           
      C   s   | sd S t | s
J t| |||d}tt| j}|j}| j}i }|r&||d< d|i}	|jr5t|j|	d< n|j	t
krAt|j	|	d< ||	i|d< |S )Nre   r8   rk   ro   rn   content)r)   r   r   r   r|   
media_typer8   rm   r   rn   r   )
r   r\   r]   rZ   body_schemar|   request_media_typer8   request_body_oairequest_media_contentrW   rW   rX   "get_openapi_operation_request_body   s0   	

r   routemethodc                 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)ri   ru   r   )warningswarnDeprecationWarningoperation_idpath_formatr"   ri   )r   r   ru   rW   rW   rX   generate_operation_id   s   r   c                 C   s   | j r| j S | jdd S )Nrg    )summaryri   r~   r2   r   r   rW   rW   rX   generate_operation_summary   s   r   operation_idsc                 C   s   i }| j r
| j |d< t| |d|d< | jr| j|d< | jp| j}||v rId| d| jj  }t| jdi d}|rB|d	| 7 }t	j
|d
d || ||d< | jrZ| j|d< |S )Ntagsr   r   rl   zDuplicate Operation ID z for function __globals____file__z at rb   r   operationIdrp   )r   r   rl   r   	unique_idendpoint__name__r{   getr   r   addrp   )r   r   r   	operationr   message	file_namerW   rW   rX   get_openapi_operation_metadata   s*   




r   c           *   	      s  i }i }i }| j d usJ dt| jtr| jj}n| j}|s#J d|j}	| jr
| j D ]}
t| |
|d g }t| j	dd}t
|d\}}|rR dg | |rY|| t| j	|||d}|| |rd	d
 |D }dd
 |D }|| t|  d< |
tv rt| j|||d}|r| d< | jri }| jD ]}t|tjrt|||||d\}}}|j|i||j< q| d< | jd urt| j}nt|j}|j d}|d urt|j!t"rt|j!}| j# di |i d< |	r*t$| jr*d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rTd} || i }!t|t.sdJ d| j/ |}"d }#|"rt(|"|||d}#|	p{d}$|di |$i di }%t0|%|# t1 t|- pt2j3j) t"|}&| dp|! dp|&pd}'t0|!| |'|!d< q9d}(t4| j	})|)s| jrt5 fd d!|(d"dfD sd#ddd$t6d% iiid& d |(< d'|vr|t7t8d( | j9rt0 | j9  ||
: < q-|||fS ))NzMethods must be a listz.A response class is needed to generate OpenAPI)r   r   r   Tr`   )rG   security)r[   r\   r]   rZ   c                 S   s   i | ]}|d  |d f|qS )rj   ri   rW   .0r   rW   rW   rX   
<dictcomp>$  s    z$get_openapi_path.<locals>.<dictcomp>c                 S   s(   i | ]}| d r|d |d f|qS )r8   rj   ri   )r   r   rW   rW   rX   r   '  s    r   )r   r\   r]   rZ   requestBodyr   r   r\   r]   rZ   	callbacksstatus_code	responsesrl   r/   r0   re   r   rk   rN   rE   defaultz%An additional response must be a dictzapplication/jsonzAdditional Response422c                 3   s    | ]	}| d  v V  qdS )r   NrW   )r   statusr   rW   rX   	<genexpr>  s
    

z#get_openapi_path.<locals>.<genexpr>rC   zValidation Errorr<   r9   )rl   r   r*   )r*   r9   );methods
isinstanceresponse_classr   r   r   rd   r   r   r[   rY   
setdefaultextendupdater   listvaluesr   r   r   r   r   APIRouteget_openapi_pathru   ri   r   strinspect	signature__init__r   r   r   intresponse_descriptionr#   r   r%   response_fieldr   r   r3   copypopupperdictresponse_fieldsr!   rF   httpclientr   anyr   validation_error_definition$validation_error_response_definitionopenapi_extralower)*r   r   r\   r]   rZ   ru   security_schemesdefinitionscurrent_response_classroute_response_media_typer   r   rG   rR   rS   operation_parametersall_parametersrequired_parametersr   r   callbackcb_pathcb_security_schemescb_definitionsr   response_signaturestatus_code_paramresponse_schemaoperation_responsesadditional_status_codeadditional_responseprocess_responsestatus_code_keyopenapi_responserf   additional_field_schemar   additional_schemastatus_textrl   http422all_route_paramsrW   r   rX   r      sH  


















r   routesc                 C   s   g }g }g }g }| D ]I}t |dd rSt|tjrS|jr*t|js$J d||j |jr3||j |jr>|	|j
  |jrI|	t|j t|j}|	| q
|t|| |  }|S )Nrd   z'A request body must be a Pydantic Field)r{   r   r   r   r   r)   rP   r   r   r   r   r   get_fields_from_routesr   r[   r   )r   body_fields_from_routesresponses_from_routesrequest_fields_from_routescallback_flat_modelsr   paramsflat_modelsrW   rW   rX   r     s4   


r   z3.1.0)openapi_versionr   rl   webhooksr   serversterms_of_servicecontactlicense_inforZ   external_docsr2   versionr   r   rl   r   r   r   r   r   r   r   c                    s  | |d}|r||d< |r||d< |	r|	|d< |
r|
|d< |r#||d< ||d}|r.||d< i }i }i }t  }tt|p<g t|pAg  }t|}t|||d	\} |pUg D ]6}t|tjrt|||||d
}|r|\}}}|rz|	|j
i | |r|	di | |r | qV|pg D ]6}t|tjrt|||||d
}|r|\}}}|r|	|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di |dddS )N)r2   r  r   rl   termsOfServicer   license)openapiinfor   )fieldsr\   rZ   r   securitySchemesc                    s   i | ]}| | qS rW   rW   )r   kr   rW   rX   r   $  s    zget_openapi.<locals>.<dictcomp>schemas
componentspathsr   r   externalDocsTrI   rW   )setr   r   r   r   r   r   r   r   r   r   r   sortedr   r   )r2   r  r   r   rl   r   r   r   r   r   r   r   rZ   r   r  outputr  r  webhook_pathsr   
all_fieldsr\   r]   r   resultru   r   path_definitionswebhookrW   r	  rX   get_openapi  s   






r  )Mhttp.clientr   r   r   typingr   r   r   r   r   r   r   r	   r
   r   fastapir   fastapi._compatr   r   r   r   r   r   r   fastapi.datastructuresr   fastapi.dependencies.modelsr   fastapi.dependencies.utilsr   r   r   fastapi.encodersr   fastapi.openapi.constantsr   r   fastapi.openapi.modelsr   fastapi.paramsr   r   fastapi.responsesr   fastapi.typesr    fastapi.utilsr!   r"   r#   pydanticr$   starlette.responsesr%   starlette.routingr&   typing_extensionsr'   _compatr)   r   r   rF   r   __annotations__rY   boolr   r   r   r   r   r   r   r   r  rW   rW   rW   rX   <module>   sD  
 0$		



P
#


"$	
 ;
#
	

