o
    ADi                     @  s  d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
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l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# dldmddZ$dldnddZ%dddddod!d"Z&e
j'G d#d$ d$Z(d%ddd&dpd1d2Z)d3ddd&dqd6d7Z*drd8d9Z+G d:d' d'eZ,dsd=d>Z-dtd@dAZ.e	dudDdEZ/e	dvdJdEZ/e	dwdNdEZ/e	dxdRdEZ/e	dydVdEZ/e	dzdZdEZ/e	d{d^dEZ/e	d|dbdEZ/e	d}dfdEZ/e	d~djdEZ/ddkdEZ/dS )    )annotations)Callable)suppress)AnyProtocoloverloadN)Configurator)Registry)Request)Response)get_current_registryget_current_request   )_KEY_CONTAINER_KEY_REGISTRYT1T2T3T4T5T6T7T8T9T10requestRequest | Nonereturnsvcs.Containerc                 C  s   | du rt  } t| tS )z
    Get the current container either from *request* or from thread locals.

    Args:
        request: If None, thread locals are used.
    N)r   getattrr   r    r!   E/var/www/Datamplify/venv/lib/python3.10/site-packages/svcs/pyramid.py	svcs_from%   s   
r#   rhPyramidRegistryHaver | Nonesvcs.Registryc                 C  s   | r| j nt }|t S )zn
    Get the registry from *rh* or thread locals.

    Args:
        rh: If None, thread locals are used.
    )registryr   r   )r$   r'   r!   r!   r"   get_registry2   s   r(   )r'   tween_under
tween_overconfigr   r'   svcs.Registry | Noner)   r   r*   Nonec                C  s&   |pt  | jt< | jd||d dS )a  
    Configure *config* to work with *svcs*.

    *svcs* uses a :term:`tween` to manage the life cycle of the container. You
    can affect its position by passing *tween_under* and *tween_over*.

    .. _Tween: https://docs.pylonsproject.org/projects/pyramid/en/main/glossary.html#term-tween

    Args:
        config: Pyramid configurator object.

        registry:
            A custom *svcs* registry to use. If None, a new one is created.

        tween_under:
            Passed unchanged to :meth:`pyramid.config.Configurator.add_tween()`
            as *under*.

        tween_over:
            Passed unchanged to :meth:`pyramid.config.Configurator.add_tween()`
            as *over*.
    zsvcs.pyramid.ServicesTween)overunderN)svcsr	   r'   r   	add_tween)r+   r'   r)   r*   r!   r!   r"   init>   s   
r2   c                   @  s,   e Zd ZU dZded< ded< dd
dZdS )ServicesTweenzC
    Handle *svcs* container life cycle for a Pyramid request.
    zCallable[[Request], Response]handlerr	   r'   r   r
   r   r   c                   s(   d	 fdd}|j |tdd  |S )
Nr   r
   r   r   c                   s&   t jt  |  fdd  S )Nc                   s      S N)close)_conr!   r"   <lambda>n   s    z@ServicesTween.__call__.<locals>.make_container.<locals>.<lambda>)r0   	Containerr'   r   add_finished_callbackr    selfr8   r"   make_containerl   s   z.ServicesTween.__call__.<locals>.make_containerT)reify)r   r
   r   r   )set_propertyr   r4   )r>   r   r?   r!   r=   r"   __call__k   s   
zServicesTween.__call__N)r   r
   r   r   )__name__
__module____qualname____doc____annotations__rB   r!   r!   r!   r"   r3   b   s
   
 r3   Tenterpingon_registry_closePyramidRegistryHaversvc_typetypefactoryr   rI   boolrJ   Callable | NonerK   c                C     | j t j|||||d dS )z^
    Same as :meth:`svcs.Registry.register_factory()`, but uses registry on
    *config*.
    rH   N)r'   r   register_factory)r+   rM   rO   rI   rJ   rK   r!   r!   r"   rS   v      

