import-checker: ignore nested imports
authorAugie Fackler <raf@durin42.com>
Sun, 17 Nov 2013 16:58:18 -0500
changeset 20037 957b43371928
parent 20036 e5d51fa51aba
child 20038 c65a6937b828
import-checker: ignore nested imports
contrib/import-checker.py
--- a/contrib/import-checker.py	Sun Nov 17 13:04:18 2013 -0500
+++ b/contrib/import-checker.py	Sun Nov 17 16:58:18 2013 -0500
@@ -71,15 +71,31 @@
 
 stdlib_modules = set(list_stdlib_modules())
 
-def imported_modules(source):
+def imported_modules(source, ignore_nested=False):
     """Given the source of a file as a string, yield the names
     imported by that file.
 
-    >>> list(imported_modules(
+    Args:
+      source: The python source to examine as a string.
+      ignore_nested: If true, import statements that do not start in
+                     column zero will be ignored.
+
+    Returns:
+      A list of module names imported by the given source.
+
+    >>> sorted(imported_modules(
     ...         'import foo ; from baz import bar; import foo.qux'))
-    ['foo', 'baz.bar', 'foo.qux']
+    ['baz.bar', 'foo', 'foo.qux']
+    >>> sorted(imported_modules(
+    ... '''import foo
+    ... def wat():
+    ...     import bar
+    ... ''', ignore_nested=True))
+    ['foo']
     """
     for node in ast.walk(ast.parse(source)):
+        if ignore_nested and getattr(node, 'col_offset', 0) > 0:
+            continue
         if isinstance(node, ast.Import):
             for n in node.names:
                 yield n.name
@@ -171,7 +187,8 @@
         f = open(source_path)
         modname = dotted_name_of_path(source_path)
         src = f.read()
-        used_imports[modname] = sorted(imported_modules(src))
+        used_imports[modname] = sorted(
+            imported_modules(src, ignore_nested=True))
         for error in verify_stdlib_on_own_line(src):
             any_errors = True
             print source_path, error