U
    [ee                     @   s  d Z ddlmZ zddlmZ W n ek
r<   dd ZY nX 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mZ ddlmZ ddlmZ ddlmZ dgZG dd deZdd ZG dd deZ ee
G dd deZ!dd  Z"d!d" Z#d#d$ Z$d%d& Z%eeG d'd( d(eZ&ee	G d)d* d*eZ'eeG d+d, d,e'Z(eeG d-d. d.e'Z)d/S )0zBasic components support
    )defaultdict)notifyc                  O   s   d S N )argkwr   r   Y/var/www/html/services/stratfitenv/lib/python3.8/site-packages/zope/interface/registry.pyr          r   )ISpecification)ComponentLookupError)IAdapterRegistration)IComponents)IHandlerRegistration) ISubscriptionAdapterRegistration)IUtilityRegistration)
Registered)Unregistered)	Interface)implementedBy)implementer)implementer_only)
providedBy)AdapterRegistry)CLASS_TYPES)STRING_TYPES
Componentsc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_UnhashableComponentCounterc                 C   s   dd |  D | _d S )Nc                 S   s   g | ]}|qS r   r   ).0itemr   r   r   
<listcomp>6   s     z8_UnhashableComponentCounter.__init__.<locals>.<listcomp>)items_data)selfZ	otherdictr   r   r   __init__4   s    z$_UnhashableComponentCounter.__init__c                 C   s$   | j D ]\}}||kr|  S qdS Nr   )r!   )r"   key	componentcountr   r   r   __getitem__8   s    
z'_UnhashableComponentCounter.__getitem__c                 C   sH   t | jD ](\}}|d |kr
||f| j|<  d S q
| j||f d S r$   )	enumerater!   append)r"   r&   r'   idatar   r   r   __setitem__>   s
    z'_UnhashableComponentCounter.__setitem__c                 C   s:   t | jD ]"\}}|d |kr
| j|=  d S q
t|d S r$   )r)   r!   KeyError)r"   r&   r+   r,   r   r   r   __delitem__E   s
    z'_UnhashableComponentCounter.__delitem__N)__name__
__module____qualname__r#   r(   r-   r/   r   r   r   r   r   1   s   r   c                   C   s   t tS r   )r   intr   r   r   r   _defaultdict_intL   s    r4   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )_UtilityRegistrationsc                 C   s"   t t| _|| _|| _|   d S r   )r   r4   _cache
_utilities_utility_registrations%_UtilityRegistrations__populate_cache)r"   	utilitiesZutility_registrationsr   r   r   r#   Q   s    
z_UtilityRegistrations.__init__c                 C   s4   t | j D ] \\}}}|d }| || qd S r$   )iterr8   r    $_UtilityRegistrations__cache_utility)r"   p_r,   r&   r   r   r   Z__populate_cacheY   s    z&_UtilityRegistrations.__populate_cachec                 C   s\   z| j | |  d7  < W n< tk
rV   t| j |  }| j |< ||  d7  < Y nX d S )N   )r6   	TypeErrorr   )r"   providedr&   Zprovr   r   r   Z__cache_utility^   s
    z%_UtilityRegistrations.__cache_utilityc                 C   s:   | j | }|| }|d8 }|dkr*||= n|||< |dkS )Nr?   r   )r6   )r"   rA   r&   r'   r   r   r   Z__uncache_utilityg   s    
z'_UtilityRegistrations.__uncache_utilityc                 C   s0   z| j | | dkW S  tk
r*   Y dS X d S )Nr   F)r6   r@   )r"   rA   r&   r   r   r   _is_utility_subscribedv   s    z,_UtilityRegistrations._is_utility_subscribedc                 C   sV   |  ||}|||f| j||f< | jd||| |sF| jd|| | || d S Nr   )rB   r8   r7   register	subscriber<   )r"   rA   namer&   infofactory
subscribedr   r   r   registerUtility}   s    z%_UtilityRegistrations.registerUtilityc                 C   s@   | j ||f= | jd|| | ||}|s<| jd|| d S rC   )r8   r7   
unregister&_UtilityRegistrations__uncache_utilityunsubscribe)r"   rA   rF   r&   rI   r   r   r   unregisterUtility   s
    z'_UtilityRegistrations.unregisterUtilityN)
