o
    SDiR                     @   s  d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	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Zd dlmZ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" 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/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z; d dl<m=Z=m>Z> d dl?m@Z@ d dlAmBZBmCZCmDZDmEZEmFZFmGZG d dlHmIZI d dlJmKZK d dlLmMZM erd dlNmOZO eePQ ZRe
eSZTe jUd!i e:G dd dZVG dd  d eZWdS )"    N)	AwaitableCallable	CoroutineSequence)date)	getLogger)Path)TYPE_CHECKING	AnnotatedAnyOptionalUnioncast)	APIRouterFastAPIHTTPExceptionrouting)Default)get_redoc_htmlget_swagger_ui_html#get_swagger_ui_oauth2_redirect_html)get_openapi)Depends)HTMLResponse)Jinja2Templates)generate_unique_id)
Middleware)Request)JSONResponseResponse)	BaseRouteRoute)Lifespan)Selfassert_never
deprecated)DATACLASS_SLOTSsame_definition_as_in)CadwynChangelogResource_generate_changelog)CadwynStructureError)APIVersionFormatAPIVersionLocationHeaderVersionManagerURLVersionManagerVersionPickingMiddleware _generate_api_version_dependency)generate_versioned_routers)_RootCadwynAPIRouter)VersionBundle)VersionTypec                   @   s.   e Zd ZU eedef edef f ed< dS )FakeDependencyOverridesProvider.dependency_overridesN)__name__
__module____qualname__dictr   r   __annotations__ r<   r<   L/var/www/Datamplify/venv/lib/python3.10/site-packages/cadwyn/applications.pyr5   3   s   
 $r5   c                a       s|  e Zd Zeejd dZdddddddeddd	d
dddddddedddd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deeedf edf dedededeedeegee f f dee dee dee deedf dededed eedf d!ed"ed#eedf d$eeeeef  df d%eeeeeeef f  df d&eee df d'ee d(ed)eee df d*eedf d+eedf d,eedf d-eeeef df d.eee df d/eeee ee! f eeege"eeef f f df d0eeeg ef  df d1eeeg ef  df d2ee#e$ df d3eedf d4eeeeeef f df d5eeeeeef f df d6ed7ed8ed9eeee ef eeef f df d:eee df d;ee%df d<eedf d=ed>eeeef df d?ee&j'gef d@edAedBdf` fdCdDZ(e)e*j+dEedFedGedBdf fdHdIZ+dpdJdKZ,dpdLdMZ-e.dBeedNef edNef f fdOdPZ/e/j0dQeedNef edNef f dBdfdRdPZ/dBe1fdSdTZ2dUe%fdVdWZ3dXe%dBdfdYdZZ4d[edBefd\d]Z5d^d_ Z6d[edBefd`daZ7d[edBefdbdcZ8d[efdddeZ9d[ed*efdfdgZ:edhdie%dje%dkedBee fdldmZ;die%dje%d"edBee fdndoZ<  Z=S )qCadwynstatic)	directoryNcustom_headerr   zx-api-versionz
/changelogTFr    z0.1.0z/openapi.jsonz/docsz/redocz/docs/oauth2-redirect)-api_version_header_nameapi_version_locationapi_version_formatapi_version_parameter_nameapi_version_default_valueapi_version_titleapi_version_descriptionversioning_middleware_classchangelog_urlinclude_changelog_url_in_schemadebugtitlesummarydescriptionversionopenapi_urlopenapi_tagsserversdependenciesdefault_response_classredirect_slashesroutesdocs_url	redoc_urlswagger_ui_oauth2_redirect_urlswagger_ui_init_oauth
middlewareexception_handlers
on_startupon_shutdownlifespanterms_of_servicecontactlicense_infoopenapi_prefix	root_pathroot_path_in_servers	responses	callbackswebhooksr%   include_in_schemaswagger_ui_parametersgenerate_unique_id_functionseparate_input_output_schemasversionsrC   papi_version_header_name is deprecated and will be removed in the future. Use api_version_parameter_name instead.rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r%   rk   rl   rm   rn   extrareturnc       .   2         s  || _ ti | _d| _|d urtjdtdd |}|d ur%|dkr%tdt j	d9i d|d|d	|d
|d|d|d|d|d|d|dd dd dd d|d|d|d|d|d|d| d|!d|"d|#d|$d|%d |&d!|'d"|(d#|)d$|*d%|+d&|,d'|-d(|.|/ i | _
t| jd)| _|
| _|| _|| _|| _|| _|| _||| ||| |||(|*|+|'|-d*| _|| _|| _|d+d,| _|| _|| _|d-krt|d.| _tj| _n|dkrt| j jd/| _tj | _nt!| t"t#| j j}0|d0kr	t$| _%n|d1krt&| _%nt!|0 t'd9i | j|| j j(|d2| _)td9i | j}1| *|1 | +  | ,|1 | j-|	|| j| j j(|d3 | jd0krft.| j j d4d5 d6d7t/| j j krhtd8d S d S ):NFrp      )
stacklevelpathzYou tried to pass an api_version_default_value while putting the API version in Path. This is not currently supported by Cadwyn. Please, open an issue on our github if you'd like to have it.rM   rN   rO   rP   rQ   rS   rT   rU   rV   rW   rR   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r%   rk   rl   rm   rn   )dependency_overrides_provider)rX   rW   rv   r_   r`   ra   rV   rU   ri   r%   rk   rh   rm   -_rA   )rF   )possible_version_valuesr   string)rF   api_version_varrE   )rF   api_version_managerr{   rG   c                 S   s   | j S N)value)vr<   r<   r=   <lambda>   s    z!Cadwyn.__init__.<locals>.<lambda>T)keyreversezHVersions are not sorted correctly. Please sort them in descending order.r<   )0ro   r5   _dependency_overrides_provider_cadwyn_initializedwarningswarnDeprecationWarningr*   super__init___versioned_webhook_routersr   _latest_version_routerrK   rL   rY   rZ   rR   _kwargs_to_routerrE   rF   replace#api_version_pythonic_parameter_namerH   rI   r-   _api_version_managerfastapiHeader"_api_version_fastapi_depends_classr.   _version_values_setr   r$   nextiterr    api_version_validation_data_typestrr2   r{   router_add_utility_endpoints_add_default_versioned_routersinclude_routeradd_middlewaresortedlist)2selfro   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   r%   rk   rl   rm   rn   rq   default_version_exampleunversioned_router	__class__r<   r=   r   ;   s*  C
	
 !"&





