90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
|
import sys
|
||
|
import os
|
||
|
import argparse
|
||
|
from .modulegraph import ModuleGraph
|
||
|
|
||
|
|
||
|
def parse_arguments():
|
||
|
parser = argparse.ArgumentParser(
|
||
|
conflict_handler='resolve', prog='%s -mmodulegraph' % (
|
||
|
os.path.basename(sys.executable)))
|
||
|
parser.add_argument(
|
||
|
'-d', action='count', dest='debug', default=1,
|
||
|
help='Increase debug level')
|
||
|
parser.add_argument(
|
||
|
'-q', action='store_const', dest='debug', const=0,
|
||
|
help='Clear debug level')
|
||
|
parser.add_argument(
|
||
|
'-m', '--modules', action='store_true',
|
||
|
dest='domods', default=False,
|
||
|
help='arguments are module names, not script files')
|
||
|
parser.add_argument(
|
||
|
'-x', metavar='NAME', action='append', dest='excludes',
|
||
|
default=[], help='Add NAME to the excludes list')
|
||
|
parser.add_argument(
|
||
|
'-p', action='append', metavar='PATH', dest='addpath', default=[],
|
||
|
help='Add PATH to the module search path')
|
||
|
parser.add_argument(
|
||
|
'-g', '--dot', action='store_const', dest='output', const='dot',
|
||
|
help='Output a .dot graph')
|
||
|
parser.add_argument(
|
||
|
'-h', '--html', action='store_const',
|
||
|
dest='output', const='html', help='Output a HTML file')
|
||
|
parser.add_argument(
|
||
|
'scripts', metavar='SCRIPT', nargs='+', help='scripts to analyse')
|
||
|
|
||
|
opts = parser.parse_args()
|
||
|
return opts
|
||
|
|
||
|
|
||
|
def create_graph(scripts, domods, debuglevel, excludes, path_extras):
|
||
|
# Set the path based on sys.path and the script directory
|
||
|
path = sys.path[:]
|
||
|
|
||
|
if domods:
|
||
|
del path[0]
|
||
|
else:
|
||
|
path[0] = os.path.dirname(scripts[0])
|
||
|
|
||
|
path = path_extras + path
|
||
|
if debuglevel > 1:
|
||
|
print("path:", file=sys.stderr)
|
||
|
for item in path:
|
||
|
print(" ", repr(item), file=sys.stderr)
|
||
|
|
||
|
# Create the module finder and turn its crank
|
||
|
mf = ModuleGraph(path, excludes=excludes, debug=debuglevel)
|
||
|
for arg in scripts:
|
||
|
if domods:
|
||
|
if arg[-2:] == '.*':
|
||
|
mf.import_hook(arg[:-2], None, ["*"])
|
||
|
else:
|
||
|
mf.import_hook(arg)
|
||
|
else:
|
||
|
mf.add_script(arg)
|
||
|
return mf
|
||
|
|
||
|
|
||
|
def output_graph(output_format, mf):
|
||
|
if output_format == 'dot':
|
||
|
mf.graphreport()
|
||
|
elif output_format == 'html':
|
||
|
mf.create_xref()
|
||
|
else:
|
||
|
mf.report()
|
||
|
|
||
|
|
||
|
def main():
|
||
|
opts = parse_arguments()
|
||
|
mf = create_graph(
|
||
|
opts.scripts, opts.domods, opts.debug,
|
||
|
opts.excludes, opts.addpath)
|
||
|
output_graph(opts.output, mf)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__': # pragma: no cover
|
||
|
try:
|
||
|
main()
|
||
|
except KeyboardInterrupt:
|
||
|
print("\n[interrupt]")
|