
|ÍW)Y  ã               @   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 Z Gd d	 „  d	 e	 ƒ Z
 e	 ƒ  Z Gd
 d „  d e	 ƒ Z e Z y d d l m Z Wn e k
 rÁ e Z Yn XGd d „  d e ƒ Z e Z y d d l m Z Wn e k
 re Z Yn XGd d „  d e	 ƒ Z Gd d „  d e e ƒ Z Gd d „  d e
 ƒ Z Gd d „  d e e ƒ Z Gd d „  d e
 ƒ Z d d „  Z d d „  Z d d „  Z d  d! „  Z d S)"zAdapter management
é    N)Ú
providedBy)Ú	Interface)Úro)Ú_normalize_nameÚ c            	   @   s»   e  Z d  Z d# Z d
 Z f  d d „ Z d d „  Z e d d „  d d „  ƒ Z d d „  Z	 d d „  Z
 d d „  Z e 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   s2   g  |  _  g  |  _ i  |  _ |  j ƒ  | |  _ d  S)N)Ú	_adaptersÚ_subscribersÚ	_providedÚ_createLookupÚ	__bases__)ÚselfÚbases© r   ú8/usr/lib/python3/dist-packages/zope/interface/adapter.pyÚ__init__%   s
    			
zBaseAdapterRegistry.__init__c             C   s0   | |  j  d <t j |  ƒ |  _ |  j |  ƒ d  S)Nr   )Ú__dict__r   Úchanged)r   r   r   r   r   Ú	_setBasesT   s    zBaseAdapterRegistry._setBasesc             C   s   |  j  d S)Nr   )r   )r   r   r   r   Ú<lambda>Y   s    zBaseAdapterRegistry.<lambda>c             C   s   |  j  | ƒ S)N)r   )r   r   r   r   r   r   Z   s    c             C   sC   |  j  |  ƒ |  _ x* |  j D] } t |  j | ƒ |  j | <q Wd  S)N)ÚLookupClassÚ	_v_lookupÚ
_delegatedÚgetattrr   )r   Únamer   r   r   r   ]   s    z!BaseAdapterRegistry._createLookupc             C   s#   |  j  d 7_  |  j j | ƒ d  S)Né   )Ú_generationr    r   )r   Úoriginally_changedr   r   r   r   b   s    zBaseAdapterRegistry.changedc             C   sQ  | d  k r& |  j  | | | | ƒ d  St t t | ƒ ƒ } t | ƒ } t | ƒ } |  j } x# t | ƒ | k r | j i  ƒ q_ W| | } | | f } x? | D]7 }	 | j |	 ƒ }
 |
 d  k rÑ i  }
 |
 | |	 <|
 } q  W| j | ƒ | k rô d  S| | | <|  j	 j | d ƒ d } | |  j	 | <| d k r@|  j
 j | ƒ |  j |  ƒ d  S)Nr   r$   )Ú
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   Úregisterf   s2    	



zBaseAdapterRegistry.registerc       
      C   s¦   t  t t | ƒ ƒ } t | ƒ } t | ƒ } |  j } t | ƒ | k rL d  S| | } | | f } x3 | D]+ } | j | ƒ }	 |	 d  k r d  S|	 } qj W| j | ƒ S)N)r(   r)   r*   r   r+   r   r-   )
r   r/   r0   r#   r2   r3   r4   r5   r6   r7   r   r   r   Ú
registered‡   s    	

zBaseAdapterRegistry.registeredNc             C   s  t  t t | ƒ ƒ } t | ƒ } |  j } | t | ƒ k r@ d S| | } | | f } g  }	 xF | D]> }
 | j |
 ƒ } | d  k r‰ d  S|	 j | |
 f ƒ | } qd W| j | ƒ } | d  k rÅ d  S| d  k	 rá | | k	 rá d  S| | =| sEx5 t |	 ƒ D]' \ } }
 | |
 } | rPqû | |
 =qû Wx | rD| d rD| d =q)W|  j | d } | d k r|  j | =|  j	 j
 | ƒ n | |  j | <|  j |  ƒ d  S)NFr$   r   éÿÿÿÿr;   )r(   r)   r*   r+   r   r-   r,   Úreversedr   r    Úremove_extendorr   )r   r/   r0   r#   r1   r2   r3   r4   r5   Úlookupsr6   r7   ÚoldÚcompr8   r   r   r   r'   š   sD    	



