U
    ccq                     @   st  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 ddlmZ e ZG dd deZdd ZzddlmZ eje W n" ek
r   e Zdd ZY nX dd Ze ZG dd deeZG dd deZG dd deZG dd deeZdKddZ erFeZ!e Z"ndLdd Z"G d!d" d"eZ!G d#d$ d$e#Z$G d%d& d&eZ%G d'd( d(eZ&G d)d* d*e%Z'G d+d, d,eZ(G d-d. d.eZ)e#Z*eZ+e$Z,e(ej-Z.e(d/d0 Z/dMd1d2Z0G d3d4 d4eZ1d5d6 Z2dNd7d8Z3d9d: Z4d;d< Z5d=d> Z6dOd?d@Z7dAdB Z8G dCdD dDeZ9G dEdF dFeZ:G dGdH dHe:Z;dIdJ Z<dS )PzCollection classes and helpers.    )absolute_importN   )binary_types)collections_abc)itertools_filterfalse)py2k)py37)string_types)	threadingc                   @   s    e Zd Zdd Ze Z ZZdS )ImmutableContainerc                 O   s   t d| jj d S )Nz%s object is immutable)	TypeError	__class____name__)selfargkw r   @/tmp/pip-unpacked-wheel-8u86ls_i/sqlalchemy/util/_collections.py
_immutable   s    zImmutableContainer._immutableN)r   
__module____qualname__r   __delitem____setitem____setattr__r   r   r   r   r      s   r   c                  C   s   G dd dt t} | S )Nc                   @   s^   e Zd Zej Z Z Z ZZ	dd Z
dd Zdd Zddd	Zdd
dZdd Zdd ZdS )z1_immutabledict_py_fallback.<locals>.immutabledictc                 W   s   t | }t j|f|  |S N)dict__new____init__clsargsnewr   r   r   r   *   s    
z9_immutabledict_py_fallback.<locals>.immutabledict.__new__c                 W   s   d S r   r   )r   r    r   r   r   r   /   s    z:_immutabledict_py_fallback.<locals>.immutabledict.__init__c                 S   s   t t| ffS r   )_immutabledict_reconstructorr   r   r   r   r   
__reduce__2   s    z<_immutabledict_py_fallback.<locals>.immutabledict.__reduce__Nc                 S   s0   |s| S t | j}t ||  t || |S r   r   r   r   r   update)r   _immutabledict__dr!   r   r   r   union5   s    z7_immutabledict_py_fallback.<locals>.immutabledict.unionc                 [   sD   |s|s| S t | j}t ||  |r4t || t || |S r   r%   )r   r'   r   r!   r   r   r   _union_w_kw>   s    z=_immutabledict_py_fallback.<locals>.immutabledict._union_w_kwc                 W   sN   d }|D ]4}|r|d kr0t | j}t ||  t || q|d krJ| S |S r   r%   )r   Zdictsr!   dr   r   r   
merge_withJ   s    z<_immutabledict_py_fallback.<locals>.immutabledict.merge_withc                 S   s   dt |  S )Nzimmutabledict(%s)r   __repr__r#   r   r   r   r-   W   s    z:_immutabledict_py_fallback.<locals>.immutabledict.__repr__)N)N)r   r   r   r   r   clearpoppopitem
setdefaultr&   r   r   r$   r(   r)   r+   r-   r   r   r   r   immutabledict$   s    
	
r2   )r   r   r2   r   r   r   _immutabledict_py_fallback#   s    6r4   r3   c                  G   s   t |  S )zdo the pickle dancer3   r   r   r   r   r"   e   s    r"   c                 C   s"   | st S t| tr| S t| S d S r   )
EMPTY_DICT
isinstancer2   r*   r   r   r   coerce_to_immutabledictj   s
    
