# HG changeset patch # User Mads Kiilerich # Date 1391561031 -3600 # Node ID a05d31b040d7db2d159e49dc7a5d74b2646d5958 # Parent 54235a6ff98ad8eba02b975611d4df437e9c676d import-checker: show stdlib and relative imports separately Make the output more useful for debugging problems. diff -r 54235a6ff98a -r a05d31b040d7 contrib/import-checker.py --- 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 diff -r 54235a6ff98a -r a05d31b040d7 tests/test-module-imports.t --- 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