Index: third_party/twisted_8_1/twisted/python/hook.py |
diff --git a/third_party/twisted_8_1/twisted/python/hook.py b/third_party/twisted_8_1/twisted/python/hook.py |
deleted file mode 100644 |
index 3c85ca74c04750dec1dc49d1d14795ee796e3c23..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/python/hook.py |
+++ /dev/null |
@@ -1,177 +0,0 @@ |
- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
- |
-""" |
-I define support for hookable instance methods. |
- |
-These are methods which you can register pre-call and post-call external |
-functions to augment their functionality. People familiar with more esoteric |
-languages may think of these as \"method combinations\". |
- |
-This could be used to add optional preconditions, user-extensible callbacks |
-(a-la emacs) or a thread-safety mechanism. |
- |
-The four exported calls are: |
- |
- - L{addPre} |
- - L{addPost} |
- - L{removePre} |
- - L{removePost} |
- |
-All have the signature (class, methodName, callable), and the callable they |
-take must always have the signature (instance, *args, **kw) unless the |
-particular signature of the method they hook is known. |
- |
-Hooks should typically not throw exceptions, however, no effort will be made by |
-this module to prevent them from doing so. Pre-hooks will always be called, |
-but post-hooks will only be called if the pre-hooks do not raise any exceptions |
-(they will still be called if the main method raises an exception). The return |
-values and exception status of the main method will be propogated (assuming |
-none of the hooks raise an exception). Hooks will be executed in the order in |
-which they are added. |
- |
-""" |
- |
-# System Imports |
-import string |
- |
-### Public Interface |
- |
-class HookError(Exception): |
- "An error which will fire when an invariant is violated." |
- |
-def addPre(klass, name, func): |
- """hook.addPre(klass, name, func) -> None |
- |
- Add a function to be called before the method klass.name is invoked. |
- """ |
- |
- _addHook(klass, name, PRE, func) |
- |
-def addPost(klass, name, func): |
- """hook.addPost(klass, name, func) -> None |
- |
- Add a function to be called after the method klass.name is invoked. |
- """ |
- _addHook(klass, name, POST, func) |
- |
-def removePre(klass, name, func): |
- """hook.removePre(klass, name, func) -> None |
- |
- Remove a function (previously registered with addPre) so that it |
- is no longer executed before klass.name. |
- """ |
- |
- _removeHook(klass, name, PRE, func) |
- |
-def removePost(klass, name, func): |
- """hook.removePre(klass, name, func) -> None |
- |
- Remove a function (previously registered with addPost) so that it |
- is no longer executed after klass.name. |
- """ |
- _removeHook(klass, name, POST, func) |
- |
-### "Helper" functions. |
- |
-hooked_func = """ |
- |
-import %(module)s |
- |
-def %(name)s(*args, **kw): |
- klazz = %(module)s.%(klass)s |
- for preMethod in klazz.%(preName)s: |
- preMethod(*args, **kw) |
- try: |
- return klazz.%(originalName)s(*args, **kw) |
- finally: |
- for postMethod in klazz.%(postName)s: |
- postMethod(*args, **kw) |
-""" |
- |
-_PRE = '__hook_pre_%s_%s_%s__' |
-_POST = '__hook_post_%s_%s_%s__' |
-_ORIG = '__hook_orig_%s_%s_%s__' |
- |
- |
-def _XXX(k,n,s): |
- "string manipulation garbage" |
- x = s % (string.replace(k.__module__,'.','_'), k.__name__, n) |
- return x |
- |
-def PRE(k,n): |
- "(private) munging to turn a method name into a pre-hook-method-name" |
- return _XXX(k,n,_PRE) |
- |
-def POST(k,n): |
- "(private) munging to turn a method name into a post-hook-method-name" |
- return _XXX(k,n,_POST) |
- |
-def ORIG(k,n): |
- "(private) munging to turn a method name into an `original' identifier" |
- return _XXX(k,n,_ORIG) |
- |
- |
-def _addHook(klass, name, phase, func): |
- "(private) adds a hook to a method on a class" |
- _enhook(klass, name) |
- |
- if not hasattr(klass, phase(klass, name)): |
- setattr(klass, phase(klass, name), []) |
- |
- phaselist = getattr(klass, phase(klass, name)) |
- phaselist.append(func) |
- |
- |
-def _removeHook(klass, name, phase, func): |
- "(private) removes a hook from a method on a class" |
- phaselistname = phase(klass, name) |
- if not hasattr(klass, ORIG(klass,name)): |
- raise HookError("no hooks present!") |
- |
- phaselist = getattr(klass, phase(klass, name)) |
- try: phaselist.remove(func) |
- except ValueError: |
- raise HookError("hook %s not found in removal list for %s"% |
- (name,klass)) |
- |
- if not getattr(klass, PRE(klass,name)) and not getattr(klass, POST(klass, name)): |
- _dehook(klass, name) |
- |
-def _enhook(klass, name): |
- "(private) causes a certain method name to be hooked on a class" |
- if hasattr(klass, ORIG(klass, name)): |
- return |
- |
- def newfunc(*args, **kw): |
- for preMethod in getattr(klass, PRE(klass, name)): |
- preMethod(*args, **kw) |
- try: |
- return getattr(klass, ORIG(klass, name))(*args, **kw) |
- finally: |
- for postMethod in getattr(klass, POST(klass, name)): |
- postMethod(*args, **kw) |
- try: |
- newfunc.func_name = name |
- except TypeError: |
- # Older python's don't let you do this |
- pass |
- |
- oldfunc = getattr(klass, name).im_func |
- setattr(klass, ORIG(klass, name), oldfunc) |
- setattr(klass, PRE(klass, name), []) |
- setattr(klass, POST(klass, name), []) |
- setattr(klass, name, newfunc) |
- |
-def _dehook(klass, name): |
- "(private) causes a certain method name no longer to be hooked on a class" |
- |
- if not hasattr(klass, ORIG(klass, name)): |
- raise HookError("Cannot unhook!") |
- setattr(klass, name, getattr(klass, ORIG(klass,name))) |
- delattr(klass, PRE(klass,name)) |
- delattr(klass, POST(klass,name)) |
- delattr(klass, ORIG(klass,name)) |