r9   c                   @   sN   e Zd ZdZej Z Z Z Z	Z
dd Zdd Zdd Zdd	 Zd
d ZdS )
FacadeDictz*A dictionary that is not publicly mutable.c                 G   s   t | }|S r   )r   r   r   r   r   r   r   {   s    
zFacadeDict.__new__c                 C   s   t dd S )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorr#   r   r   r   copy   s    zFacadeDict.copyc                 C   s   t t| ffS r   )r:   r   r#   r   r   r   r$      s    zFacadeDict.__reduce__c                 C   s   t | || dS )z,insert an item into the dictionary directly.N)r   r   r   keyvaluer   r   r   _insert_item   s    zFacadeDict._insert_itemc                 C   s   dt |  S )NzFacadeDict(%s)r,   r#   r   r   r   r-      s    zFacadeDict.__repr__N)r   r   r   __doc__r   r   r.   r/   r0   r1   r&   r   r<   r$   r@   r-   r   r   r   r   r:   v   s   r:   c                       s   e Zd ZdZdZdd Zdd Zdd Z fd	d
Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd.d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Z  ZS )/
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._datac                 C   s   t | d| d S NrD   objectr   )r   datar   r   r   r      s    zProperties.__init__c                 C   s
   t | jS r   )lenrD   r#   r   r   r   __len__   s    zProperties.__len__c                 C   s   t t| j S r   )iterlistrD   valuesr#   r   r   r   __iter__   s    zProperties.__iter__c                    s"   t tt| dd | j D  S )Nc                 S   s   g | ]}t |qS r   )str.0kr   r   r   
<listcomp>   s    z&Properties.__dir__.<locals>.<listcomp>)dirsuperrB   rD   keysr#   r   r   r   __dir__   s    zProperties.__dir__c                 C   s   t | t | S r   rL   r   otherr   r   r   __add__   s    zProperties.__add__c                 C   s   || j |< d S r   rC   r   r>   objr   r   r   r      s    zProperties.__setitem__c                 C   s
   | j | S r   rC   r   r>   r   r   r   __getitem__   s    zProperties.__getitem__c                 C   s   | j |= d S r   rC   r_   r   r   r   r      s    zProperties.__delitem__c                 C   s   || j |< d S r   rC   r]   r   r   r   r      s    zProperties.__setattr__c                 C   s
   d| j iS rE   rC   r#   r   r   r   __getstate__   s    zProperties.__getstate__c                 C   s   t | d|d  d S rE   rF   )r   stater   r   r   __setstate__   s    zProperties.__setstate__c                 C   s.   z| j | W S  tk
r(   t|Y nX d S r   )rD   KeyErrorAttributeErrorr_   r   r   r   __getattr__   s    zProperties.__getattr__c                 C   s
   || j kS r   rC   r_   r   r   r   __contains__   s    zProperties.__contains__c                 C   s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ImmutablePropertiesrD   r#   r   r   r   as_immutable   s    zProperties.as_immutablec                 C   s   | j | d S r   )rD   r&   r   r?   r   r   r   r&      s    zProperties.updateNc                 C   s   || kr| | S |S d S r   r   )r   r>   defaultr   r   r   get   s    zProperties.getc                 C   s
   t | jS r   )rL   rD   r#   r   r   r   rV      s    zProperties.keysc                 C   s   t | j S r   )rL   rD   rM   r#   r   r   r   rM      s    zProperties.valuesc                 C   s   t | j S r   )rL   rD   itemsr#   r   r   r   rm      s    zProperties.itemsc                 C   s
   || j kS r   rC   r_   r   r   r   has_key   s    zProperties.has_keyc                 C   s   | j   d S r   )rD   r.   r#   r   r   r   r.      s    zProperties.clear)N)r   r   r   rA   	__slots__r   rJ   rN   rX   r\   r   r`   r   r   ra   rc   rf   rg   ri   r&   rl   rV   rM   rm   rn   r.   __classcell__r   r   rW   r   rB      s.   
