U
    &%e                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ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 d dl m!Z!m"Z" d dl#m$Z$ d d	l%m&Z&m'Z'm(Z(m)Z)m*Z* d d
l+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZFmGZG d dlHmIZImJZJmKZKmLZLmMZMmNZN d dlHmOZO d dlPmQZQmRZRmSZS d dlTmUZU dddeeVeVeVedddZWdddddddddee eee4 ee4 eVeVeVeVeVed
d d!ZXe$eeYef eVed"d#d$ZZdde!eFddddddddfe$ee ee[ eeeG e"f ee ee4 ee4 eVeVeVeVee eeDgeeeeGf f d%d&d'Z\d1e$ee eeUgeeeef f d(d)d*Z]G d+d, d,e>j^Z_G d-d. d.e>j`ZaG d/d0 d0e>jbZcdS )2    N)AsyncExitStack)EnumIntEnum)AnyCallable	CoroutineDictListOptionalSequenceSetTupleTypeUnion)params)
ModelField	Undefined_get_model_config_model_dump_normalize_errorslenient_issubclass)DefaultDefaultPlaceholder)	Dependant)get_body_fieldget_dependantget_parameterless_sub_dependantget_typed_return_annotationsolve_dependencies)jsonable_encoder)FastAPIErrorRequestValidationErrorResponseValidationErrorWebSocketRequestValidationError)DecoratedCallableIncEx)create_cloned_fieldcreate_response_fieldgenerate_unique_idget_value_or_defaultis_body_allowed_for_status_code)	BaseModel)routing)run_in_threadpool)HTTPException)Request)JSONResponseResponse)	BaseRouteMatchcompile_pathget_namerequest_responsewebsocket_session)Mount)ASGIAppLifespanScope	WebSocketF)exclude_defaultsexclude_none)resexclude_unsetr>   r?   returnc                   s   t | tr4tt| dd }|r"| S t| d dS t | trT fdd| D S t | trx fdd|  D S t	| rt
| S | S )Nread_with_orm_modeT)by_aliasrA   r>   r?   c                    s   g | ]}t | d qS rA   r>   r?   _prepare_response_content).0itemr>   r?   rA    N/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/fastapi/routing.py
<listcomp>a   s   z-_prepare_response_content.<locals>.<listcomp>c              	      s"   i | ]\}}|t | d qS rE   rG   )rI   kvrK   rL   rM   
<dictcomp>k   s    z-_prepare_response_content.<locals>.<dictcomp>)
isinstancer+   getattrr   r   listdictitemsdataclassesis_dataclassasdict)r@   rA   r>   r?   rC   rL   rK   rM   rH   J   s,    

	
	

rH   T)fieldincludeexcluderD   rA   r>   r?   is_coroutine)
rZ   response_contentr[   r\   rD   rA   r>   r?   r]   rB   c        	      	      s   | rg }	t | ds"t||||d}|r<| j|i dd\}
}nt| j|i ddI d H \}
}t|trn|	| n|r||	| |	rtt	|	|dt | dr| j
|
||||||dS t|
||||||dS t|S d S )N	serializerF   )response)loc)errorsbody)r[   r\   rD   rA   r>   r?   )hasattrrH   validater-   rR   rT   extendappendr"   r   r_   r   )rZ   r^   r[   r\   rD   rA   r>   r?   r]   rb   valueZerrors_rL   rL   rM   serialize_responsey   s\    
   

 


