U
    cc	                     @   sX   d dl Z d dlZd dlZddlmZ G dd dZG dd de jZG dd	 d	eZ	dS )
    N   )excc                   @   sD   e Zd Zi ZdZdd ZedddZedd Zedd
dZ	dS )ReversibleProxy)__weakref__c                 C   s:   |d k	r6t |tj}t | ttj|}|tj|< |S N)weakrefrefr   _target_gced	functoolspartial_proxy_objects)selftargetZ
target_ref	proxy_ref r   ?/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/ext/asyncio/base.py_assign_proxied   s    
zReversibleProxy._assign_proxiedNc                 C   s   | j |d  d S r   )r   pop)clsr   r   r   r   r   r	      s    zReversibleProxy._target_gcedc                 C   s
   t  d S r   )NotImplementedError)r   r   r   r   r   _regenerate_proxy_for_target"   s    z,ReversibleProxy._regenerate_proxy_for_targetTc                 C   sR   z| j t| }W n tk
r(   Y nX | }|d k	r<|S |rJ| |S d S d S r   )r   r   r   KeyErrorr   )r   r   Z
regenerater   proxyr   r   r   _retrieve_proxy_for_target&   s    
z*ReversibleProxy._retrieve_proxy_for_target)N)T)
__name__
__module____qualname__r   	__slots__r   classmethodr	   r   r   r   r   r   r   r      s   
r   c                   @   sF   e Zd ZdZejdddZdd Zdd Zejd	d
 Z	dd Z
dS )StartableContextr   Fc                    s   d S r   r   )r   is_ctxmanagerr   r   r   start:   s    zStartableContext.startc                 C   s   |    S r   )r!   	__await__r   r   r   r   r"   >   s    zStartableContext.__await__c                    s   | j ddI d H S )NT)r    )r!   r#   r   r   r   
__aenter__A   s    zStartableContext.__aenter__c                    s   d S r   r   )r   type_value	tracebackr   r   r   	__aexit__D   s    zStartableContext.__aexit__c                 C   s   t d| jj d S )Nz@%s context has not been started and object has not been awaited.)	async_excZAsyncContextNotStarted	__class__r   r#   r   r   r   _raise_for_not_startedH   s
    z'StartableContext._raise_for_not_startedN)F)r   r   r   r   abcabstractmethodr!   r"   r$   r(   r+   r   r   r   r   r   7   s   
r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ProxyComparabler   c                 C   s   t | S r   )idr#   r   r   r   __hash__R   s    zProxyComparable.__hash__c                 C   s   t || jo| j|jkS r   
isinstancer*   Z_proxiedr   otherr   r   r   __eq__U   s    
zProxyComparable.__eq__c                 C   s   t || j p| j|jkS r   r1   r3   r   r   r   __ne__[   s    
zProxyComparable.__ne__N)r   r   r   r   r0   r5   r6   r   r   r   r   r.   O   s   r.   )
r,   r
   r    r   r)   r   ABCr   r.   r   r   r   r   <module>   s   )