rB   c                   @   s   e Zd ZdZdZdd ZdS )OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r   c                 C   s   t | t  d S r   )rB   r   OrderedDictr#   r   r   r   r      s    zOrderedProperties.__init__N)r   r   r   rA   ro   r   r   r   r   r   rq      s   rq   c                   @   s   e Zd ZdZdZdS )rh   zDProvide immutable dict/object attribute to an underlying dictionary.r   N)r   r   r   rA   ro   r   r   r   r   rh      s   rh   c                    s0    fddt  |dD }    | dS )zSort an OrderedDict in-place.c                    s   g | ]}| | fqS r   r   rP   r8   r   r   rS      s     z,_ordered_dictionary_sort.<locals>.<listcomp>r>   N)sortedr.   r&   )r*   r>   rm   r   r8   r   _ordered_dictionary_sort   s    ru   c                 C   s   | j |d dS )zSort an OrderedDict in place.rs   Nru   )r*   r>   r   r   r   sort_dictionary  s    rw   c                   @   s   e Zd ZdZdZd*ddZdd Zd+dd	Zd
d Zdd Z	dd Z
d,ddZdd Zdd Zdd Zdd Zdd Zerdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) ZdS )-rr   zhDictionary that maintains insertion order.

        Superseded by Python dict as of Python 3.7

        _listNc                 C   s   t | |d d S )Nrs   rv   r_   r   r   r   ru     s    z$OrderedDict._ordered_dictionary_sortc                 C   s   t |  ffS r   )rr   rm   r#   r   r   r   r$     s    zOrderedDict.__reduce__c                 K   s2   g | _ |d kr |r.| jf | n| j|f| d S r   )ry   r&   )r   _OrderedDict____sequencekwargsr   r   r   r     s
    zOrderedDict.__init__c                 C   s   g | _ t|  d S r   )ry   r   r.   r#   r   r   r   r.     s    zOrderedDict.clearc                 C   s   |   S r   )__copy__r#   r   r   r   r<   !  s    zOrderedDict.copyc                 C   s   t | S r   )rr   r#   r   r   r   r|   $  s    zOrderedDict.__copy__c                 K   sZ   |d k	rHt |dr2| D ]}| |||  qn|D ]\}}|| |< q6|rV| | d S )NrV   )hasattrrV   r   r&   )r   rz   r{   r>   r?   r   r   r   r&   '  s    

