From patchwork Mon Jan 20 00:32:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1,of,8] import-checker: show stdlib and relative imports separately From: Mads Kiilerich X-Patchwork-Id: 3387 Message-Id: <3a963f886a2374b0221c.1390177945@localhost.localdomain> To: mercurial-devel@selenic.com Date: Mon, 20 Jan 2014 01:32:25 +0100 # HG changeset patch # User Mads Kiilerich # Date 1390177794 -3600 # Mon Jan 20 01:29:54 2014 +0100 # Node ID 3a963f886a2374b0221c73cdcba4e4bac2981852 # Parent 4988e42465370f1458b2ddd9bf2760f3f881b3ce import-checker: show stdlib and relative imports separately Make it more clear what is what so the problem can be investigated. diff --git a/contrib/import-checker.py b/contrib/import-checker.py --- a/contrib/import-checker.py +++ b/contrib/import-checker.py @@ -136,7 +136,7 @@ def verify_stdlib_on_own_line(source): 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')) @@ -144,13 +144,13 @@ def verify_stdlib_on_own_line(source): """ 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 --git a/tests/test-module-imports.t b/tests/test-module-imports.t --- a/tests/test-module-imports.t +++ b/tests/test-module-imports.t @@ -23,16 +23,21 @@ hidden by deduplication algorithm in the 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