ó
¿b›]c           @   s’   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 e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ	 d e f d „  ƒ  YZ
 d S(   iÿÿÿÿNi   (   t
   attributes(   t   utili   (   t   exct   IdentityMapc           B   s¶   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s+   i  |  _  t ƒ  |  _ t j |  ƒ |  _ d  S(   N(   t   _dictt   sett	   _modifiedt   weakreft   reft   _wr(   t   self(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __init__   s    	c         C   s   |  j  j ƒ  S(   N(   R   t   keys(   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR      s    c         C   s   t  ƒ  ‚ d  S(   N(   t   NotImplementedError(   R
   t   state(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   replace   s    c         C   s   t  ƒ  ‚ d  S(   N(   R   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   add   s    c         C   s   |  j  | ƒ d S(   sU   optional inlined form of add() which can assume item isn't present
        in the mapN(   R   (   R
   R   t   key(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   _add_unpresent   s    c         C   s   t  d ƒ ‚ d  S(   Ns%   IdentityMap uses add() to insert data(   R   (   R
   t   dict_(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   update$   s    c         C   s   t  d ƒ ‚ d  S(   Ns(   IdentityMap uses remove() to remove data(   R   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   clear'   s    c         C   s,   |  j  | _ | j r( |  j j | ƒ n  d  S(   N(   R	   t   _instance_dictt   modifiedR   R   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   _manage_incoming_state*   s    	c         C   s&   | `  | j r" |  j j | ƒ n  d  S(   N(   R   R   R   t   discard(   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   _manage_removed_state0   s    	c         C   s   |  j  S(   N(   R   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   _dirty_states5   s    c         C   s   t  |  j ƒ S(   s[   return True if any InstanceStates present have been marked
        as 'modified'.

        (   t   boolR   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   check_modified8   s    c         C   s
   | |  k S(   N(    (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   has_key?   s    c         C   s   t  d ƒ ‚ d  S(   Ns(   IdentityMap uses remove() to remove data(   R   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   popitemB   s    c         G   s   t  d ƒ ‚ d  S(   Ns(   IdentityMap uses remove() to remove data(   R   (   R
   R   t   args(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   popE   s    c         C   s   t  d ƒ ‚ d  S(   Ns%   IdentityMap uses add() to insert data(   R   (   R
   R   t   default(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt
   setdefaultH   s    c         C   s   t  |  j ƒ S(   N(   t   lenR   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __len__K   s    c         C   s   t  ƒ  ‚ d  S(   N(   R   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   copyN   s    c         C   s   t  d ƒ ‚ d  S(   Ns%   IdentityMap uses add() to insert data(   R   (   R
   R   t   value(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __setitem__Q   s    c         C   s   t  d ƒ ‚ d  S(   Ns(   IdentityMap uses remove() to remove data(   R   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __delitem__T   s    N(   t   __name__t
   __module__R   R   R   R   R   R   R   R   R   R   R   R   R   R!   t   NoneR#   R%   R&   R(   R)   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR      s&   																	t   WeakInstanceDictc           B   s°   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z	 d „  Z
 d „  Z d	 „  Z e j r d
 „  Z d „  Z n  d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s8   |  j  | } | j ƒ  } | d  k r4 t | ƒ ‚ n  | S(   N(   R   t   objR,   t   KeyError(   R
   R   R   t   o(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __getitem__Y   s
    c         C   sV   y3 | |  j  k r. |  j  | } | j ƒ  } n t SWn t k
 rG t SX| d  k	 Sd  S(   N(   R   R.   t   FalseR/   R,   (   R
   R   R   R0   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __contains__`   s    c         C   sJ   | j  |  j k rB y |  j | j  | k SWqF t k
 r> t SXn t Sd  S(   N(   R   R   R/   R2   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   contains_statel   s    c         C   s„   | j  |  j k r] y |  j | j  } Wn t k
 r9 qc X| | k	 rV |  j | ƒ qc d  Sn d  } | |  j | j  <|  j | ƒ | S(   N(   R   R   R/   R   R,   R   (   R
   R   t   existing(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   u   s    c         C   s±   | j  } | |  j k r“ y |  j | } Wn t k
 r< q“ X| | k	 rŒ | j ƒ  } | d  k	 r t j d t j | ƒ | j  f ƒ ‚ q q“ t	 Sn  | |  j | <|  j
 | ƒ t S(   NsZ   Can't attach instance %s; another instance with key %s is already present in this session.(   R   R   R/   R.   R,   t   sa_exct   InvalidRequestErrort   orm_utilt	   state_strR2   R   t   True(   R
   R   R   t   existing_stateR0   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   ˆ   s     	"c         C   s   | |  j  | <|  j | _ d  S(   N(   R   R	   R   (   R
   R   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   ¡   s    c         C   s]   | |  j  k r | Sy |  j  | } Wn t k
 r8 | SX| j ƒ  } | d  k rU | S| Sd  S(   N(   R   R/   R.   R,   (   R
   R   R"   R   R0   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   get¦   s    c         C   sX   |  j  ƒ  } g  } x? | D]7 } | j ƒ  } | d  k	 r | j | j | f ƒ q q W| S(   N(   t
   all_statesR.   R,   t   appendR   (   R
   t   valuest   resultR   R'   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   items´   s    c         C   sO   |  j  ƒ  } g  } x6 | D]. } | j ƒ  } | d  k	 r | j | ƒ q q W| S(   N(   R=   R.   R,   R>   (   R
   R?   R@   R   R'   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR?   ½   s    c         C   s   t  |  j ƒ  ƒ S(   N(   t   iterR   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   __iter__Ç   s    c         C   s   t  |  j ƒ  ƒ S(   N(   RB   RA   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt	   iteritemsÌ   s    c         C   s   t  |  j ƒ  ƒ S(   N(   RB   R?   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt
   itervaluesÏ   s    c         C   s-   t  j r |  j j ƒ  St |  j j ƒ  ƒ Sd  S(   N(   R   t   py2kR   R?   t   list(   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR=   Ò   s    	c         C   sQ   y |  j  | j } Wn t k
 r' n& X| | k rM |  j  j | j d  ƒ n  d  S(   N(   R   R   R/   R!   R,   (   R
   R   t   st(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   _fast_discardØ   s    c         C   s   |  j  | ƒ d  S(   N(   t   safe_discard(   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   ä   s    c         C   ss   | j  |  j k ro y |  j | j  } Wn t k
 r9 qo X| | k ro |  j j | j  d  ƒ |  j | ƒ qo n  d  S(   N(   R   R   R/   R!   R,   R   (   R
   R   RH   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRJ   ç   s    c         C   s   d S(   Ni    (    (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   pruneó   s    N(   R*   R+   R1   R3   R4   R   R   R   R,   R<   RA   R?   RC   R   RF   RD   RE   R=   RI   R   RJ   RK   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR-   X   s$   										
							t   StrongInstanceDictc           B   s¶   e  Z d  Z e j r* d „  Z d „  Z n  d „  Z d „  Z d „  Z	 d d „ Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s&  A 'strong-referencing' version of the identity map.

    .. deprecated 1.1::
        The strong
        reference identity map is legacy.  See the
        recipe at :ref:`session_referencing_behavior` for
        an event-based approach to maintaining strong identity
        references.


    c         C   s   |  j  j ƒ  S(   N(   R   RE   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRE     s    c         C   s   |  j  j ƒ  S(   N(   R   RD   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRD   	  s    c         C   s   t  |  j ƒ S(   N(   RB   R   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRC     s    c         C   s   |  j  | S(   N(   R   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR1     s    c         C   s   | |  j  k S(   N(   R   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR3     s    c         C   s   |  j  j | | ƒ S(   N(   R   R<   (   R
   R   R"   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR<     s    c         C   s   |  j  j ƒ  S(   N(   R   R?   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR?     s    c         C   s   |  j  j ƒ  S(   N(   R   RA   (   R
   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRA     s    c         C   s&   g  |  j  ƒ  D] } t j | ƒ ^ q S(   N(   R?   R    t   instance_state(   R
   R0   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR=     s    c         C   s)   | j  |  k o( t j |  | j  ƒ | k S(   N(   R   R    RM   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR4   !  s    c         C   s   | j  |  j k rT |  j | j  } t j | ƒ } | | k	 rM |  j | ƒ qZ d  Sn d  } | j ƒ  |  j | j  <|  j | ƒ | S(   N(   R   R   R    RM   R   R,   R.   R   (   R
   R   R5   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   '  s    c         C   s…   | j  |  k rZ t j |  j | j  ƒ | k	 rV t j d t j | ƒ | j  f ƒ ‚ n  t S| j	 ƒ  |  j | j  <|  j
 | ƒ t Sd  S(   NsZ   Can't attach instance %s; another instance with key %s is already present in this session.(   R   R    RM   R   R6   R7   R8   R9   R2   R.   R   R:   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   6  s    c         C   s#   | j  ƒ  |  j | <|  j | _ d  S(   N(   R.   R   R	   R   (   R
   R   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   E  s    c         C   sZ   y |  j  | j } Wn t k
 r' n/ Xt j | ƒ | k rV |  j  j | j d  ƒ n  d  S(   N(   R   R   R/   R    RM   R!   R,   (   R
   R   R.   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRI   J  s    c         C   s   |  j  | ƒ d  S(   N(   RJ   (   R
   R   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyR   V  s    c         C   sj   | j  |  j k rf |  j | j  } t j | ƒ } | | k rf |  j j | j  d  ƒ |  j | ƒ qf n  d  S(   N(   R   R   R    RM   R!   R,   R   (   R
   R   R.   RH   (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRJ   Y  s    c         C   s   t  |  ƒ } g  |  j ƒ  D] } | j r | j ƒ  ^ q } t j ƒ  } | j |  ƒ |  j j ƒ  |  j j | ƒ t	 | ƒ |  _ | t  |  ƒ S(   s%   prune unreferenced, non-dirty states.(
   R$   R=   R   R.   R   t   WeakValueDictionaryR   R   R   R   (   R
   t	   ref_countt   st   dirtyt   keepers(    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRK   a  s    .N(   R*   R+   t   __doc__R   RF   RE   RD   RC   R1   R3   R,   R<   R?   RA   R=   R4   R   R   R   RI   R   RJ   RK   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyRL   ÷   s&   															(   R   t    R    R   R8   R   R6   t   objectR   R-   RL   (    (    (    s6   lib/python2.7/site-packages/sqlalchemy/orm/identity.pyt   <module>   s   HŸ