zOrderedDict.updatec                 C   s&   || kr|  || |S | |S d S r   )r   r`   r=   r   r   r   r1   2  s    zOrderedDict.setdefaultc                 C   s
   t | jS r   rK   ry   r#   r   r   r   rN   9  s    zOrderedDict.__iter__c                 C   s   t | S r   rY   r#   r   r   r   rV   <  s    zOrderedDict.keysc                    s    fdd j D S )Nc                    s   g | ]} | qS r   r   rQ   r>   r#   r   r   rS   @  s     z&OrderedDict.values.<locals>.<listcomp>rx   r#   r   r#   r   rM   ?  s    zOrderedDict.valuesc                    s    fdd j D S )Nc                    s   g | ]}| | fqS r   r   r   r#   r   r   rS   C  s     z%OrderedDict.items.<locals>.<listcomp>rx   r#   r   r#   r   rm   B  s    zOrderedDict.itemsc                 C   s   t |  S r   )rK   rM   r#   r   r   r   
itervaluesG  s    zOrderedDict.itervaluesc                 C   s   t | S r   )rK   r#   r   r   r   iterkeysJ  s    zOrderedDict.iterkeysc                 C   s   t |  S r   )rK   rm   r#   r   r   r   	iteritemsM  s    zOrderedDict.iteritemsc                 C   sH   || kr6z| j | W n tk
r4   |g| _ Y nX t| || d S r   )ry   appendre   r   r   r]   r   r   r   r   P  s    zOrderedDict.__setitem__c                 C   s   t | | | j| d S r   )r   r   ry   remover_   r   r   r   r   Z  s    zOrderedDict.__delitem__c                 G   s.   || k}t j| |f| }|r*| j| |S r   )r   r/   ry   r   )r   r>   rk   Zpresentr?   r   r   r   r/   ^  s
    zOrderedDict.popc                 C   s   t | }| j|d  |S Nr   )r   r0   ry   r   r   itemr   r   r   r0   e  s    
zOrderedDict.popitem)N)N)N)r   r   r   rA   ro   ru   r$   r   r.   r<   r|   r&   r1   rN   rV   rM   rm   r   r   r   r   r   r   r/   r0   r   r   r   r   rr     s,   



rr   c                   @   s   e Zd Zd&ddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd ZeZdd ZeZdd ZeZdd ZeZdd ZeZdd ZeZd d! ZeZd"d# ZeZd$d% ZeZdS )'
OrderedSetNc                 C   s6   t |  |d k	r,t|| _t | | j ng | _d S r   )setr   unique_listry   r&   )r   r*   r   r   r   r   l  s
    

zOrderedSet.__init__c                 C   s$   || kr| j | t| | d S r   ry   r   r   addr   elementr   r   r   r   t  s    zOrderedSet.addc                 C   s   t | | | j| d S r   )r   r   ry   r   r   r   r   r   y  s    zOrderedSet.removec                 C   s&   || kr| j || t| | d S r   )ry   insertr   r   )r   posr   r   r   r   r   }  s    zOrderedSet.insertc                 C   s$   || kr | j | t| | d S r   )ry   r   r   r   r   r   r   discard  s    zOrderedSet.discardc                 C   s   t |  g | _d S r   )r   r.   ry   r#   r   r   r   r.     s    
zOrderedSet.clearc                 C   s
   | j | S r   rx   r_   r   r   r   r`     s    zOrderedSet.__getitem__c                 C   s
   t | jS r   r~   r#   r   r   r   rN     s    zOrderedSet.__iter__c                 C   s
   |  |S r   )r(   rZ   r   r   r   r\     s    zOrderedSet.__add__c                 C   s   d| j j| jf S Nz%s(%r))r   r   ry   r#   r   r   r   r-     s    zOrderedSet.__repr__c                 C   s.   |D ]$}|| kr| j | t| | q| S r   r   )r   iterableer   r   r   r&     s
    zOrderedSet.updatec                 C   s   |  | }|| |S r   )r   r&   r   r[   resultr   r   r   r(     s    

zOrderedSet.unionc                    s    t   |  fdd| D S )Nc                 3   s   | ]}| kr|V  qd S r   r   rQ   ar[   r   r   	<genexpr>  s      z*OrderedSet.intersection.<locals>.<genexpr>r   r   rZ   r   r   r   intersection  s    zOrderedSet.intersectionc                    s<   t    fddD }|fdd D  |S )Nc                 3   s   | ]}| kr|V  qd S r   r   r   r   r   r   r     s      z2OrderedSet.symmetric_difference.<locals>.<genexpr>c                 3   s   | ]}| kr|V  qd S r   r   r   r#   r   r   r     s      )r   r   r&   r   r   )r[   r   r   symmetric_difference  s    zOrderedSet.symmetric_differencec                    s    t   |  fdd| D S )Nc                 3   s   | ]}| kr|V  qd S r   r   r   r   r   r   r     s      z(OrderedSet.difference.<locals>.<genexpr>r   rZ   r   r   r   
difference  s    zOrderedSet.differencec                    s.   t   t |    fdd| jD | _| S )Nc                    s   g | ]}| kr|qS r   r   r   r   r   r   rS     s      z2OrderedSet.intersection_update.<locals>.<listcomp>)r   intersection_updatery   rZ   r   r   r   r     s    zOrderedSet.intersection_updatec                    sD   t  |  fdd jD  _  j fdd|jD 7  _ S )Nc                    s   g | ]}| kr|qS r   r   r   r#   r   r   rS     s      z:OrderedSet.symmetric_difference_update.<locals>.<listcomp>c                    s   g | ]}| kr|qS r   r   r   r#   r   r   rS     s      )r   symmetric_difference_updatery   rZ   r   r#   r   r     s    z&OrderedSet.symmetric_difference_updatec                    s&   t  |  fdd jD  _ S )Nc                    s   g | ]}| kr|qS r   r   r   r#   r   r   rS     s      z0OrderedSet.difference_update.<locals>.<listcomp>)r   difference_updatery   rZ   r   r#   r   r     s    zOrderedSet.difference_update)N)r   r   r   r   r   r   r   r   r.   r`   rN   r\   r-   __str__r&   __ior__r(   __or__r   __and__r   __xor__r   __sub__r   __iand__r   __ixor__r   __isub__r   r   r   r   r   k  s6   
r   c                   @   s>  e Zd ZdZdMddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$e$Z%dEdF Z&dGdH Z'dIdJ Z(dKdL Z)dS )NIdentitySetzA 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.

    Nc                 C   s   t  | _|r| | d S r   )r   _membersr&   r   r   r   r   r   r     s    zIdentitySet.__init__c                 C   s   || j t|< d S r   r   idrj   r   r   r   r     s    zIdentitySet.addc                 C   s   t || jkS r   )r   r   rj   r   r   r   rg     s    zIdentitySet.__contains__c                 C   s   | j t|= d S r   r   rj   r   r   r   r     s    zIdentitySet.removec                 C   s(   z|  | W n tk
r"   Y nX d S r   )r   rd   rj   r   r   r   r     s    zIdentitySet.discardc                 C   s6   z| j  }|d W S  tk
r0   tdY nX d S )Nr   zpop from an empty set)r   r0   rd   )r   pairr   r   r   r/     s
    