r0   r1   r2   r#   r9   r<   rL   rB   rJ   rN   r   r   r   r   r5   O   s   	r5   c                       sN  e Zd ZdZdIddZdd Z fdd	Zd
d Zdd Ze	dd Z
dd Zdd Ze	dd dd ZdJddZdKddZdd ZdLddZdMd d!Zd"d# Zd$d% ZdNd&d'ZdOd(d)Zd*d+ ZdPd,d-ZdQd.d/ZdRd0d1ZdSd2d3Zd4d5 ZdTd6d7Zd8d9 ZdUd:d;Zd<d= Z dVd>d?Z!d@dA Z"dWdBdCZ#dDdE Z$dXdGdHZ%  Z&S )Yr   N r   c                 C   s8   t |tst|| _|   |   t|| _d | _d S r   )	
isinstancer   AssertionErrorr0   _init_registries_init_registrationstuple	__bases___v_utility_registrations_cache)r"   rF   basesr   r   r   r#      s    
zComponents.__init__c                 C   s   d| j j| jf S )Nz<%s %s>)	__class__r0   r"   r   r   r   __repr__   s    zComponents.__repr__c                    s<   t t|  }dd |d  D }t|}||d< t|S )Nc                 S   s    i | ]\}}| d s||qS )Z_v_)
startswith)r   kvr   r   r   
<dictcomp>   s    
 z)Components.__reduce__.<locals>.<dictcomp>   )superr   
__reduce__r    listrT   )r"   Z	reductionZfiltered_staterX   r   r   ra      s
    zComponents.__reduce__c                 C   s   t  | _t  | _d S r   )r   adaptersr:   rY   r   r   r   rR      s    zComponents._init_registriesc                 C   s   i | _ i | _g | _g | _d S r   )r8   _adapter_registrations_subscription_registrations_handler_registrationsrY   r   r   r   rS      s    zComponents._init_registrationsc                 C   s>   | j }|d ks&|j| jk	s&|j| jk	r:t| j| j }| _ |S r   )rV   r7   r:   r8   r5   )r"   cacher   r   r   _utility_registrations_cache   s    


z'Components._utility_registrations_cachec                 C   s   | j ddS )NrU   r   )__dict__getrY   r   r   r   	_getBases   s    zComponents._getBasesc                 C   s>   t dd |D | j_t dd |D | j_t || jd< d S )Nc                 S   s   g | ]
}|j qS r   )rd   r   baser   r   r   r      s    z(Components._setBases.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   )r:   rm   r   r   r   r      s    rU   )rT   rd   rU   r:   rj   r"   rW   r   r   r   	_setBases   s    zComponents._setBasesc                 C   s   |   S r   )rl   rY   r   r   r   <lambda>   r	   zComponents.<lambda>c                 C   s
   |  |S r   )rp   ro   r   r   r   rq      r	   Tc              	   C   s   |r|rt d| }|d kr&t|}|dkr6t|}| j||f}|d k	rx|d d ||fkrfd S | |d || | j||||| |rtt	t
| ||||| d S )N$Can't specify factory and component.rO   r_   r   )r@   _getUtilityProvided_getNamer8   rk   rN   ri   rJ   r   r   UtilityRegistration)r"   r&   rA   rF   rG   eventrH   regr   r   r   rJ      s4        zComponents.registerUtilityc                 C   s   |r|rt d| }|d kr6|d kr.t dt|}| j||f}|d ksb|d k	rf||d krfdS |d krv|d }| j||| ttt| |||f|dd    dS )Nrr   z3Must specify one of component, factory and providedr   Fr?   T)	r@   rs   r8   rk   ri   rN   r   r   ru   )r"   r&   rA   rF   rH   oldr   r   r   rN      s0    
  zComponents.unregisterUtilityc                 c   s4   t | j D ] \\}}}t| ||f| V  qd S r   )r;   r8   r    ru   )r"   rA   rF   r,   r   r   r   registeredUtilities  s    zComponents.registeredUtilitiesc                 C   s   | j d|||S rC   )r:   lookup)r"   rA   rF   defaultr   r   r   queryUtility  s    zComponents.queryUtilityc                 C   s&   | j d||}|d kr"t|||S rC   )r:   rz   r   )r"   rA   rF   utilityr   r   r   
