a
    _^                     @   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d
l	mZ ddgZG dd deZe ZeG dd deZeG dd deZ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)_use_c_implAdapterRegistryVerifyingAdapterRegistryc                   @   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d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"   	_setBasesl   s    
zBaseAdapterRegistry._setBasesc                 C   s
   | j d S r$   )r%   r    r   r   r"   <lambda>q       zBaseAdapterRegistry.<lambda>c                 C   s
   |  |S r   )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   u   s    
z!BaseAdapterRegistry._createLookupc                 C   s   |  j d7  _ | j| d S N   )_generationr,   r&   r    originally_changedr   r   r"   r&   z   s    zBaseAdapterRegistry.changedc                 C   s  t |tstd|d u r.| |||| d S tdd |D }t|}t|}| j}t||krn|i  qV|| }||f }|D ]&}	|	|	}
|
d u ri }
|
||	< |
}q|	||u rd S |||< | j
	|dd }|| j
|< |dkr| j| | |  d S )Nname is not a stringc                 S   s   g | ]}t |qS r   _convert_None_to_Interface.0rr   r   r"   
<listcomp>   r*   z0BaseAdapterRegistry.register.<locals>.<listcomp>r   r1   )
isinstancer
   
ValueError
unregistertupler	   lenr   appendgetr   r,   add_extendorr&   )r    requiredprovidedr/   valueorderbyorder
componentskeykdnr   r   r"   register~   s6    



zBaseAdapterRegistry.register c           
      C   sz   t dd |D }t|}t|}| j}t||kr8d S || }||f }|D ] }||}	|	d u rj d S |	}qN||S )Nc                 S   s   g | ]}t |qS r   r6   r8   r   r   r"   r;      r*   z2BaseAdapterRegistry.registered.<locals>.<listcomp>)r?   r	   r@   r   rB   )
r    rD   rE   r/   rG   rH   rI   rJ   rK   rL   r   r   r"   
registered   s    

zBaseAdapterRegistry.registeredNc                 C   s2  t dd |D }t|}| j}|t|kr0dS || }||f }g }	|D ].}
||
}|d u rf d S |	||
f |}qJ||}|d u rd S |d ur||urd S ||= |st|	D ] \}}
||
 }|r qq||
= q|r|d s|d= q| j| d }|dkr| j|= | j| n
|| j|< | 	|  d S )Nc                 S   s   g | ]}t |qS r   r6   r8   r   r   r"   r;      r*   z2BaseAdapterRegistry.unregister.<locals>.<listcomp>Fr1   r   )
r?   r@   r   rB   rA   reversedr   r,   remove_extendorr&   )r    rD   rE   r/   rF   rG   rH   rI   rJ   lookupsrK   rL   oldcomprM   r   r   r"   r>      sD    




zBaseAdapterRegistry.unregisterc                 C   s   t dd |D }d}t|}| j}t||kr<|i  q$|| }||f }|D ]&}	||	}
|
d u rti }
|
||	< |
}qR||d|f ||< |d ur| j|dd }|| j|< |dkr| j| | |  d S )Nc                 S   s   g | ]}t |qS r   r6   r8   r   r   r"   r;      r*   z1BaseAdapterRegistry.subscribe.<locals>.<listcomp>rO   r   r   r1   )	r?   r@   r   rA   rB   r   r,   rC   r&   )r    rD   rE   rF   r/   rG   rH   rI   rJ   rK   rL   rM   r   r   r"   	subscribe   s*    


zBaseAdapterRegistry.subscribec                    sb  t dd |D }t|}| j}|t|kr0d S || }||f }g }|D ].}	||	}
|
d u rf d S |||	f |
}qJ|d}|sd S  d u rd}nt  fdd|D }||krd S |r||d< nH|d= t|D ] \}}	||	 }
|
r qq||	= q|r|d s|d= q|d urT| j| t| t| }|dkrT| j|= | j| | 	|  d S )Nc                 S   s   g | ]}t |qS r   r6   r8   r   r   r"   r;      r*   z3BaseAdapterRegistry.unsubscribe.<locals>.<listcomp>rO   r   c                    s   g | ]}| kr|qS r   r   )r9   vrF   r   r"   r;     r*   rQ   r   )
r?   r@   r   rB   rA   rR   r   r,   rS   r&   )r    rD   rE   rF   rG   rH   rI   rJ   rT   rK   rL   rU   newrV   rM   r   rY   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   r_   r   )r    _r_   r   r   r"   rB   ;  s    zBaseAdapterRegistry.get)r   )rO   )N)N)r\   r]   r^   r-   r2   r#   r'   propertyr   r   r&   rN   rP   r>   rW   r[   rB   r   r   r   r"   r   2   s   
/#