zIdentitySet.popc                 C   s   | j   d S r   )r   r.   r#   r   r   r   r.     s    zIdentitySet.clearc                 C   s   t dd S )Nzcannot compare sets using cmp()r   rZ   r   r   r   __cmp__  s    zIdentitySet.__cmp__c                 C   s   t |tr| j|jkS dS d S )NFr7   r   r   rZ   r   r   r   __eq__  s    
zIdentitySet.__eq__c                 C   s   t |tr| j|jkS dS d S NTr   rZ   r   r   r   __ne__  s    
zIdentitySet.__ne__c                 C   sV   t || jr|}n
| |}t| t|kr0dS t|jjt| j D ]} dS dS NFTr7   r   rI   r   r   rg   rK   rV   r   r   r[   mr   r   r   issubset
  s    
 zIdentitySet.issubsetc                 C   s   t |tstS | |S r   )r7   r   NotImplementedr   rZ   r   r   r   __le__  s    
zIdentitySet.__le__c                 C   s(   t |tstS t| t|k o&| |S r   )r7   r   r   rI   r   rZ   r   r   r   __lt__  s    
zIdentitySet.__lt__c                 C   sV   t || jr|}n
| |}t| t|k r0dS t| jjt|j D ]} dS dS r   r   r   r   r   r   
issuperset"  s    
 zIdentitySet.issupersetc                 C   s   t |tstS | |S r   )r7   r   r   r   rZ   r   r   r   __ge__1  s    
zIdentitySet.__ge__c                 C   s(   t |tstS t| t|ko&| |S r   )r7   r   r   rI   r   rZ   r   r   r   __gt__6  s    
zIdentitySet.__gt__c                 C   s4   |   }| j}|j| |jdd |D  |S )Nc                 s   s   | ]}t ||fV  qd S r   r   rQ   r^   r   r   r   r   ?  s     z$IdentitySet.union.<locals>.<genexpr>)r   r   r&   r   r   r   membersr   r   r   r(   ;  s
    zIdentitySet.unionc                 C   s   t |tstS | |S r   )r7   r   r   r(   rZ   r   r   r   r   B  s    
zIdentitySet.__or__c                 C   s   | j dd |D  d S )Nc                 s   s   | ]}t ||fV  qd S r   r   r   r   r   r   r   H  s     z%IdentitySet.update.<locals>.<genexpr>)r   r&   r   r   r   r   r&   G  s    zIdentitySet.updatec                 C   s   t |tstS | | | S r   )r7   r   r   r&   rZ   r   r   r   r   J  s    

zIdentitySet.__ior__c                    sZ   |   }| j}t|| j r*t|j  ndd |D  |j fdd| D  |S )Nc                 S   s   h | ]}t |qS r   r   r   r   r   r   	<setcomp>V  s     z)IdentitySet.difference.<locals>.<setcomp>c                 3   s"   | ]\}}| kr||fV  qd S r   r   rQ   rR   vr   r   r   r   X  s      z)IdentitySet.difference.<locals>.<genexpr>r   r   r7   r   rV   r&   rm   r   r   r   r   r   P  s    zIdentitySet.differencec                 C   s   t |tstS | |S r   )r7   r   r   r   rZ   r   r   r   r   \  s    
zIdentitySet.__sub__c                 C   s   |  |j| _d S r   )r   r   r   r   r   r   r   a  s    zIdentitySet.difference_updatec                 C   s   t |tstS | | | S r   )r7   r   r   r   rZ   r   r   r   r   d  s    

