U
    ؒ]|[                     @   s~  d 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 d
ZG dd deZe ZG dd deZeZzddlmZ W n ek
r   eZY nX G dd deZeZzddlmZ W n ek
r   eZY nX G dd deZG dd deeZeeG dd deZG dd deeZeeG dd deZdd Zdd  Zd!d" Zd#d$ Z dS )%zAdapter management
    N)implementer)
providedBy	Interface)ro)IAdapterRegistry)_normalize_name)STRING_TYPES c                   @   s   e Zd ZdZdZdddZdd Zedd	 d
d	 Zdd Z	dd Z
dd ZefddZdddZdd ZdddZdd ZdS )BaseAdapterRegistry)	lookupqueryMultiAdapterlookup1queryAdapteradapter_hook	lookupAllnamessubscriptionssubscribersr    c                 C   s$   g | _ g | _i | _|   || _d S N)	_adapters_subscribers	_provided_createLookup	__bases__selfbasesr   r   8/usr/lib/python3/dist-packages/zope/interface/adapter.py__init__(   s
    zBaseAdapterRegistry.__init__c                 C   s$   || j d< t| | _| |  d S Nr   )__dict__r   changedr   r   r   r   	_setBasesW   s    
zBaseAdapterRegistry._setBasesc                 C   s
   | j d S r!   )r"   r   r   r   r   <lambda>\       zBaseAdapterRegistry.<lambda>c                 C   s
   |  |S r   )r$   r   r   r   r   r&   ]   r'   c                 C   s.   |  | | _| jD ]}t| j|| j|< qd S r   )LookupClass	_v_lookup
_delegatedgetattrr"   )r   namer   r   r   r   `   s    
z!BaseAdapterRegistry._createLookupc                 C   s   |  j d7  _ | j| d S N   )_generationr)   r#   r   originally_changedr   r   r   r#   e   s    zBaseAdapterRegistry.changedc                 C   s   t |tstd|d kr.| |||| d S ttt|}t|}t|}| j	}t||krj|
i  qR|| }||f }|D ]&}	||	}
|
d kri }
|
||	< |
}q|||krd S |||< | j|dd }|| j|< |dkr| j| | |  d S )Nname is not a stringr   r.   )
isinstancer	   
ValueError
unregistertuplemap_convert_None_to_Interfacer   lenr   appendgetr   r)   add_extendorr#   )r   requiredprovidedr,   valueorderbyorder
componentskeykdnr   r   r   registeri   s6    



zBaseAdapterRegistry.registerc           
      C   sv   t tt|}t|}t|}| j}t||kr4d S || }||f }|D ] }||}	|	d krf d S |	}qJ||S r   )r6   r7   r8   r   r9   r   r;   )
r   r=   r>   r,   r@   rA   rB   rC   rD   rE   r   r   r   
registered   s    

zBaseAdapterRegistry.registeredNc                 C   s.  t tt|}t|}| j}|t|kr,dS || }||f }g }	|D ].}
||
}|d krb d S |	||
f |}qF||}|d krd S |d k	r||k	rd S ||= |st|	D ] \}}
||
 }|r qq||
= q|r|d s|d= q| j| d }|dkr| j|= | j	
| n
|| j|< | |  d S )NFr.   r   )r6   r7   r8   r9   r   r;   r:   reversedr   r)   remove_extendorr#   )r   r=   r>   r,   r?   r@   rA   rB   rC   lookupsrD   rE   oldcomprF   r   r   r   r5      sD    




zBaseAdapterRegistry.unregisterc                 C   s   t tt|}t}t|}| j}t||kr8|i  q || }||f }|D ]&}	||	}
|
d krpi }
|
||	< |
}qN||d|f ||< |d k	r| j|dd }|| j|< |dkr| j	
| | |  d S )Nr   r   r.   )r6   r7   r8   _BLANKr9   r   r:   r;   r   r)   r<   r#   )r   r=   r>   r?   r,   r@   rA   rB   rC   rD   rE   rF   r   r   r   	subscribe   s*    


