o
    㥵i:                     @  s  d dl m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	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 d dlmZ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&m'Z'm(Z(m)Z) erd
dl*m+Z, d
dl-m.Z/ d
dl0m+Z1 d
dl2m3Z3 d
dl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ede
dZ>dd Z?dd Z@d^ddZAd_d d!ZBd`d#d$ZCdad%d&ZDdbd.d/ZEdcd2d3ZFddd7d8ZGdedCdDZHdfdIdJZIdgdPdQZJdRdS ZKdhdVdWZLdidZd[ZMd\d] ZNdS )j    )annotationsN)groupby)TYPE_CHECKINGAnyCallableDict	GeneratorListOptionalSequenceSetTupleTypeTypeVarUnion)cast)FormData)	BaseModelValidationErrorcreate_model)	FieldInfo)	AnnotatedLiteralget_args
get_originget_type_hints   )create_root_modelget_model_fieldsget_model_json_schemavalidate_model)HTTPConnection)specification)RequestValidationError)safe_issubclass   )BaseHTTPFieldInfoDependsInBodyInCookieInHeaderInPathInQueryCallableObject)boundc                 C  s   dd dd t | D D S )Nc                 S  s   g | ]	}|D ]}|qqS  r/   ).0ijr/   r/   K/home/ubuntu/.local/lib/python3.10/site-packages/kui/parameters/__init__.py
<listcomp>8   s    z<lambda>.<locals>.<listcomp>c                 s  s*    | ]}t |tu rt|n|gV  qd S N)r   r   get_annotated_args)r0   tr/   r/   r3   	<genexpr>:   s
    
z<lambda>.<locals>.<genexpr>)r   )tpr/   r/   r3   <lambda>8   s
    r:   c                 C  s   t t| |d|dS )N)key)r   sorted)iterabler;   r/   r/   r3   r:   A       itemsSequence[Tuple[str, Any]]return Dict[str, Union[Any, List[Any]]]c                 C  s"   dd dd t | dd D D S )zS
    If there are values with the same key value, they are merged into a List.
    c                 S  s*   i | ]\}}|t |d kr|n|d qS )r%   r   )len)r0   kv_listr/   r/   r3   
<dictcomp>J   s    z&_merge_multi_value.<locals>.<dictcomp>c                 s  s&    | ]\}}|d d |D fV  qdS )c                 S  s   g | ]\}}|qS r/   r/   )r0   _vr/   r/   r3   r4   M   r>   z0_merge_multi_value.<locals>.<genexpr>.<listcomp>Nr/   )r0   rD   kv_iterr/   r/   r3   r8   L   s
    
z%_merge_multi_value.<locals>.<genexpr>c                 S     | d S )Nr   r/   kvr/   r/   r3   r:   N       z$_merge_multi_value.<locals>.<lambda>)sorted_groupby)r?   r/   r/   r3   _merge_multi_valueD   s
   rO   siginspect.SignatureTuple[Dict[Literal['path', 'query', 'header', 'cookie'], Type[BaseModel]] | None, Type[BaseModel] | None, Dict[Type[BaseModel], str], Dict[Literal['path', 'query', 'header', 'cookie'], Dict[str, Any]]]c                   s  dd dD  i }i i i i d}| j  D ]\}}t|jtu s(t|jtu s(q|jr3td| d|j}t|jtu rDt||jf }t|^}}t	dd |D ]} nq|j
rgt|}	|	 |j< |||	< qt |j trt|j  d	|j  d
tt	dd |}
||
f |j |< t|tttfr|jr|j||j |
jp|< qt	dd  fddt  D D ]\}}t|tr|}	ntdi |}	|	 |< qd v r܈ d}nd } rttttt f  }nd }ttt d tt f ||||fS )Nc                 S  s   i | ]}|i qS r/   r/   r0   r;   r/   r/   r3   rF   [   s    z?_parse_parameters_and_request_body_to_model.<locals>.<dictcomp>)pathqueryheadercookiebody)rT   rU   rV   rW   z
Parameter z1 cannot be defined as positional only parameters.c                 S  s   t | tttttfS r5   )
isinstancer+   r,   r*   r)   r(   xr/   r/   r3   r:   v   r>   z=_parse_parameters_and_request_body_to_model.<locals>.<lambda>z(exclusive=True) and z  cannot be used at the same timec                 S  
   t | tS r5   )rY   r   rZ   r/   r/   r3   r:         
 c                 S  rJ   )Nr%   r/   rK   r/   r/   r3   r:      rM   c                 3  s    | ]
}|  |fV  qd S r5   poprS   raw_parametersr/   r3   r8      s    z>_parse_parameters_and_request_body_to_model.<locals>.<genexpr>temporary_modelrX   )rb   )!
parametersr?   r   defaultr   
annotationPOSITIONAL_ONLY	TypeErrorr6   filter	exclusiver   _inr$   r   RuntimeError
capitalizenextrY   r,   r*   r)   securityaliastuplekeysr   r_   typing_castr   strr   r   )rP   exclusive_modelssecurity_infonameparamannontated_definetype_annontated_list	kui_fieldmodel
field_infor;   paramsrequest_bodyrc   r/   r`   r3   +_parse_parameters_and_request_body_to_modelS   s   