zIdentitySet.__isub__c                    sZ   |   }| j}t|| j r*t|j  ndd |D  |j fdd| D  |S )Nc                 S   s   h | ]}t |qS r   r   r   r   r   r   r   p  s     z+IdentitySet.intersection.<locals>.<setcomp>c                 3   s"   | ]\}}| kr||fV  qd S r   r   r   r   r   r   r   q  s     z+IdentitySet.intersection.<locals>.<genexpr>r   r   r   r   r   r   j  s    zIdentitySet.intersectionc                 C   s   t |tstS | |S r   )r7   r   r   r   rZ   r   r   r   r   v  s    
zIdentitySet.__and__c                 C   s   |  |j| _d S r   )r   r   r   r   r   r   r   {  s    zIdentitySet.intersection_updatec                 C   s   t |tstS | | | S r   )r7   r   r   r   rZ   r   r   r   r   ~  s    

zIdentitySet.__iand__c                    sp   |   }| j t|| j r"|jndd |D |jfdd  D  |j fdd D  |S )Nc                 S   s   i | ]}t ||qS r   r   r   r   r   r   
<dictcomp>  s      z4IdentitySet.symmetric_difference.<locals>.<dictcomp>c                 3   s"   | ]\}}| kr||fV  qd S r   r   r   r   r   r   r     s      z3IdentitySet.symmetric_difference.<locals>.<genexpr>c                 3   s"   | ]\}}| kr||fV  qd S r   r   r   )r   r   r   r     s      )r   r   r7   r&   rm   )r   r   r   r   )r   r[   r   r     s    z IdentitySet.symmetric_differencec                 C   s   t |tstS | |S r   r7   r   r   r   rZ   r   r   r   r     s    
zIdentitySet.__xor__c                 C   s   |  |j| _d S r   )r   r   r   r   r   r   r     s    z'IdentitySet.symmetric_difference_updatec                 C   s   t |tstS | | | S r   r   rZ   r   r   r   r     s    

zIdentitySet.__ixor__c                 C   s   t | t| j S r   )typerK   r   rM   r#   r   r   r   r<     s    zIdentitySet.copyc                 C   s
   t | jS r   )rI   r   r#   r   r   r   rJ     s    zIdentitySet.__len__c                 C   s   t | j S r   )rK   r   rM   r#   r   r   r   rN     s    zIdentitySet.__iter__c                 C   s   t dd S )Nzset objects are unhashabler   r#   r   r   r   __hash__  s    zIdentitySet.__hash__c                 C   s   dt | jt| j f S r   )r   r   rL   r   rM   r#   r   r   r   r-     s    zIdentitySet.__repr__)N)*r   r   r   rA   r   r   rg   r   r   r/   r.   r   r   r   r   r   r   r   r   r   r(   r   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   r<   r|   rJ   rN   r   r-   r   r   r   r   r     sN   
r   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )WeakSequencer   c                    s0   t | fdd  | _ fdd|D | _d S )Nc                 S   s   | }|d k	r|j |  d S r   )_storager   )r   selfrefr   r   r   r   _remove  s    z&WeakSequence.__init__.<locals>._removec                    s   g | ]}t | qS r   )weakrefref)rQ   r   r   r   r   rS     s    z)WeakSequence.__init__.<locals>.<listcomp>)r   r   r   r   )r   Z_WeakSequence__elementsr   r   r   r     s
    
zWeakSequence.__init__c                 C   s   | j t|| j d S r   )r   r   r   r   r   r   r   r   r   r     s    zWeakSequence.appendc                 C   s
   t | jS r   )rI   r   r#   r   r   r   rJ     s    zWeakSequence.__len__c                 C   s   dd dd | j D D S )Nc                 s   s   | ]}|d k	r|V  qd S r   r   r   r   r   r   r     s     z(WeakSequence.__iter__.<locals>.<genexpr>c                 s   s   | ]}| V  qd S r   r   )rQ   r   r   r   r   r     s     )r   r#   r   r   r   rN     s    zWeakSequence.__iter__c                 C   s:   z| j | }W n  tk
r.   td| Y nX | S d S )NzIndex %s out of range)r   rd   
IndexError)r   indexr^   r   r   r   r`     s
    zWeakSequence.__getitem__N)r   )r   r   r   r   r   rJ   rN   r`   r   r   r   r   r     s
   