0
<r   c                       sf   e Zd Zdd ZdddZdd Zdd	d
ZdddZdddZd fdd	Z	dd Z
dd Z  ZS )
LookupBasec                 C   s   i | _ i | _i | _d S r   )_cache_mcache_scacher(   r   r   r"   r#   F  s    zLookupBase.__init__Nc                 C   s"   | j   | j  | j  d S r   )rc   clearrd   re   )r    ignoredr   r   r"   r&   K  s    

zLookupBase.changedc                 C   sL   | j |}|d u r"i }|| j |< |rH||}|d u rDi }|||< |}|S r   )rc   rB   )r    rE   r/   cachecr   r   r"   	_getcacheP  s    

zLookupBase._getcacherO   c                 C   s   t |tstd| ||}t|}t|dkrD||d t}n|t|t}|tu r| |||}t|dkr|||d < n||t|< |d u r|S |S )Nr5   r1   r   )	r<   r
   r=   rj   r?   r@   rB   _not_in_mapping_uncached_lookupr    rD   rE   r/   defaultrh   resultr   r   r"   r   ]  s    
zLookupBase.lookupc                 C   sT   t |tstd| ||}||t}|tu rD| |f|||S |d u rP|S |S Nr5   )r<   r
   r=   rj   rB   rk   r   rm   r   r   r"   r   s  s    
zLookupBase.lookup1c                 C   s   |  ||||S r   )r   )r    objectrE   r/   rn   r   r   r"   r     s    zLookupBase.queryAdapterc           	         sz   t |tstdt|}| ||}||t}|tu rJ| |f||}|d urvt |trb|j	}||}|d urv|S |S rp   )
r<   r
   r=   r   rj   rB   rk   r   super__self__)	r    rE   rq   r/   rn   rD   rh   factoryro   	__class__r   r"   r     s    

zLookupBase.adapter_hookc                 C   sV   | j |}|d u r"i }|| j |< t|}||t}|tu rR| ||}|||< |S r   )rd   rB   r?   rk   _uncached_lookupAllr    rD   rE   rh   ro   r   r   r"   r     s    
zLookupBase.lookupAllc                 C   sV   | j |}|d u r"i }|| j |< t|}||t}|tu rR| ||}|||< |S r   )re   rB   r?   rk   _uncached_subscriptionsrx   r   r   r"   r     s    
zLookupBase.subscriptions)N)rO   N)rO   N)rO   N)rO   N)r\   r]   r^   r#   r&   rj   r   r   r   r   r   r   __classcell__r   r   ru   r"   rb   C  s   



rb   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )VerifyingBasec                 C   s4   t | | | jjdd  | _dd | jD | _d S )Nr1   c                 S   s   g | ]
}|j qS r   r2   r8   r   r   r"   r;     r*   z)VerifyingBase.changed.<locals>.<listcomp>)LookupBaseFallbackr&   	_registryr   
_verify_ro_verify_generationsr3   r   r   r"   r&     s    zVerifyingBase.changedc                 C   s$   dd | j D | jkr | d  d S )Nc                 S   s   g | ]
}|j qS r   r|   r8   r   r   r"   r;     r*   z)VerifyingBase._verify.<locals>.<listcomp>)r   r   r&   r(   r   r   r"   _verify  s    zVerifyingBase._verifyc                 C   s   |    t| ||S r   )r   r}   rj   )r    rE   r/   r   r   r"   rj     s    zVerifyingBase._getcachec                 C   s   |    t| ||S r   )r   r}   r   r    rD   rE   r   r   r"   r     s    zVerifyingBase.lookupAllc                 C   s   |    t| ||S r   )r   r}   r   r   r   r   r"   r     s    zVerifyingBase.subscriptionsN)r\   r]   r^   r&   r   rj   r   r   r   r   r   r"   r{     s
   r{   c                       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dddZ	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   )r~   	_requiredinit_extendorsrr   r   r#   )r    registryru   r   r"   r#     s    zAdapterLookupBase.__init__Nc                    sF   t t| d  | j D ]}| }|d ur||  q| j  d S r   )rr   r   r&   r   keysr[   rf   )r    rg   r:   ru   r   r"   r&     s    zAdapterLookupBase.changedc                 C   s"   i | _ | jjD ]}| | qd S r   )
_extendorsr~   r   rC   )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r9   erE   r   r"   r;     r*   z2AdapterLookupBase.add_extendor.<locals>.<listcomp>c                    s   g | ]}  |s|qS r   r   r   r   r   r"   r;     r*   r   Z__iro__rB   )r    rE   r   i	extendorsr   r   r"   rC     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"   r;     s   z5AdapterLookupBase.remove_extendor.<locals>.<listcomp>r   r   )r    rE   r   r   r   r   r"   rS   	  s    
z!AdapterLookupBase.remove_extendorc                 G   s6   | j }|D ]&}| }||vr
||  d||< q
d S r0   )r   weakrefrW   )r    rD   Z_refsr:   refr   r   r"   
_subscribe  s    
zAdapterLookupBase._subscriberO   c           
      C   s~   t |}d }t|}| jjD ]R}|j}|t|kr4q|jj|}|sHq|| }	t|	|||d|}|d ur qpq| j	|  |S Nr   )