r   Dict[str, Depends]c                 C  s,   i dd | j  D dd | j  D S )Nc                 S  sP   i | ]$\}}t |jtu rtd d t|jD r|ttdd t|jqS )c                 s  s    | ]}t |tV  qd S r5   rY   r'   )r0   argr/   r/   r3   r8      s    z2_parse_depends_attrs.<locals>.<dictcomp>.<genexpr>c                 S  r\   r5   r   rZ   r/   r/   r3   r:      r]   z1_parse_depends_attrs.<locals>.<dictcomp>.<lambda>)r   re   r   anyr   rm   rh   r0   rv   rw   r/   r/   r3   rF      s    z(_parse_depends_attrs.<locals>.<dictcomp>c                 S  s$   i | ]\}}t |jtr||jqS r/   )rY   rd   r'   r   r/   r/   r3   rF      s    
)rc   r?   rP   r/   r/   r3   _parse_depends_attrs   s   r   c                 C  s    t jdd | j D | jdS )Nc                 S  sB   g | ]}t |jttfst|jtu rt t|jd  ts|qS )r%   )	rY   rd   r&   r'   r   re   r   r   r   )r0   rw   r/   r/   r3   r4      s    z)_create_new_signature.<locals>.<listcomp>)rc   return_annotation)inspect	Signaturerc   valuesr   r   r/   r/   r3   _create_new_signature   s   r   mOptional[Type[BaseModel]]position,Literal['path', 'query', 'header', 'cookie']security_fieldsSet[str]List[spec.Parameter]c                   sB   | d u rg S t | }|d }|dd fdd| D S )N
propertiesrequiredr/   c                   s>   g | ]\}}|vr || d d|v || dddqS )description 
deprecatedF)inrv   r   r   schemar   r^   )r0   rv   r   r   r   r   r/   r3   r4      s    	

	z(_get_parameters_docs.<locals>.<listcomp>)r   getr?   )r   r   r   _schemasr   r/   r   r3   _get_parameters_docs   s   	r   r[   yc                   s     fdd|D  }|S )Nc                   s&   g | ] t t fd ds qS )c                   s    | d  d ko| d  d kS )Nrv   r   r/   )x_paramrw   r/   r3   r:      s    z3_merge_parameters_docs.<locals>.<listcomp>.<lambda>)r   map)r0   rZ   r   r3   r4      s    
z*_merge_parameters_docs.<locals>.<listcomp>r/   )r[   r   resultr/   rZ   r3   _merge_parameters_docs   s   r   handlerCallable[..., Any]List[Dict[Any, Any]]c                 C  sh   g }t t| rt| st| st| jddnt| dddD ]}t|t	r.|
| q"t|S )NT)include_extrasrA   )r   callabler   
isfunctionismethodr   __call__r   rY   dictappendcopydeepcopy)r   response_docsresponser/   r/   r3   _get_response_docs  s   




r   old_handlerrc   JDict[Literal['path', 'query', 'header', 'cookie'], Type[BaseModel]] | Noner   Type[BaseModel] | Nonedepend_functionsDict[str, Callable[..., Any]]ru   BDict[Literal['path', 'query', 'header', 'cookie'], Dict[str, Any]]Nonec              
   C  s  t |r|j}t|jtrBt |j}t|ds7t|ds7td|	ddD ]\}}t
|d| d| q'nt|dsBt
|d| |d urWt|dg }	|	| t
|d|	 |d urt|d	g }
t|d
g }| D ]\}}t|
t||t||  }
qk|dd | D  t
|d
| t
|d	|
 t
|dt|  | D ]P}t|dg }	|	t|dg  t
|d|	 t
|d	tt|d	g t|d	g  t|d
g }|t|d
g  t
|d
| t|dg }|t| t
|d| qd S )N__docs_summary____docs_description__)summaryr   z