zBaseAdapterRegistry.unregisterc             C   s+  t  t t | ƒ ƒ } t } t | ƒ } |  j } x# t | ƒ | k rU | j i  ƒ q3 W| | } | | f } x? | D]7 }	 | j |	 ƒ }
 |
 d  k r¥ i  }
 |
 | |	 <|
 } qt W| j | f  ƒ | f | | <| d  k	 r|  j j | d ƒ d } | |  j | <| d k r|  j	 j
 | ƒ |  j |  ƒ d  S)Nr   r$   )r(   r)   r*   Ú_BLANKr+   r   r,   r-   r   r    r.   r   )r   r/   r0   r1   r#   r2   r3   r4   r5   r6   r7   r8   r   r   r   Ú	subscribeÊ   s*    	


zBaseAdapterRegistry.subscribec                sØ  t  t t | ƒ ƒ } t | ƒ } |  j } | t | ƒ k r@ d  S| | } | | f } g  } xF | D]> }	 | j |	 ƒ }
 |
 d  k r‰ d  S| j | |	 f ƒ |
 } qd W| j t ƒ } | s¿ d  Sˆ  d  k rÔ f  } n t  ‡  f d d †  | Dƒ ƒ } | | k rd  S| r| | t <n^ | t =x5 t | ƒ D]' \ } }	 | |	 }
 |
 rJPq*| |	 =q*Wx | rs| d rs| d =qXW| d  k	 rÇ|  j	 | t | ƒ t | ƒ } | d k rÇ|  j	 | =|  j
 j | ƒ |  j |  ƒ d  S)Nc                s"   g  |  ] } | ˆ  k	 r | ‘ q Sr   r   )Ú.0Úv)r1   r   r   ú
<listcomp>ÿ   s   	 z3BaseAdapterRegistry.unsubscribe.<locals>.<listcomp>r$   r   r;   r;   )r(   r)   r*   r+   r   r-   r,   rA   r<   r   r    r=   r   )r   r/   r0   r1   r2   r3   r4   r5   r>   r6   r7   r?   Únewr@   r8   r   )r1   r   Úunsubscribeå   sL    	

	
!
zBaseAdapterRegistry.unsubscribec             C   s   Gd 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   rK   r   )r   Ú_rK   r   r   r   r-   !  s    zBaseAdapterRegistry.get)	zlookupzqueryMultiAdapterzlookup1zqueryAdapterzadapter_hookz	lookupAllznameszsubscriptionszsubscribers)rH   rI   rJ   r!   r%   r   r   Úpropertyr   r   r   r9   rA   r:   r'   rB   rG   r-   r   r   r   r   r      s      /!0<r   c               @   s—   e  Z d  Z d d „  Z d d d „ Z d d „  Z e d d d	 „ Z e d d
 d „ Z e d d d „ Z	 e d d d „ Z
 d d „  Z d d „  Z d S)ÚLookupBaseFallbackc             C   s   i  |  _  i  |  _ i  |  _ d  S)N)Ú_cacheÚ_mcacheÚ_scache)r   r   r   r   r   *  s    		zLookupBaseFallback.__init__Nc             C   s+   |  j  j ƒ  |  j j ƒ  |  j j ƒ  d  S)N)rO   ÚclearrP   rQ   )r   Úignoredr   r   r   r   /  s    zLookupBaseFallback.changedc             C   sl   |  j  j | ƒ } | d  k r1 i  } | |  j  | <| rh | j | ƒ } | d  k rb i  } | | | <| } | S)N)rO   r-   )r   r0   r#   ÚcacheÚcr   r   r   Ú	_getcache4  s    