ri   )	dependantvaluesr]   rB   c                    s@   | j d k	std|r(| j f |I d H S t| j f|I d H S d S )N!dependant.call must be a function)callAssertionErrorr-   rj   rk   r]   rL   rL   rM   run_endpoint_function   s    rp   )rj   
body_fieldstatus_coderesponse_classresponse_fieldresponse_model_includeresponse_model_excluderesponse_model_by_aliasresponse_model_exclude_unsetresponse_model_exclude_defaultsresponse_model_exclude_nonedependency_overrides_providerrB   c                    sx   j d k	stdtj o.tjtjt|trB|j	 n| t
td 	
fdd}|S )Nrl   )requestrB   c                    sr  zd }r҈rD|   I d H }| jd}t|ts6t||j n|  I d H }|rt	}| j
d}|sz|  I d H }nFtj }||d< | dkr| }|dks|dr|  I d H }|t	kr|}n|}W n tjk
r$ } z.tdd|jfdi d	|jid
g|jd|W 5 d }~X Y nH tk
r:    Y n2 tk
rj } ztddd|W 5 d }~X Y nX t| |dI d H }	|	\}
}}}}|rtt||dnt|
dI d H }t|tr|jd kr||_|S d|i}rn|j}|d k	r||d< |jr|j|d< t|	
d	I d H } |f|}t |jsXd|_|j
j!"|j
j! |S d S )NZfastapi_astackzcontent-typeZapplicationjsonz+jsonZjson_invalidrc   zJSON decode errorerror)typera   msginputctx)rc   i  z#There was an error parsing the body)rr   detail)r|   rj   rc   r{   ro   
backgroundrr   )	rZ   r^   r[   r\   rD   rA   r>   r?   r]       )#formscopegetrR   r   rn   push_async_callbackcloserc   r   headersr}   emailmessageMessageget_content_maintypeget_content_subtypeendswithJSONDecodeErrorr!   posr   docr.   	Exceptionr   r   rp   r1   r   rr   ri   r*   rawrf   )r|   rc   stackZ
body_bytesZ	json_bodyZcontent_type_valuer   subtypeesolved_resultrk   rb   Zbackground_tasksZsub_response_Zraw_responseZresponse_argsZcurrent_status_codecontentr`   Zactual_response_classrq   rj   r{   Zis_body_formr]   rt   rw   rv   ry   rz   rx   ru   rr   rL   rM   app   s    
	   

z get_request_handler.<locals>.app)rm   rn   asyncioiscoroutinefunctionrR   Z
field_infor   ZFormr   rh   r/   r1   )rj   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   r   rL   r   rM   get_request_handler   s    
.[r   )rj   r{   rB   c                    s   t d d fdd}|S )N)	websocketrB   c                    sZ   t |  dI d H }|\}}}}}|r2tt| jd k	sDtd jf |I d H  d S )N)r|   rj   r{   rl   )r   r#   r   rm   rn   )r   r   rk   rb   r   Z_2Z_3rj   r{   rL   rM   r   :  s    zget_websocket_app.<locals>.appr<   )rj   r{   r   rL   r   rM   get_websocket_app7  s    r   c                       sh   e Zd Zddddeedef ee eeej	  ee ddddZ
eeeef d fdd	Z  ZS )
APIWebSocketRouteN)namedependenciesr{   .)pathendpointr   r   r{   rB   c                C   s   || _ || _|d krt|n|| _t|p*g | _t|\| _| _| _	t
| j| jd| _| jd d d D ]}| jjdt|| jd qftt| j|d| _d S )Nr   rm   r   dependsr   r   )r   r   r5   r   rT   r   r4   
path_regexpath_formatparam_convertorsr   rj   insertr   r7   r   r   )selfr   r   r   r   r{   r   rL   rL   rM   __init__J  s"    	zAPIWebSocketRoute.__init__r   rB   c                    s*   t  |\}}|tjkr"| |d< ||fS Nroutesupermatchesr3   NONEr   r   matchZchild_scope	__class__rL   rM   r   f  s    
zAPIWebSocketRoute.matches)__name__
__module____qualname__strr   r   r
   r   r   Dependsr   r;   r   r3   r   __classcell__rL   rL   r   rM   r   I  s   
r   c                       sx  e Zd Zedddddddddddddddddddeedddeedeedef ee	e
 e	eeeef   e	eej  e	e e	e ee	eee
ef eeef f  e	e e	e e	eee ee f  e	e e	e e	e eeeeeeee ef e	e e	ee  e	eeef  eed gef ef dddd	Zeegeeeef f d
ddZeeeef d fddZ   Z!S )APIRouteNSuccessful ResponseTF)response_modelrr   tagsr   summarydescriptionresponse_description	responses
deprecatedr   methodsoperation_idru   rv   rw   rx   ry   rz   include_in_schemars   r{   	callbacksopenapi_extragenerate_unique_id_function.)r   r   r   rr   r   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r{   r   r   r   rB   c          $      C   s  || _ || _t|tr2t|}t|tr.d }n|}|| _|| _|	| _	|| _
|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|| _|pg | _|
pi | _|d krt|n|| _t|\| _| _| _|d krdg}dd |D | _ t|tr|j!}n|}| jp|| | _"t|t#r2t$|}|| _%| jrt&|sZt'd| dd| j" }t(|| jdd| _)t*| j)| _+nd | _)d | _+t,|pg | _-|pt./| jj0pd	| _1| j12d
d 3 | _1i }| j4 D ]n\}} t| t5st'd| 6d}!|!rt&|s&t'd| dd| d| j" }t(||!d}"|"||< q|r^|| _7ni | _7t8|svt'dt9| j| jd| _:| j-d d d D ] }#| j:j-;dt<|#| jd qt=| j:| j"d| _>t?| @ | _Ad S )NGETc                 S   s   h | ]}|  qS rL   )upper)rI   methodrL   rL   rM   	<setcomp>  s     z$APIRoute.__init__.<locals>.<setcomp>zStatus code z must not have a response bodyZ	Response_Zserialization)r   type_mode r   z%An additional response must be a dictmodelr   )r   r   zAn endpoint must be a callabler   r   r   )rj   r   )Br   r   rR   r   r   r   r1   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r{   r   r   r   r   r   r5   r   r4   r   r   r   r   rh   	unique_idr   intrr   r*   rn   r'   rt   r&   secure_cloned_response_fieldrT   r   inspectcleandoc__doc__r   splitstriprV   rU   r   response_fieldscallabler   rj   r   r   r   rq   r6   get_route_handlerr   )$r   r   r   r   rr   r   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r{   r   r   r   return_annotationcurrent_generate_unique_idZresponse_namer   Zadditional_status_coder`   r   rt   r   rL   rL   rM   r   n  s    "