zBaseAdapterRegistry.subscribec                    s^  t tt|}t|}| j}|t|kr,d S || }||f }g }|D ].}	||	}
|
d krb d S |||	f |
}qF|t}|sd S  d krd}nt  fdd|D }||krd S |r||t< nH|t= t|D ] \}}	||	 }
|
r qq||	= q|r|d s|d= q|d k	rP| j	| t| t| }|dkrP| j	|= | j
| | |  d S )Nr   c                    s   g | ]}| kr|qS r   r   ).0vr?   r   r   
<listcomp>  s      z3BaseAdapterRegistry.unsubscribe.<locals>.<listcomp>rI   r   )r6   r7   r8   r9   r   r;   r:   rO   rJ   r   r)   rK   r#   )r   r=   r>   r?   r@   rA   rB   rC   rL   rD   rE   rM   newrN   rF   r   rS   r   unsubscribe   sL    





zBaseAdapterRegistry.unsubscribec                 C   s   G dd d}|S )Nc                   @   s   e Zd Zi ZdS )z2BaseAdapterRegistry.get.<locals>.XXXTwistedFakeOutN)__name__
__module____qualname__ZselfImpliedr   r   r   r   XXXTwistedFakeOut'  s   rZ   r   )r   _rZ   r   r   r   r;   &  s    zBaseAdapterRegistry.get)r   )N)N)rW   rX   rY   r*   r/   r    r$   propertyr   r   r#   rG   rO   rH   r5   rP   rV   r;   r   r   r   r   r      s   
/#
0
<r   c                   @   sn   e Zd Zdd ZdddZdd Zedfdd	Zedfd
dZedfddZ	edfddZ
dd Zdd ZdS )LookupBaseFallbackc                 C   s   i | _ i | _i | _d S r   )_cache_mcache_scacher%   r   r   r   r    /  s    zLookupBaseFallback.__init__Nc                 C   s"   | j   | j  | j  d S r   )r^   clearr_   r`   )r   ignoredr   r   r   r#   4  s    

zLookupBaseFallback.changedc                 C   sL   | j |}|d kr"i }|| j |< |rH||}|d krDi }|||< |}|S r   )r^   r;   )r   r>   r,   cachecr   r   r   	_getcache9  s    

zLookupBaseFallback._getcachec                 C   s   t |tstd| ||}t|}t|dkrD||d t}n|t|t}|tkr| |||}t|dkr|||d < n||t|< |d kr|S |S )Nr2   r.   r   )	r3   r	   r4   re   r6   r9   r;   _not_in_mapping_uncached_lookupr   r=   r>   r,   defaultrc   resultr   r   r   r   F  s    
zLookupBaseFallback.lookupc                 C   sT   t |tstd| ||}||t}|tkrD| |f|||S |d krP|S |S Nr2   )r3   r	   r4   re   r;   rf   r   rh   r   r   r   r   \  s    
zLookupBaseFallback.lookup1c                 C   s   |  ||||S r   )r   )r   objectr>   r,   ri   r   r   r   r   i  s    zLookupBaseFallback.queryAdapterc           	      C   sj   t |tstdt|}| ||}||t}|tkrJ| |f||}|d k	rf||}|d k	rf|S |S rk   )r3   r	   r4   r   re   r;   rf   r   )	r   r>   rl   r,   ri   r=   rc   factoryrj   r   r   r   r   l  s    
zLookupBaseFallback.adapter_hookc                 C   sV   | j |}|d kr"i }|| j |< t|}||t}|tkrR| ||}|||< |S r   )r_   r;   r6   rf   _uncached_lookupAllr   r=   r>   rc   rj   r   r   r   r   |  s    
zLookupBaseFallback.lookupAllc                 C   sV   | j |}|d kr"i }|| j |< t|}||t}|tkrR| ||}|||< |S r   )r`   r;   r6   rf   _uncached_subscriptionsro   r   r   r   r     s    
z LookupBaseFallback.subscriptions)N)rW   rX   rY   r    r#   re   rO   r   r   r   r   r   r   r   r   r   r   r]   -  s   
r]   )
LookupBasec                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )VerifyingBaseFallbackc                 C   s4   t | | | jjdd  | _dd | jD | _d S )Nr.   c                 S   s   g | ]
}|j qS r   r/   rQ   rr   r   r   rT     s     z1VerifyingBaseFallback.changed.<locals>.<listcomp>)r]   r#   	_registryr   
_verify_ro_verify_generationsr0   r   r   r   r#     s    zVerifyingBaseFallback.changedc                 C   s$   dd | j D | jkr | d  d S )Nc                 S   s   g | ]
}|j qS r   rs   rt   r   r   r   rT     s     z1VerifyingBaseFallback._verify.<locals>.<listcomp>)rw   rx   r#   r%   r   r   r   _verify  s    zVerifyingBaseFallback._verifyc                 C   s   |    t| ||S r   )ry   r]   re   )r   r>   r,   r   r   r   re     s    zVerifyingBaseFallback._getcachec                 C   s   |    t| ||S r   )ry   r]   r   r   r=   r>   r   r   r   r     s    zVerifyingBaseFallback.lookupAllc                 C   s   |    t| ||S r   )ry   r]   r   rz   r   r   r   r     s    z#VerifyingBaseFallback.subscriptionsN)rW   rX   rY   r#   ry   re   r   r   r   r   r   r   rr     s
   rr   )VerifyingBasec                       s   e Zd Z fddZd fdd	Zdd Zdd	 Zd
