o
    h]                     @   s8  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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-ZAeeBeBf eCd.< d/ed0eeeBef eeeBef  f fd1d2ZDd3d4d5ed6ed7e0d8eeee>d9 f ef d:eEd0eeeBef  fd;d<ZFd3d4d=ee d6ed7e0d8eeee>d9 f ef d:eEd0eeeBef  fd>d?ZGd@ejHdAeBd0eBfdBdCZId@ejHdAeBd0eBfdDdEZJd@ejHdAeBdFe
eB d0eeBef fdGdHZKd3d4d@ejHdFe
eB d6ed7e0d8eeee>d9 f ef d:eEd0eeeBef eeBef eeBef f fdIdJZLdKe	e: d0ee fdLdMZMdNddddddddd3dO
dPeBdQeBdReBdSeeB dTeeB dKe	e: dUee	e:  dVeeeeBef   dWeeeeBeeBef f   dXeeB dYeeeBeeBef f  dZeeeBeeBef f  d:eEd0eeBef fd[d\ZNdS )]    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)HTTP_422_UNPROCESSABLE_ENTITY)LiteralValidationErrorobjectLocationarrayanyOftypestringinteger)titler0   itemsMessage)r3   r0   z
Error Type)locmsgr0   )r3   r0   
propertiesrequiredHTTPValidationErrordetailDetail$ref)r3   r0   r8   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)rH   security_definitionsoperation_securitysecurity_requirementsecurity_definitionsecurity_name rX   i/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fastapi/openapi/utils.py get_openapi_security_definitionsN   s   
rZ   T)separate_input_output_schemas	dependantschema_generatormodel_name_mapfield_mapping)
validationserializationr[   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 ]y\}}|D ]r}|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^   r_   r[   _-)nameinr9   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   aliasrk   replacevaluer9   rn   r   r   rQ   )r\   r]   r^   r_   r[   
parametersrH   rs   rt   ru   rv   parameter_groupsdefault_convert_underscoresfirst_field
param_typeparam_groupparamr~   param_schemark   re   	parameterro   rp   rX   rX   rY   !_get_openapi_operation_parameters_   sv   







*r   
body_fieldc                 C   s   | sd S t | tsJ t| ||||d}tt| j}|j}| j}i }	|r(||	d< d|i}
|jr7t	|j|
d< n|j
tkrCt	|j
|
d< ||
i|	d< |	S )Nrg   r9   rm   rq   rp   content)
isinstancer   r   r   r   r~   
media_typer9   ro   r   rp   r   )r   r]   r^   r_   r[   body_schemar~   request_media_typer9   request_body_oairequest_media_contentrX   rX   rY   "get_openapi_operation_request_body   s2   


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 soon   
stacklevel)rk   rw   r   )warningswarnDeprecationWarningoperation_idpath_formatr$   rk   )r   r   rw   rX   rX   rY   generate_operation_id   s   r   c                 C   s   | j r| j S | jdd S )Nri    )summaryrk   r   r3   r   r   rX   rX   rY   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   rn   zDuplicate Operation ID z for function __globals____file__z at rd   r   operationIdrr   )r   r   rn   r   	unique_idendpoint__name__r}   getr   r   addrr   )r   r   r   	operationr   message	file_namerX   rX   rY   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rXd}!||!i }"t| t.shJ d| j/ |}#d }$|#rt(|#||||d}$|
pd}%| di |%i di }&t0|&|$ t1 t|- pt2j3j) t"|}'|  dp|" dp|'pd}(t0|"|  |(|"d< q=tt4})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&|vr |t8t9d' | j:r
t0 | j:  ||; < q-|||fS )(NzMethods must be a listz.A response class is needed to generate OpenAPI)r   r   r   Trb   )rH   security)r\   r]   r^   r_   r[   c                 S   s   i | ]}|d  |d f|qS )rl   rk   rX   .0r   rX   rX   rY   
<dictcomp>*  s    z$get_openapi_path.<locals>.<dictcomp>c                 S   s(   i | ]}| d r|d |d f|qS )r9   rl   rk   )r   r   rX   rX   rY   r   -  s    r   )r   r]   r^   r_   r[   requestBodyr   r   r]   r^   r_   r[   	callbacksstatus_code	responsesrn   r0   r1   rg   r   rm   rO   rF   defaultz%An additional response must be a dictzapplication/jsonzAdditional Responsec                 3   s    | ]	}| d  v V  qdS )r   NrX   )r   statusr   rX   rY   	<genexpr>  s
    

z#get_openapi_path.<locals>.<genexpr>rD   zValidation Errorr=   r:   )rn   r   r+   )r+   r:   )<methodsr   response_classr   r   r   rf   r   r   r\   rZ   
setdefaultextendupdater   listvaluesr   r   r   r   r   APIRouteget_openapi_pathrw   rk   r   strinspect	signature__init__r   r   r   intresponse_descriptionr%   r   r'   response_fieldr   r   r4   copypopupperdictresponse_fieldsr#   rG   httpclientr)   r   anyr   validation_error_definition$validation_error_response_definitionopenapi_extralower)+r   r   r]   r^   r_   r[   rw   security_schemesdefinitionscurrent_response_classroute_response_media_typer   r   rH   rS   rT   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_responserh   additional_field_schemar   additional_schemastatus_textrn   http422all_route_paramsrX   r   rY   r      sR  





	











r   routesc                 C   s   g }g }g }g }| D ]J}t |dd rTt|tjrT|jr+t|jts%J d||j |jr4||j |jr?|	|j
  |jrJ|	t|j t|j}|	| q
|t|| |  }|S )Nrf   z'A request body must be a Pydantic Field)r}   r   r   r   r   r   rQ   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_modelsrX   rX   rY   r     s4   


r   z3.1.0)
openapi_versionr   rn   webhooksr   serversterms_of_servicecontactlicense_infor[   r3   versionr   r   rn   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td	}t||||d
\} |p[g D ]7}t|tj	rt
||||||d}|r|\}}}|r||ji | |r|di | |r | q\|pg D ]7}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< ttdi |dddS )N)r3   r  r   rn   termsOfServicer   license)openapiinfor   )ref_template)fieldsr]   r^   r[   r   securitySchemesc                    s   i | ]}| | qS rX   rX   )r   kr   rX   rY   r   1  s    zget_openapi.<locals>.<dictcomp>schemas
componentspathsr   r   TrJ   rX   )setr   r   r   r   r   r   r   r   r   r   r   r   r   sortedr   r   )r3   r  r   r   rn   r   r   r   r   r   r   r  r[   r  outputr  r  webhook_pathsr   
all_fieldsr^   r]   r_   r   resultrw   r   path_definitionswebhookrX   r  rY   get_openapi  s   







r  )Ohttp.clientr   r   r   typingr   r   r   r   r   r   r   r	   r
   r   fastapir   fastapi._compatr   r   r   r   r   r   r   r   fastapi.datastructuresr   fastapi.dependencies.modelsr   fastapi.dependencies.utilsr   r   r   fastapi.encodersr   fastapi.openapi.constantsr   r   r   fastapi.openapi.modelsr   fastapi.paramsr   r    fastapi.responsesr!   fastapi.typesr"   fastapi.utilsr#   r$   r%   pydanticr&   starlette.responsesr'   starlette.routingr(   starlette.statusr)   typing_extensionsr*   r   r   rG   r   __annotations__rZ   boolr   r   r   r   r   r   r   r   r  rX   rX   rX   rY   <module>   sJ  
 0(
	


	
S	
%


#	$

 A
#
	

