σ
Ώb]c           @@  sΏ   d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z d d l m Z e j	 e
  Z e j	 e
  Z d   Z d   Z d	   Z d
   Z d   Z d e f d     YZ d S(   sJ  Provides managed registration services on behalf of :func:`.listen`
arguments.

By "managed registration", we mean that event listening functions and
other objects can be added to various collections in such a way that their
membership in all those collections can be revoked at once, based on
an equivalent :class:`._EventKey`.

i    (   t   absolute_importNi   (   t   exc(   t   utilc         C@  s}   t  s |  t  k r d  St  j |   } xP | j   D]B } | t k r3 t | } | j |   | su t j |  qu q3 q3 Wd  S(   N(   t   _collection_to_keyt   popt   valuest   _key_to_collection(   t   reft   listener_to_keyt   keyt   dispatch_reg(    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   _collection_gced5   s    
c         C@  s`   |  j  } t | } | j } t j |  j  } | | k r> t S| | | <t | } | | | <t S(   N(   t   _keyR   R   t   weakreft
   _listen_fnt   FalseR   t   True(   t	   event_keyt   ownerR	   R
   t	   owner_reft
   listen_refR   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   _stored_in_collectionC   s    	
	


c         C@  sx   |  j  } t | } t j |  j  } | j } | j | d   | sN t | =n  | t k rt t | } | j |  n  d  S(   N(   R   R   R   R   R   R   t   NoneR   (   R   R   R	   R
   R   R   R   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   _removed_from_collectionV   s    	
	

c   	      C@  s‘   | s
 d  S| j  } |  j  }  t | } t |  } xj | D]b } t j  |  } | | } t | } |  | k r | |  | k s t  n
 | | |  <| | | <q7 Wd  S(   N(   R   R   R   R   t   AssertionError(	   t   newownert   oldownert   elementst   old_listener_to_keyt   new_listener_to_keyt	   listen_fnR   R	   R
   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   _stored_in_collection_multig   s    		




c         C@  su   | s
 d  S|  j  }  t |  } xQ | D]I } t j  |  } | | } t | } | j |  d   | s$ t | =q$ q$ Wd  S(   N(   R   R   R   R   R   R   (   R   R   R   R   R   R	   R
   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   _clear}   s    	


t	   _EventKeyc           B@  s   e  Z d  Z d Z d d  Z e d    Z d	   Z d
   Z	 d   Z
 d   Z d   Z e e e d d  Z e d    Z d   Z d   Z d   Z RS(   s)   Represent :func:`.listen` arguments.
    t   targett
   identifiert   fnt   fn_keyt   fn_wrapt   dispatch_targetc         C@  sv   | |  _  | |  _ | |  _ t | t j  rQ t | j  t | j  f |  _	 n t |  |  _	 | |  _
 | |  _ d  S(   N(   R"   R#   R$   t
   isinstancet   typest
   MethodTypet   idt   __func__t   __self__R%   R&   R'   (   t   selfR"   R#   R$   R'   t   _fn_wrap(    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   __init__   s    			$	c         C@  s   t  |  j  |  j |  j f S(   N(   R+   R"   R#   R%   (   R.   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyR   ₯   s    c         C@  s<   | |  j  k r |  St |  j |  j |  j |  j d | Sd  S(   NR/   (   R   R!   R"   R#   R$   R'   (   R.   R&   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   with_wrapper©   s    	c         C@  s<   | |  j  k r |  St |  j |  j |  j | d |  j Sd  S(   NR/   (   R'   R!   R"   R#   R$   R&   (   R.   R'   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   with_dispatch_target΅   s    c         O@  s  | j  d t  } | j  d t  } | j  d t  } |  j |  j |  j } } } t | j |  }	 |	 j | |  }
 |  j |
  }  t |  j j j	 |  j  } t
 | d  r½ | j   n  | sΙ | rχ |  j t j |  j d |  j | |   n |  j j j |  | |  d  S(   Nt   oncet   _once_unless_exceptiont   namedt   _sa_warnt   retry_on_exception(   R   R   R'   R#   R   t   getattrt   dispatcht   _adjust_fn_specR1   t   _eventst   hasattrR6   R   t	   only_oncet   listent   _listen(   R.   t   argst   kwR3   t   once_unless_exceptionR5   R"   R#   R$   t   dispatch_collectiont   adjusted_fnt   stub_function(    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyR>   Α   s&    c         C@  s°   |  j  } | t k r= t j d |  j |  j |  j f   n  t j |  } x] | j   D]O \ } } |   } |   } | d  k	 rY | d  k	 rY | j
 |  j |   qY qY Wd  S(   Ns*   No listeners found for event %s / %r / %s (   R   R   R   t   InvalidRequestErrorR"   R#   R$   R   t   itemsR   t   removeR1   (   R.   R	   R
   t   collection_reft   listener_reft
   collectiont   listener_fn(    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyRH   α   s    			c         C@  s   |  j  t k S(   s?   Return True if this event key is registered to listen.
        (   R   R   (   R.   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   containsρ   s    c         C@  sj   |  j  |  j } } t | j |  } | rJ | j | j  j |  |  n | j | j  j |  |  d  S(   N(   R'   R#   R8   R9   t
   for_modifyt   insertt   append(   R.   t	   propagateRO   R5   t   retvalR"   R#   RC   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   base_listenφ   s    c         C@  s   |  j  p |  j S(   N(   R&   R$   (   R.   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyR     s    c         C@  s+   t  |  |  r# | j |  j  t St Sd  S(   N(   R   RP   R   R   R   (   R.   R   t   list_(    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   append_to_list  s    c         C@  s!   t  |  |  | j |  j  d  S(   N(   R   RH   R   (   R.   R   RT   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   remove_from_list  s    c         C@  s+   t  |  |  r# | j |  j  t St Sd  S(   N(   R   t
   appendleftR   R   R   (   R.   R   RT   (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   prepend_to_list  s    (   R"   R#   R$   R%   R&   R'   N(   t   __name__t
   __module__t   __doc__t	   __slots__R   R0   t   propertyR   R1   R2   R>   RH   RM   R   RS   R   RU   RV   RX   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyR!      s&        			 				(   R[   t
   __future__R    t   collectionsR)   R   t    R   R   t   defaultdictt   dictR   R   R   R   R   R   R    t   objectR!   (    (    (    s8   lib/python2.7/site-packages/sqlalchemy/event/registry.pyt   <module>   s   					