3 ˆuAc^ã@sldZddlZddlmZddgZGdd„deƒZGdd „d eƒZGd d„deeeƒƒZ Gd d„de e ƒZ dS) z[This module contains variants of certain base types which call registered hooks on changes.éN)Úwith_metaclassÚHookableÚ HookableSetc@s eZdZdd„Zedd„ƒZdS)Ú HookableTypec Cs’d|kr‚y |d}WnJtk r^d}x0dd„|DƒD]}|rRtdt|ƒƒ‚q8|}q8WYnXx |dD]}tj||ƒ||<qjWtj||||ƒS)NÚ_hookable_change_methodsZ_hookable_base_classcss|]}|tkr|VqdS)N)r)Ú.0Úx©r ú/usr/lib/python3.6/hookable.pyú )sz'HookableType.__new__..ztoo many base classes: %s)ÚKeyErrorÚ TypeErrorÚstrrÚ wrap_methodÚtypeÚ__new__)ÚclsÚnameÚbasesZdctÚbaseZbase_candidateÚ methodnamer r r r"s zHookableType.__new__cs t||ƒ‰‡fdd„}||_|S)Ncsˆ|f|ž|Ž}|jƒ|S)N)Ú _run_hooks)ÚselfÚpÚkZretval)Úfuncr r Ú methodwrapper9sz/HookableType.wrap_method..methodwrapper)ÚgetattrÚ__name__)rrrrr )rr r5s  zHookableType.wrap_methodN)rÚ __module__Ú __qualname__rÚ classmethodrr r r r r src@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „ZdS) Ú _HookEntryNc Csât|tjƒst‚t|tƒst‚xFt|ƒD]:\}}y t|ƒWq(tk r`td||fƒ‚Yq(Xq(WxF|jƒD]:\}}y t|ƒWqptk r¨td||fƒ‚YqpXqpWt|t ƒsÀt |ƒ}||_ ||_ ||_ ||_ d|_dS)Nz*Positional argument %d is not hashable: %rz'Keyword argument %r is not hashable: %r)Ú isinstanceÚ collectionsÚCallableÚAssertionErrorrÚ enumerateÚhashr ÚitemsÚtupleÚ_HookEntry__hookÚ_HookEntry__argsÚ_HookEntry__kwargsÚ_HookEntry__hookableÚ_HookEntry__hash)rÚhookÚargsÚkwargsÚhookableÚnrrr r r Ú__init__Ds.   z_HookEntry.__init__cCs$|j|jko"|j|jko"|j|jkS)N)r+r,r-)rÚobjr r r Ú__cmp__cs  z_HookEntry.__cmp__cCs|js|jƒ|_|jS)N)r/Ú _compute_hash)rr r r Ú__hash__is z_HookEntry.__hash__cCs>t|jƒ}t|ƒt|jƒA}t|ƒttt|jjƒƒƒƒA}|S)N)r(r+r,r*Úsortedr-r))rÚ hashvaluer r r r8ns  z_HookEntry._compute_hashcCs4|jr |j|jf|jž|jŽn|j|j|jŽdS)N)r.r+r,r-)rr r r Úrunusz_HookEntry.run)N)rrr r5r7r9r8r<r r r r r"Bs  r"c@sˆeZdZdZedd„ƒZdd„Zdd„ZeeeƒZdd „Z d d „Z ee e ƒZ d d „Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„ZdS)rz2An object which calls registered hooks on changes.cOst|dƒstƒ|_|jS)NÚ__real_hooks__)ÚhasattrÚsetr=)rrrr r r Ú __hooks__€s zHookable.__hooks__cCst|dƒsd|_|jS)NÚ__hooks_enabled__T)r>rA)rr r r Ú_get_hooks_enabled†s zHookable._get_hooks_enabledcCs ||_dS)N)rA)rZenabledr r r Ú_set_hooks_enabled‹szHookable._set_hooks_enabledcCst|dƒsd|_|jS)NÚ__hooks_frozen__F)r>rD)rr r r Ú_get_hooks_frozen�s zHookable._get_hooks_frozencCsB||jkrdS||_|r"tƒ|_nx|jD] }|jƒq*W|`dS)N)Ú hooks_frozenrDr?Ú__hooks_frozen_entries__r<)rZfreezeÚ hookentryr r r Ú_set_hooks_frozen•s    zHookable._set_hooks_frozencCs d|_dS)NT)rF)rr r r Ú freeze_hooks¤szHookable.freeze_hookscCs d|_dS)NF)rF)rr r r Ú thaw_hooks§szHookable.thaw_hookscOs|j|df|ž|ŽdS)N)Ú_Hookable__add_hook)rr0r1r2r r r Úadd_hookªszHookable.add_hookcOs|j||f|ž|ŽdS)N)rL)rr0r1r2r r r Úadd_hook_hookable­szHookable.add_hook_hookablecOs>t|tjƒst‚t|tƒst‚t||||d�}|jj|ƒdS)N)r3)r#r$r%r&rr"r@Úadd)rr0Z _hookabler1r2rHr r r Z __add_hook°szHookable.__add_hookcOs|jjt|||ƒƒdS)N)r@Úremover")rr0r1r2r r r Ú remove_hook¶szHookable.remove_hookcCs8|jr4|js&x&|jD] }|jƒqWn|jj|jƒdS)N)Ú hooks_enabledrFr@r<rGÚupdate)rrHr r r rºs  zHookable._run_hooksN)rrr Ú__doc__Úpropertyr@rBrCrRrErIrFrJrKrMrNrLrQrr r r r r|s   c @seZdZdZdZd d „Zd S)rz5A set object which calls registered hooks on changes.rOÚclearÚdifference_updateÚdiscardÚintersection_updateÚpoprPÚsymmetric_difference_updaterScCstj|ƒ}tƒ|_|S)N)r?Úcopyr=)rr6r r r r\Ës zHookableSet.copyN) rOrVrWrXrYrZrPr[rS)rrr rTrr\r r r r rÃs) rTr$ZsixrÚ__all__rrÚobjectr"rr?rr r r r Ús ":G