ó
¿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 d d l m	 Z	 d d l m
 Z
 d d	 l m Z d d
 l m Z e ƒ  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d  „  ƒ  YZ d! e f d" „  ƒ  YZ d# e f d$ „  ƒ  YZ d% e f d& „  ƒ  YZ  e Z! e Z" e Z# e  Z$ e  e j% ƒ Z& e  d' „  ƒ Z' d d( „ Z) d) e f d* „  ƒ  YZ* d+ „  Z+ d d, „ Z, d- „  Z- d. „  Z. d/ „  Z/ d d0 „ Z0 d1 „  Z1 d2 e f d3 „  ƒ  YZ2 e2 d4 ƒ Z3 d5 „  Z4 d6 e f d7 „  ƒ  YZ5 d8 e5 f d9 „  ƒ  YZ6 d: „  Z7 d; „  Z8 d S(<   s   Collection classes and helpers.i    (   t   absolute_importNi   (   t   binary_types(   t   collections_abc(   t   itertools_filterfalse(   t   py2k(   t   string_types(   t	   threadingt   AbstractKeyedTuplec           B@  s   e  Z d Z d  „  Z RS(   c         C@  s   t  |  j ƒ S(   s‰   Return a list of string key names for this :class:`.KeyedTuple`.

        .. seealso::

            :attr:`.KeyedTuple._fields`

        (   t   listt   _fields(   t   self(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   keys   s    	(    (   t   __name__t
   __module__t	   __slots__R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR      s   t
   KeyedTuplec           B@  s;   e  Z d  Z d d „ Z e d „  ƒ Z d „  Z d „  Z RS(   s  ``tuple`` subclass that adds labeled names.

    E.g.::

        >>> k = KeyedTuple([1, 2, 3], labels=["one", "two", "three"])
        >>> k.one
        1
        >>> k.two
        2

    Result rows returned by :class:`.Query` that contain multiple
    ORM entities and/or column expressions make use of this
    class to return rows.

    The :class:`.KeyedTuple` exhibits similar behavior to the
    ``collections.namedtuple()`` construct provided in the Python
    standard library, however is architected very differently.
    Unlike ``collections.namedtuple()``, :class:`.KeyedTuple` is
    does not rely on creation of custom subtypes in order to represent
    a new series of keys, instead each :class:`.KeyedTuple` instance
    receives its list of keys in place.   The subtype approach
    of ``collections.namedtuple()`` introduces significant complexity
    and performance overhead, which is not necessary for the
    :class:`.Query` object's use case.

    .. seealso::

        :ref:`ormtutorial_querying`

    c         C@  sK   t  j |  | ƒ } | r4 | j j t | | ƒ ƒ n g  } | | j d <| S(   Nt   _labels(   t   tuplet   __new__t   __dict__t   updatet   zip(   t   clst   valst   labelst   t(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   J   s    c         C@  s,   t  g  |  j D] } | d k	 r | ^ q ƒ S(   sÖ   Return a tuple of string key names for this :class:`.KeyedTuple`.

        This method provides compatibility with ``collections.namedtuple()``.

        .. seealso::

            :meth:`.KeyedTuple.keys`

        N(   R   R   t   None(   R
   t   l(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR	   S   s    c         C@  s   t  d | ƒ ‚ d  S(   Ns   Can't set attribute: %s(   t   AttributeError(   R
   t   keyt   value(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __setattr__`   s    c         @  s   ‡  f d †  ˆ  j  ƒ  Dƒ S(   sæ   Return the contents of this :class:`.KeyedTuple` as a dictionary.

        This method provides compatibility with ``collections.namedtuple()``,
        with the exception that the dictionary returned is **not** ordered.

        c         @  s    i  |  ] } ˆ  j  | | “ q S(    (   R   (   t   .0R   (   R
   (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys
   <dictcomp>j   s   	 (   R   (   R
   (    (   R
   s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   _asdictc   s    N(	   R   R   t   __doc__R   R   t   propertyR	   R   R!   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   *   s
   		t   _LWc           B@  s)   e  Z d Z d  „  Z d „  Z d „  Z RS(   c         C@  s   t  j |  | ƒ S(   N(   R   R   (   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   p   s    c         C@  s   t  t |  ƒ |  j f f S(   N(   R   R   t   _real_fields(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt
   __reduce__s   s    c         C@  s,   t  t |  j |  ƒ ƒ } | j d d ƒ | S(   sA   Return the contents of this :class:`.KeyedTuple` as a dictionary.N(   t   dictR   R%   t   popR   (   R
   t   d(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR!   y   s    (    (   R   R   R   R   R&   R!   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR$   m   s   		t   ImmutableContainerc           B@  s   e  Z d  „  Z e Z Z Z RS(   c         O@  s   t  d |  j j ƒ ‚ d  S(   Ns   %s object is immutable(   t	   TypeErrort	   __class__R   (   R
   t   argt   kw(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt
   _immutable‚   s    (   R   R   R/   t   __delitem__t   __setitem__R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR*      s   	t   immutabledictc           B@  sN   e  Z e j Z Z Z Z Z d  „  Z	 d „  Z
 d „  Z d „  Z d „  Z RS(   c         G@  s#   t  j |  ƒ } t  j | | Œ | S(   N(   R'   R   t   __init__(   R   t   argst   new(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   Œ   s    c         G@  s   d  S(   N(    (   R
   R4   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   ‘   s    c         C@  s   t  t |  ƒ f f S(   N(   R2   R'   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR&   ”   s    c         C@  sT   | s
 |  S|  s0 t  | t ƒ r# | St | ƒ Sn  t |  ƒ } t j | | ƒ | Sd  S(   N(   t
   isinstanceR2   R'   R   (   R
   R)   t   d2(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   union—   s    c         C@  s   d t  j |  ƒ S(   Ns   immutabledict(%s)(   R'   t   __repr__(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR9   ¤   s    (   R   R   R*   R/   t   clearR(   t   popitemt
   setdefaultR   R   R3   R&   R8   R9   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR2   ˆ   s   				t
   Propertiesc           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 „  Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s8   Provide a __getattr__/__setattr__ interface over a dict.t   _datac         C@  s   t  j |  d | ƒ d  S(   NR>   (   t   objectR   (   R
   t   data(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   ­   s    c         C@  s   t  |  j ƒ S(   N(   t   lenR>   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __len__°   s    c         C@  s   t  t |  j j ƒ  ƒ ƒ S(   N(   t   iterR   R>   t   values(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __iter__³   s    c         C@  s9   t  t t |  ƒ ƒ g  |  j j ƒ  D] } t | ƒ ^ q" S(   N(   t   dirt   superR=   R>   R   t   str(   R
   t   k(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __dir__¶   s    c         C@  s   t  |  ƒ t  | ƒ S(   N(   R   (   R
   t   other(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __add__»   s    c         C@  s   | |  j  | <d  S(   N(   R>   (   R
   R   t   obj(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR1   ¾   s    c         C@  s   |  j  | S(   N(   R>   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __getitem__Á   s    c         C@  s   |  j  | =d  S(   N(   R>   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR0   Ä   s    c         C@  s   | |  j  | <d  S(   N(   R>   (   R
   R   RM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   Ç   s    c         C@  s   i |  j  d 6S(   NR>   (   R>   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __getstate__Ê   s    c         C@  s   t  j |  d | d ƒ d  S(   NR>   (   R?   R   (   R
   t   state(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __setstate__Í   s    c         C@  s3   y |  j  | SWn t k
 r. t | ƒ ‚ n Xd  S(   N(   R>   t   KeyErrorR   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __getattr__Ð   s    c         C@  s   | |  j  k S(   N(   R>   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __contains__Ö   s    c         C@  s   t  |  j ƒ S(   s8   Return an immutable proxy for this :class:`.Properties`.(   t   ImmutablePropertiesR>   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   as_immutableÙ   s    c         C@  s   |  j  j | ƒ d  S(   N(   R>   R   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   Þ   s    c         C@  s   | |  k r |  | S| Sd  S(   N(    (   R
   R   t   default(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   getá   s    c         C@  s   t  |  j ƒ S(   N(   R   R>   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   ç   s    c         C@  s   t  |  j j ƒ  ƒ S(   N(   R   R>   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRD   ê   s    c         C@  s   t  |  j j ƒ  ƒ S(   N(   R   R>   t   items(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRY   í   s    c         C@  s   | |  j  k S(   N(   R>   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   has_keyð   s    c         C@  s   |  j  j ƒ  d  S(   N(   R>   R:   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:   ó   s    (   R>   N(   R   R   R"   R   R3   RB   RE   RJ   RL   R1   RN   R0   R   RO   RQ   RS   RT   RV   R   R   RX   R   RD   RY   RZ   R:   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR=   ¨   s.   																			t   OrderedPropertiesc           B@  s   e  Z d  Z d Z d „  Z RS(   sU   Provide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.c         C@  s   t  j |  t ƒ  ƒ d  S(   N(   R=   R3   t   OrderedDict(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   ý   s    (    (   R   R   R"   R   R3   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR[   ÷   s   RU   c           B@  s   e  Z d  Z d Z RS(   sD   Provide immutable dict/object attribute to an underlying dictionary.(    (   R   R   R"   R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRU     s   R\   c           B@  sÎ   e  Z d  Z d Z d „  Z d d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z e r¨ d „  Z d „  Z d „  Z n  d „  Z d „  Z d „  Z d „  Z RS(   sC   A dict that returns keys/values/items in the order they were added.t   _listc         C@  s   t  |  j ƒ  f f S(   N(   R\   RY   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR&     s    c         K@  sB   g  |  _  | d  k r. | r> |  j |   q> n |  j | |  d  S(   N(   R]   R   R   (   R
   t   _OrderedDict____sequencet   kwargs(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3     s
    	c         C@  s   g  |  _  t j |  ƒ d  S(   N(   R]   R'   R:   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:     s    	c         C@  s
   |  j  ƒ  S(   N(   t   __copy__(   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   copy  s    c         C@  s
   t  |  ƒ S(   N(   R\   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR`     s    c         O@  s   |  j  j | | Ž  d  S(   N(   R]   t   sort(   R
   R-   R.   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRb   !  s    c         K@  s‡   | d  k	 rm t | d ƒ rI xL | j ƒ  D] } |  j | | | ƒ q( Wqm x! | D] \ } } | |  | <qP Wn  | rƒ |  j | ƒ n  d  S(   NR   (   R   t   hasattrR   R1   R   (   R
   R^   R_   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   $  s    c         C@  s1   | |  k r  |  j  | | ƒ | S|  j | ƒ Sd  S(   N(   R1   RN   (   R
   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR<   /  s    c         C@  s   t  |  j ƒ S(   N(   RC   R]   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRE   6  s    c         C@  s
   t  |  ƒ S(   N(   R   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   9  s    c         C@  s   g  |  j  D] } |  | ^ q
 S(   N(   R]   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRD   <  s    c         C@  s$   g  |  j  D] } | |  | f ^ q
 S(   N(   R]   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRY   ?  s    c         C@  s   t  |  j ƒ  ƒ S(   N(   RC   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt
   itervaluesD  s    c         C@  s
   t  |  ƒ S(   N(   RC   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   iterkeysG  s    c         C@  s   t  |  j ƒ  ƒ S(   N(   RC   RY   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt	   iteritemsJ  s    c         C@  sZ   | |  k rC y |  j  j | ƒ WqC t k
 r? | g |  _  qC Xn  t j |  | | ƒ d  S(   N(   R]   t   appendR   R'   R1   (   R
   R   RM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR1   M  s    c         C@  s$   t  j |  | ƒ |  j j | ƒ d  S(   N(   R'   R0   R]   t   remove(   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR0   W  s    c         G@  s>   | |  k } t  j |  | | Œ } | r: |  j j | ƒ n  | S(   N(   R'   R(   R]   Rh   (   R
   R   RW   t   presentR   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR(   [  s
    c         C@  s'   t  j |  ƒ } |  j j | d ƒ | S(   Ni    (   R'   R;   R]   Rh   (   R
   t   item(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR;   b  s    (   R]   N(   R   R   R"   R   R&   R   R3   R:   Ra   R`   Rb   R   R<   RE   R   RD   RY   R   Rd   Re   Rf   R1   R0   R(   R;   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR\     s,   													
		t
   OrderedSetc           B@  sã   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z e Z d
 „  Z e Z d „  Z e Z d „  Z e Z d „  Z e Z d „  Z e Z d „  Z e Z d „  Z e Z d „  Z e Z RS(   c         C@  sT   t  j |  ƒ g  |  _ | d  k	 rG t | ƒ |  _ t  j |  |  j ƒ n	 g  |  _ d  S(   N(   t   setR3   R]   R   t   unique_listR   (   R
   R)   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   i  s    	c         C@  s3   | |  k r |  j  j | ƒ n  t j |  | ƒ d  S(   N(   R]   Rg   Rl   t   add(   R
   t   element(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRn   r  s    c         C@  s$   t  j |  | ƒ |  j j | ƒ d  S(   N(   Rl   Rh   R]   (   R
   Ro   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRh   w  s    c         C@  s6   | |  k r" |  j  j | | ƒ n  t j |  | ƒ d  S(   N(   R]   t   insertRl   Rn   (   R
   t   posRo   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRp   {  s    c         C@  s3   | |  k r/ |  j  j | ƒ t j |  | ƒ n  d  S(   N(   R]   Rh   Rl   (   R
   Ro   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   discard€  s    c         C@  s   t  j |  ƒ g  |  _ d  S(   N(   Rl   R:   R]   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:   …  s    c         C@  s   |  j  | S(   N(   R]   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRN   ‰  s    c         C@  s   t  |  j ƒ S(   N(   RC   R]   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRE   Œ  s    c         C@  s   |  j  | ƒ S(   N(   R8   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRL     s    c         C@  s   d |  j  j |  j f S(   Ns   %s(%r)(   R,   R   R]   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR9   ’  s    c         C@  sD   x= | D]5 } | |  k r |  j  j | ƒ t j |  | ƒ q q W|  S(   N(   R]   Rg   Rl   Rn   (   R
   t   iterablet   e(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   —  s
    c         C@  s    |  j  |  ƒ } | j | ƒ | S(   N(   R,   R   (   R
   RK   t   result(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR8      s    c         @  s)   t  ˆ  ƒ ‰  |  j ‡  f d †  |  Dƒ ƒ S(   Nc         3@  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R    t   a(   RK   (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>©  s    (   Rl   R,   (   R
   RK   (    (   RK   s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   intersection§  s    c         @  sL   t  ˆ  ƒ ‰  ˆ j ‡  f d †  ˆ Dƒ ƒ } | j ‡ f d †  ˆ  Dƒ ƒ | S(   Nc         3@  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R    Rv   (   RK   (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>¯  s    c         3@  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R    Rv   (   R
   (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>°  s    (   Rl   R,   R   (   R
   RK   Ru   (    (   RK   R
   s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   symmetric_difference­  s    c         @  s)   t  ˆ  ƒ ‰  |  j ‡  f d †  |  Dƒ ƒ S(   Nc         3@  s!   |  ] } | ˆ  k r | Vq d  S(   N(    (   R    Rv   (   RK   (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>·  s    (   Rl   R,   (   R
   RK   (    (   RK   s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt
   differenceµ  s    c         C@  sK   t  | ƒ } t  j |  | ƒ g  |  j D] } | | k r& | ^ q& |  _ |  S(   N(   Rl   t   intersection_updateR]   (   R
   RK   Rv   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRz   »  s    +c         C@  sp   t  j |  | ƒ g  |  j D] } | |  k r | ^ q |  _ |  j g  | j D] } | |  k rL | ^ qL 7_ |  S(   N(   Rl   t   symmetric_difference_updateR]   (   R
   RK   Rv   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR{   Ã  s    +1c         C@  s?   t  j |  | ƒ g  |  j D] } | |  k r | ^ q |  _ |  S(   N(   Rl   t   difference_updateR]   (   R
   RK   Rv   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR|   Ë  s    +N(   R   R   R   R3   Rn   Rh   Rp   Rr   R:   RN   RE   RL   R9   t   __str__R   t   __ior__R8   t   __or__Rw   t   __and__Rx   t   __xor__Ry   t   __sub__Rz   t   __iand__R{   t   __ixor__R|   t   __isub__(    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRk   h  s6   																		t   IdentitySetc           B@  ss  e  Z d  Z e 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 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 „  Z  d „  Z! d „  Z" d „  Z# d „  Z$ d  „  Z% d! „  Z& d" „  Z' e' Z( d# „  Z) d$ „  Z* d% „  Z+ d& „  Z, RS((   sÏ   A set that considers only object id() for uniqueness.

    This strategy has edge cases for builtin types- it's possible to have
    two 'foo' strings in one of these sets, for example.  Use sparingly.

    c         C@  s7   t  ƒ  |  _ | r3 x | D] } |  j | ƒ q Wn  d  S(   N(   R'   t   _membersRn   (   R
   Rs   t   o(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   Ý  s    c         C@  s   | |  j  t | ƒ <d  S(   N(   R‡   t   id(   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRn   ã  s    c         C@  s   t  | ƒ |  j k S(   N(   R‰   R‡   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRT   æ  s    c         C@  s   |  j  t | ƒ =d  S(   N(   R‡   R‰   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRh   é  s    c         C@  s)   y |  j  | ƒ Wn t k
 r$ n Xd  S(   N(   Rh   RR   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRr   ì  s    c         C@  s?   y |  j  j ƒ  } | d SWn t k
 r: t d ƒ ‚ n Xd  S(   Ni   s   pop from an empty set(   R‡   R;   RR   (   R
   t   pair(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR(   ò  s
    c         C@  s   |  j  j ƒ  d  S(   N(   R‡   R:   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:   ù  s    c         C@  s   t  d ƒ ‚ d  S(   Ns   cannot compare sets using cmp()(   R+   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __cmp__ü  s    c         C@  s'   t  | t ƒ r |  j | j k St Sd  S(   N(   R6   R†   R‡   t   False(   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __eq__ÿ  s    c         C@  s'   t  | t ƒ r |  j | j k St Sd  S(   N(   R6   R†   R‡   t   True(   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __ne__  s    c         C@  sb   t  |  ƒ | ƒ } t |  ƒ t | ƒ k r. t Sx- t | j j t |  j j ƒ  ƒ ƒ D] } t SWt S(   N(	   t   typeRA   RŒ   R   R‡   RT   RC   R   RŽ   (   R
   Rs   RK   t   m(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   issubset  s    %c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   t   NotImplementedR’   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __le__  s    c         C@  s8   t  | t ƒ s t St |  ƒ t | ƒ k  o7 |  j | ƒ S(   N(   R6   R†   R“   RA   R’   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __lt__  s    c         C@  sb   t  |  ƒ | ƒ } t |  ƒ t | ƒ k  r. t Sx- t |  j j t | j j ƒ  ƒ ƒ D] } t SWt S(   N(	   R   RA   RŒ   R   R‡   RT   RC   R   RŽ   (   R
   Rs   RK   R‘   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt
   issuperset   s    %c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   R“   R–   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __ge__,  s    c         C@  s8   t  | t ƒ s t St |  ƒ t | ƒ k o7 |  j | ƒ S(   N(   R6   R†   R“   RA   R–   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __gt__1  s    c         C@  sM   t  |  ƒ ƒ  } |  j ƒ  } t | ƒ } | j j |  j | ƒ j | ƒ ƒ | S(   N(   R   t   _member_id_tuplest   _iter_idR‡   R   t   _working_setR8   (   R
   Rs   Ru   t   membersRK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR8   6  s
    "c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   R“   R8   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   >  s    c         C@  s   |  j  | ƒ j |  _ d  S(   N(   R8   R‡   (   R
   Rs   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   C  s    c         C@  s$   t  | t ƒ s t S|  j | ƒ |  S(   N(   R6   R†   R“   R   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR~   F  s    c         C@  sM   t  |  ƒ ƒ  } |  j ƒ  } t | ƒ } | j j |  j | ƒ j | ƒ ƒ | S(   N(   R   R™   Rš   R‡   R   R›   Ry   (   R
   Rs   Ru   Rœ   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRy   L  s
    "c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   R“   Ry   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR‚   T  s    c         C@  s   |  j  | ƒ j |  _ d  S(   N(   Ry   R‡   (   R
   Rs   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR|   Y  s    c         C@  s$   t  | t ƒ s t S|  j | ƒ |  S(   N(   R6   R†   R“   R|   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR…   \  s    c         C@  sM   t  |  ƒ ƒ  } |  j ƒ  } t | ƒ } | j j |  j | ƒ j | ƒ ƒ | S(   N(   R   R™   Rš   R‡   R   R›   Rw   (   R
   Rs   Ru   Rœ   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRw   b  s
    "c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   R“   Rw   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR€   j  s    c         C@  s   |  j  | ƒ j |  _ d  S(   N(   Rw   R‡   (   R
   Rs   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRz   o  s    c         C@  s$   t  | t ƒ s t S|  j | ƒ |  S(   N(   R6   R†   R“   Rz   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRƒ   r  s    c         C@  sM   t  |  ƒ ƒ  } |  j ƒ  } t | ƒ } | j j |  j | ƒ j | ƒ ƒ | S(   N(   R   R™   Rš   R‡   R   R›   Rx   (   R
   Rs   Ru   Rœ   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRx   x  s    	c         C@  s   d „  |  j  j ƒ  Dƒ S(   Nc         s@  s!   |  ] } t  | ƒ | f Vq d  S(   N(   R‰   (   R    t   v(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>ƒ  s    (   R‡   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR™   ‚  s    c         C@  s    t  | t ƒ s t S|  j | ƒ S(   N(   R6   R†   R“   Rx   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR   …  s    c         C@  s   |  j  | ƒ j |  _ d  S(   N(   Rx   R‡   (   R
   Rs   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR{   Š  s    c         C@  s$   t  | t ƒ s t S|  j | ƒ |  S(   N(   R6   R†   R“   Rx   (   R
   RK   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR„     s    c         C@  s   t  |  ƒ t |  j j ƒ  ƒ ƒ S(   N(   R   RC   R‡   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRa   “  s    c         C@  s   t  |  j ƒ S(   N(   RA   R‡   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRB   ˜  s    c         C@  s   t  |  j j ƒ  ƒ S(   N(   RC   R‡   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRE   ›  s    c         C@  s   t  d ƒ ‚ d  S(   Ns   set objects are unhashable(   R+   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __hash__ž  s    c         C@  s&   d t  |  ƒ j t |  j j ƒ  ƒ f S(   Ns   %s(%r)(   R   R   R   R‡   RD   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR9   ¡  s    N(-   R   R   R"   Rl   R›   R   R3   Rn   RT   Rh   Rr   R(   R:   R‹   R   R   R’   R”   R•   R–   R—   R˜   R8   R   R   R~   Ry   R‚   R|   R…   Rw   R€   Rz   Rƒ   Rx   R™   R   R{   R„   Ra   R`   RB   RE   Rž   R9   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR†   Ó  sR   																												
								t   WeakSequencec           B@  sA   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C@  s/   g  | D] } t  j | |  j ƒ ^ q |  _ d  S(   N(   t   weakreft   reft   _removet   _storage(   R
   t   _WeakSequence__elementsRo   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   ¦  s    c         C@  s#   |  j  j t j | |  j ƒ ƒ d  S(   N(   R£   Rg   R    R¡   R¢   (   R
   Rj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRg   «  s    c         C@  s   |  j  j | ƒ d  S(   N(   R£   Rh   (   R
   R¡   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR¢   ®  s    c         C@  s   t  |  j ƒ S(   N(   RA   R£   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRB   ±  s    c         C@  s   d „  d „  |  j  Dƒ Dƒ S(   Nc         s@  s!   |  ] } | d  k	 r | Vq d  S(   N(   R   (   R    RM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>¶  s    c         s@  s   |  ] } | ƒ  Vq d  S(   N(    (   R    R¡   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pys	   <genexpr>¶  s    (   R£   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRE   ´  s    c         C@  s@   y |  j  | } Wn! t k
 r4 t d | ƒ ‚ n X| ƒ  Sd  S(   Ns   Index %s out of range(   R£   RR   t
   IndexError(   R
   t   indexRM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRN   ¹  s
    (    (   R   R   R3   Rg   R¢   RB   RE   RN   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRŸ   ¥  s   				t   OrderedIdentitySetc           B@  s*   e  Z d  e f d „  ƒ  YZ d d „ Z RS(   R›   c           B@  s   e  Z e Z RS(    (   R   R   RŽ   t   __sa_hash_exempt__(    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR›   Ã  s   c         C@  sD   t  j |  ƒ t ƒ  |  _ | r@ x | D] } |  j | ƒ q& Wn  d  S(   N(   R†   R3   R\   R‡   Rn   (   R
   Rs   Rˆ   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   Ê  s
    N(   R   R   Rk   R›   R   R3   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR§   Â  s   t   PopulateDictc           B@  s    e  Z d  Z d „  Z d „  Z RS(   s•   A dict which populates missing values via a creation function.

    Note the creation function takes a key, unlike
    collections.defaultdict.

    c         C@  s   | |  _  d  S(   N(   t   creator(   R
   Rª   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   Ú  s    c         C@  s   |  j  | ƒ |  | <} | S(   N(   Rª   (   R
   R   t   val(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __missing__Ý  s    (   R   R   R"   R3   R¬   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR©   Ò  s   	c         C@  s   t  t j |  ƒ ƒ S(   N(   R#   t   operatort
   itemgetter(   t   idx(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   <lambda>ï  t    c         C@  sˆ   t  ƒ  } | j } | sH g  |  D]% } | | k r | | ƒ r | ^ q Sg  |  D]1 } | | ƒ | k rO | | | ƒ ƒ rO | ^ qO Sd  S(   N(   Rl   Rn   (   t   seqt   hashfunct   seent   seen_addt   x(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRm   ó  s    		0
t   UniqueAppenderc           B@  s,   e  Z d  Z d d „ Z d „  Z d „  Z RS(   s½   Appends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    c         C@  sm   | |  _  i  |  _ | r- t | | ƒ |  _ n< t | d ƒ rK | j |  _ n t | d ƒ ri | j |  _ n  d  S(   NRg   Rn   (   R@   t   _uniquet   getattrt   _data_appenderRc   Rg   Rn   (   R
   R@   t   via(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3     s    		c         C@  s<   t  | ƒ } | |  j k r8 |  j | ƒ t |  j | <n  d  S(   N(   R‰   R¸   Rº   RŽ   (   R
   Rj   t   id_(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRg     s    c         C@  s   t  |  j ƒ S(   N(   RC   R@   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRE     s    N(   R   R   R"   R   R3   Rg   RE   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR·      s   
	c         C@  s>   t  |  ƒ d k r6 t |  d t j ƒ r6 t |  d ƒ S|  Sd  S(   Ni   i    (   RA   R6   t   typest   GeneratorTypeR   (   R-   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   coerce_generator_arg  s    (c         C@  s^   |  d  k r | St |  t j ƒ s6 t |  t t ƒ r= |  g St |  t ƒ rP |  St |  ƒ Sd  S(   N(   R   R6   R   t   IterableR   R   R   (   R¶   RW   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   to_list"  s    c         C@  s/   t  |  j g  | D] } | j r | ^ q ƒ ƒ S(   s²   return True if any items of set\_ are present in iterable.

    Goes through special effort to ensure __hash__ is not called
    on items in iterable that don't support it.

    (   t   boolRw   Rž   (   t   set_Rs   t   i(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   has_intersection/  s    c         C@  s:   |  d  k r t ƒ  St |  t ƒ s2 t t |  ƒ ƒ S|  Sd  S(   N(   R   Rl   R6   RÁ   (   R¶   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   to_set:  s
    c         C@  s:   |  d  k r t ƒ  St |  t ƒ s2 t t |  ƒ ƒ S|  Sd  S(   N(   R   t
   column_setR6   RÁ   (   R¶   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   to_column_setC  s
    c         K@  s3   |  j  ƒ  }  | r" |  j | ƒ n  |  j |   |  S(   s5   Copy the given dict and update with the given values.(   Ra   R   (   R)   t   _newR.   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   update_copyL  s
    c         c@  sX   xQ |  D]I } t  | t ƒ rK t | d ƒ rK x! t | ƒ D] } | Vq9 Wq | Vq Wd S(   s   Given an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    RE   N(   R6   RH   Rc   t   flatten_iterator(   R¶   t   elemt   y(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRË   V  s
    t   LRUCachec           B@  sw   e  Z d  Z d Z d d d d „ Z d	 „  Z d d
 „ Z d „  Z d „  Z	 d „  Z
 d „  Z e d „  ƒ Z d „  Z RS(   só   Dictionary with 'squishy' removal of least
    recently used items.

    Note that either get() or [] should be used here, but
    generally its not safe to do an "in" check first as the dictionary
    can change subsequent to that call.

    t   capacityt	   thresholdt
   size_alertt   _countert   _mutexid   g      à?c         C@  s7   | |  _  | |  _ | |  _ d |  _ t j ƒ  |  _ d  S(   Ni    (   RÏ   RÐ   RÑ   RÒ   R   t   LockRÓ   (   R
   RÏ   RÐ   RÑ   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   o  s
    				c         C@  s   |  j  d 7_  |  j  S(   Ni   (   RÒ   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   _inc_counterv  s    c         C@  sA   t  j |  | | ƒ } | | k	 r9 |  j ƒ  | d <| d S| Sd  S(   Ni   i   (   R'   RX   RÕ   (   R
   R   RW   Rj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRX   z  s
    c         C@  s*   t  j |  | ƒ } |  j ƒ  | d <| d S(   Ni   i   (   R'   RN   RÕ   (   R
   R   Rj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRN   ‚  s    c         C@  s$   g  t  j |  ƒ D] } | d ^ q S(   Ni   (   R'   RD   (   R
   RÄ   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRD   ‡  s    c         C@  s&   | |  k r |  | S| |  | <| Sd  S(   N(    (   R
   R   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR<   Š  s    
c         C@  sa   t  j |  | ƒ } | d  k rI | | |  j ƒ  g } t  j |  | | ƒ n
 | | d <|  j ƒ  d  S(   Ni   (   R'   RX   R   RÕ   R1   t   _manage_size(   R
   R   R   Rj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR1   ‘  s    
c         C@  s   |  j  |  j  |  j S(   N(   RÏ   RÐ   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   size_thresholdš  s    c         C@  sì   |  j  j t ƒ s d  SzÁ t |  j ƒ } x« t |  ƒ |  j |  j |  j k rÕ | rj t } |  j |  ƒ n  t t	 j
 |  ƒ d t j d ƒ d t ƒ} x; | |  j D], } y |  | d =Wq¢ t k
 rÍ q¢ q¢ Xq¢ Wq+ WWd  |  j  j ƒ  Xd  S(   NR   i   t   reversei    (   RÓ   t   acquireRŒ   RÂ   RÑ   RA   RÏ   RÐ   t   sortedR'   RD   R­   R®   RŽ   RR   t   release(   R
   RÑ   t
   by_counterRj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRÖ   ž  s     &'(   RÏ   RÐ   RÑ   RÒ   RÓ   N(   R   R   R"   R   R   R3   RÕ   RX   RN   RD   R<   R1   R#   R×   RÖ   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRÎ   c  s   						id   c      	   C@  sÎ   |  f t  | ƒ } t j | ƒ } | r, | St |  t f t g  t | ƒ D]( \ } } | d  k	 rH | t | f ^ qH d d f g ƒ ƒ } | | _	 t  g  | D] } | d  k	 rœ | ^ qœ ƒ | _
 | t | <| S(   NR   (    (   R   t
   _lw_tuplesRX   R   R$   R'   t	   enumerateR   t   _property_gettersR%   R	   (   t   namet   fieldst   hash_t   tp_clsR¯   t   fieldt   f(    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   lightweight_named_tuple·  s     	.
t   ScopedRegistryc           B@  s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sÆ  A Registry that can store one or multiple instances of a single
    class on the basis of a "scope" function.

    The object implements ``__call__`` as the "getter", so by
    calling ``myregistry()`` the contained object is returned
    for the current scope.

    :param createfunc:
      a callable that returns a new object to be placed in the registry

    :param scopefunc:
      a callable that will return a key to store/retrieve an object.
    c         C@  s   | |  _  | |  _ i  |  _ d S(   sV  Construct a new :class:`.ScopedRegistry`.

        :param createfunc:  A creation function that will generate
          a new value for the current scope, if none is present.

        :param scopefunc:  A function that returns a hashable
          token representing the current scope (such as, current
          thread identifier).

        N(   t
   createfunct	   scopefunct   registry(   R
   Rè   Ré   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3   à  s    		c         C@  sI   |  j  ƒ  } y |  j | SWn' t k
 rD |  j j | |  j ƒ  ƒ SXd  S(   N(   Ré   Rê   RR   R<   Rè   (   R
   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   __call__ï  s
    c         C@  s   |  j  ƒ  |  j k S(   s9   Return True if an object is present in the current scope.(   Ré   Rê   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   hasö  s    c         C@  s   | |  j  |  j ƒ  <d S(   s$   Set the value for the current scope.N(   Rê   Ré   (   R
   RM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRl   û  s    c         C@  s,   y |  j  |  j ƒ  =Wn t k
 r' n Xd S(   s    Clear the current scope, if any.N(   Rê   Ré   RR   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:      s    (   R   R   R"   R3   Rë   Rì   Rl   R:   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRç   Ñ  s   				t   ThreadLocalRegistryc           B@  s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s\   A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c         C@  s   | |  _  t j ƒ  |  _ d  S(   N(   Rè   R   t   localRê   (   R
   Rè   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR3     s    	c         C@  s=   y |  j  j SWn( t k
 r8 |  j ƒ  } |  j  _ | SXd  S(   N(   Rê   R   R   Rè   (   R
   R«   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRë     s
    c         C@  s   t  |  j d ƒ S(   NR   (   Rc   Rê   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRì     s    c         C@  s   | |  j  _ d  S(   N(   Rê   R   (   R
   RM   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRl     s    c         C@  s%   y |  j  ` Wn t k
 r  n Xd  S(   N(   Rê   R   R   (   R
   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyR:      s    (   R   R   R"   R3   Rë   Rì   Rl   R:   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRí   	  s   				c         c@  s&   x |  D] } t  | ƒ | f Vq Wd S(   s*   Generator: ((id(o), o) for o in iterable).N(   R‰   (   Rs   Rj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyRš   '  s    c         C@  sD   d } x7 |  D]/ } | | k r | d 7} | d k r< t  Sq q Wt S(   sr   Given a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    i    i   (   RŽ   RŒ   (   t   sequencet   targett   cRj   (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt	   has_dupes.  s    

(9   R"   t
   __future__R    R­   R½   R    t   compatR   R   R   R   R   R   t	   frozensett	   EMPTY_SETR   R   R   R$   R?   R*   R'   R2   R=   R[   RU   R\   Rl   Rk   R†   RŸ   R§   R©   RÇ   t   column_dictt   ordered_column_sett   populate_column_dictR®   t   _gettersRß   R   Rm   R·   R¿   RÁ   RÅ   RÆ   RÈ   RÊ   RË   RÎ   RÝ   Ræ   Rç   Rí   Rš   Rò   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/util/_collections.pyt   <module>   s`   	C O
akÒ						
	Q	8	