zLookupBaseFallback._getcachec             C   sÉ   |  j  | | ƒ } t | ƒ } t | ƒ d k rI | j | d t ƒ } n | j t | ƒ t ƒ } | t k rµ |  j | | | ƒ } t | ƒ d k r¥ | | | d <n | | t | ƒ <| d  k rÅ | S| S)Nr$   r   )rV   r(   r+   r-   Ú_not_in_mappingÚ_uncached_lookup)r   r/   r0   r#   ÚdefaultrT   Úresultr   r   r   r   A  s    zLookupBaseFallback.lookupc             C   s]   |  j  | | ƒ } | j | t ƒ } | t k rI |  j | f | | | ƒ S| d  k rY | S| S)N)rV   r-   rW   r   )r   r/   r0   r#   rY   rT   rZ   r   r   r   r
   U  s    zLookupBaseFallback.lookup1c             C   s   |  j  | | | | ƒ S)N)r   )r   Úobjectr0   r#   rY   r   r   r   r   `  s    zLookupBaseFallback.queryAdapterc       	      C   s€   t  | ƒ } |  j | | ƒ } | j | t ƒ } | t k rT |  j | f | | ƒ } | d  k	 r| | | ƒ } | d  k	 r| | S| S)N)r   rV   r-   rW   r   )	r   r0   r[   r#   rY   r/   rT   ÚfactoryrZ   r   r   r   r   c  s    zLookupBaseFallback.adapter_hookc             C   s{   |  j  j | ƒ } | d  k r1 i  } | |  j  | <t | ƒ } | j | t ƒ } | t k rw |  j | | ƒ } | | | <| S)N)rP   r-   r(   rW   Ú_uncached_lookupAll)r   r/   r0   rT   rZ   r   r   r   r   q  s    
zLookupBaseFallback.lookupAllc             C   s{   |  j  j | ƒ } | d  k r1 i  } | |  j  | <t | ƒ } | j | t ƒ } | t k rw |  j | | ƒ } | | | <| S)N)rQ   r-   r(   rW   Ú_uncached_subscriptions)r   r/   r0   rT   rZ   r   r   r   r   €  s    
z LookupBaseFallback.subscriptions)rH   rI   rJ   r   r   rV   rA   r   r
   r   r   r   r   r   r   r   r   rN   (  s   rN   )Ú
LookupBasec               @   sL   e  Z d  Z d d „  Z d d „  Z d d „  Z d d „  Z d	 d
 „  Z d S)ÚVerifyingBaseFallbackc             C   sF   t  j |  | ƒ |  j j d d  … |  _ d d „  |  j Dƒ |  _ d  S)Nr$   c             S   s   g  |  ] } | j  ‘ q Sr   )r%   )rC   Úrr   r   r   rE   Ÿ  s   	 z1VerifyingBaseFallback.changed.<locals>.<listcomp>)rN   r   Ú	_registryr   Ú