r   c                   @   s   e Zd ZdddZdS )OrderedIdentitySetNc                 C   s.   t |  t | _|r*|D ]}| | qd S r   )r   r   rr   r   r   )r   r   or   r   r   r     s
    
zOrderedIdentitySet.__init__)N)r   r   r   r   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )PopulateDictzA dict which populates missing values via a creation function.

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

    c                 C   s
   || _ d S r   creator)r   r   r   r   r   r     s    zPopulateDict.__init__c                 C   s   |  | | |< }|S r   r   r   r>   valr   r   r   __missing__  s    zPopulateDict.__missing__Nr   r   r   rA   r   r   r   r   r   r   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    c                 C   s   |j | _|j}t|| _d S r   )__func__r   __self__r   r   weakself)r   Zcreator_methodr   r   r   r   r     s    zWeakPopulateDict.__init__c                 C   s   |  |  | | |< }|S r   )r   r   r   r   r   r   r     s    zWeakPopulateDict.__missing__Nr   r   r   r   r   r     s   r   c                 C   s   t t| S r   )propertyoperator
itemgetter)idxr   r   r   <lambda>
      r   c                    s>   t  j s$fdd| D S  fdd| D S d S )Nc                    s    g | ]}| kr|s|qS r   r   rQ   x)seenseen_addr   r   rS     s       zunique_list.<locals>.<listcomp>c                    s(   g | ] } |kr |s|qS r   r   r   hashfuncr   r   r   r   rS     s    )r   r   )seqr   r   r   r   r     s    r   c                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
UniqueAppenderzAppends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    Nc                 C   sH   || _ i | _|rt||| _n&t|dr2|j| _nt|drD|j| _d S )Nr   r   )rH   _uniquegetattr_data_appenderr}   r   r   )r   rH   Zviar   r   r   r   "  s    


zUniqueAppender.__init__c                 C   s*   t |}|| jkr&| | d| j|< d S r   )r   r   r   )r   r   Zid_r   r   r   r   ,  s    

zUniqueAppender.appendc                 C   s
   t | jS r   )rK   rH   r#   r   r   r   rN   2  s    zUniqueAppender.__iter__)N)r   r   r   rA   r   r   rN   r   r   r   r   r     s   

r   c                 C   s0   t | dkr(t| d tjr(t| d S | S d S )Nr   r   )rI   r7   typesGeneratorTyperL   r5   r   r   r   coerce_generator_arg6  s    r   c                 C   sF   | d kr|S t | tjr&t | tt r,| gS t | tr:| S t| S d S r   )r7   r   Iterabler	   r   rL   )r   rk   r   r   r   to_list=  s     
r   c                 C   s   t | dd |D S )zreturn 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.

    c                 S   s   g | ]}|j r|qS r   )r   rQ   ir   r   r   rS   R  s      z$has_intersection.<locals>.<listcomp>)boolr   )set_r   r   r   r   has_intersectionJ  s    r   c                 C   s,   | d krt  S t| t s$t t| S | S d S r   )r   r7   r   r   r   r   r   to_setU  s
    
r   c                 C   s,   | d krt  S t| t s$t t| S | S d S r   )
column_setr7   r   r   r   r   r   to_column_set^  s
    
r  c                 K   s&   |   } |r| | | jf | | S )z5Copy the given dict and update with the given values.)r<   r&   )r*   Z_newr   r   r   r   update_copyg  s
    
r  c                 c   s>   | D ]4}t |ts2t|dr2t|D ]
}|V  q$q|V  qdS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rN   N)r7   rO   r}   flatten_iterator)r   elemyr   r   r   r  q  s
    
r  c                   @   sd   e Zd ZdZdZdddZdd	 Zdd
dZdd Zdd Z	dd Z
dd Zedd Zdd ZdS )LRUCachezDictionary 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.

    )capacity	threshold
