[pywin32-checkins] pywin32/AutoDuck py2d.py,NONE,1.1
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
|
From: Mark H. <mha...@us...> - 2004-09-11 07:43:49
|
Update of /cvsroot/pywin32/pywin32/AutoDuck In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8609 Added Files: py2d.py Log Message: simple tool to grab docstrings from modules and write a .d file autoduck understands --- NEW FILE: py2d.py --- import sys import types class DocInfo: def __init__(self, name, ob): self.name = name self.ob = ob self.short_desc = "" self.desc = "" def BuildArgInfos(ob): ret = [] vars = list(ob.func_code.co_varnames[:ob.func_code.co_argcount]) vars.reverse() # for easier default checking. defs = list(ob.func_defaults or []) for i, n in enumerate(vars): info = DocInfo(n, ob) info.short_desc = info.desc = n info.default = "" if len(defs): info.default = defs.pop() ret.append(info) ret.reverse() return ret def BuildInfo(name, ob): ret = DocInfo(name, ob) docstring = ob.__doc__ or "" ret.desc = ret.short_desc = docstring.strip() if ret.desc: ret.short_desc = ret.desc.splitlines()[0] return ret def format_desc(desc): if not desc: return "" lines = desc.splitlines() chunks = [lines[0]] for line in lines[1:]: line = line.strip() if not line: line = "<nl>" chunks.append( "// " + line ) return "\n".join(chunks) def build_module(fp, mod_name): __import__(mod_name) mod = sys.modules[mod_name] functions = [] classes = [] constants = [] for name, ob in mod.__dict__.items(): if name.startswith("_"): continue if hasattr(ob, "__module__") and ob.__module__ != mod_name: continue if type(ob)==types.ClassType: classes.append(BuildInfo(name, ob)) elif type(ob)==types.FunctionType: functions.append(BuildInfo(name, ob)) elif name.upper()==name and type(ob) in (int, str): constants.append( (name, ob) ) info = BuildInfo(mod_name, mod) print >> fp, "// @module %s|%s" % (mod_name, format_desc(info.desc)) for ob in functions: print >> fp, "// @pymeth %s|%s" % (ob.name, ob.short_desc) for ob in functions: print >> fp, "// @pymethod |%s|%s|%s" % (mod_name, ob.name, format_desc(ob.desc)) for ai in BuildArgInfos(ob.ob): print >> fp, "// @pyparm |%s|%s|%s" % (ai.name, ai.default, ai.short_desc) for ob in classes: ob_name = mod_name + "." + ob.name print >> fp, "// @object %s|%s" % (ob_name, format_desc(ob.desc)) func_infos = [] for n, o in ob.ob.__dict__.items(): if type(o)==types.FunctionType: info = BuildInfo(n, o) func_infos.append(info) for fi in func_infos: print >> fp, "// @pymeth %s|%s" % (fi.name, fi.short_desc) for fi in func_infos: print >> fp, "// @pymethod |%s|%s|%s" % (ob_name, fi.name, format_desc(fi.desc)) for ai in BuildArgInfos(fi.ob): print >> fp, "// @pyparm |%s|%s|%s" % (ai.name, ai.default, ai.short_desc) for (name, val) in constants: desc = "%s = %r" % (name, val) if type(val) in (int, long): desc += " (0x%x)" % (val,) print >> fp, "// @const %s|%s|%s" % (mod_name, name, desc) def main(fp, args): print >> fp, "// @doc" for arg in args: build_module(sys.stdout, arg) if __name__=='__main__': main(sys.stdout, sys.argv[1:]) |