eddZddlmZ ddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZdgZGddZdZGddZee GddZdZdZdZ dZ!ee Gdd Z"ee Gd!d"Z#ee Gd#d$e#Z$ee Gd%d&e#Z%y'#e$rdZYwxYw)(zBasic components support ) defaultdict)notifycyN)argkws 9/usr/lib/python3/dist-packages/zope/interface/registry.pyrr)ISpecification)ComponentLookupError)IAdapterRegistration) IComponents)IHandlerRegistration) ISubscriptionAdapterRegistration)IUtilityRegistration) Registered) Unregistered) Interface) implementedBy) implementer)implementer_only) providedBy)AdapterRegistry Componentsc$eZdZdZdZdZdZy)_UnhashableComponentCountercT|jDcgc]}|c}|_ycc}wr)items_data)self otherdictitems r __init__z$_UnhashableComponentCounter.__init__2s'0'89td9 9s %c>|jD]\}}||k(s |cSyNr)r!)r"key componentcounts r __getitem__z'_UnhashableComponentCounter.__getitem__6s, $   IuC  r ct|jD] \}}|d|k(s||f|j|<y|jj||fyr') enumerater!append)r"r)r*idatas r __setitem__z'_UnhashableComponentCounter.__setitem__<sX , GAtAw)# )5 0 1   9e,-r ct|jD]\}}|d|k(s|j|=yt|r')r-r!KeyError)r"r)r/r0s r __delitem__z'_UnhashableComponentCounter.__delitem__CsE , GAtAw)#JJqM y!!r N)__name__ __module__ __qualname__r%r+r1r4rr r rr/s: ."r rc ttSr)rintrr r _defaultdict_intr:Js s r c6eZdZdZdZdZdZdZdZdZ y) _UtilityRegistrationschtt|_||_||_|j yr)rr:_cache _utilities_utility_registrations%_UtilityRegistrations__populate_cache)r" utilitiesutility_registrationss r r%z_UtilityRegistrations.__init__Os*!"23 #&;# r ct|jjD]\\}}}|d}|j||!yr')iterr@r $_UtilityRegistrations__cache_utility)r"p_r0r)s r __populate_cachez&_UtilityRegistrations.__populate_cacheWsF"4#>#>#D#D#FG /NVaTQI  I . /r c |j||xxdz cc<y#t$r7t|j|x}|j|<||xxdz cc<YywxYw)N)r> TypeErrorr)r"providedr)provs r __cache_utilityz%_UtilityRegistrations.__cache_utility\sb ! KK !) , 1 , !,Gt{{S[G\+] ]D4;;x( Oq O  !s=AAcb|j|}||}|dz}|dk(r||=|dkDS|||<|dkDS)NrKr)r>)r"rMr)r*s r __uncache_utilityz'_UtilityRegistrations.__uncache_utilityesV;;x( #   A:#qy#(HY qyr cL |j||dkDS#t$rYywxYw)NrF)r>rL)r"rMr)s r _is_utility_subscribedz,_UtilityRegistrations._is_utility_subscribedts2 ;;x(3a7 7  s  ##c|j||}|||f|j||f<|jjd||||s|jj d|||j ||yNr)rSr@r?register subscriberF)r"rMnamer)infofactory subscribeds r registerUtilityz%_UtilityRegistrations.registerUtility{sq009E 8A48P##Xt$45   XtY? OO % %b(I > Xy1r c|j||f=|jjd|||j||}|s|jj d||yyrU)r@r? unregister&_UtilityRegistrations__uncache_utility unsubscribe)r"rMrXr)r[s r unregisterUtilityz'_UtilityRegistrations.unregisterUtilitys[  ' '4(8 9 ""2x6++Hi@  OO ' 'Hi @r N) r5r6r7r%rArFr_rSr\rarr r r<r<Ms& / !  2Ar r<c@eZdZdZd$dZdZfdZdZdZe dZ dZ d Z e d d Z d%d Z d&d ZdZd'dZd(dZdZdZ d)dZ d*dZdZd'dZd(dZ d'dZd(dZdZ d)dZdZ d*dZdZ d+dZ!d Z"d,d!Z#d"Z$d-d#Z%xZ&S).rNct|tsJ||_|j|j t ||_d|_yr) isinstancestrr5_init_registries_init_registrationstuple __bases___v_utility_registrations_cache)r"rXbasess r r%zComponents.__init__sF$$$$     "u.2+r cbdj|jj|jS)Nz<{} {}>)format __class__r5r"s r __repr__zComponents.__repr__s# 7 7GGr ct|}|djDcic]\}}|jds||}}}t |}||d<t |Scc}}w)N_v_)super __reduce__r startswithlistrh)r" reductionkvfiltered_staterns r ruzComponents.__reduce__ss G&( ,5Q<+=+=+?641a!"e!4Q$66O % ! Y 6sA"c@t|_t|_yr)radaptersrBros r rfzComponents._init_registriess() (*r c<i|_i|_g|_g|_yr)r@_adapter_registrations_subscription_registrations_handler_registrationsros r rgzComponents._init_registrationss"&(#&(#+-(&(#r c|j}|0|j|jus|j|jur't |j|jx}|_|Sr)rjr?rBr@r<)r"caches r _utility_registrations_cachez'Components._utility_registrations_cachese33 Mt~~5++43N3NN:O++;- -ED7 r c:|jjddS)Nrir)__dict__getros r _getBaseszComponents._getBasess}}  b11r ct|Dcgc]}|jc}|j_t|Dcgc]}|jc}|j_t||jd<ycc}wcc}w)Nri)rhr}rirBr)r"rkbases r _setBaseszComponents._setBasessn"'&+)-"DMM)-#. #(',*.#DNN*.$/ %*5\ k" )-*.s A>Bc"|jSr)rros r zComponents.s T^^%r c$|j|Sr)r)r"rks r rzComponents.sDNN51r c r|r|r td|}| t|}|dk(r t|}|jj ||f}|!|dd||fk(ry|j |d|||j j||||||r#ttt||||||yy)N$Can't specify factory and component.rrr) rL_getUtilityProvided_getNamer@rrarr\rrUtilityRegistration)r"r)rMrXrYeventrZregs r r\zComponents.registerUtilitys  FGG I  *95H 2:I&D))--x.>? ?2Aw9d++  " "3q68T : ))99 dItW 6  :#D(D)T$+-  r c H|r|r td|}|| tdt|}|jj||f}| | ||dk7ry||d}|jj |||t tt||||g|ddy)Nrz3Must specify one of component, factory and providedrFrKT) rLrr@rrrarrr)r"r)rMrXrZolds r razComponents.unregisterUtilitys  FGG I   !+,,*95H))--x.>? Ki3'3q61  AI ));; dI ' | hi J#ab' J r c#Kt|jjD]\\}}}t|||g|ywr)rEr@r r)r"rMrXr0s r registeredUtilitieszComponents.registeredUtilitiessKt2288:; C  ht%dHdBTB B CsAAc>|jjd|||SrU)rBlookup)r"rMrXdefaults r queryUtilityzComponents.queryUtilitys~~$$R4AAr c\|jjd||}| t|||SrU)rBrr)r"rMrXutilitys r getUtilityzComponents.getUtilitys1..''Hd; ?&x6 6r c#XK|jjd|Ed{y7wrU)rB lookupAllr" interfaces r getUtilitiesForzComponents.getUtilitiesFor%s >>++B :::s *(*c:|jjd|SrU)rB subscriptionsrs r getAllUtilitiesRegisteredForz'Components.getAllUtilitiesRegisteredFor(s~~++B ::r c | t|}t||}|dk(r t|}||f|j|||f<|jj |||||r#t tt||||||yyNr) _getAdapterProvided_getAdapterRequiredrrr}rVrrAdapterRegistrationr"rZrequiredrMrXrYrs r registerAdapterzComponents.registerAdapter+s  *73H&w9 2:G$D(/  ##Xx$> & x4A  :#D(Hd$+T3  r c `|| tdt|}| | tdt||}|jj |||f}| | ||dk7ry|j|||f=|j j |||ttt||||g|y)N(Must specify one of factory and provided(Must specify one of factory and requiredrFT) rLrrrrr}r^rrr)r"rZrrMrXrs r unregisterAdapterzComponents.unregisterAdapter=s   JKK*73H  7?FG G&w9))--x4.HI Kg1%Q/  ' '8T(B C   8T:| h$ &!$ &  r c #Kt|jjD]\\}}}\}}t|||||| ywr)rErr r)r"rrMrXr)rYs r registeredAdapterszComponents.registeredAdaptersXsVt2288:; 7  'h$):)T%dHh&/7 7 7sAAc>|jj||||Sr)r} queryAdapter)r"objectrrXrs r rzComponents.queryAdapter^s}}))&)T7KKr c^|jj|||}| t||||Sr)r}rr)r"rrrXadapters r getAdapterzComponents.getAdapteras3--,,VYE ?&vy$? ?r c>|jj||||Sr)r}queryMultiAdapter)r"objectsrrXrs r rzComponents.queryMultiAdaptergs"}}.. Yg/ /r c^|jj|||}| t||||Sr)r}rr)r"rrrXrs r getMultiAdapterzComponents.getMultiAdapterls3--11'9dK ?&w 4@ @r c#K|jjttt||D]\}}||}|||fywr)r}rrwmapr)r"rrMrXrZrs r getAdapterszComponents.getAdaptersrsV!]]44 Z) *  $MD'w'G"Gm#  $s AA  A c |r td| t|}t||}|jj |||||f|j j ||||r#ttt||||||yy)N'Named subscribers are not yet supported) rLrrrr.r}rWrrSubscriptionRegistrationrs r registerSubscriptionAdapterz&Components.registerSubscriptionAdapterzs EF F  *73H&w9 ((// xw 5  (G<  :(x4)0$8  r c#JK|jD]}t|g|ywr)rrr"r0s r registeredSubscriptionAdaptersz)Components.registeredSubscriptionAdapterss+44 8D*47$7 7 8!#c t|r td|| tdt|}| | tdt||}|7|jD cgc]\}}}}} ||k(r||k(s||||| f} }}}}} n;|jD cgc]\}}}}} ||k(r ||k(r||k(s||||| f } }}}}} t | t |jk(ry| |jdd|j j |||ttt|||||dycc} }}}}wcc} }}}}w)NrrrFrT) rLrrrlenr}r`rrr) r"rZrrMrXrrGnfr/news r unregisterSubscriptionAdapterz(Components.unregisterSubscriptionAdaptersn EF F   JKK*73H  7?FG G&w9 ?66&1aA=Q(]q!Q?C66&1aA=Q(]qG|q!Q?C s8s4;;< </2((+ !!(Hg>| $T8Xt%,b 2  1 s D( #D1 c:|jj||Srr} subscribers)r"rrMs r rzComponents.subscriberss}}(((;;r c |r tdt||}|jj||||f|jj |d||r"t tt|||||yy)Nz$Named handlers are not yet supported) rLrrr.r}rWrrHandlerRegistration)r"rZrrXrYrs r registerHandlerzComponents.registerHandlers~ BC C&w9 ##** tWd +  $8  :#D(D'4H  r c#JK|jD]}t|g|ywr)rrrs r registeredHandlerszComponents.registeredHandlerss+// 3D%d2T2 2 3rc |r td| | tdt||}|.|jDcgc]\}}}}||k7r||||f}}}}}n2|jDcgc]\}}}}||k(r||k(s||||f}}}}}t|t|jk(ry||jdd|jj |d|t tt||||dycc}}}}wcc}}}}w)NrrFrT) rLrrrr}r`rrr) r"rZrrXrrrr/rs r unregisterHandlerzComponents.unregisterHandlers0 EF F  7?FG G&w9 ?11#1a8mq!Q<C11#1a=Q'\q!Q<C s8s4667 7),##A& !!(D':| hgr B - s C; *D c<|jj|dyrr)r"rs r handlezComponents.handles !!'40r c0t|j}|j}d}d}d}d}d|jvsJd|_|r|j }|j } ndx}} |jD]`\\} } \} } }|jd| | | k7r|d| | | |dz }n|dz }|jd| | |dz }| d| | \|dz }b |`|r|s|r|j | ||||dS#|`|r|s|r|j |wwwxYw)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 rchangedcyrr)rHs r rzAComponents.rebuildUtilityRegistryFromLocalCache..r r cyrr)argss r rzAComponents.rebuildUtilityRegistryFromLocalCache..!r r rrK)needed_registereddid_not_registerneeded_subscribeddid_not_subscribe) dictr@rBrrrVrWr registeredr[)r"rebuildregsutilsrrrrrVrWrMrXvalue_info_factorys r $rebuildUtilityRegistryFromLocalCachez/Components.rebuildUtilityRegistryFromLocalCachesf.D//0 ...& ~~HI#5 5Hy %>Bjjl +: 4":5%##B$75@R47%*%$)$##B%8@%*%b(E2%*% + -1B e$"3 0!2!2    -1B e$2Cws #A3C88D)rr)NNrrTN)NNrN)rN)r)NNrrT)NNNr)NrrT)NNr)F)'r5r6r7rjr%rprurfrgpropertyrrrrir\rarrrrrrrrrrrrrrrrrrrrrr __classcell__)rns@r rrs!&*"3H  + )   22%1 I CE59:EG"&>C B ;;@D04$)-=?67 L :<"&/  $FJ24*.(859=?(T<+/&(""3 D1A r c: |jS#t$rYywxYwr)__component_name__AttributeError)r)s r rr<s%+++ s  cftt|}t|dk(r|dStd)NrKrzWThe utility doesn't provide a single interface and no provided interface was specified.)rwrrrL)r)rMs r rrBs9Jy)*H 8}{  3 44r cftt|}t|dk(r|dStd)NrKrzaThe adapter factory doesn't implement a single interface and no provided interface was specified.)rwrrrL)rZrMs r rrJs9M'*+H 8}{  3 44r c~| |j}n tj|r tdg}|D]d}|t }nHtj|s3t |tr t|}ntdt|z|j|ft|S#t$r tdwxYw)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) __component_adapts__rrLr rrrdtyperr.rh)rZrresultrs r rrRs 33H  " "8 ,=> >F   9A**1-!T"!!$!ACG7!K""  a  =+ J  s B''B<cDeZdZd dZdZdZdZdZdZdZ d Z d Z y) rNc^||||||f\|_|_|_|_|_|_yr)registryrMrXr)rYrZ)r"rrMrXr)docrZs r r%zUtilityRegistration.__init__qs2xy#w >  ty$.$) r c "dj|jj|jt |j dd|j t |jdt|j|j|jS)Nz"{}({!r}, {}, {!r}, {}, {!r}, {!r})r5) rmrnr5rgetattrrMrXr)reprrZrYros r rpzUtilityRegistration.__repr__vse3::''  z48$)) D4HI dii  r ct|Sridros r __hash__zUtilityRegistration.__hash__ $xr c0t|t|k(Srrr"others r __eq__zUtilityRegistration.__eq__DzT%[((r c0t|t|k7Srr r s r __ne__zUtilityRegistration.__ne__rr c0t|t|kSrr r s r __lt__zUtilityRegistration.__lt__DzDK''r c0t|t|kSrr r s r __le__zUtilityRegistration.__le__rr c0t|t|kDSrr r s r __gt__zUtilityRegistration.__gt__rr c0t|t|k\Srr r s r __ge__zUtilityRegistration.__ge__rr r r5r6r7r%rprrrrrrrrr r rrns/? ))()()r rcBeZdZdZdZdZdZdZdZdZ dZ d Z y ) rc^||||||f\|_|_|_|_|_|_yr)rrrMrXrZrY)r"rrrMrXr)rs r r%zAdapterRegistration.__init__s2x4C ?  t}di tyr cdj|jj|jddj |j Dcgc]}|jc}zdzt |jdd|jt |jdt|j|jScc}w)Nz {}({!r}, {}, {}, {!r}, {}, {!r})[, ]r5) rmrnr5rjoinrrrMrXrZrrYr"rs r rpzAdapterRegistration.__repr__s188 NN # # MM $))?AQZZ?@ @3 F DMM:t 4dii DLL*d4<<.@ A499  @sB>ct|Srrros r rzAdapterRegistration.__hash__r r c0t|t|k(Srr r s r rzAdapterRegistration.__eq__rr c0t|t|k7Srr r s r rzAdapterRegistration.__ne__rr c0t|t|kSrr r s r rzAdapterRegistration.__lt__rr c0t|t|kSrr r s r rzAdapterRegistration.__le__rr c0t|t|kDSrr r s r rzAdapterRegistration.__gt__rr c0t|t|k\Srr r s r rzAdapterRegistration.__ge__rr Nrrr r rrs0@ ))()()r rc eZdZy)rN)r5r6r7rr r rrsr rc,eZdZdZedZdZdZy)rcP|||||f\|_|_|_|_|_yr)rrrXhandlerrY)r"rrrXr.rs r r%zHandlerRegistration.__init__s) xw 3  ty$, r c|jSr)r.ros r rZzHandlerRegistration.factorys ||r Nc Zdj|jj|jddj |j Dcgc]}|jc}zdz|j t|jdt|j|jScc}w)Nz{}({!r}, {}, {!r}, {}, {!r})rr r!r5) rmrnr5rr"rrXrrZrrYr#s r rpzHandlerRegistration.__repr__s~-44 NN # # MM $))?AQZZ?@ @3 F II DLL*d4<<.@ A499  @sB()r5r6r7r%rrZrMrprr r rrs'4Hr rN)&__doc__ collectionsr zope.eventr ImportErrorzope.interface.interfacesr rrrrrrrrzope.interface.interfacerzope.interface.declarationsrrrrzope.interface.adapterr__all__rr:r<rrrrrrrrrrr r r:s=#!!5::1:F:02.53822   ""6@A@AF [i i i V  448 !"#)#)##)J !"#)#)##)J23 2 4 &'-(Y! !sC<<DD