getUtility!  s    
zComponents.getUtilityc                 c   s&   | j d|D ]\}}||fV  qd S rC   )r:   	lookupAll)r"   	interfacerF   r}   r   r   r   getUtilitiesFor'  s    zComponents.getUtilitiesForc                 C   s   | j d|S rC   )r:   Zsubscriptions)r"   r   r   r   r   getAllUtilitiesRegisteredFor+  s    z'Components.getAllUtilitiesRegisteredForc              	   C   sr   |d krt |}t||}|dkr*t|}||f| j|||f< | j|||| |rnttt| ||||| d S NrO   )	_getAdapterProvided_getAdapterRequiredrt   re   rd   rD   r   r   AdapterRegistrationr"   rH   requiredrA   rF   rG   rv   r   r   r   registerAdapter.  s    

 zComponents.registerAdapterc                 C   s   |d kr |d krt dt|}|d kr8|d kr8t dt||}| j|||f}|d ksp|d k	rt||d krtdS | j|||f= | j||| ttt	| |||f|  dS )N(Must specify one of factory and provided(Must specify one of factory and requiredr   FT)
r@   r   r   re   rk   rd   rK   r   r   r   )r"   rH   r   rA   rF   rx   r   r   r   unregisterAdapter@  s(    

zComponents.unregisterAdapterc                 c   s:   t | j D ]&\\}}}\}}t| |||||V  qd S r   )r;   re   r    r   )r"   r   rA   rF   r&   rG   r   r   r   registeredAdapters[  s    
 zComponents.registeredAdaptersc                 C   s   | j ||||S r   )rd   queryAdapter)r"   objectr   rF   r{   r   r   r   r   a  s    zComponents.queryAdapterc                 C   s(   | j |||}|d kr$t||||S r   )rd   r   r   )r"   r   r   rF   adapterr   r   r   
getAdapterd  s    zComponents.getAdapterc                 C   s   | j ||||S r   )rd   queryMultiAdapter)r"   objectsr   rF   r{   r   r   r   r   j  s       zComponents.queryMultiAdapterc                 C   s(   | j |||}|d kr$t||||S r   )rd   r   r   )r"   r   r   rF   r   r   r   r   getMultiAdaptero  s    zComponents.getMultiAdapterc                 c   s@   | j ttt||D ]"\}}|| }|d k	r||fV  qd S r   )rd   r   rb   mapr   )r"   r   rA   rF   rH   r   r   r   r   getAdaptersu  s    zComponents.getAdaptersc              	   C   sn   |rt d|d krt|}t||}| j|||||f | j||| |rjttt	| ||||| d S )N'Named subscribers are not yet supported)
r@   r   r   rf   r*   rd   rE   r   r   SubscriptionRegistrationr   r   r   r   registerSubscriptionAdapter}  s     

 z&Components.registerSubscriptionAdapterc                 c   s    | j D ]}t| f| V  qd S r   )rf   r   r"   r,   r   r   r   registeredSubscriptionAdapters  s    
z)Components.registeredSubscriptionAdaptersc              	      s   |rt dd kr, d kr$t dt d krD d krDt dt  d krnfdd| jD }n fdd| jD }t|t| jkrdS || jd d < | j  ttt	| | d d	S )
Nr   r   r   c                    s4   g | ],\}}}}}|kr"| ks|||||fqS r   r   r   rr=   nfr+   )rA   r   r   r   r     s    z<Components.unregisterSubscriptionAdapter.<locals>.<listcomp>c                    s<   g | ]4\}}}}}|kr*|kr*| ks|||||fqS r   r   r   rH   rA   r   r   r   r     s
     FrO   T)
r@   r   r   rf   lenrd   rM   r   r   r   )r"   rH   r   rA   rF   newr   r   r   unregisterSubscriptionAdapter  s6    

 z(Components.unregisterSubscriptionAdapterc                 C   s   | j ||S r   rd   subscribers)r"   r   rA   r   r   r   r     s    zComponents.subscribersc                 C   sZ   |rt dt||}| j||||f | j|d | |rVttt| |||| d S )Nz$Named handlers are not yet supported)	r@   r   rg   r*   rd   rE   r   r   HandlerRegistration)r"   rH   r   rF   rG   rv   r   r   r   registerHandler  s    

