#!/usr/bin/env python # pydiction.py 0.5 """ pydiction creats a dictionary of Python module attributes for vim's completion feature. Usage: pydiction.py [-v] (Note: If you're getting import errors try importing the Package's main module below in this file) Example: The following will append all the time and math modules' attributes to the file "pydiction" with and without the "time." and "math." prefix: $python pydiction.py time math To print the output to stdout, supply the -v option (This won't append to the pydiction file): $python pydiction.py -v time math """ __author__ = 'Ryan (gt3) Kulla ' __version__ = '0.5' import os import sys import types def main_loop(write_to): sub_mods = [] for mod_name in sys.argv[1:]: sub_mods = mod_lookup(mod_name, sub_mods, write_to) # process current mod_name's submodules for mod_name in sub_mods: sub_mods = mod_lookup(mod_name, sub_mods, write_to, False) def mod_lookup(mod_name, sub_mods, write_to, dig=True): prefix_on = {True:"%s.%s(", False:"%s.%s"} prefix_off = {True:"%s(", False:"%s"} try: exec "import %s" % mod_name except ImportError, err_msg: if sub_mods != []: # sub_mod isn't an importable module sub_mods.remove(mod_name) else: sys.stderr.write("ImportError: %s\n" % err_msg) sys.exit() mod_contents = dir(eval(mod_name)) write_to.write('\n-- %(x)s module with "%(x)s." prefix --\n' % {'x': mod_name}) for attr in mod_contents: if callable(getattr(eval(mod_name), attr)): write_to.write(prefix_on[True] % (mod_name, attr) + '\n') else: write_to.write(prefix_on[False] % (mod_name, attr) + '\n') if dig is True: # dig for submodules if type(getattr(eval(mod_name), attr)) is types.ModuleType: sub_mods.append(mod_name + '.' + attr) write_to.write('\n-- %(x)s module without "%(x)s." prefix --\n' % {'x': mod_name}) for attr in mod_contents: if callable(getattr(eval(mod_name), attr)): write_to.write(prefix_off[True] % attr + '\n') else: write_to.write(prefix_off[False] % attr + '\n') return sub_mods if __name__ == '__main__': if sys.version_info[0:2] < (2, 3): sys.stderr.write("Please upgrade to Python 2.3 or greater\n") sys.exit() if len(sys.argv) <= 1: sys.stderr.write("%s requires at least one argument\n" % sys.argv[0]) sys.exit() if "-v" in sys.argv: write_to = sys.stdout sys.argv.remove("-v") else: if os.path.exists("pydiction"): print "Appending to pydiction file.." else: print "Creating and writing to pydiction file.." write_to = open("pydiction", "a") main_loop(write_to)