r%   __docs_____docs_request_body____docs_parameters____docs_security__c                 s  s"    | ]}|  D ]}|V  qqd S r5   )r   )r0   pinfor/   r/   r3   r8   >  s     z_update_docs.<locals>.<genexpr>__docs_responses__)r   r   __func__rY   __doc__rs   cleandochasattrzipsplitsetattrgetattrr   r?   r   r   setrq   extendr   parse_docs_responsesr   )r   r   rc   r   r   ru   	clean_docrD   value__request_body____parameters____security__r   r|   func__responses__r/   r/   r3   _update_docs  sf   
	



	r   CDict[Literal['path', 'query', 'header', 'cookie'], Type[BaseModel]]requestASGIConnection | WSGIConnection7Generator[None, Any, List[Tuple[Type[BaseModel], Any]]]c              
   c  s   g }d| v r&z| t| d |j W n ty% } zt|dd }~ww d| v rMz| t| d t|j  W n tyL } zt|dd }~ww d| v rqz| t| d |jj	 W n typ } zt|dd }~ww d| v rz| t| d |j
 W n ty } zt|dd }~ww |rd V }t|trt| }z| t|| W |S  ty } zt|dd }~ww |S )NrT   rU   rV   rW   rX   )r   r    path_paramsr   r#   rO   query_paramsmulti_itemsheaders_dictcookiesrY   r   )rc   r   r   datae
_body_datar/   r/   r3   %_validate_parameters_and_request_body[  s^   





r   r   !List[Tuple[Type[BaseModel], Any]]rt   Dict[Type[BaseModel], str]Dict[str, Any]c                 C  s8   i }| D ]\}}|j dkr|| q|||| < q|S )Nrb   )__name__update)r   rt   r   r|   r   r/   r/   r3   (_convert_model_data_to_keyword_arguments  s   
r   c                 C  s"   t j| ddG dd d| }|S )z8
    Create a fake class for auto-bound parameters.
    r/   )updatedc                   @  s   e Zd ZdS )z#_create_new_class.<locals>.NewClassN)r   
__module____qualname__r/   r/   r/   r3   NewClass  s    r   )	functoolswraps)clsr   r/   r/   r3   _create_new_class  s   r   create_new_callback*Callable[[CallableObject], CallableObject]c                   s   d fdd}|S )z
    Create auto_params
    r   r-   rA   c                   s   t | dr/t| }tdd | jD ]}t| |} |}t||| qt|dt| d|  |S | } |}t|dt| d|  |S )N__methods__c                 S  s   |   S r5   )lowerrZ   r/   r/   r3   r:     rM   z9create_auto_params.<locals>.auto_params.<locals>.<lambda>__raw_handler__)r   r   r   r   r   r   )r   	new_classmethodold_callbacknew_callbackr   r/   r3   auto_params  s(   



z'create_auto_params.<locals>.auto_paramsN)r   r-   rA   r-   r/   )r   r   r/   r   r3   create_auto_params  s   r   new_handlerr   c                 C  sB   t |D ]}|ds|dv rt| |t|| qt| d| | S )z3
    Update wrapper for auto-bound parameters.
    r   )
__method__r   r   )dir
startswithr   r   )r  r   attrr/   r/   r3   update_wrapper  s   r  c                 C  s   g t | dg t| S )Nr   )r   r   )callbackr/   r/   r3   r     s
   
r   )r?   r@   rA   rB   )rP   rQ   rA   rR   )rP   rQ   rA   r   )rP   rQ   rA   rQ   )r   r   r   r   r   r   rA   r   )r[   r   r   r   rA   r   )r   r   rA   r   )r   r   r   r   rc   r   r   r   r   r   ru   r   rA   r   )rc   r   r   r   r   r   rA   r   )r   r   rt   r   rA   r   )r   r   rA   r   )r  r-   r   r   rA   r-   )O
__future__r   r   r   r   	itertoolsr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   rr   baize.datastructuresr   pydanticr   r   r   pydantic.fieldsr   typing_extensionsr   r   r   r   r   pydantic_compatibler   r   r   r    asgi.requestsr!   ASGIConnectionopenapir"   specwsgi.requestsWSGIConnection
exceptionsr#   utilsr$   fieldsr&   r'   r(   r)   r*   r+   r,   r-   r6   rN   rO   r   r   r   r   r   r   r   r   r   r   r   r  r   r/   r/   r/   r3   <module>   sH    <$
	


b





D
2

!