U
    [h!$                     @  s$  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 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ZddlmZ ddlmZ erddlmZ ddlmZ ededZededZG dd dZG dd deZddddd d!ZdS )"    )annotations)Any)cast)Dict)Iterable)Iterator)List)NoReturn)Optional)Set)Tuple)TYPE_CHECKING)TypeVarN   )util   )exc)_IdentityKeyType)InstanceState_T)Zbound_Oc                   @  sl  e Zd ZU ded< ded< ded< ddd	d
ZddddZddddZdddddZdddddZdddddZ	dddddZ
dDdd d d!d"d#Zdd$dd%d&Zd'dd(d)Zd*dd+d,Zd-d$dd.d/Zdddd0d1Zdddd2d3Zdddd4d5d6Zdddd7d8Zdddd9d:Zddd;d<Zddd=d>Zdddd?d@ZdAddBdCZdS )EIdentityMapzweakref.ref[IdentityMap]_wrz Dict[_IdentityKeyType[Any], Any]_dictzSet[InstanceState[Any]]	_modifiedNonereturnc                 C  s   i | _ t | _t| | _d S N)r   setr   weakrefrefr   self r$   =./venv/lib/python3.8/site-packages/sqlalchemy/orm/identity.py__init__+   s    zIdentityMap.__init__c                 C  s
   t | _d S r   )_killed_add_unpresentr"   r$   r$   r%   _kill0   s    zIdentityMap._killList[InstanceState[Any]]c                 C  s
   t  d S r   NotImplementedErrorr"   r$   r$   r%   
all_states3   s    zIdentityMap.all_statesInstanceState[Any]boolstater   c                 C  s
   t  d S r   r+   r#   r1   r$   r$   r%   contains_state6   s    zIdentityMap.contains_state_IdentityKeyType[Any]keyr   c                 C  s
   t  d S r   r+   r#   r6   r$   r$   r%   __contains__9   s    zIdentityMap.__contains__c                 C  s
   t  d S r   r+   r2   r$   r$   r%   safe_discard<   s    zIdentityMap.safe_discard_IdentityKeyType[_O]r   c                 C  s
   t  d S r   r+   r7   r$   r$   r%   __getitem__?   s    zIdentityMap.__getitem__NOptional[_O]r6   defaultr   c                 C  s
   t  d S r   r+   )r#   r6   r>   r$   r$   r%   getB   s    zIdentityMap.getOptional[InstanceState[_O]]c                 C  s
   t  d S r   r+   r7   r$   r$   r%   fast_get_stateG   s    zIdentityMap.fast_get_statezIterable[_IdentityKeyType[Any]]c                 C  s
   | j  S r   )r   keysr"   r$   r$   r%   rB   L   s    zIdentityMap.keyszIterable[object]c                 C  s
   t  d S r   r+   r"   r$   r$   r%   valuesO   s    zIdentityMap.valuesInstanceState[_O]c                 C  s
   t  d S r   r+   r2   r$   r$   r%   replaceR   s    zIdentityMap.replacec                 C  s
   t  d S r   r+   r2   r$   r$   r%   addU   s    zIdentityMap.addc                 C  s
   t  d S r   r+   r2   r$   r$   r%   _fast_discardX   s    zIdentityMap._fast_discardr1   r6   r   c                 C  s   |  | dS )zUoptional inlined form of add() which can assume item isn't present
        in the mapN)rF   r#   r1   r6   r$   r$   r%   r(   [   s    zIdentityMap._add_unpresentc                 C  s   | j |_|jr| j| d S r   )r   _instance_dictmodifiedr   rF   r2   r$   r$   r%   _manage_incoming_stateb   s    z"IdentityMap._manage_incoming_statec                 C  s   |` |jr| j| d S r   )rJ   rK   r   discardr2   r$   r$   r%   _manage_removed_stateh   s    z!IdentityMap._manage_removed_statec                 C  s   | j S r   )r   r"   r$   r$   r%   _dirty_statesm   s    zIdentityMap._dirty_statesc                 C  s
   t | jS )z[return True if any InstanceStates present have been marked
        as 'modified'.

        )r/   r   r"   r$   r$   r%   check_modifiedp   s    zIdentityMap.check_modifiedc                 C  s   || kS r   r$   r7   r$   r$   r%   has_keyw   s    zIdentityMap.has_keyintc                 C  s
   t | jS r   )lenr   r"   r$   r$   r%   __len__z   s    zIdentityMap.__len__)N)__name__
