Show More
@@ -59,21 +59,6 b' requirealias = {' | |||
|
59 | 59 | } |
|
60 | 60 | |
|
61 | 61 | |
|
62 | def usingabsolute(root): | |
|
63 | """Whether absolute imports are being used.""" | |
|
64 | if sys.version_info[0] >= 3: | |
|
65 | return True | |
|
66 | ||
|
67 | for node in ast.walk(root): | |
|
68 | if isinstance(node, ast.ImportFrom): | |
|
69 | if node.module == '__future__': | |
|
70 | for n in node.names: | |
|
71 | if n.name == 'absolute_import': | |
|
72 | return True | |
|
73 | ||
|
74 | return False | |
|
75 | ||
|
76 | ||
|
77 | 62 | def walklocal(root): |
|
78 | 63 | """Recursively yield all descendant nodes but not in a different scope""" |
|
79 | 64 | todo = collections.deque(ast.iter_child_nodes(root)) |
@@ -403,21 +388,10 b' def imported_modules(source, modulename,' | |||
|
403 | 388 | |
|
404 | 389 | |
|
405 | 390 | def verify_import_convention(module, source, localmods): |
|
406 | """Verify imports match our established coding convention. | |
|
407 | ||
|
408 | We have 2 conventions: legacy and modern. The modern convention is in | |
|
409 | effect when using absolute imports. | |
|
391 | """Verify imports match our established coding convention.""" | |
|
392 | root = ast.parse(source) | |
|
410 | 393 | |
|
411 | The legacy convention only looks for mixed imports. The modern convention | |
|
412 | is much more thorough. | |
|
413 | """ | |
|
414 | root = ast.parse(source) | |
|
415 | absolute = usingabsolute(root) | |
|
416 | ||
|
417 | if absolute: | |
|
418 | 394 |
|
|
419 | else: | |
|
420 | return verify_stdlib_on_own_line(root) | |
|
421 | 395 | |
|
422 | 396 | |
|
423 | 397 | def verify_modern_convention(module, root, localmods, root_col_offset=0): |
@@ -618,33 +592,6 b' def verify_modern_convention(module, roo' | |||
|
618 | 592 | ) |
|
619 | 593 | |
|
620 | 594 | |
|
621 | def verify_stdlib_on_own_line(root): | |
|
622 | """Given some python source, verify that stdlib imports are done | |
|
623 | in separate statements from relative local module imports. | |
|
624 | ||
|
625 | >>> list(verify_stdlib_on_own_line(ast.parse('import sys, foo'))) | |
|
626 | [('mixed imports\\n stdlib: sys\\n relative: foo', 1)] | |
|
627 | >>> list(verify_stdlib_on_own_line(ast.parse('import sys, os'))) | |
|
628 | [] | |
|
629 | >>> list(verify_stdlib_on_own_line(ast.parse('import foo, bar'))) | |
|
630 | [] | |
|
631 | """ | |
|
632 | for node in ast.walk(root): | |
|
633 | if isinstance(node, ast.Import): | |
|
634 | from_stdlib = {False: [], True: []} | |
|
635 | for n in node.names: | |
|
636 | from_stdlib[n.name in stdlib_modules].append(n.name) | |
|
637 | if from_stdlib[True] and from_stdlib[False]: | |
|
638 | yield ( | |
|
639 | 'mixed imports\n stdlib: %s\n relative: %s' | |
|
640 | % ( | |
|
641 | ', '.join(sorted(from_stdlib[True])), | |
|
642 | ', '.join(sorted(from_stdlib[False])), | |
|
643 | ), | |
|
644 | node.lineno, | |
|
645 | ) | |
|
646 | ||
|
647 | ||
|
648 | 595 | class CircularImport(Exception): |
|
649 | 596 | pass |
|
650 | 597 |
General Comments 0
You need to be logged in to leave comments.
Login now