55 lines
1.8 KiB
Python
55 lines
1.8 KiB
Python
import os
|
|
import botocore
|
|
import ast
|
|
|
|
|
|
ROOTDIR = os.path.dirname(botocore.__file__)
|
|
|
|
|
|
def test_no_bare_six_imports():
|
|
for rootdir, dirnames, filenames in os.walk(ROOTDIR):
|
|
if 'vendored' in dirnames:
|
|
# We don't need to lint our vendored packages.
|
|
dirnames.remove('vendored')
|
|
for filename in filenames:
|
|
if not filename.endswith('.py'):
|
|
continue
|
|
fullname = os.path.join(rootdir, filename)
|
|
yield _assert_no_bare_six_imports, fullname
|
|
|
|
|
|
def _assert_no_bare_six_imports(filename):
|
|
with open(filename) as f:
|
|
contents = f.read()
|
|
parsed = ast.parse(contents, filename)
|
|
checker = SixImportChecker(filename).visit(parsed)
|
|
|
|
|
|
class SixImportChecker(ast.NodeVisitor):
|
|
def __init__(self, filename):
|
|
self.filename = filename
|
|
|
|
def visit_Import(self, node):
|
|
for alias in node.names:
|
|
if getattr(alias, 'name', '') == 'six':
|
|
line = self._get_line_content(self.filename, node.lineno)
|
|
raise AssertionError(
|
|
"A bare 'import six' was found in %s:\n"
|
|
"\n%s: %s\n"
|
|
"Please use 'from botocore.compat import six' instead" %
|
|
(self.filename, node.lineno, line))
|
|
|
|
def visit_ImportFrom(self, node):
|
|
if node.module == 'six':
|
|
line = self._get_line_content(self.filename, node.lineno)
|
|
raise AssertionError(
|
|
"A bare 'from six import ...' was found in %s:\n"
|
|
"\n%s:%s\n"
|
|
"Please use 'from botocore.compat import six' instead" %
|
|
(self.filename, node.lineno, line))
|
|
|
|
def _get_line_content(self, filename, lineno):
|
|
with open(filename) as f:
|
|
contents = f.readlines()
|
|
return contents[lineno - 1]
|