r?   r@   r~   r   r   r,   r   rB   _lookupr   )
r    rD   rE   r/   ro   rG   r   rH   r   rI   r   r   r"   rl     s$    
z"AdapterLookupBase._uncached_lookupc                    sJ   |  dd |D ||}|d u r$|S | fdd|D  }|d u rF|S |S )Nc                 S   s   g | ]}t |qS r   r   r9   or   r   r"   r;   0  r*   z7AdapterLookupBase.queryMultiAdapter.<locals>.<listcomp>c                    s    g | ]}t |tr|jn|qS r   )r<   rr   rs   r   ru   r   r"   r;   4  r*   )r   )r    objectsrE   r/   rn   rt   ro   ru   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   )r?   r@   rR   r~   r   r   r,   r   rB   
_lookupAllr   items)	r    rD   rE   rG   ro   r   rH   r   rI   r   r   r"   rw   :  s    
z%AdapterLookupBase._uncached_lookupAllc                 C   s   dd |  ||D S )Nc                 S   s   g | ]}|d  qS )r   r   )r9   ri   r   r   r"   r;   M  r*   z+AdapterLookupBase.names.<locals>.<listcomp>)r   r   r   r   r"   r   L  s    zAdapterLookupBase.namesc              	   C   s   t |}t|}g }t| jjD ]X}|j}|t|kr8q |d u rH|f}n|jj|}|d u r`q t	|| ||d|d| q | j
|  |S )NrO   r   )r?   r@   rR   r~   r   r   r,   r   rB   _subscriptionsr   )r    rD   rE   rG   ro   r   rH   r   r   r   r"   ry   O  s"    
z)AdapterLookupBase._uncached_subscriptionsc                 C   sb   |  dd |D |}|d u r6d}|D ]}||  q&n(g }|D ]}|| }|d ur>|| q>|S )Nc                 S   s   g | ]}t |qS r   r   r   r   r   r"   r;   g  r*   z1AdapterLookupBase.subscribers.<locals>.<listcomp>r   )r   rA   )r    r   rE   r   ro   ZsubscriptionZ
subscriberr   r   r"   r   f  s    zAdapterLookupBase.subscribers)N)rO   )rO   N)r\   r]   r^   r#   r&   r   rC   rS   r   rl   r   rw   r   ry   r   rz   r   r   ru   r"   r     s   
r   c                   @   s   e Zd ZdS )AdapterLookupNr\   r]   r^   r   r   r   r"   r   t  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 )r   r   c                    s   t  | _tt| | d S r   )r   WeakKeyDictionary_v_subregistriesrr   r   r#   r   ru   r   r"   r#   |  s    
zAdapterRegistry.__init__c                 C   s   d| j |< d S r0   r   r    r:   r   r   r"   _addSubregistry  s    zAdapterRegistry._addSubregistryc                 C   s   || j v r| j |= d S r   r   r   r   r   r"   _removeSubregistry  s    
z"AdapterRegistry._removeSubregistryc                    sZ   | j dd}|D ]}||vr||  q|D ]}||vr.||  q.tt| | d S )Nr   r   )r%   rB   r   r   rr   r   r'   )r    r!   rU   r:   ru   r   r"   r'     s    zAdapterRegistry._setBasesc                    s.   t t| | | j D ]}|| qd S r   )rr   r   r&   r   r   )r    r4   subru   r   r"   r&     s    zAdapterRegistry.changed)r   )r\   r]   r^   r   r+   r#   r   r   r'   r&   rz   r   r   ru   r"   r   w  s   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 )r   N)r\   r]   r^   r   r+   r   r   r   r"   r     s   c                 C   s   | d u rt S | S d S r   r   )xr   r   r"   r7     s    r7   c                 C   s   | j }||k rR|| jD ]6}||}|rt|||||d |}	|	d ur|	  S qn0|D ]*}
||
}|rV| |}	|	d urV|	  S qVd S r0   )rB   __sro__r   )rI   specsrE   r/   r   lcomponents_getspeccompsr:   ifacer   r   r"   r     s    

r   c           
      C   sn   | j }||k rFt|| jD ]&}||}|rt|||||d | qn$t|D ]}	||	}|rN|| qNd S r0   )rB   rR   r   r   update)
rI   r   rE   ro   r   r   r   r   r   r   r   r   r"   r     s    r   c              	   C   s~   | j }||k rHt|| jD ](}||}	|	rt|	|||||d | qn2t|D ](}
||
}	|	rP|	 |}	|	rP||	 qPd S r0   )rB   rR   r   r   extend)rI   r   rE   r/   ro   r   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
   r   __all__rq   r   rk   rb   r}   r{   r   r   r   r   r   r7   r   r   r   r   r   r   r"   <module>   s@     o $$