diff options
Diffstat (limited to 'share/shadow.py')
-rwxr-xr-x | share/shadow.py | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/share/shadow.py b/share/shadow.py new file mode 100755 index 0000000..5cc7c9e --- /dev/null +++ b/share/shadow.py @@ -0,0 +1,75 @@ +#!/usr/bin/python +#--------------------------------------------------------------- +# Project : Mandrake Linux +# Module : share +# File : shadow.py +# Version : $Id$ +# Author : Frederic Lepied +# Created On : Sat Jan 26 17:38:39 2002 +# Purpose : loads a python module and creates another one +# on stdout. All the functions of the module are shadowed according +# to their doc string: "D" direct mapping, "1" indirect call but +# name + first arg used as the key and all other cases indirect +# call with the name as the key. +#--------------------------------------------------------------- + +import sys +import imp +import inspect + +### strings used in the rewritting +direct_str = """ +%s=%s.%s + +""" + +indirect_str = """ +def %s(*args): + indirect(\"%s\", %s.%s, %d, args) + +""" + +header = """ + +NONE=0 +ALL=1 +LOCAL=2 + +FAKE = {} + +def indirect(name, func, type, args): + if type == 1: + key = (name, args[0]) + else: + key = name + FAKE[key] = (func, args) + +def commit_changes(): + for f in FAKE.values(): + apply(f[0], f[1]) + +""" + +### code +modulename = sys.argv[1] + +module = __import__(modulename) + +sys.stdout.write(header) + +sys.stdout.write("import %s\n\n" % modulename) + +for f in inspect.getmembers(module, inspect.isfunction): + (args, varargs, varkw, locals) = inspect.getargspec(f[1]) + if f[1].__doc__ and f[1].__doc__[0] == 'D': + #argspec = inspect.formatargspec(args, varargs, varkw, locals) + s = direct_str % (f[0], modulename, f[0]) + else: + if f[1].__doc__ and f[1].__doc__[0] == '1': + type = 1 + else: + type = 0 + s = indirect_str % (f[0], f[0], modulename, f[0], type) + sys.stdout.write(s) + +# shadow.py ends here |