$zCadwyn.__init__scopereceivesendc                    s2   | j s|   t j| _| |||I d H  d S r}   )r   _cadwyn_initializer   __call__)r   r   r   r   r   r<   r=   r      s
   
zCadwyn.__call__c                 C   s^   t | j| j| jd}|j D ]\}}| j||d q|j D ]	\}}|| j|< q d| _d S )N)rj   ro   )rQ   T)	r1   r   rj   ro   	endpointsitems_add_versioned_routersr   r   )r   generated_routersrQ   r   r<   r<   r=   r     s   
zCadwyn._cadwyn_initializec                 C   s*   | j D ]}tdi | j| jj|j< qd S )Nr<   )ro   r   r   r   versioned_routersr~   )r   rQ   r<   r<   r=   r     s   
z%Cadwyn._add_default_versioned_routers.c                 C   s   | j jS r}   r   r6   r   r<   r<   r=   r6     s   zCadwyn.dependency_overridesr~   c                 C   s   || j _d S r}   r   )r   r~   r<   r<   r=   r6     s   c                 C   s   t | j| jS r}   )r)   ro   r   r   r<   r<   r=   generate_changelog%  s   zCadwyn.generate_changelogr   c                 C   s   | j d ur|j| j | jtdg| jd | jd urW|j| j| jdd | jd urF|j| j| j	dd | j
rFdtdtfdd}| j| j
|dd	 | jd urY|j| j| jdd d S d S d S )
NGET)ru   endpointresponse_modelmethodsrk   Fru   r   rk   reqrr   c                    s   t  S r}   )r   )r   r<   r<   r=   swagger_ui_redirect@  s   z:Cadwyn._add_utility_endpoints.<locals>.swagger_ui_redirect)rk   )rK   add_api_router   r(   rL   rR   	add_routeopenapi_jsonsrY   swagger_dashboardr[   r   r   rZ   redoc_dashboard)r   r   r   r<   r<   r=   r   (  sF   




zCadwyn._add_utility_endpointsroutersc                 G   s   |D ]}| j | qd S r}   )r   r   )r   r   r   r<   r<   r=   &generate_and_include_versioned_routersQ  s   z-Cadwyn.generate_and_include_versioned_routersr   c           	         s  |j dp|j| jj}|| jjv r| jj| j}|}n|dkr.|  r.| jj}d}n
t	dd| dddd | j
D }d	d
 |D }| |}|r^||vr^| jr^| j
dd|i d }|| jv rk| j| j}tt| j|| j| j| j| j| j| j||| j| j
dS )NrQ   unversionedi  zOpenApi file of with version `z` not found)status_codedetailc                 s   s    | ]}| d V  qdS )urlN)get).0server_datar<   r<   r=   	<genexpr>e  s    z'Cadwyn.openapi_jsons.<locals>.<genexpr>c                 S   s   h | ]}|r|qS r<   r<   )r   r   r<   r<   r=   	<setcomp>f  s    z'Cadwyn.openapi_jsons.<locals>.<setcomp>r   r   )rN   rQ   openapi_versionrP   rO   rb   rc   rd   rX   rj   tagsrT   )query_paramsr   headersr   rF   r   rX   $_there_are_public_unversioned_routesunversioned_routesr   rT   _extract_root_pathrg   insertr   r   r   rN   r   rP   rO   rb   rc   rd   rS   )	r   r   rQ   rX   formatted_versionurlsserver_urlsrf   webhook_routesr<   r<   r=   r   U  sH   


