#!/usr/bin/env python import sys import os from twisted.python import reflect from twisted.internet import reactor # epydoc import epydoc from epydoc.cli import cli if epydoc.__version__[0] == '2': # Fix support for epydoc 2.x. Unneeded for 3.x class FakeModule: def __init__(self, name, level): self.__level = level self.__name__ = name def __repr__(self): return '<Fake %s>' % self.__name__ __str__ = __repr__ def __nonzero__(self): return 1 def __call__(self, *args, **kw): pass #print 'Called:', args def __getattr__(self, attr): if self.__level == 0: raise AttributeError return FakeModule(self.__name__+'.'+attr, self.__level-1) def __cmp__(self, other): if not hasattr(other, '___name__'): return -1 return cmp(self.__name__, other.__name__) def fakeOut(modname): modpath = modname.split('.') prevmod = None for m in range(len(modpath)): mp = '.'.join(modpath[:m+1]) nm = FakeModule(mp, 4) if prevmod: setattr(prevmod, modpath[m], nm) sys.modules[mp] = nm prevmod = nm #fakeOut("twisted") # HACK: Another "only doc what we tell you". We don't want epydoc to # automatically recurse into subdirectories: "twisted"'s presence was # causing "twisted/test" to be docced, even thought we explicitly # didn't put any twisted/test in our modnames. from epydoc import imports orig_find_modules = imports.find_modules import re def find_modules(dirname): if not os.path.isdir(dirname): return [] found_init = 0 modules = {} dirs = [] # Search for directories & modules, and check for __init__.py. # Don't include duplicates (like foo.py and foo.pyc), and give # precedance to the .py files. for file in os.listdir(dirname): filepath = os.path.join(dirname, file) if os.path.isdir(filepath): dirs.append(filepath) elif not re.match(r'\w+.py.?', file): continue # Ignore things like ".#foo.py" or "a-b.py" elif file[-3:] == '.py': modules[file] = os.path.join(dirname, file) if file == '__init__.py': found_init = 1 elif file[-4:-1] == '.py': modules.setdefault(file[:-1], file) if file[:-1] == '__init__.py': found_init = 1 modules = modules.values() # If there was no __init__.py, then this isn't a package # directory; return nothing. if not found_init: return [] # Recurse to the child directories. # **twisted** here's the change: commented next line out #for d in dirs: modules += find_modules(d) return modules imports.find_modules = find_modules # Now, set up the list of modules for epydoc to document modnames = [] def addMod(arg, path, files): for fn in files: file = os.path.join(path, fn).replace('%s__init__'%os.sep, '') if file[-3:] == '.py' and not file.count('%stest%s' % (os.sep,os.sep)): modName = file[:-3].replace(os.sep,'.') try: #print 'pre-loading', modName reflect.namedModule(modName) except ImportError, e: print 'import error:', modName, e except Exception, e: print 'other error:', modName, e else: modnames.append(modName) def main(): document_all = True # are we doing a full build? names = ['buildbot/'] #default, may be overriden below #get list of modules/pkgs on cmd-line try: i = sys.argv.index("--modules") except: pass else: names = sys.argv[i+1:] document_all = False sys.argv[i:] = [] #sanity check on names for i in range(len(names)): try: j = names[i].rindex('buildbot/') except: raise SystemExit, 'You can only specify buildbot modules or packages' else: #strip off any leading directories before the 'twisted/' #dir. this makes it easy to specify full paths, such as #from TwistedEmacs names[i] = names[i][j:] old_out_dir = "html" #if -o was specified, we need to change it to point to a tmp dir #otherwise add our own -o option try: i = sys.argv.index('-o') old_out_dir = sys.argv[i+1] try: os.mkdir(tmp_dir) except OSError: pass sys.argv[i+1] = tmp_dir except ValueError: sys.argv[1:1] = ['-o', tmp_dir] osrv = sys.argv sys.argv=["IGNORE"] for name in names: if name.endswith(".py"): # turn it in to a python module name name = name[:-3].replace(os.sep, ".") try: reflect.namedModule(name) except ImportError: print 'import error:', name except: print 'other error:', name else: modnames.append(name) else: #assume it's a dir os.path.walk(name, addMod, None) sys.argv = osrv if 'buildbot.test' in modnames: modnames.remove('buildbot.test') ##if 'twisted' in modnames: ## modnames.remove('twisted') sys.argv.extend(modnames) import buildbot sys.argv[1:1] = [ '-n', 'BuildBot %s' % buildbot.version, '-u', 'http://buildbot.sourceforge.net/', '--no-private'] # Make it easy to profile epyrun if 0: import profile profile.run('cli()', 'epyrun.prof') else: cli() print 'Done!' if __name__ == '__main__': main()