zAPIRoute.__init__)rB   c                 C   s8   t | j| j| j| j| j| j| j| j| j	| j
| j| jdS )N)rj   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   )r   rj   rq   rr   rs   r   ru   rv   rw   rx   ry   rz   r{   )r   rL   rL   rM   r     s    zAPIRoute.get_route_handlerr   c                    s*   t  |\}}|tjkr"| |d< ||fS r   r   r   r   rL   rM   r     s    
zAPIRoute.matches)"r   r   r   r   r0   r(   r   r   r   r
   r   r	   r   r   r   r   r   r   boolr   r%   r   r1   r   r2   r   r/   r   r   r;   r   r3   r   r   rL   rL   r   rM   r   m  sx   

 "r   c                       sj  e Zd Zdddeeddddddedddddeedeee	e
eef   eeej  ee eee
eef eeef f  ee	e  ee	ej  eee ee ee eeeg ef   eeeg ef   eee  ee eeegef dd fddZd9eee	e  ee eeegef dd	d
Zeddddddddddddddddddeeddddeedeedef eee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee
ee e	e f  ee ee ee eeeeee
ee ef ee eee  ee	e  eeeef  e
eegef ef ddddZ eddddddddddddddddddeedddeedeeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee	e  ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef dddZ!d:ddeedef ee eeej  ddddZ"d;ddeee eeej  eegef dddZ#d<ee
edf eegef dddZ$dddeeddddeed 	d eee	e
eef   eeej  ee eee
eef eeef f  ee	e  ee eeegef dd!d"d#Z%edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d&d'Z&edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d(d)Z'edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d*d+Z(edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d,d-Z)edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d.d/Z*edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d0d1Z+edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d2d3Z,edddddddddddddddddeedddeed$eeee ee	e
eef   eeej  ee ee eeee
eef eeef f  ee ee ee ee eeeeeee ee ee	e  eeeef  eegef eegef d%d4d5Z-eeegef d6d7d8Z.  Z/S )=	APIRouterr   NT)prefixr   r   default_response_classr   r   routesredirect_slashesdefaultr{   route_class
on_startupon_shutdownlifespanr   r   r   )r   r   r   r   r   r   r   r   r   r{   r   r   r   r   r   r   r   rB   c                   s   t  j|||	|||d |r@|ds.td|dr@td|| _|pLg | _t|pXg | _|| _	|| _
|ppi | _|pzg | _|
| _|| _|| _|| _d S )N)r   r   r   r   r   r   /!A path prefix must start with '/'FA path prefix must not end with '/', as the routes will start with '/')r   r   
startswithrn   r   r   r   rT   r   r   r   r   r   r{   r   r   r   )r   r   r   r   r   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   rL   rM   r   
  s4    


