XjsddlmZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z m Z m Z mZddlmZmZmZddlmZddlmZddlmZmZddlmZdd lmZmZdd lmZdd lm Z m!Z!dd l"m#Z#m$Z$m%Z%dd l&m'Z'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4m5Z5m6Z6ddl7m8Z8m9Z9Gdde:Z;GddeZ< d/dZ= d0dZ>d1dZ? d2dZ@ejdZB d3dZCGddZDGdd eDZEGd!d"eDZFGd#d$eDZGGd%d&eDZHed'ZIGd(d)eeIZJ d4d*ZKGd+d,ZLGd-d.ZMy)5) annotationsN) AwaitableCallable Collection GeneratorSequence)AbstractAsyncContextManagerAbstractContextManagerasynccontextmanager)Enum)Pattern)AnyTypeVar)wrap_app_handling_exceptions)get_route_pathis_async_callable)run_in_threadpool)CONVERTOR_TYPES Convertor)URLHeadersURLPath) HTTPExceptionStarletteDeprecationWarning) Middleware)Request)PlainTextResponseRedirectResponseResponse)ASGIAppLifespanReceiveScopeSend) WebSocketWebSocketClosec$eZdZdZdfd ZxZS) NoMatchFoundz} Raised by `.url_for(name, **path_params)` and `.url_path_for(name, **path_params)` if no matching route exists. cdjt|j}t|d|d|dy)N, zNo route exists for name "z" and params "z".)joinlistkeyssuper__init__)selfname path_paramsparams __class__s e/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/starlette/routing.pyr/zNoMatchFound.__init__#s=4 0 0 234 5dV>&QSTU)r1strr2zdict[str, Any]returnNone)__name__ __module__ __qualname____doc__r/ __classcell__)r4s@r5r(r(s VVr6r(ceZdZdZdZdZy)MatchrN)r:r;r<NONEPARTIALFULLr6r5r@r@(s DG Dr6r@cbt|r|ntjt|dfd }|S)zi Takes a function or coroutine `func(request) -> response`, and returns an ASGI application. ctKt|||dfd }t||||d{y7w)NcZKd{}||||d{y77wNrF)scopereceivesendresponsefrequests r5appz*request_response..app..app<s.wZ'H5'40 0 0( 0s +'+)++rKr#rLr"rMr$r8r9)rr)rKrLrMrQrPrOs @r5rQzrequest_response..app9s8%$/ 19*38NNNs ,868rR)r functoolspartialr)funcrQrOs @r5request_responserV.s2"$'Y->->?PRV-WO Jr6cdfd }|S)zM Takes a coroutine `func(session)`, and returns an ASGI application. cvKt|||dfd }t||||d{y7w)N)rLrMc2Kd{y7wrJrF)rKrLrMrUsessions r5rQz+websocket_session..app..appPsw-  s rR)r%r)rKrLrMrQrZrUs @r5rQzwebsocket_session..appMs8E7> 9*38NNNs -979rRrF)rUrQs` r5websocket_sessionr[EsO Jr6cDt|d|jjS)Nr:)getattrr4r:)endpoints r5get_namer_Xs 8Z););)D)D EEr6ct|jD]O\}}d|zdz|vs||}|j|}|jd|zdz|}|j |Q||fS)N{})r,items to_stringreplacepop)pathparam_convertorsr2keyvalue convertors r5replace_paramsrl\s ;,,./! U 9s?d "(-I''.E<<c C7D OOC !  r6z4{([a-zA-Z_][a-zA-Z0-9_]*)(:[a-zA-Z_][a-zA-Z0-9_]*)?}cx|jd }d}d}t}d}i}tj|D]}|j d\}} | j d} | t vs Jd| dt | } |tj|||jz }|d |d | jd z }||||jz }|d |zz }||vr|j|| ||<|j}|r@d jt|} t|dkDrdnd} t!d| d| d||r3||dj#dd} |tj| dzz }n|tj||ddzz }|||dz }tj$|||fS)a* Given a path string, like: "/{username:str}", or a host string, like: "{subdomain}.mydomain.org", return a three-tuple of (regex, format, {param_name:convertor}). regex: "/(?P[^/]+)" format: "/{username}" convertors: {"username": StringConvertor()} /^rr7:zUnknown path convertor ''z(?P<>)z{%s}r*rAszDuplicated param name z at path N$) startswithset PARAM_REGEXfinditergroupslstriprreescapestartregexaddendr+sortedlen ValueErrorsplitcompile)rgis_host path_regex path_formatduplicated_paramsidxrhmatch param_nameconvertor_typerknamesendinghostnames r5 compile_pathrns//#&&GJK"%% C%%d+%*\\%%8" N'..s30^4L^L\\]2^^0#N3 biiS5;;= 9:: ZL)//):!<< tC%++-00 v ** ) )  ! !* -'0$iik#& &!234-.20% $PQQ:##C(+bii)C// biiST +c11 4:K ::j !;0@ @@r6c,eZdZddZddZddZddZy) BaseRoutectrJNotImplementedError)r0rKs r5matcheszBaseRoute.matches !##r6c trJr)r0r1r2s r5 url_path_forzBaseRoute.url_path_forrr6cKtwrJrr0rKrLrMs r5handlezBaseRoute.handles!##s cXK|j|\}}|tjk(rM|ddk(r tdd}||||d{y|ddk(rt }||||d{y|j ||j |||d{y7W747 w)z A route may be used in isolation as a stand-alone ASGI app. This is a somewhat contrived case, as they'll almost always be used within a Router, but could be useful for some tooling and minimal apps. typehttp Not Found status_codeN websocket)rr@rCrr&updater)r0rKrLrMr child_scoperNwebsocket_closes r5__call__zBaseRoute.__call__s "\\%0{ EJJ V}&,[cJugt444 v+-"0"2%eWd;;;  [!kk%$///5< 0s6A B* B$ $B*1B&2,B*B(B*&B*(B*NrKr#r8ztuple[Match, Scope]r1r7r2rr8rrR)r:r;r<rrrrrFr6r5rrs$$$0r6rcbeZdZddddd d dZd dZd dZd dZddZdd Zy)RouteNT)methodsr1include_in_schema middlewarec|jdsJd||_||_| t|n||_||_|}t |tjr'|j}t |tjr'tj|stj|rt||_| dg}n||_|/t|D]!\}} } ||jg| i| |_#|d|_nL|D chc]} | j#c} |_d|j vr|j j%dt'|\|_|_|_ycc} w)Nrn Routed paths must start with '/'GETHEAD)rxrgr^r_r1r isinstancerSrTrUinspect isfunctionismethodrVrQreversedrupperrrrrrh) r0rgr^rr1rrendpoint_handlerclsargskwargsmethods r5r/zRoute.__init__sWs#G%GG#   *.,HX&D !2#)9+<+<=/44 )9+<+<=   . /73C3CDT3U'1DH ' DH  !%-j%9 :!T6txx9$9&9 : ?DL9@AvFLLNADL $   (COPTCU@)4+@ Bs E2c|ddk(rt|}|jj|}|r|j}|j D]&\}}|j |j |||<(t|jdi}|j||j|d}|jr#|d|jvrtj|fStj|fStjifS)Nrrr2r^r2r)rrr groupdictrcrhconvertdictgetrr^rr@rDrErC r0rK route_pathrmatched_paramsrirjr2rs r5rz Route.matchess =F "'.JOO))*5E!&!2"0"6"6"8TJC*.*?*?*D*L*LU*SN3'T"599]B#?@ "">2+/==U <t[1 1!/0@0@$BWBWYd!e###D622r6c"K|jr`|d|jvrOddj|ji}d|vr td|tdd|}||||d{y|j |||d{y7!7w)NrAllowr*rQi)rheaderszMethod Not Allowed)rr+rrrQ)r0rKrLrMrrNs r5rz Route.handle s <2+/==U zz;..zz2~r6c $t|j}t|jj}||jk7s||k7r t ||t |j |j|\}}|rJt|dS)Nrrrrs r5rzWebSocketRoute.url_path_forRs+**,- d3388:; 499   >t[1 1!/0@0@$BWBWYd!e###D;77r6cFK|j|||d{y7wrJrQrs r5rzWebSocketRoute.handle]hhugt,,, !!ct|txr4|j|jk(xr|j|jk(SrJ)rrrgr^rs r5rzWebSocketRoute.__eq__`s9%0pTYY%**5LpQUQ^Q^bgbpbpQppr6ch|jjd|jd|jdS)Nrrrt)r4r:rgr1r0s r5rzWebSocketRoute.__repr__cs/..))*& WTYYMQRSSr6) rgr7r^rr1rrrr8r9rrrRrrrrFr6r5rr%s`  26 VV%V  V 0 V V:  8-qTr6rcreZdZ d dd d dZed dZd dZddZddZddZ dd Z y)MountNrc|dk(s|jdsJd| |Jd|jd|_|||_nt ||_|j|_|/t |D]!\}}}||j g|i||_#||_t|jdz\|_ |_ |_ y)Nrprnrz0Either 'app=...', or 'routes=' must be specified)routesz /{path:path}) rxrstriprg _base_appRouterrQrr1rrrrh) r0rgrQrr1rrrrs r5r/zMount.__init__hsrzT__S1U3UU1&"4h6hh4KK$ ?&)DN#62DN>>  !%-j%9 :!T6txx9$9&9 : COPTPYPY\jPjCk@)4+@r6c0t|jdgSNr)r]rrs r5rz Mount.routesst~~x44r6cF|ddvr|jdd}t|}|jj|}|r|j }|j D]&\}}|j |j|||<(d|jdz}|dt| } t|jdi} | j|| |jd||| z|jd } tj| fStjifS) Nrrr root_pathrprnrgr2 app_root_path)r2rrr^)rrrrrrcrhrrfrrrrQr@rErC) r0rKrrrrrirjremaining_path matched_pathr2rs r5rz Mount.matchess =1 1 +r2I'.JOO))*5E!&!2"0"6"6"8TJC*.*?*?*D*L*LU*SN3'T!$~'9'9&'A!A)*@S-@,@A "599]B#?@ "">2#.&+YY %J!*\!9 $ zz;..zz2~r6c |j\||jk(rMd|vrI|djd|d<t|j|j|\}}|st |S|j|j |jdzr|j|}n|t|jdzd}|jd}d|d<t|j|j|\}}|||d<|jxsgD]I} |j|fi|} t |jdt| z| jcSt||#t$rYcwxYw)Nrgrn)rgrqrArpr)r1r}rlrrhrrxrrrrrr7rr() r0r1r2rgrremaining_name path_kwarg path_prefixrouteurls r5rzMount.url_path_forsy 99 TTYY%66[;P"-f"5"<"2.9txxP zz;..zz2~r6c |jW||jk(rHd|vrD|jd}t|j|j|\}}|st ||S|j|j |jdzr|j|}n|t|jdzd}t|j|j|\}}|jxsgD]8} |j|fi|}t t||j|cSt||#t$rYRwxYw)Nrg)rgrrqrA)rgrr) r1rfrlrrhrrxrrrr7rr() r0r1r2rgrrrrr s r5rzHost.url_path_fors5 99 TTYY%66[;P??6*D%3D4D4DdF[F[]h%i "D"#Dt44 YY $//$))c/"Byy !%"&c$))nq&8&:!;%3D4D4DdF[F[]h%i "D"* ,%,,^P?OPC"C3<D?cFK|j|||d{y7wrJrrs r5rz Host.handlerrct|txr4|j|jk(xr|j|jk(SrJ)rrrrQrs r5rz Host.__eq__s6%&\499 +B\txxSXS\S\G\\r6c|jj}|jxsd}|d|jd|d|jdS)Nrpz(host=rr rt)r4r:r1rrQrs r5rz Host.__repr__rr6rJrr7rQr r1rr8r9rrrrRrrrrFr6r5rrs7V// ..-]Tr6r_Tc4eZdZddZddZ ddZy)_AsyncLiftContextManagerc||_yrJ)_cm)r0cms r5r/z!_AsyncLiftContextManager.__init__ s r6c>K|jjSwrJ)r' __enter__rs r5 __aenter__z#_AsyncLiftContextManager.__aenter__sxx!!##scDK|jj|||SwrJ)r'__exit__)r0exc_type exc_value tracebacks r5 __aexit__z"_AsyncLiftContextManager.__aexit__s! xx  9i@@s N)r(zAbstractContextManager[_T])r8r#)r.ztype[BaseException] | Noner/zBaseException | Noner0ztypes.TracebackType | Noner8z bool | None)r:r;r<r/r+r1rFr6r5r%r% s<$A,A(A. A  Ar6r%cntj|tjdfd }|S)Nc&t|SrJ)r%)rQcmgrs r5wrapperz+_wrap_gen_lifespan_context..wrapper!s'S 22r6)rQrr8z_AsyncLiftContextManager[Any]) contextlibcontextmanagerrSwraps)lifespan_contextr5r4s @r5_wrap_gen_lifespan_contextr:s8  $ $%5 6D__T33 Nr6c,eZdZddZddZddZd dZy) _DefaultLifespanc||_yrJ)_router)r0routers r5r/z_DefaultLifespan.__init__)s  r6c KywrJrFrs r5r+z_DefaultLifespan.__aenter__,  c KywrJrF)r0exc_infos r5r1z_DefaultLifespan.__aexit__/rArBc|SrJrF)r0rQs r5rz_DefaultLifespan.__call__2s r6N)r?r)r8r9)rDobjectr8r9)r0r#rQrFr8r#)r:r;r<r/r+r1rrFr6r5r<r<(s  r6r<ceZdZ ddd ddZddZddZddZddZddZdd Z ddd Z ddd Z d dd Z d dd Z y)rNrc|gn t||_||_| |jn||_|t ||_ntj|r+tjdtt||_nGtj|r+tjdtt||_n||_|j|_|r0t#|D]!\}}}||j g|i||_#yy)Nzjasync generator function lifespans are deprecated, use an @contextlib.asynccontextmanager function insteadzdgenerator function lifespans are deprecated, use an @contextlib.asynccontextmanager function instead)r,rredirect_slashes not_founddefaultr<r9risasyncgenfunctionwarningswarnrr isgeneratorfunctionr:rQmiddleware_stackr) r0rrIrKlifespanrrrrs r5r/zRouter.__init__7s#NbV  0)0t~~g  3CD3ID !  ' ' 1 MMJ+  %8$AD !  ( ( 2 MMv+ %?x$HD !$,D ! $ %-j%9 T!T6(+D,A,A(SD(SF(S% T r6cK|ddk(rt}||||d{yd|vr tdtdd}||||d{y757w)NrrrQrrr)r&rr)r0rKrLrMrrNs r5rJzRouter.not_found^sl =K ',.O!%$7 7 7  E>C0 0(#FHugt,,, 8 -s! AA/AAAAc |jD]} |j|fi|cSt||#t$rY1wxYwrJ)rrr()r0r1r2rs r5rzRouter.url_path_formsU[[ E )u))$>+>>  4--   s 3 ??c6Kd}|jd}|d{ |j|4d{}|#d|vr td|dj||ddid{d}|d{dddd{|dd id{y77q7<7-7#1d{7swY/xYw7$#t$rAt j }|r|d |d d{7|d |d d{7wxYww) z{ Handle ASGI lifespan messages, which allows us to manage application startup and shutdown events. FrQNstatez:The server does not support "state" in the lifespan scope.rzlifespan.startup.completeTzlifespan.shutdown.completezlifespan.shutdown.failed)rmessagezlifespan.startup.failed)rr9 RuntimeErrorr BaseExceptionr0 format_exc)r0rKrLrMstartedrQ maybe_stateexc_texts r5rQzRouter.lifespanus6 99U#i ?,,S1  [*e+*+ghh'N))+6F$?@AAAi   <=> > >%  B    ?  ++-H$>8TUUU $=(STTT   sDB+DC B-C 3B52B/3B5B1B5 C B3C  D%C &D-C /B51B53C 5C;B> <CC D -D9C<:DDDDcFK|j|||d{y7w)z; The main entry point to the Router class. N)rPrs r5rzRouter.__call__s ##E7D999rcK|ddvsJd|vr||d<|ddk(r|j|||d{yd}|jD]r}|j|\}}|tjk(r.|j ||j |||d{y|tjk(sl|o|}|}t|-|j |j |||d{yt|} |ddk(r|jr| dk7rt|} | jdr| djd| d<n | ddz| d<|jD]^}|j| \}}|tjk7s+t| } tt!|  } | |||d{y|j#|||d{y77B77+7w) Nr)rrrQr?rQrrnrgr)r )rQrrr@rErrrDrrIrendswithrrCrrr7rK) r0rKrLrMrTrrr partial_scoperredirect_scope redirect_urlrNs r5rQz Router.appsV} AAAA 5 "E(O =J &--w5 5 5 [[ ,E"'u!5 E; " [)ll5'4888%--'GO +  ,   LL '..6 6 6 #E* =F "t'<'<sAR!%[N""3')7)?)F)Fs)Kv&)7)?#)Ev& %*]]>%B"{EJJ&#&^#rs"  PP__E>3;::K+&MMCC:V9V D  = . 0 &F   /    bjjOP 5A 5A85Ap00<^RI^RB?TY?TDaTIaTH;T9;T| T] A:2> A ? 6   u"u"r6