σ
Ώb]c           @@  s   d  Z  d d l 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	 e	 j
 e  Z d
   Z d e f d     YZ d e f d     YZ d e f d     YZ d   Z d   Z d e	 j e e  f d     YZ d e f d     YZ d e f d     YZ d S(   s΅  Base implementation classes.

The public-facing ``Events`` serves as the base class for an event interface;
its public attributes represent different kinds of events.   These attributes
are mirrored onto a ``_Dispatch`` class, which serves as a container for
collections of listener functions.   These collections are represented both
at the class level of a particular ``_Dispatch`` class as well as within
instances of ``_Dispatch``.

i    (   t   absolute_importNi   (   t   _ClsLevelDispatch(   t   _EmptyListener(   t   _JoinedListeneri   (   t   utilc         C@  s   |  j  d  o |  d k S(   Nt   _t   dispatch(   t
   startswith(   t   name(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _is_event_name   s    t   _UnpickleDispatchc           B@  s   e  Z d  Z d   Z RS(   s   Serializable callable that re-generates an instance of
    :class:`_Dispatch` given a particular :class:`.Events` subclass.

    c         C@  sJ   xC | j  D], } d | j k r
 | j d j j |  Sq
 Wt d   d  S(   NR   s*   No class with a 'dispatch' member present.(   t   __mro__t   __dict__R   t
   _for_classt   AttributeError(   t   selft   _instance_clst   cls(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   __call__)   s
    (   t   __name__t
   __module__t   __doc__R   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR
   #   s   t	   _Dispatchc           B@  s   e  Z d  Z d Z e j   Z d d  Z d   Z	 e
 d    Z e
 d    Z d	   Z d
   Z d   Z d   Z e d  Z d   Z RS(   s;  Mirror the event listening definitions of an Events class with
    listener collections.

    Classes which define a "dispatch" member will return a
    non-instantiated :class:`._Dispatch` subclass when the member
    is accessed at the class level.  When the "dispatch" member is
    accessed at the instance level of its owner, an instance
    of the :class:`._Dispatch` class is returned.

    A :class:`._Dispatch` class is generated for each :class:`.Events`
    class defined, by the :func:`._create_dispatcher_class` function.
    The original :class:`.Events` classes remain untouched.
    This decouples the construction of :class:`.Events` subclasses from
    the implementation used by the event internals, and allows
    inspecting tools like Sphinx to work in an unsurprising
    way against the public API.

    t   _parentR   R   t   _empty_listenersc         @  sw   | |  _    |  _   rj y |  j   |  _ Wqs t k
 rf   f d   | j D |  _ |  j   <qs Xn	 i  |  _ d  S(   Nc         @  s%   i  |  ] } t  |    | j  q S(    (   R   R   (   t   .0t   ls(   t   instance_cls(    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pys
   <dictcomp>X   s   	(   R   R   t   _empty_listener_regR   t   KeyErrort   _event_descriptors(   R   t   parentR   (    (   R   s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   __init__M   s    		"c         C@  sL   y |  j  | } Wn t k
 r0 t |   n Xt |  | j |  | Sd  S(   N(   R   R   R   t   setattrR   (   R   R   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   __getattr__^   s    c         c@  s&   x |  j  D] } t |  |  Vq
 Wd  S(   N(   t   _event_namest   getattr(   R   t   k(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR   i   s    c         C@  s
   |  j  j S(   N(   t   _eventst   _listen(   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR'   p   s    c         C@  s   |  j  |  |  S(   N(   t	   __class__(   R   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR   t   s    c         C@  s   | j  } |  j |  S(   N(   R(   R   (   R   t   instanceR   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _for_instancew   s    	c         C@  sZ   d |  j  j k rJ t d |  j  j t f i |  j d 6 } | |  j  _ n  |  j |  |  S(   s‘   Create a 'join' of this :class:`._Dispatch` and another.

        This new dispatcher will dispatch events to both
        :class:`._Dispatch` objects.

        t   _joined_dispatch_clss   Joined%st	   __slots__(   R(   R   t   typeR   t   _JoinedDispatcherR#   R+   (   R   t   otherR   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _join{   s    c         C@  s   t    |  j f f S(   N(   R
   R   (   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt
   __reduce__   s    c         C@  sU   xN | j  D]C } t | t  r% q
 n  t |  | j  j |   j | d | q
 Wd S(   sM   Populate from the listeners in another :class:`_Dispatch`
            object.t   only_propagateN(   R   t
   isinstanceR   R$   R   t
   for_modifyt   _update(   R   R/   R2   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR5      s
    c         C@  s+   x$ |  j  D] } | j |   j   q
 Wd  S(   N(   R   R4   t   clear(   R   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _clear   s    (   R   R   R   R   N(   R   R   R   R,   t   weakreft   WeakKeyDictionaryR   t   NoneR    R"   t   propertyR   R'   R   R*   R0   R1   t   TrueR5   R7   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR   3   s   					
t
   _EventMetac           B@  s   e  Z d  Z d   Z RS(   sK   Intercept new Event subclasses and create
    associated _Dispatch classes.c         C@  s)   t  |  | | |  t j |  | | |  S(   N(   t   _create_dispatcher_classR-   R    (   R   t	   classnamet   basest   dict_(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR    ’   s    (   R   R   R   R    (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR=      s   c         C@  sc  t  |  d  r |  j j } n t } g  | D] } t |  r+ | ^ q+ } t d | | f i | d 6 } | | _ |  j |  |  } x? | j D]4 } t | | t	 |  | |   t
 | j |   q Wxo | j D]d }	 t |	 t  rΠ |	 t k	 rΠ x@ |	 j j j D], }
 t | |
 j |
  | j j |
 j  qWqΠ qΠ Wt |  d d  r_t |   |  j _ n  d S(   sR   Create a :class:`._Dispatch` class corresponding to an
    :class:`.Events` class.R   s
   %sDispatchR,   t   _dispatch_targetN(   t   hasattrR   R(   R   R	   R-   R#   t   _set_dispatchR!   R   t   _registrarst   appendt	   __bases__t
   issubclassR&   R   R   R$   R:   t
   dispatcherRB   (   R   R?   R@   RA   t   dispatch_baseR%   t   event_namest   dispatch_clst   dispatch_instt   super_R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR>   §   s$    %	c         C@  s@   x9 |  j  j D]+ } t | j |   t | s t | =q q Wd  S(   N(   R   R#   RE   t   remove(   R   R%   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _remove_dispatcherΙ   s    
t   Eventsc           B@  sb   e  Z d  Z e d    Z e d    Z e e e e d   Z e d    Z	 e d    Z
 RS(   s>   Define event listening functions for a particular target type.c         C@  s   | d   |  _ |  | _ |  j S(   N(   R:   R   R&   (   R   RL   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyRD   Σ   s    	c         @  s}     f d   }   f d   } t    d  ry | |  j j  sr | t |  j j  sr | t  ry | |  j j  ry   Sn  d  S(   Nc          @  s   t    f d   |  D  S(   Nc         3@  s!   |  ] } t    j |  Vq d  S(   N(   R3   R   (   R   t   t(   t   target(    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pys	   <genexpr>α   s    (   t   all(   t   types(   RS   (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   dispatch_isΰ   s    c         @  s   t    j j |   S(   N(   R3   R   R   (   RR   (   RS   (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   dispatch_parent_isγ   s    R   (   RC   R   R(   R-   R.   (   R   RS   RV   RW   (    (   RS   s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _accept_withή   s    c         C@  s    | j  d | d | d |  d  S(   Nt	   propagatet   insertt   named(   t   base_listen(   R   t	   event_keyRY   RZ   R[   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR'   σ   s    c         C@  s   | j    d  S(   N(   RO   (   R   R]   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   _removeχ   s    c         C@  s   |  j  j   d  S(   N(   R   R7   (   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR7   ϋ   s    (   R   R   R   t   staticmethodRD   t   classmethodRX   t   FalseR'   R^   R7   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyRQ   Π   s   R.   c           B@  sD   e  Z d  Z d Z d   Z d   Z e d    Z e d    Z RS(	   s5   Represent a connection between two _Dispatch objects.t   localR   R   c         C@  s%   | |  _  | |  _ |  j  j |  _ d  S(   N(   Rb   R   R   (   R   Rb   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR      s    		c         C@  sA   t  |  j |  } t |  j | j |  } t |  | j |  | S(   N(   R$   Rb   R   R   R   R!   (   R   R   R   t   jl(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR"   
  s    c         C@  s
   |  j  j S(   N(   R   R'   (   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR'     s    c         C@  s
   |  j  j S(   N(   R   R&   (   R   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR&     s    (   Rb   R   R   (	   R   R   R   R,   R    R"   R;   R'   R&   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR.      s   		RI   c           B@  s    e  Z d  Z d   Z d   Z RS(   s   Descriptor used by target classes to
    deliver the _Dispatch class at the class level
    and produce new _Dispatch instances for target
    instances.

    c         C@  s   | j  |  _  | |  _ d  S(   N(   R   t   events(   R   Rd   (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyR    #  s    c         C@  s4   | d  k r |  j S|  j j |  | j d <} | S(   NR   (   R:   R   R*   R   (   R   t   objR   t   disp(    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   __get__'  s    (   R   R   R   R    Rg   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyRI     s   	(   R   t
   __future__R    R8   t   attrR   R   R   t    R   t   defaultdictt   listRE   R	   t   objectR
   R   R-   R=   R>   RP   t   with_metaclassRQ   R.   RI   (    (    (    s4   lib/python2.7/site-packages/sqlalchemy/event/base.pyt   <module>   s    	k		"	"0