zCadwyn.openapi_jsonsc                 C   s   t dd | jjD S )Nc                 s   s     | ]}t |to|jV  qd S r}   )
isinstancer!   rk   )r   router<   r<   r=   r     s    z>Cadwyn._there_are_public_unversioned_routes.<locals>.<genexpr>)anyr   r   r   r<   r<   r=   r     s   z+Cadwyn._there_are_public_unversioned_routesc                    st   |j d}|r0| |}|| j d|  }| j}|r!|| }t|| j d|| j| jdS | 	|t
t| jS )NrQ   	?version=z - Swagger UI)rR   rN   oauth2_redirect_url
init_oauthrl   )r   r   r   rR   r[   r   rN   r\   rl   _render_docs_dashboardr   r   rY   )r   r   rQ   rf   rR   r   r<   r<   r=   r     s    

zCadwyn.swagger_dashboardc                    sZ   |j d}|r"| |}|| j d|  }t|| j ddS | j|tt| j	dS )NrQ   r   z - ReDoc)rR   rN   )rY   )
r   r   r   rR   r   rN   r   r   r   rZ   )r   r   rQ   rf   rR   r<   r<   r=   r     s   
zCadwyn.redoc_dashboardc                 C   s   |j dddS )Nrf   rB   /)r   r   rstrip)r   r   r<   r<   r=   r     s   zCadwyn._extract_root_pathc                    sl   t |jd}| |}||   fdd| jjD }|  r,|d   diO }| jd||dS )Nr   c                    s    i | ]}|   d | qS )r   r<   )r   rQ   base_urlrY   r<   r=   
<dictcomp>  s     z1Cadwyn._render_docs_dashboard.<locals>.<dictcomp>r   z?version=unversionedz	docs.html)requesttable)	r   r   r   r   r   ro   r   
_templatesTemplateResponse)r   r   rY   	base_hostrf   r   r<   r   r=   r     s   
zCadwyn._render_docs_dashboardzMUse generate_and_include_versioned_routers and VersionBundle versions insteadfirst_routerother_routersheader_valuec             
   G   sJ   zt | W n ty } ztd|d}~ww | j|g|R d|iS )zWAdd all routes from routers to be routed using header_value and return the added routesz)header_value should be in ISO 8601 formatNrQ   )r   fromisoformat
ValueErrorr   )r   r   r   r   er<   r<   r=   add_header_versioned_routers  s   
z#Cadwyn.add_header_versioned_routersc                G   s   g }|| j jvrtdi | j| j j|< | j j| }| jd ur1|j| j| jdd ||jd  d}|g|R D ]$}| j j| j	|t
t| j|| j| j| j| jdgd |t|j7 }q9||j| d   | j j| |S )NFr   r   )r   default_valuefastapi_depends_classvalidation_data_typerN   rP   )rU   r<   )r   r   r   r   rR   r   r   appendrX   r   r   r0   r   r   r   rH   rI   lenextend)r   r   rQ   r   added_routesversioned_routeradded_route_countr   r<   r<   r=   r     s>   
zCadwyn._add_versioned_routers)rr   N)>r7   r8   r9   r   CURR_DIRparentr   r/   r   r   r   r3   r
   r   r   r%   r,   r+   r   r   r   r   typeboolr   r:   r   r   r   r   r    r   int	Exceptionr   r"   r#   r   r   APIRouter   r'   r   r   r   r   propertyr6   setterr(   r   r   r   r   r   r   r   r   r   r   r   __classcell__r<   r<   r   r=   r>   8   s   	




 
!
"#$&./0
123456"78
9
:;<=@AB D 

()+
r>   r<   )Xdataclassesr   collections.abcr   r   r   r   datetimer   loggingr   pathlibr   typingr	   r
   r   r   r   r   r   r   r   r   r   fastapi.datastructuresr   fastapi.openapi.docsr   r   r   fastapi.openapi.utilsr   fastapi.paramsr   fastapi.responsesr   fastapi.templatingr   fastapi.utilsr   starlette.middlewarer   starlette.requestsr   starlette.responsesr   r   starlette.routingr    r!   starlette.typesr"   typing_extensionsr#   r$   r%   cadwyn._utilsr&   r'   cadwyn.changelogsr(   r)   cadwyn.exceptionsr*   cadwyn.middlewarer+   r,   r-   r.   r/   r0   cadwyn.route_generationr1   cadwyn.routingr2   cadwyn.structurer3   cadwyn.structure.commonr4   __file__resolver   r7   logger	dataclassr5   r>   r<   r<   r<   r=   <module>   sH      