| 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))
|
|
|