_verify_roÚ_verify_generations)r   r&   r   r   r   r   œ  s    zVerifyingBaseFallback.changedc             C   s0   d d „  |  j  Dƒ |  j k r, |  j d  ƒ d  S)Nc             S   s   g  |  ] } | j  ‘ q Sr   )r%   )rC   ra   r   r   r   rE   ¢  s   	 z1VerifyingBaseFallback._verify.<locals>.<listcomp>)rc   rd   r   )r   r   r   r   Ú_verify¡  s    zVerifyingBaseFallback._verifyc             C   s   |  j  ƒ  t j |  | | ƒ S)N)re   rN   rV   )r   r0   r#   r   r   r   rV   ¦  s    
zVerifyingBaseFallback._getcachec             C   s   |  j  ƒ  t j |  | | ƒ S)N)re   rN   r   )r   r/   r0   r   r   r   r   ª  s    
zVerifyingBaseFallback.lookupAllc             C   s   |  j  ƒ  t j |  | | ƒ S)N)re   rN   r   )r   r/   r0   r   r   r   r   ®  s    
z#VerifyingBaseFallback.subscriptionsN)rH   rI   rJ   r   re   rV   r   r   r   r   r   r   r`   –  s
   r`   )Ú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	 d d „ Z
 e	 d d d „ Z d d „  Z d d „  Z d d „  Z d d „  Z ‡  S)ÚAdapterLookupBasec                s3   | |  _  i  |  _ |  j ƒ  t t |  ƒ j ƒ  d  S)N)rb   Ú	_requiredÚinit_extendorsÚsuperrg   r   )r   Úregistry)Ú	__class__r   r   r   ¼  s    		
zAdapterLookupBase.__init__Nc                sc   t  t |  ƒ j d  ƒ x9 |  j j ƒ  D]( } | ƒ  } | d  k	 r& | j |  ƒ q& W|  j j ƒ  d  S)N)rj   rg   r   rh   ÚkeysrG   rR   )r   rS   ra   )rl   r   r   r   Â  s    	zAdapterLookupBase.changedc             C   s1   i  |  _  x! |  j j D] } |  j | ƒ q Wd  S)N)Ú
_extendorsrb   r   r.   )r   Úpr   r   r   ri   á  s    	z AdapterLookupBase.init_extendorsc                sn   |  j  } x^ ˆ  j D]S } | j | f  ƒ } ‡  f d d †  | Dƒ ˆ  g ‡  f d d †  | Dƒ | | <q Wd  S)Nc                s%   g  |  ] } ˆ  j  | ƒ r | ‘ q Sr   )ÚisOrExtends)rC   Úe)r0   r   r   rE   ë  s   	 z2AdapterLookupBase.add_extendor.<locals>.<listcomp>c                s%   g  |  ] } ˆ  j  | ƒ s | ‘ q Sr   )rp   )rC   rq   )r0   r   r   rE   ï  s   	 )rn   Ú__iro__r-   )r   r0   rn   ÚiÚ	extendorsr   )r0   r   r.   æ  s
    	zAdapterLookupBase.add_extendorc                sJ   |  j  } x: ˆ  j D]/ } ‡  f d d †  | j | f  ƒ Dƒ | | <q Wd  S)Nc                s"   g  |  ] } | ˆ  k r | ‘ q Sr   r   )rC   rq   )r0   r   r   rE   õ  s   	 z5AdapterLookupBase.remove_extendor.<locals>.<listcomp>)rn   rr   r-   )r   r0   rn   rs   r   )r0   r   r=   ò  s    	z!AdapterLookupBase.remove_extendorc             G   sM   |  j  } x= | D]5 } | j ƒ  } | | k r | j |  ƒ d | | <q Wd  S)Nr$   )rh   ÚweakrefrB   )r   r/   Z_refsra   Úrefr   r   r   Ú
_subscribeù  s    	zAdapterLookupBase._subscribec       
      C   s´   t  | ƒ } d  } t | ƒ } x‚ |  j j D]t } | j } | t | ƒ k rO q+ | j j j | ƒ } | sm q+ | | }	 t |	 | | | d | ƒ } | d  k	 r+ Pq+ W|  j	 | Œ  | S)Nr   )
r(   r+   rb   r   r   r    rn   r-   Ú_lookuprw   )
r   r/   r0   r#   rZ   r2   rk   r3   rt   r4   r   r   r   rX     s"    	
	z"AdapterLookupBase._uncached_lookupc             C   sN   |  j  t t | ƒ | | ƒ } | d  k r. | S| | Œ  } | d  k rJ | S| S)N)r   r)   r   )r   Úobjectsr0   r#   rY   r\   rZ   r   r   r   r	     s    z#AdapterLookupBase.queryMultiAdapterc       	      C   s·   t  | ƒ } t | ƒ } i  } xy t |  j j ƒ D]e } | j } | t | ƒ k rU q1 | j j j | ƒ } | ss q1 | | } t	 | | | | d | ƒ q1 W|  j
 | Œ  t  | j ƒ  ƒ S)Nr   )r(   r+   r<   rb   r   r   r    rn   r-   Ú
_lookupAllrw   Úitems)	r   r/   r0   r2   rZ   rk   r3   rt   r4   r   r   r   r]   #  s    	
z%AdapterLookupBase._uncached_lookupAllc             C   s   d d „  |  j  | | ƒ Dƒ S)Nc             S   s   g  |  ] } | d  ‘ q S)r   r   )rC   rU   r   r   r   rE   6  s   	 z+AdapterLookupBase.names.<locals>.<listcomp>)r   )r   r/   r0   r   r   r   r   5  s    zAdapterLookupBase.namesc          	   C   sÆ   t  | ƒ } t | ƒ } g  } x” t |  j j ƒ D]€ } | j } | t | ƒ k rU q1 | d  k rm | f } n$ | j j j | ƒ } | d  k r‘ q1 t	 | | | | t
 | d | ƒ q1 W|  j | Œ  | S)Nr   )r(   r+   r<   rb   r   r   r    rn   r-   Ú_subscriptionsrA   rw   )r   r/   r0   r2   rZ   rk   r3   rt   r   r   r   r^   8  s     	z)AdapterLookupBase._uncached_subscriptionsc             C   s‹   |  j  t t | ƒ | ƒ } | d  k rK f  } xW | D] } | | Œ  q4 Wn< g  } x3 | D]+ } | | Œ  } | d  k	 rX | j | ƒ qX W| S)N)r   r)   r   r,   )r   ry   r0   r   rZ   ZsubscriptionZ
subscriberr   r   r   r   O  s    zAdapterLookupBase.subscribers)rH   rI   rJ   r   r   ri   r.   r=   rw   rA   rX   r	   r]   r   r^   r   r   r   )rl   r   rg   º  s   rg   c               @   s   e  Z d  Z d S)ÚAdapterLookupN)rH   rI   rJ   r   r   r   r   r}   ]  s   r}   c                   sg   e  Z d  Z e Z f  ‡  f d d † Z d d „  Z d d „  Z ‡  f d d †  Z ‡  f d	 d
 †  Z	 ‡  S)ÚAdapterRegistryc                s)   t  j ƒ  |  _ t t |  ƒ j | ƒ d  S)N)ru   ÚWeakKeyDictionaryÚ_v_subregistriesrj   r~   r   )r   r   )rl   r   r   r   d  s    zAdapterRegistry.__init__c             C   s   d |  j  | <d  S)Nr$   )r€   )r   ra   r   r   r   Ú_addSubregistryk  s    zAdapterRegistry._addSubregistryc             C   s   | |  j  k r |  j  | =d  S)N)r€   )r   ra   r   r   r   Ú_removeSubregistryn  s    z"AdapterRegistry._removeSubregistryc                sƒ   |  j  j d f  ƒ } x' | D] } | | k r | j |  ƒ q Wx' | D] } | | k rF | j |  ƒ qF Wt t |  ƒ j | ƒ d  S)Nr   )r   r-   r‚   r   rj   r~   r   )r   r   r?   ra   )rl   r   r   r   r  s    zAdapterRegistry._setBasesc                sA   t  t |  ƒ j | ƒ x$ |  j j ƒ  D] } | j | ƒ q& Wd  S)N)rj   r~   r   r€   rm   )r   r&   Úsub)rl   r   r   r   }  s    zAdapterRegistry.changed)
rH   rI   rJ   r}   r   r   r   r‚   r   r   r   r   )rl   r   r~   `  s   r~   c               @   s   e  Z d  Z d S)ÚVerifyingAdapterLookupN)rH   rI   rJ   r   r   r   r   r„   „  s   r„   c               @   s   e  Z d  Z e Z d S)ÚVerifyingAdapterRegistryN)rH   rI   rJ   r„   r   r   r   r   r   r…   ‡  s   r…   c             C   s   |  d  k r t  S|  Sd  S)N)r   )Úxr   r   r   r*   ‹  s    r*   c       
      C   s´   | | k  rk x¡ | | j  D]J } |  j | ƒ } | r t | | | | | d | ƒ } | d  k	 r | Sq WnE xB | D]: }	 |  j |	 ƒ } | rr | j | ƒ } | d  k	 rr | Sqr Wd  S)Nr$   )Ú__sro__r-   rx   )