size_alert_counter_mutexd         ?Nc                 C   s&   || _ || _|| _d| _t | _d S r   )r  r	  r
  r  r
   Lockr  )r   r  r	  r
  r   r   r   r     s
    zLRUCache.__init__c                 C   s   |  j d7  _ | j S Nr   )r  r#   r   r   r   _inc_counter  s    zLRUCache._inc_counterc                 C   s2   t | ||}||k	r*|  |d< |d S |S d S N   r   )r   rl   r  )r   r>   rk   r   r   r   r   rl     s
    zLRUCache.getc                 C   s    t | |}|  |d< |d S r  )r   r`   r  )r   r>   r   r   r   r   r`     s    zLRUCache.__getitem__c                 C   s   dd t | D S )Nc                 S   s   g | ]}|d  qS )r   r   r   r   r   r   rS     s     z#LRUCache.values.<locals>.<listcomp>)r   rM   r#   r   r   r   rM     s    zLRUCache.valuesc                 C   s    || kr| | S || |< |S d S r   r   r=   r   r   r   r1     s    zLRUCache.setdefaultc                 C   sF   t | |}|d kr2|||  g}t | || n||d< |   d S r  )r   rl   r  r   _manage_size)r   r>   r?   r   r   r   r   r     s    zLRUCache.__setitem__c                 C   s   | j | j | j  S r   )r  r	  r#   r   r   r   size_threshold  s    zLRUCache.size_thresholdc              	   C   s   | j dsd S zt| j}t| | j| j| j  kr|rHd}| |  tt	
| tddd}|| jd  D ],}z| |d = W qp tk
r   Y qpY qpX qpqW 5 | j   X d S )NFr  T)r>   reverser   )r  acquirereleaser   r
  rI   r  r	  rt   r   rM   r   r   rd   )r   r
  Z
by_counterr   r   r   r   r    s&    

  zLRUCache._manage_size)r  r  N)N)r   r   r   rA   ro   r   r  rl   r`   rM   r1   r   r   r  r  r   r   r   r   r  ~  s   	

	
r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ScopedRegistrya  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 )aV  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)
createfunc	scopefuncregistry)r   r  r  r   r   r   r     s    zScopedRegistry.__init__c                 C   s@   |   }z| j| W S  tk
r:   | j||   Y S X d S r   )r  r  rd   r1   r  r_   r   r   r   __call__  s
    zScopedRegistry.__call__c                 C   s   |   | jkS )z9Return True if an object is present in the current scope.)r  r  r#   r   r   r   has  s    zScopedRegistry.hasc                 C   s   || j |  < dS )z$Set the value for the current scope.N)r  r  r   r^   r   r   r   r     s    zScopedRegistry.setc                 C   s*   z| j |  = W n tk
r$   Y nX dS )z Clear the current scope, if any.N)r  r  rd   r#   r   r   r   r.     s    zScopedRegistry.clearN	r   r   r   rA   r   r  r  r   r.   r   r   r   r   r    s   r  c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    c                 C   s   || _ t | _d S r   )r  r
   localr  )r   r  r   r   r   r     s    zThreadLocalRegistry.__init__c                 C   s8   z
| j jW S  tk
r2   |   }| j _| Y S X d S r   )r  r?   re   r  )r   r   r   r   r   r    s
    
zThreadLocalRegistry.__call__c                 C   s   t | jdS )Nr?   )r}   r  r#   r   r   r   r    s    zThreadLocalRegistry.hasc                 C   s   || j _d S r   )r  r?   r  r   r   r   r     s    zThreadLocalRegistry.setc                 C   s$   z
| j `W n tk
r   Y nX d S r   )r  r?   re   r#   r   r   r   r.     s    
zThreadLocalRegistry.clearNr   r   r   r   r   r!    s   r!  c                 C   s0   d}| D ]"}||kr|d7 }|dkr dS qdS )zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr   )sequencetargetcr   r   r   r   	has_dupes%  s    
r&  )N)N)N)N)N)=rA   
__future__r   r   r   r   compatr   r   r   r   r   r	   r
   	frozenset	EMPTY_SETrG   r   r4   Zsqlalchemy.cimmutabledictr2   MappingregisterImportErrorr"   r9   r6   r   r:   rB   rq   rh   ru   rr   rw   r   r   r   r   r   r   r   r  Zcolumn_dictZordered_column_setr   Z_gettersZ_property_gettersr   r   r   r   r   r   r  r  r  r  r  r!  r&  r   r   r   r   <module>   sv   :	O



ej _"	


		

Q8