d Zdd Ze	fddZ
e	dfddZdd Zdd Zdd Zdd Z  ZS )AdapterLookupBasec                    s&   || _ i | _|   tt|   d S r   )rv   	_requiredinit_extendorssuperr|   r    )r   registry	__class__r   r   r      s    zAdapterLookupBase.__init__Nc                    sF   t t| d  | j D ]}| }|d k	r||  q| j  d S r   )r   r|   r#   r}   keysrV   ra   )r   rb   ru   r   r   r   r#     s    zAdapterLookupBase.changedc                 C   s"   i | _ | jjD ]}| | qd S r   )
_extendorsrv   r   r<   )r   pr   r   r   r~     s    z AdapterLookupBase.init_extendorsc                    sP   | j } jD ]>}||d} fdd|D  g  fdd|D  ||< qd S )Nr   c                    s   g | ]}  |r|qS r   ZisOrExtendsrQ   er>   r   r   rT     s     
 z2AdapterLookupBase.add_extendor.<locals>.<listcomp>c                    s   g | ]}  |s|qS r   r   r   r   r   r   rT     s     
 r   Z__iro__r;   )r   r>   r   i	extendorsr   r   r   r<     s    
zAdapterLookupBase.add_extendorc                    s4   | j } jD ]"} fdd||dD ||< qd S )Nc                    s   g | ]}| kr|qS r   r   r   r   r   r   rT      s    z5AdapterLookupBase.remove_extendor.<locals>.<listcomp>r   r   )r   r>   r   r   r   r   r   rK     s    
z!AdapterLookupBase.remove_extendorc                 G   s6   | j }|D ]&}| }||kr
||  d||< q
d S r-   )r}   weakrefrP   )r   r=   Z_refsru   refr   r   r   
_subscribe  s    
zAdapterLookupBase._subscribec           
      C   s~   t |}d }t|}| jjD ]R}|j}|t|kr4q|jj|}|sHq|| }	t|	|||d|}|d k	r qpq| j	|  |S Nr   )
