
    Ki                        d Z ddlmZ ddlZddlmZ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mZmZmZmZ d	d
lmZmZ d	dlmZ  ed      Z G d dee         Z G d d      Zedd       Zedd       Zedd       Zedd       ZddZy)z9App-scoped shared dependencies: Shared and SharedContext.    )annotationsN)	AwaitableCallable)AbstractAsyncContextManagerAbstractContextManagerAsyncExitStack)
ContextVar)TracebackType)AnyClassVarTypeVarcastoverload   )DependencyFactory_FunctionalDependency)get_dependency_parametersRc                       e Zd ZdZddZddZy)_SharedzApp-scoped dependency resolved once and reused across all calls.

    Unlike _Depends (which resolves per-call), _Shared dependencies initialize
    once within a SharedContext and the same instance is provided to all
    subsequent resolutions.
    c                p  K   t         j                  j                         }| j                  |v r|| j                     S | j	                          d {   }t         j
                  j                         4 d {    | j                  |v r || j                     cd d d       d {    S t         j                  j                         } | j                  di |}| j                  ||       d {   }||| j                  <   |cd d d       d {    S 7 7 7 u7 ,7 # 1 d {  7  sw Y   y xY ww)N )SharedContextresolvedgetfactory_resolve_parameterslockstack_resolve_factory_value)selfr   	argumentsr   	raw_valueresolved_values         _/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/uncalled_for/shared.py
__aenter__z_Shared.__aenter__   s     ))--/<<8#DLL))2244	 %%))+ 		" 		"||x'-		" 		" 		" "''++-E$1y1I#'#>#>ui#PPN%3HT\\"!		" 		" 		" 5		" 		" Q		" 		" 		" 		"s   AD6D&D68D9D6<D!D6%D&D6+AD!0D1D!D6DD6D6D6D!D6!D3'D*(D3/D6c                   K   t         j                  j                         }i }t        | j                        }|j                         D ]!  \  }}|j                  |       d {   ||<   # |S 7 wN)r   r   r   r   r   itemsenter_async_context)r!   r   r"   
parameters	parameter
dependencys         r%   r   z_Shared._resolve_parameters1   sr     ##'')$&	.t||<
%/%5%5%7 	O!Iz).)B)B:)N#NIi 	O  $Os   A A0"A.#A0N)returnr   )r.   zdict[str, Any])__name__
__module____qualname____doc__r&   r   r       r%   r   r      s    "&r3   r   c                      e Zd ZU dZ ed      Zded<    ed      Zded<    ed      Zd	ed
<   ddZ		 	 	 	 	 	 	 	 ddZ
y)r   a  Manages app-scoped Shared dependency lifecycle.

    Use as an async context manager to establish a scope for Shared
    dependencies. All Shared factories resolved within this scope will
    be cached and reused. Context managers are cleaned up when the
    SharedContext exits.

    Example::

        async with SharedContext():
            async with resolved_dependencies(my_func) as dependencies:
                # Shared dependencies are resolved once and cached here
                ...
            async with resolved_dependencies(my_func) as dependencies:
                # Same Shared instances reused
                ...
        # Shared context managers are cleaned up here
    shared_resolvedz7ClassVar[ContextVar[dict[DependencyFactory[Any], Any]]]r   shared_lockz"ClassVar[ContextVar[asyncio.Lock]]r   shared_stackz$ClassVar[ContextVar[AsyncExitStack]]r   c                  K   t               | _        | j                  j                          d {    t        j                  j                  i       | _        t        j                  j                  t        j                               | _
        t        j                  j                  | j                        | _        | S 7 wr(   )r   _stackr&   r   r   set_resolved_tokenr   asyncioLock_lock_tokenr   _stack_token)r!   s    r%   r&   zSharedContext.__aenter__V   s     $&kk$$&&&,5599"=(--11',,.A)//33DKK@ 	's   -C B>BC c                P  K   | j                   j                  |||       d {    t        j                  j	                  | j
                         t        j                  j	                  | j                         t        j                  j	                  | j                         y 7 wr(   )
r9   	__aexit__r   r   resetr?   r   r>   r   r;   )r!   exc_type	exc_value	tracebacks       r%   rA   zSharedContext.__aexit__`   sx      kk##HiCCC!!$"3"34  !1!12$$T%9%9:	 	Ds   !B&B$BB&N)r.   r   )rC   ztype[BaseException] | NonerD   zBaseException | NonerE   zTracebackType | Noner.   None)r/   r0   r1   r2   r	   r   __annotations__r   r   r&   rA   r   r3   r%   r   r   <   ss    & ISIHE  0:-/HD
,H2<^2LE/L
;,
; (
; (	
;
 

;r3   r   c                     y r(   r   r   s    r%   SharedrJ   m   s    ILr3   c                     y r(   r   rI   s    r%   rJ   rJ   o   s    DGr3   c                     y r(   r   rI   s    r%   rJ   rJ   q   s    7:r3   c                     y r(   r   rI   s    r%   rJ   rJ   s   s    ,/r3   c                4    t        t        t        |             S )ub  Declare an app-scoped dependency shared across all calls.

    The factory initializes once within a ``SharedContext`` and the value is
    reused for all subsequent resolutions. Factories may be:

    - A sync function returning a value
    - An async function returning a value
    - A sync generator (context manager) yielding a value
    - An async generator (async context manager) yielding a value

    Context managers are cleaned up when the SharedContext exits.
    Identity is the factory function — multiple ``Shared(same_factory)``
    declarations anywhere resolve to the same cached value.
    )r   r   r   rI   s    r%   rJ   rJ   u   s     77#$$r3   )r   z-Callable[..., AbstractAsyncContextManager[R]]r.   r   )r   z(Callable[..., AbstractContextManager[R]]r.   r   )r   zCallable[..., Awaitable[R]]r.   r   )r   zCallable[..., R]r.   r   )r   zDependencyFactory[R]r.   r   )r2   
__future__r   r<   collections.abcr   r   
contextlibr   r   r   contextvarsr	   typesr
   typingr   r   r   r   r   
functionalr   r   introspectionr   r   r   r   rJ   r   r3   r%   <module>rW      s    ? "  / 
 #  9 9 @ 4CL##A& #L.; .;b 
 L 
 L	 G 
 G	 : 
 :	 / 
 /%r3   