__module____qualname____annotations__r&   r)   r-   r3   r8   r9   r;   r?   rA   rB   rC   rE   rF   rG   r(   rL   rN   rO   rP   rQ   rT   r$   r$   r$   r%   r   %   s2   
 r   c                   @  s  e Zd ZU ded< dddddZdd	dd
dZdd	dddZdddddZdd	dddZddddddZ	dddddZ
d4dddddd Zd!d"d#d$Zd%d"d&d'Zd(d"d)d*Zd+d"d,d-Zdddd.d/Zdddd0d1Zdddd2d3ZdS )5WeakInstanceDictz/Dict[_IdentityKeyType[Any], InstanceState[Any]]r   r:   r   r5   c                 C  s,   t d| j| }| }|d kr(t||S NrD   )r   r   objKeyErrorr#   r6   r1   or$   r$   r%   r;      s
    zWeakInstanceDict.__getitem__r4   r/   c                 C  sL   z(|| j kr | j | }| }nW dS W n tk
r>   Y dS X |d k	S d S NF)r   r[   r\   r]   r$   r$   r%   r8      s    



zWeakInstanceDict.__contains__r.   r0   c                 C  sR   |j | jkrJtr|j d k	stz| j|j  |kW S  tk
rF   Y dS X ndS d S r_   )r6   r   r   AssertionErrorr\   r2   r$   r$   r%   r3      s    
zWeakInstanceDict.contains_statezOptional[InstanceState[Any]]c                 C  s   |j d k	st|j | jkrbz| j|j   }}W n tk
rF   d }Y qfX ||k	r\| | qfd S nd }|| j|j < | | |S r   )r6   r`   r   r\   rN   rL   )r#   r1   existingZexisting_non_noner$   r$   r%   rE      s    

zWeakInstanceDict.replacec                 C  s   |j }|d k	st|| jkrxz| j| }W n tk
r>   Y n:X ||k	rt| }|d k	rxtdt||j f ndS || j|< | 	| dS )NzZCan't attach instance %s; another instance with key %s is already present in this session.FT)
r6   r`   r   r\   r[   sa_excInvalidRequestErrororm_util	state_strrL   )r#   r1   r6   Zexisting_stater^   r$   r$   r%   rF      s&    


zWeakInstanceDict.addr   rH   c                 C  s   || j |< | j|_d S r   )r   r   rJ   rI   r$   r$   r%   r(      s    
zWeakInstanceDict._add_unpresentr@   c                 C  s   | j |S r   )r   r?   r7   r$   r$   r%   rA      s    zWeakInstanceDict.fast_get_stateNr<   r=   c                 C  sX   || j kr|S ztd| j | }W n tk
r:   | Y S X | }|d krP|S |S d S rZ   )r   r   r\   r[   )r#   r6   r>   r1   r^   r$   r$   r%   r?      s    

zWeakInstanceDict.getz6List[Tuple[_IdentityKeyType[Any], InstanceState[Any]]]r   c                 C  sJ   |   }g }|D ]4}| }|j}|d k	s.t|d k	r|||f q|S r   )r-   r[   r6   r`   append)r#   rC   resultr1   valuer6   r$   r$   r%   items   s    zWeakInstanceDict.itemszList[object]c                 C  s4   |   }g }|D ]}| }|d k	r|| q|S r   )r-   r[   rf   )r#   rC   rg   r1   rh   r$   r$   r%   rC      s    zWeakInstanceDict.valueszIterator[_IdentityKeyType[Any]]c                 C  s   t |  S r   )iterrB   r"   r$   r$   r%   __iter__   s    zWeakInstanceDict.__iter__r*   c                 C  s   t | j S r   )listr   rC   r"   r$   r$   r%   r-     s    zWeakInstanceDict.all_statesc                 C  sP   |j }|d k	stz| j| }W n tk
r4   Y nX ||krL| j|d  d S r   )r6   r`   r   r\   popr#   r1   r6   str$   r$   r%   rG     s    zWeakInstanceDict._fast_discardc                 C  s   |  | d S r   )r9   r2   r$   r$   r%   rM     s    zWeakInstanceDict.discardc                 C  sd   |j }|| jkr`|d k	stz| j| }W n tk
r>   Y n"X ||kr`| j|d  | | d S r   )r6   r   r`   r\   rm   rN   rn   r$   r$   r%   r9     s    
zWeakInstanceDict.safe_discard)N)rU   rV   rW   rX   r;   r8   r3   rE   rF   r(   rA   r?   ri   rC   rk   r-   rG   rM   r9   r$   r$   r$   r%   rY   ~   s"   
 
rY   r.   r4   r	   rH   c                 C  s   t jdt|  ddd S )NzObject %s cannot be converted to 'persistent' state, as this identity map is no longer valid.  Has the owning Session been closed?Zlkrp)code)rb   rc   rd   re   )r1   r6   r$   r$   r%   r'   &  s    r'   )Z
__future__r   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r     r   rd   r   rb   Z_typingr   r1   r   r   objectr   r   rY   r'   r$   r$   r$   r%   <module>   s0   Y )