o
    㥵i%                     @  s@  d dl m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 d dlmZmZ erJddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm Z! ddl"m#Z# ddl$m%Z%m&Z& G dd deddZ'G dd de'Z(G dd dZ)ededZ*d'ddZ+d(d!d"Z,d)d%d&Z-dS )*    )annotationsN)Path)TYPE_CHECKINGAnyDictIterableListOptionalSequenceTypeVar)Literal	TypedDict   )HttpRequest)Kui)RequestValidationError)_get_response_docs)DEFINITIONS_KEY   )specification)merge_openapi_info)schema_request_bodyschema_responsec                   @     e Zd ZU ded< dS )TagDetailOptionalzSequence[str]pathsN__name__
__module____qualname____annotations__ r!   r!   K/home/ubuntu/.local/lib/python3.10/site-packages/kui/openapi/application.pyr         
 r   F)totalc                   @  r   )	TagDetailstrdescriptionNr   r!   r!   r!   r"   r%      r#   r%   c                   @  sV   e Zd Zdddi fi ddddd-ddZd.ddZd/d!d"Zd0d%d&Zd1d*d+Zd,S )2OpenAPIu   Kuí APIz1.0.0)titleversionswagger T)tagstemplate_nametemplatereloadinfo	spec.Infosecurity_schemes/Dict[str, spec.SecurityScheme | spec.Reference]r-   Dict[str, TagDetail]r.   &Literal['redoc', 'swagger', 'rapidoc']r/   r&   r0   boolreturnNonec                C  s   |dkrt t jd | d jdd}|| _|| _tjd|i dd |	 D i d	| _
|r;| j
d
i }||d< i | _i | _|	 D ]\}}	|	dg D ]}
| j|
g | qOqEd S )Nr,   	templatesz.htmlutf8)encodingz3.1.0c                 S  s"   g | ]\}}|| d ddqS )r'   r,   )namer'   )get).0tag_nametag_infor!   r!   r"   
<listcomp>7   s    z$OpenAPI.__init__.<locals>.<listcomp>)openapir1   r   r-   
componentsrD   securitySchemesr   )r   __file__absoluteparent	read_texthtml_templater0   specr(   itemsrC   
setdefaultr3   path2tagr>   append)selfr1   r3   r-   r.   r/   r0   rD   r@   rA   pathr!   r!   r"   __init__!   s2   

zOpenAPI.__init__applicationASGIKui | WSGIKui
spec.Pathsc                   s&   dd  fdd j j D D S )Nc                 S     i | ]	\}}|r||qS r!   r!   )r?   rQ   openapi_path_itemr!   r!   r"   
<dictcomp>I   s    z+OpenAPI._generate_paths.<locals>.<dictcomp>c                 3  s&    | ]\}}|  ||fV  qd S N)_generate_path)r?   path_formathandlerrS   rP   r!   r"   	<genexpr>K   s
    
z*OpenAPI._generate_paths.<locals>.<genexpr>)router	http_treeiterator)rP   rS   r!   r]   r"   _generate_pathsH   s
   
zOpenAPI._generate_pathsviewr   rQ   spec.PathItemc                   s   t dr t fdddd ttt jD D }nt dr8tttj 	 i}ni }tt
j|S )z1
        Generate documents under a path
        __methods__c              	     s"   i | ]}|  t|qS r!   )_generate_methodgetattrr?   methodrS   rQ   rP   rc   r!   r"   rX   Z   s    z*OpenAPI._generate_path.<locals>.<dictcomp>c                 s  s$    | ]}|  d kr|  V  qdS )optionsN)lowerrh   r!   r!   r"   r^   ^   s    z)OpenAPI._generate_path.<locals>.<genexpr>
__method__)hasattr_clear_emptytypingcastr   r&   re   rm   rl   rf   rK   PathItem)rP   rS   rc   rQ   resultr!   rj   r"   rZ   R   s"   

zOpenAPI._generate_pathfuncspec.Operationc              	   C  sV  i }t |drt|jtr|j|d< t |dr"t|jtr"|j|d< i }t|dg D ]}| jt	|d  |t	|d  q*dd	 |
 D |d