r4   Úspecsr0   r#   rs   ÚlÚspecÚcompsra   Úifacer   r   r   rx   ‘  s    rx   c       	      C   sœ   | | k  r_ x‰ t  | | j ƒ D]8 } |  j | ƒ } | r  t | | | | | d | ƒ q  Wn9 x6 t  | ƒ D]( } |  j | ƒ } | rl | j | ƒ ql Wd  S)Nr$   )r<   r‡   r-   rz   Úupdate)	r4   rˆ   r0   rZ   rs   r‰   rŠ   r‹   rŒ   r   r   r   rz   £  s    $rz   c       
   	   C   s´   | | k  rb x¡ t  | | j ƒ D]; } |  j | ƒ } | r  t | | | | | | d | ƒ q  WnN xK t  | ƒ D]= }	 |  j |	 ƒ } | ro | j | ƒ } | ro | j | ƒ qo Wd  S)Nr$   )r<   r‡   r-   r|   Úextend)
r4   rˆ   r0   r#   rZ   rs   r‰   rŠ   r‹   rŒ   r   r   r   r|   ¯  s    'r|   )Ú__doc__ru   Zzope.interfacer   r   r   Zzope.interface._compatr   rA   r[   r   rW   rN   ZLookupBasePyZ_zope_interface_coptimizationsr_   ÚImportErrorr`   ZVerifyingBasePyrf   rg   r}   r~   r„   r…   r*   rx   rz   r|   r   r   r   r   Ú<module>   s<   ÿ 	f£$