[PATCH 2 of 5] import-checker: establish new function for verifying import conventions

Gregory Szorc gregory.szorc at gmail.com
Sun Jun 28 14:49:40 CDT 2015


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1435519728 25200
#      Sun Jun 28 12:28:48 2015 -0700
# Node ID e2b71702d2baf1218c791d2ff5718b6c44abc7f4
# Parent  772bfce29007817eb4422e6aa085afe3836adf5c
import-checker: establish new function for verifying import conventions

A future patch will formalize the modern import convention. In
preparation for that, introduce a new wrapper function that will invoke
the proper function.

diff --git a/contrib/import-checker.py b/contrib/import-checker.py
--- a/contrib/import-checker.py
+++ b/contrib/import-checker.py
@@ -271,24 +271,30 @@ def imported_modules(source, modulename,
                     # this should be a function or a property of "node.module"
                     continue
                 yield found[1]
 
-def verify_stdlib_on_own_line(source):
+def verify_import_convention(module, source):
+    """Verify imports match our established coding convention."""
+    root = ast.parse(source)
+
+    return verify_stdlib_on_own_line(root)
+
+def verify_stdlib_on_own_line(root):
     """Given some python source, verify that stdlib imports are done
     in separate statements from relative local module imports.
 
     Observing this limitation is important as it works around an
     annoying lib2to3 bug in relative import rewrites:
     http://bugs.python.org/issue19510.
 
-    >>> list(verify_stdlib_on_own_line('import sys, foo'))
+    >>> list(verify_stdlib_on_own_line(ast.parse('import sys, foo')))
     ['mixed imports\\n   stdlib:    sys\\n   relative:  foo']
-    >>> list(verify_stdlib_on_own_line('import sys, os'))
+    >>> list(verify_stdlib_on_own_line(ast.parse('import sys, os')))
     []
-    >>> list(verify_stdlib_on_own_line('import foo, bar'))
+    >>> list(verify_stdlib_on_own_line(ast.parse('import foo, bar')))
     []
     """
-    for node in ast.walk(ast.parse(source)):
+    for node in ast.walk(root):
         if isinstance(node, ast.Import):
             from_stdlib = {False: [], True: []}
             for n in node.names:
                 from_stdlib[n.name in stdlib_modules].append(n.name)
@@ -366,9 +372,9 @@ def main(argv):
         f = open(source_path)
         src = f.read()
         used_imports[modname] = sorted(
             imported_modules(src, modname, localmods, ignore_nested=True))
-        for error in verify_stdlib_on_own_line(src):
+        for error in verify_import_convention(modname, src):
             any_errors = True
             print source_path, error
         f.close()
     cycles = find_cycles(used_imports)


More information about the Mercurial-devel mailing list