r6   r9   rv   r   r   r)   r   r;   _lookupr   )
r   r=   r>   r,   rj   r@   r   rA   r   rB   r   r   r   rg     s$    
z"AdapterLookupBase._uncached_lookupc                 C   s8   |  tt|||}|d kr |S || }|d kr4|S |S r   )r   r7   r   )r   objectsr>   r,   ri   rm   rj   r   r   r   r   #  s    z#AdapterLookupBase.queryMultiAdapterc           	      C   s~   t |}t|}i }t| jjD ]F}|j}|t|kr8q |jj|}|sLq || }t	||||d| q | j
|  t | S r   )r6   r9   rJ   rv   r   r   r)   r   r;   
_lookupAllr   items)	r   r=   r>   r@   rj   r   rA   r   rB   r   r   r   rn   .  s    
z%AdapterLookupBase._uncached_lookupAllc                 C   s   dd |  ||D S )Nc                 S   s   g | ]}|d  qS )r   r   )rQ   rd   r   r   r   rT   A  s     z+AdapterLookupBase.names.<locals>.<listcomp>)r   rz   r   r   r   r   @  s    zAdapterLookupBase.namesc              	   C   s   t |}t|}g }t| jjD ]X}|j}|t|kr8q |d krH|f}n|jj|}|d kr`q t	|| ||t
|d| q | j|  |S r   )r6   r9   rJ   rv   r   r   r)   r   r;   _subscriptionsrO   r   )r   r=   r>   r@   rj   r   rA   r   r   r   r   rp   C  s&      
z)AdapterLookupBase._uncached_subscriptionsc                 C   s^   |  tt||}|d kr2d}|D ]}||  q"n(g }|D ]}|| }|d k	r:|| q:|S )Nr   )r   r7   r   r:   )r   r   r>   r   rj   ZsubscriptionZ
subscriberr   r   r   r   Z  s    zAdapterLookupBase.subscribers)N)rW   rX   rY   r    r#   r~   r<   rK   r   rO   rg   r   rn   r   rp   r   __classcell__r   r   r   r   r|     s   r|   c                   @   s   e Zd ZdS )AdapterLookupNrW   rX   rY   r   r   r   r   r   h  s   r   c                       sJ   e Zd ZeZd fdd	Zdd Zdd Z fdd	Z fd
dZ	  Z
S )AdapterRegistryr   c                    s   t  | _tt| | d S r   )r   WeakKeyDictionary_v_subregistriesr   r   r    r   r   r   r   r    p  s    
zAdapterRegistry.__init__c                 C   s   d| j |< d S r-   r   r   ru   r   r   r   _addSubregistryw  s    zAdapterRegistry._addSubregistryc                 C   s   || j kr| j |= d S r   r   r   r   r   r   _removeSubregistryz  s    
z"AdapterRegistry._removeSubregistryc                    sZ   | j dd}|D ]}||kr||  q|D ]}||kr.||  q.tt| | d S )Nr   r   )r"   r;   r   r   r   r   r$   )r   r   rM   ru   r   r   r   r$   ~  s    zAdapterRegistry._setBasesc                    s.   t t| | | j D ]}|| qd S r   )r   r   r#   r   r   )r   r1   subr   r   r   r#     s    zAdapterRegistry.changed)r   )rW   rX   rY   r   r(   r    r   r   r$   r#   r   r   r   r   r   r   k  s   r   c                   @   s   e Zd ZdS )VerifyingAdapterLookupNr   r   r   r   r   r     s   r   c                   @   s   e Zd ZeZdS )VerifyingAdapterRegistryN)rW   rX   rY   r   r(   r   r   r   r   r     s   r   c                 C   s   | d krt S | S d S r   r   )xr   r   r   r8     s    r8   c           
      C   s   ||k rN|| j D ]8}| |}|rt|||||d |}|d k	r|  S qn2|D ],}	| |	}|rR||}|d k	rR|  S qRd S r-   )__sro__r;   r   )
rB   specsr>   r,   r   lspeccompsru   ifacer   r   r   r     s    



r   c           	      C   sl   ||k rBt || jD ](}| |}|rt|||||d | qn&t |D ]}| |}|rJ|| qJd S r-   )rJ   r   r;   r   update)	rB   r   r>   rj   r   r   r   r   r   r   r   r   r     s    

r   c           
   	   C   s|   ||k rDt || jD ]*}| |}|rt||||||d | qn4t |D ]*}	| |	}|rL||}|rL|| qLd S r-   )rJ   r   r;   r   extend)
rB   r   r>   r,   rj   r   r   r   r   r   r   r   r   r     s    


r   )!__doc__r   Zzope.interfacer   r   r   r   Zzope.interface.interfacesr   Zzope.interface._compatr   r	   rO   rl   r   rf   r]   ZLookupBasePyZ-zope.interface._zope_interface_coptimizationsrq   ImportErrorrr   ZVerifyingBasePyr{   r|   r   r   r   r   r8   r   r   r   r   r   r   r   <module>   sJ     l

 $$