zAPIRouter.__init__)r   r   r   r   rB   c                    s    t t d fdd}|S )NfuncrB   c                    s   j |  d | S )N)r   r   r   )	add_router   r   r   r   r   r   rL   rM   	decoratorC  s    z"APIRouter.route.<locals>.decoratorr$   )r   r   r   r   r   r   rL   r   rM   r   <  s    
zAPIRouter.router   Fr   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   route_class_overrider   r   r   .)r   r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r  r   r   r   rB   c          #      C   s   |p| j }|
pi }
| j|
}t|| j}| j }|r@|| | j }|rX|| | j } |rp| | t|| j	}!|| j
| ||||||||	||p| j|||||||||o| j||| j| ||!d}"| j|" d S )N)r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r{   r   r   r   )r   r   r)   r   r   copyrf   r   r   r   r   r   r   r{   r   rg   )#r   r   r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r  r   r   r   r   combined_responsesZcurrent_response_classcurrent_tagscurrent_dependenciescurrent_callbacksr   r   rL   rL   rM   add_api_routeO  sb    "

 





 zAPIRouter.add_api_router   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   )r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   rB   c                   sH   t t d 	
fdd}|S )Nr   c                    s@   j 
| 	 d | S )Nr  )r  r   r   r   r   r   r   r   r   r   r   r   r   rs   r   r   rw   rv   ry   rz   rx   ru   r   r   rr   r   r   rL   rM   r     s8    z&APIRouter.api_route.<locals>.decoratorr   )r   r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   r   rL   r	  rM   	api_route  s    DzAPIRouter.api_route)r   )r   r   r   r   rB   c                C   sB   | j  }|r|| t| j| |||| jd}| j| d S )N)r   r   r   r{   )r   r  rf   r   r   r{   r   rg   )r   r   r   r   r   r  r   rL   rL   rM   add_api_websocket_route  s    

z!APIRouter.add_api_websocket_route)r   r   r   rB   c                   s   t t d fdd}|S )Nr   c                    s   j |  d | S )N)r   r   )r  r   r   r   r   r   rL   rM   r     s       z&APIRouter.websocket.<locals>.decoratorr   )r   r   r   r   r   rL   r  rM   r     s    zAPIRouter.websocket)r   r   rB   c                    s   t t d fdd}|S )Nr   c                    s   j |  d | S )Nr   )add_websocket_router   r   r   r   rL   rM   r     s    z,APIRouter.websocket_route.<locals>.decoratorr   )r   r   r   r   rL   r  rM   websocket_route  s    zAPIRouter.websocket_route)	r   r   r   r   r   r   r   r   r   )routerr   r   r   r   r   r   r   r   r   rB   c       	         C   s  |r*| dstd|drhtdn>|jD ]6}t|d}t|dd}|d k	r0|s0td| dq0|d krti }|jD ]}t|tr||j}t	|j
|j|| j}g }|r|| |jr||j g }|r|| |jr||j g }|r|| |jr||j t	|j|j|
| j}| j||j |j|j|j|||j|j|j||jpj|pj| j|j|j|j|j|j|j|j |j!|j"o| j"o|	||j#t$|||j%|d	 qzt|t&j'rt(|jpg }| j)||j |j||j"|j#d
 qzt|t*rJg }|r|| |jr,||j | j+||j |j||j#d qzt|t&j,rz| j-||j |j|j#d qz|j.D ]}| /d| qx|j0D ]}| /d| qd S )Nr   r   r   r   r   unknownz6Prefix and path cannot be both empty (path operation: )r   )r   r   r   )r   r   r  Zstartupshutdown)1r   rn   r   r   rS   r    rR   r   r   r)   rs   r   rf   r   r   r   r   r  r   r   r   rr   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   r   r   r   r,   RouterT   r   r   r  WebSocketRouter  r   add_event_handlerr   )r   r  r   r   r   r   r   r   r   r   r   rr   r   r   r  Zuse_response_classr  r  r  r   r   handlerrL   rL   rM   include_router  s    







  

