blob: 48ef1475c6f9befbd5a348f99854a2ed40d99efe [file] [log] [blame]
from __future__ import print_function
import argparse
import os
import sys
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.run_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]")