zComponents.registerHandlerc                 c   s    | j D ]}t| f| V  qd S r   )rg   r   r   r   r   r   registeredHandlers  s    
zComponents.registeredHandlersc                    s   |rt dd kr$ d kr$t dt  d krLfdd| jD }n fdd| jD }t|t| jkrxdS || jd d < | jd   ttt| | d dS )	Nr   r   c                    s(   g | ] \}}}}| kr||||fqS r   r   r   r   r   r   r+   )r   r   r   r     s   
z0Components.unregisterHandler.<locals>.<listcomp>c                    s0   g | ](\}}}}|kr | ks||||fqS r   r   r   rH   r   r   r   r     s   
 FrO   T)	r@   r   rg   r   rd   rM   r   r   r   )r"   rH   r   rF   r   r   r   r   unregisterHandler  s(    

zComponents.unregisterHandlerc                 G   s   | j |d  d S r   r   )r"   r   r   r   r   handle  s    zComponents.handleFc              	   C   s  t | j}| j}d}d}d}d}d|jks.tdd |_|rJ|j}|j}	ndd  }}	z| D ]t\\}
}\}}}|	d|
||kr|d|
|| |d7 }n|d7 }|
d|
|dkr|d7 }|	d|
| q`|d7 }q`W 5 |`|r|s|r|| X ||||d	S )
a  
        Emergency maintenance method to rebuild the ``.utilities``
        registry from the local copy maintained in this object, or
        detect the need to do so.

        Most users will never need to call this, but it can be helpful
        in the event of suspected corruption.

        By default, this method only checks for corruption. To make it
        actually rebuild the registry, pass `True` for *rebuild*.

        :param bool rebuild: If set to `True` (not the default),
           this method will actually register and subscribe utilities
           in the registry as needed to synchronize with the local cache.

        :return: A dictionary that's meant as diagnostic data. The keys
           and values may change over time. When called with a false *rebuild*,
           the keys ``"needed_registered"`` and ``"needed_subscribed"`` will be
           non-zero if any corruption was detected, but that will not be corrected.

        .. versionadded:: 5.3.0
        r   changedc                 S   s   d S r   r   )r>   r   r   r   rq     r	   zAComponents.rebuildUtilityRegistryFromLocalCache.<locals>.<lambda>c                  W   s   d S r   r   )argsr   r   r   rq   $  r	   r   r?   N)needed_registereddid_not_registerneeded_subscribeddid_not_subscribe)dictr8   r:   rj   rQ   r   rD   rE   r    
registeredrI   )r"   Zrebuildregsutilsr   r   r   r   rD   rE   rA   rF   value_info_factoryr   r   r   $rebuildUtilityRegistryFromLocalCache  s<    


z/Components.rebuildUtilityRegistryFromLocalCache)rO   r   )NNrO   rO   TN)NNrO   N)rO   N)rO   )NNrO   rO   T)NNNrO   )rO   N)rO   )rO   N)rO   )NNrO   rO   T)NNNrO   )NrO   rO   T)NNrO   )F)'r0   r1   r2   rV   r#   rZ   ra   rR   rS   propertyri   rl   rp   rU   rJ   rN   ry   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   rc   r   r      s   


      
  


      
      


  

	       
      
*     

"c                 C   s$   z| j W S  tk
r   Y dS X d S r   )Z__component_name__AttributeError)r&   r   r   r   rt   ?  s    rt   c                 C   s,   t t| }t|dkr |d S tdd S )Nr?   r   zWThe utility doesn't provide a single interface and no provided interface was specified.)rb   r   r   r@   )r&   rA   r   r   r   rs   E  s    rs   c                 C   s,   t t| }t|dkr |d S tdd S )Nr?   r   zaThe adapter factory doesn't implement a single interface and no provided interface was specified.)rb   r   r   r@   )rH   rA   r   r   r   r   M  s    r   c                 C   s   |d kr2z
| j }W qD tk
r.   tdY qDX nt|rDtdg }|D ]J}|d kr^t}n.t|st|tr|t|}ntdt	| |
| qLt|S )NzoThe adapter factory doesn't have a __component_adapts__ attribute and no required specifications were specifiedzLthe required argument should be a list of interfaces, not a single interfacez?Required specification must be a specification or class, not %r)Z__component_adapts__r   r@   r
   r   r   rP   r   r   typer*   rT   )rH   r   resultr   r   r   r   r   U  s*    




r   c                   @   sV   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S )ru   Nc                 C   s,   ||||||f\| _ | _| _| _| _| _d S r   )registryrA   rF   r&   rG   rH   )r"   r   rA   rF   r&   docrH   r   r   r   r#   t  s    zUtilityRegistration.__init__c              
   C   s<   d| j j| jt| jdd | jt| jdt| j| j| j	f S )Nz%s(%r, %s, %r, %s, %r, %r)r0   )
rX   r0   r   getattrrA   rF   r&   reprrH   rG   rY   r   r   r   rZ   y  s      zUtilityRegistration.__repr__c                 C   s   t | S r   idrY   r   r   r   __hash__  s    zUtilityRegistration.__hash__c                 C   s   t | t |kS r   r   r"   otherr   r   r   __eq__  s    zUtilityRegistration.__eq__c                 C   s   t | t |kS r   r   r   r   r   r   __ne__  s    zUtilityRegistration.__ne__c                 C   s   t | t |k S r   r   r   r   r   r   __lt__  s    zUtilityRegistration.__lt__c                 C   s   t | t |kS r   r   r   r   r   r   __le__  s    zUtilityRegistration.__le__c                 C   s   t | t |kS r   r   r   r   r   r   __gt__  s    zUtilityRegistration.__gt__c                 C   s   t | t |kS r   r   r   r   r   r   __ge__  s    zUtilityRegistration.__ge__)Nr0   r1   r2   r#   rZ   r   r   r   r   r   r   r   r   r   r   r   ru   q  s   
	ru   c                   @   sT   e Z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S )r   c                 C   s,   ||||||f\| _ | _| _| _| _| _d S r   )r   r   rA   rF   rH   rG   )r"   r   r   rA   rF   r&   r   r   r   r   r#     s
     zAdapterRegistration.__init__c                 C   sT   d| j j| jdddd | jD  d t| jdd | jt| jdt	| j| j
f S )Nz%s(%r, %s, %s, %r, %s, %r)[, c                 S   s   g | ]
}|j qS r   r0   r   r   r   r   r   r     s     z0AdapterRegistration.__repr__.<locals>.<listcomp>]r0   )rX   r0   r   joinr   r   rA   rF   rH   r   rG   rY   r   r   r   rZ     s      zAdapterRegistration.__repr__c                 C   s   t | S r   r   rY   r   r   r   r     s    zAdapterRegistration.__hash__c                 C   s   t | t |kS r   r   r   r   r   r   r     s    zAdapterRegistration.__eq__c                 C   s   t | t |kS r   r   r   r   r   r   r     s    zAdapterRegistration.__ne__c                 C   s   t | t |k S r   r   r   r   r   r   r     s    zAdapterRegistration.__lt__c                 C   s   t | t |kS r   r   r   r   r   r   r     s    zAdapterRegistration.__le__c                 C   s   t | t |kS r   r   r   r   r   r   r     s    zAdapterRegistration.__gt__c                 C   s   t | t |kS r   r   r   r   r   r   r     s    zAdapterRegistration.__ge__Nr   r   r   r   r   r     s   	r   c                   @   s   e Zd ZdS )r   N)r0   r1   r2   r   r   r   r   r     s   r   c                   @   s,   e Zd Zdd Zedd ZdZdd ZdS )r   c                 C   s&   |||||f\| _ | _| _| _| _d S r   )r   r   rF   handlerrG   )r"   r   r   rF   r   r   r   r   r   r#     s    zHandlerRegistration.__init__c                 C   s   | j S r   )r   rY   r   r   r   rH     s    zHandlerRegistration.factoryNc              
   C   sH   d| j j| jdddd | jD  d | jt| jdt| j| j	f S )Nz%s(%r, %s, %r, %s, %r)r   r   c                 S   s   g | ]
}|j qS r   r   r   r   r   r   r     s     z0HandlerRegistration.__repr__.<locals>.<listcomp>r   r0   )
rX   r0   r   r   r   rF   r   rH   r   rG   rY   r   r   r   rZ     s     zHandlerRegistration.__repr__)r0   r1   r2   r#   r   rH   rA   rZ   r   r   r   r   r     s
   
r   N)*__doc__collectionsr   Z
zope.eventr   ImportErrorZzope.interface.interfacesr
   r   r   r   r   r   r   r   r   Zzope.interface.interfacer   Zzope.interface.declarationsr   r   r   r   Zzope.interface.adapterr   Zzope.interface._compatr   r   __all__r   r   r4   r5   r   rt   rs   r   r   ru   r   r   r   r   r   r   r   <module>   sX   C   /%%