zAPIRouter.include_router)r   rr   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   )r   r   rr   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   rB   c                C   s<   | j |||||||||	|
dg|||||||||||||dS )Nr   r   r   rr   r   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   r
  r   r   r   rr   r   r   r   r   r   r   r   r   ru   rv   rw   rx   ry   rz   r   rs   r   r   r   r   rL   rL   rM   r     s4    zAPIRouter.getc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPUTr  r  r  rL   rL   rM   put  s4    zAPIRouter.putc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPOSTr  r  r  rL   rL   rM   post  s4    zAPIRouter.postc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NDELETEr  r  r  rL   rL   rM   delete-  s4    zAPIRouter.deletec                C   s<   | j |||||||||	|
dg|||||||||||||dS )NOPTIONSr  r  r  rL   rL   rM   optionse  s4    zAPIRouter.optionsc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NHEADr  r  r  rL   rL   rM   head  s4    zAPIRouter.headc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NPATCHr  r  r  rL   rL   rM   patch  s4    zAPIRouter.patchc                C   s<   | j |||||||||	|
dg|||||||||||||dS )NTRACEr  r  r  rL   rL   rM   trace  s4    zAPIRouter.trace)
event_typerB   c                    s   t t d fdd}|S )Nr   c                    s     |  | S )N)r  r   r,  r   rL   rM   r   H  s    z%APIRouter.on_event.<locals>.decoratorr   )r   r,  r   rL   r-  rM   on_eventE  s    zAPIRouter.on_event)NNT)N)N)N)0r   r   r   r   r0   r   r(   r   r
   r	   r   r   r   r   r   r   r1   r   r   r   r2   r,   r   r9   r   r:   r   r$   r   r   r%   r   r  r
  r  r   r  r  r   r  r!  r#  r%  r'  r)  r+  r.  r   rL   rL   r   rM   r   	  s  

5   



V

B 
   

}
<
<
<
<
<
<
<
9r   )N)dr   rW   email.messager   r   r}   
contextlibr   enumr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   Zfastapir   Zfastapi._compatr   r   r   r   r   r   Zfastapi.datastructuresr   r   Zfastapi.dependencies.modelsr   Zfastapi.dependencies.utilsr   r   r   r   r   Zfastapi.encodersr   Zfastapi.exceptionsr    r!   r"   r#   Zfastapi.typesr$   r%   Zfastapi.utilsr&   r'   r(   r)   r*   Zpydanticr+   Z	starletter,   Zstarlette.concurrencyr-   Zstarlette.exceptionsr.   Zstarlette.requestsr/   Zstarlette.responsesr0   r1   Zstarlette.routingr2   r3   r4   r5   r6   r7   r8   Zstarlette.typesr9   r:   r;   Zstarlette.websocketsr=   r   rH   ri   r   rp   r   r   r   r  r   r  r   ZRouterr   rL   rL   rL   rM   <module>   s   4  1> 
 u  $ 