def find_dependencies(fn, verbose, process_pragmas,
ignore_unused=False,
warning_lambda=logging.warning,
debug_lambda=logging.debug):
"Returns a list of the files 'fn' depends on."
file_errors = []
ast, _ = parse_python_source(fn)
if ast is None:
return [], file_errors
found_imports = get_ast_imports(ast)
if found_imports is None:
return [], file_errors
# Filter out the unused imports if requested.
if ignore_unused:
found_imports, unused_imports = filter_unused_imports(ast, found_imports)
for modname, rname, lname, lineno, level, pragma in unused_imports:
file_errors.append((ERROR_UNUSED, lname))
output_code = (verbose >= 2)
source_lines = None
if output_code:
source_lines = open(fn, 'rU').read().splitlines()
files = []
assert not isdir(fn)
dn = dirname(fn)
seenset = set()
for x in found_imports:
mod, rname, lname, lineno, level, pragma = x
if process_pragmas and pragma == 'OPTIONAL':
if rname is None:
msg = WARNING_OPTIONAL % (lineno, mod)
else:
msg = '%s.%s' % (mod, rname)
logging.warning(msg)
continue
sig = (mod, rname)
if sig in seenset:
continue
seenset.add(sig)
modfile, errors = find_dotted_module(mod, rname, dn, level)
if errors:
file_errors.extend(errors)
for err, name in errors:
if err is ERROR_IMPORT:
efun = warning_lambda
else:
efun = debug_lambda
efun(err % (lineno, name))
if output_code:
efun(ERROR_SOURCE % source_lines[lineno-1].rstrip())
if modfile is None:
continue
files.append(realpath(modfile))
return files, file_errors
评论列表
文章目录