import-checker: show stdlib and relative imports separately
Make the output more useful for debugging problems.
--- a/contrib/import-checker.py Wed Feb 05 01:41:36 2014 +0100
+++ b/contrib/import-checker.py Wed Feb 05 01:43:51 2014 +0100
@@ -139,7 +139,7 @@
http://bugs.python.org/issue19510.
>>> list(verify_stdlib_on_own_line('import sys, foo'))
- ['mixed stdlib and relative imports:\\n foo, sys']
+ ['mixed imports\\n stdlib: sys\\n relative: foo']
>>> list(verify_stdlib_on_own_line('import sys, os'))
[]
>>> list(verify_stdlib_on_own_line('import foo, bar'))
@@ -147,13 +147,13 @@
"""
for node in ast.walk(ast.parse(source)):
if isinstance(node, ast.Import):
- from_stdlib = {}
+ from_stdlib = {False: [], True: []}
for n in node.names:
- from_stdlib[n.name] = n.name in stdlib_modules
- num_std = len([x for x in from_stdlib.values() if x])
- if num_std not in (len(from_stdlib.values()), 0):
- yield ('mixed stdlib and relative imports:\n %s' %
- ', '.join(sorted(from_stdlib.iterkeys())))
+ from_stdlib[n.name in stdlib_modules].append(n.name)
+ if from_stdlib[True] and from_stdlib[False]:
+ yield ('mixed imports\n stdlib: %s\n relative: %s' %
+ (', '.join(sorted(from_stdlib[True])),
+ ', '.join(sorted(from_stdlib[False]))))
class CircularImport(Exception):
pass
--- a/tests/test-module-imports.t Wed Feb 05 01:41:36 2014 +0100
+++ b/tests/test-module-imports.t Wed Feb 05 01:43:51 2014 +0100
@@ -23,16 +23,21 @@
these may expose other cycles.
$ hg locate 'mercurial/**.py' | xargs python "$import_checker"
- mercurial/dispatch.py mixed stdlib and relative imports:
- commands, error, extensions, fancyopts, hg, hook, util
- mercurial/fileset.py mixed stdlib and relative imports:
- error, merge, parser, util
- mercurial/revset.py mixed stdlib and relative imports:
- discovery, error, hbisect, parser, phases, util
- mercurial/templater.py mixed stdlib and relative imports:
- config, error, parser, templatefilters, util
- mercurial/ui.py mixed stdlib and relative imports:
- config, error, formatter, scmutil, util
+ mercurial/dispatch.py mixed imports
+ stdlib: commands
+ relative: error, extensions, fancyopts, hg, hook, util
+ mercurial/fileset.py mixed imports
+ stdlib: parser
+ relative: error, merge, util
+ mercurial/revset.py mixed imports
+ stdlib: parser
+ relative: discovery, error, hbisect, phases, util
+ mercurial/templater.py mixed imports
+ stdlib: parser
+ relative: config, error, templatefilters, util
+ mercurial/ui.py mixed imports
+ stdlib: formatter
+ relative: config, error, scmutil, util
Import cycle: mercurial.cmdutil -> mercurial.subrepo -> mercurial.cmdutil
Import cycle: mercurial.repoview -> mercurial.revset -> mercurial.repoview
Import cycle: mercurial.fileset -> mercurial.merge -> mercurial.subrepo -> mercurial.match -> mercurial.fileset