rS   Fvalueobjectc                C  rR   )z\
    Same as :meth:`svcs.Registry.register_value()`, but uses registry on
    *config*.
    rH   N)r'   r   register_value)r+   rM   rU   rI   rJ   rK   r!   r!   r"   rW      rT   rW   c                 C  s:   t t t|   W d   dS 1 sw   Y  dS )z
    Close the registry on *rh*, if present.

    Ideal for :func:`atexit.register()` handlers.

    Args:
        rh: An object that carries a :class:`pyramid.registry.Registry`.
    N)r   KeyErrorr(   r6   )r$   r!   r!   r"   close_registry   s   
	"rY   c                   @  s   e Zd ZU dZded< dS )rL   z
    An object with a :class:`pyramid.registry.Registry` as a ``registry``
    attribute. For example a :class:`~pyramid.config.Configurator` or an
    application.
    zdict[str, Any]r'   N)rC   rD   rE   rF   rG   r!   r!   r!   r"   rL      s   
 r
   list[svcs.ServicePing]c                 C  s   t |  S )z
    Like :meth:`svcs.Container.get_pings()`, but uses container on *request*.

    See Also:
        :ref:`pyramid-health`
    )r#   	get_pingsr    r!   r!   r"   r[      s   r[   	svc_typesc                 G     t | j| S )z_
    Same as :meth:`svcs.Container.get_abstract()`, but uses container from
    *request*.
    r#   getr   r\   r!   r!   r"   get_abstract      ra   type[T1]r   c                C     d S r5   r!   )r   rM   r!   r!   r"   r_      s   r_   	svc_type1	svc_type2type[T2]tuple[T1, T2]c                C  rd   r5   r!   )r   re   rf   r!   r!   r"   r_      s   	svc_type3type[T3]tuple[T1, T2, T3]c                C  rd   r5   r!   )r   re   rf   ri   r!   r!   r"   r_      s   	svc_type4type[T4]tuple[T1, T2, T3, T4]c                C  rd   r5   r!   )r   re   rf   ri   rl   r!   r!   r"   r_      s   	svc_type5type[T5]tuple[T1, T2, T3, T4, T5]c                C  rd   r5   r!   )r   re   rf   ri   rl   ro   r!   r!   r"   r_      s   		svc_type6type[T6]tuple[T1, T2, T3, T4, T5, T6]c                C  rd   r5   r!   )r   re   rf   ri   rl   ro   rr   r!   r!   r"   r_      s   
	svc_type7type[T7]!tuple[T1, T2, T3, T4, T5, T6, T7]c                C  rd   r5   r!   )r   re   rf   ri   rl   ro   rr   ru   r!   r!   r"   r_     s   	svc_type8type[T8]%tuple[T1, T2, T3, T4, T5, T6, T7, T8]c	   	       	      C  rd   r5   r!   )	r   re   rf   ri   rl   ro   rr   ru   rx   r!   r!   r"   r_     s   	svc_type9type[T9])tuple[T1, T2, T3, T4, T5, T6, T7, T8, T9]c
   
       
      C  rd   r5   r!   )
r   re   rf   ri   rl   ro   rr   ru   rx   r{   r!   r!   r"   r_   #  s   
svc_type10	type[T10].tuple[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]c                C  rd   r5   r!   )r   re   rf   ri   rl   ro   rr   ru   rx   r{   r~   r!   r!   r"   r_   3  s   c                 G  r]   )zg
    Same as :meth:`svcs.Container.get()`, but uses thread locals to find the
    current request.
    r^   r`   r!   r!   r"   r_   D  rb   r5   )r   r   r   r   )r$   r%   r   r&   )
r+   r   r'   r,   r)   r   r*   r   r   r-   )r+   rL   rM   rN   rO   r   rI   rP   rJ   rQ   rK   rQ   r   r-   )r+   rL   rM   rN   rU   rV   rI   rP   rJ   rQ   rK   rQ   r   r-   )r$   rL   r   r-   )r   r
   r   rZ   )r   r
   r\   rN   r   r   )r   r
   rM   rc   r   r   )r   r
   re   rc   rf   rg   r   rh   )
r   r
   re   rc   rf   rg   ri   rj   r   rk   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   r   rn   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   r   rq   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   rr   rs   r   rt   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   rr   rs   ru   rv   r   rw   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   rr   rs   ru   rv   rx   ry   r   rz   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   rr   rs   ru   rv   rx   ry   r{   r|   r   r}   )r   r
   re   rc   rf   rg   ri   rj   rl   rm   ro   rp   rr   rs   ru   rv   rx   ry   r{   r|   r~   r   r   r   )r   r
   r\   rN   r   rV   )0
__future__r   collections.abcr   
contextlibr   typingr   r   r   attrspyramid.configr   pyramid.registryr	   pyramid.requestr
   pyramid.responser   pyramid.threadlocalr   r   r0   _corer   r   r   r   r   r   r   r   r   r   r   r   r#   r(   r2   definer3   rS   rW   rY   rL   r[   ra   r_   r!   r!   r!   r"   <module>   sj   8$




	