< t|dg  |d< }ttt|dg |}||d< i }	t|dg }
|sr|r|jt}|d u r~t|
t| |
D ]o}t|
 D ]\}}||= ||t|< q| D ]!}t|di 
 D ]\}}t|d }||di | d< qqt|	 t| @ }|r|D ]}i |	| di || di }|r||	| d< qq|	| q|	|d< |r|| jv r| j| |d< t|dg |dg  |d< ttjtt|t|di }|S )N__docs_summary__summary__docs_description__r'   __docs_security__schemerequiredc                 S  s   g | ]\}}||iqS r!   r!   r?   kvr!   r!   r"   rB      s    z,OpenAPI._generate_method.<locals>.<listcomp>security__docs_parameters__
parameters__docs_request_body__requestBody__docs_responses__contentschema	responsesr-   __docs_tags____docs_extra__) rn   
isinstancerv   r&   rx   rg   r3   updatecopydeepcopyrL   r   _create_modelexception_middleware_lookup_exception_handlerr   RuntimeErrorextendr   listvaluesr>   r   setkeysrN   rp   rq   rK   	Operationr   ro   )rP   rS   rt   rQ   rs   security_setsecurity_dictr   request_bodyr   r   r\   response_docsr}   r~   response
media_typemedia_type_valuer   need_merge_status_codesstatus_coder   	operationr!   r!   r"   rf   r   s~   

zOpenAPI._generate_methodrequest!ASGIHttpRequest | WSGIHttpRequestspec.OpenAPIc                 C  s   t | j}dddtjdd|jjddgdd	|jjd
dddg|d< i | _t | 	|j
}| D ]}tdd | D ]}ttj|}d|vrQi |d< q@q5|di }| jrf|di | j |di }|jdi t| ||d< |S )N/zCurrent server)urlr'   z{scheme}://{address}/zCustom API Server Hosthttphttpszhttp or https)defaultenumr'   zapi server's host[:port])r   r'   )rz   address)r   r'   	variablesserversc                 S  s
   t | tS rY   )r   dict)xr!   r!   r"   <lambda>   s   
 z%OpenAPI.create_docs.<locals>.<lambda>r   rD   rE   schemasr   r!   )r   r   rC   rK   Serverr   rz   netlocr3   rb   appr   filterrp   rq   r   rM   r   _pop_definitions)rP   r   rC   r   	path_itemr   rD   r   r!   r!   r"   create_docs   sB   zOpenAPI.create_docsN)r1   r2   r3   r4   r-   r5   r.   r6   r/   r&   r0   r7   r8   r9   )rS   rT   r8   rU   )rS   rT   rc   r   rQ   r&   r8   rd   )rS   rT   rt   r   rQ   r&   r8   ru   )r   r   r8   r   )r   r   r   rR   rb   rZ   rf   r   r!   r!   r!   r"   r(       s    
'


 Tr(   	_DictType)bounddr8   c                 C  s   t tdd |  D S )Nc                 S  rV   r!   r!   r|   r!   r!   r"   rX      s    z _clear_empty.<locals>.<dictcomp>)rp   rq   r   rL   )r   r!   r!   r"   ro      s   ro   bases
List[type]Optional[type]c                 C  s   | r
t dt| i S d S )NT_SchemaModel)typetuple)r   r!   r!   r"   r      s   r   Dict[str, Any]Dict[str, spec.Schema]c                 C  s   i }|   D ]7\}}|dkr|ti   S t|tr#|t| qt|ttfr<|D ]}t|tr:|t| q,q	 q|S )Nr   )	rL   popr   r   r   r   r   r   r   )r   definitionskeyvaluer~   r!   r!   r"   r      s   

r   )r   r   r8   r   )r   r   r8   r   )r   r   r8   r   ).
__future__r   r   rp   pathlibr   r   r   r   r   r   r	   r
   r   typing_extensionsr   r   asgir   ASGIHttpRequestr   ASGIKuiwsgiWSGIHttpRequestWSGIKui
exceptionsr   r   r   pydantic_compatibler   r,   r   rK   
extra_docsr   r   r   r   r   r%   r(   r   ro   r   r   r!   r!   r!   r"   <module>   s2    ( N

