425 def __checkPrintStatements(self): |
426 def __checkPrintStatements(self): |
426 """ |
427 """ |
427 Private method to check for print statements. |
428 Private method to check for print statements. |
428 """ |
429 """ |
429 for node in ast.walk(self.__tree): |
430 for node in ast.walk(self.__tree): |
430 if (isinstance(node, ast.Call) and |
431 if ( |
431 getattr(node.func, 'id', None) == 'print') or \ |
432 (isinstance(node, ast.Call) and |
432 (hasattr(ast, 'Print') and isinstance(node, ast.Print)): |
433 getattr(node.func, 'id', None) == 'print') or |
|
434 (hasattr(ast, 'Print') and isinstance(node, ast.Print)) |
|
435 ): |
433 self.__error(node.lineno - 1, node.col_offset, "M801") |
436 self.__error(node.lineno - 1, node.col_offset, "M801") |
434 |
437 |
435 def __checkTuple(self): |
438 def __checkTuple(self): |
436 """ |
439 """ |
437 Private method to check for one element tuples. |
440 Private method to check for one element tuples. |
438 """ |
441 """ |
439 for node in ast.walk(self.__tree): |
442 for node in ast.walk(self.__tree): |
440 if isinstance(node, ast.Tuple) and \ |
443 if ( |
441 len(node.elts) == 1: |
444 isinstance(node, ast.Tuple) and |
|
445 len(node.elts) == 1 |
|
446 ): |
442 self.__error(node.lineno - 1, node.col_offset, "M811") |
447 self.__error(node.lineno - 1, node.col_offset, "M811") |
443 |
448 |
444 def __checkFuture(self): |
449 def __checkFuture(self): |
445 """ |
450 """ |
446 Private method to check the __future__ imports. |
451 Private method to check the __future__ imports. |
648 |
653 |
649 for node in ast.walk(self.__tree): |
654 for node in ast.walk(self.__tree): |
650 if isinstance(node, ast.Assign): |
655 if isinstance(node, ast.Assign): |
651 # assign statement |
656 # assign statement |
652 for element in node.targets: |
657 for element in node.targets: |
653 if isinstance(element, ast.Name) and \ |
658 if ( |
654 element.id in self.__builtins: |
659 isinstance(element, ast.Name) and |
|
660 element.id in self.__builtins |
|
661 ): |
655 value = node.value |
662 value = node.value |
656 if isinstance(value, ast.Name) and \ |
663 if ( |
657 element.id in ignoreBuiltinAssignments and \ |
664 isinstance(value, ast.Name) and |
658 value.id in ignoreBuiltinAssignments[element.id]: |
665 element.id in ignoreBuiltinAssignments and |
|
666 value.id in ignoreBuiltinAssignments[element.id] |
|
667 ): |
659 # ignore compatibility assignments |
668 # ignore compatibility assignments |
660 continue |
669 continue |
661 self.__error(element.lineno - 1, element.col_offset, |
670 self.__error(element.lineno - 1, element.col_offset, |
662 "M131", element.id) |
671 "M131", element.id) |
663 elif isinstance(element, (ast.Tuple, ast.List)): |
672 elif isinstance(element, (ast.Tuple, ast.List)): |
664 for tupleElement in element.elts: |
673 for tupleElement in element.elts: |
665 if isinstance(tupleElement, ast.Name) and \ |
674 if ( |
666 tupleElement.id in self.__builtins: |
675 isinstance(tupleElement, ast.Name) and |
|
676 tupleElement.id in self.__builtins |
|
677 ): |
667 self.__error(tupleElement.lineno - 1, |
678 self.__error(tupleElement.lineno - 1, |
668 tupleElement.col_offset, |
679 tupleElement.col_offset, |
669 "M131", tupleElement.id) |
680 "M131", tupleElement.id) |
670 elif isinstance(node, ast.For): |
681 elif isinstance(node, ast.For): |
671 # for loop |
682 # for loop |
672 target = node.target |
683 target = node.target |
673 if isinstance(target, ast.Name) and \ |
684 if ( |
674 target.id in self.__builtins: |
685 isinstance(target, ast.Name) and |
|
686 target.id in self.__builtins |
|
687 ): |
675 self.__error(target.lineno - 1, target.col_offset, |
688 self.__error(target.lineno - 1, target.col_offset, |
676 "M131", target.id) |
689 "M131", target.id) |
677 elif isinstance(target, (ast.Tuple, ast.List)): |
690 elif isinstance(target, (ast.Tuple, ast.List)): |
678 for element in target.elts: |
691 for element in target.elts: |
679 if isinstance(element, ast.Name) and \ |
692 if ( |
680 element.id in self.__builtins: |
693 isinstance(element, ast.Name) and |
|
694 element.id in self.__builtins |
|
695 ): |
681 self.__error(element.lineno - 1, |
696 self.__error(element.lineno - 1, |
682 element.col_offset, |
697 element.col_offset, |
683 "M131", element.id) |
698 "M131", element.id) |
684 elif any(isinstance(node, functionDef) |
699 elif any(isinstance(node, functionDef) |
685 for functionDef in functionDefs): |
700 for functionDef in functionDefs): |
686 # (asynchronous) function definition |
701 # (asynchronous) function definition |
687 if sys.version_info >= (3, 0): |
702 if sys.version_info >= (3, 0): |
688 for arg in node.args.args: |
703 for arg in node.args.args: |
689 if isinstance(arg, ast.arg) and \ |
704 if ( |
690 arg.arg in self.__builtins: |
705 isinstance(arg, ast.arg) and |
|
706 arg.arg in self.__builtins |
|
707 ): |
691 self.__error(arg.lineno - 1, arg.col_offset, |
708 self.__error(arg.lineno - 1, arg.col_offset, |
692 "M132", arg.arg) |
709 "M132", arg.arg) |
693 else: |
710 else: |
694 for arg in node.args.args: |
711 for arg in node.args.args: |
695 if isinstance(arg, ast.Name) and \ |
712 if ( |
696 arg.id in self.__builtins: |
713 isinstance(arg, ast.Name) and |
|
714 arg.id in self.__builtins |
|
715 ): |
697 self.__error(arg.lineno - 1, arg.col_offset, |
716 self.__error(arg.lineno - 1, arg.col_offset, |
698 "M132", arg.id) |
717 "M132", arg.id) |
699 |
718 |
700 def __checkComprehensions(self): |
719 def __checkComprehensions(self): |
701 """ |
720 """ |
1403 callPath = list(composeCallPath(node)) |
1430 callPath = list(composeCallPath(node)) |
1404 |
1431 |
1405 if '.'.join(callPath) == 'sys.maxint' and sys.version_info >= (3, 0): |
1432 if '.'.join(callPath) == 'sys.maxint' and sys.version_info >= (3, 0): |
1406 self.violations.append((node, "M504")) |
1433 self.violations.append((node, "M504")) |
1407 |
1434 |
1408 elif len(callPath) == 2 and callPath[1] == 'message' and \ |
1435 elif ( |
1409 sys.version_info >= (2, 6): |
1436 len(callPath) == 2 and |
|
1437 callPath[1] == 'message' and |
|
1438 sys.version_info >= (2, 6) |
|
1439 ): |
1410 name = callPath[0] |
1440 name = callPath[0] |
1411 for elem in reversed(self.__nodeStack[:-1]): |
1441 for elem in reversed(self.__nodeStack[:-1]): |
1412 if isinstance(elem, ast.ExceptHandler) and elem.name == name: |
1442 if isinstance(elem, ast.ExceptHandler) and elem.name == name: |
1413 self.violations.append((node, "M505")) |
1443 self.violations.append((node, "M505")) |
1414 break |
1444 break |
1427 if '__metaclass__' in assignTargets and sys.version_info >= (3, 0): |
1457 if '__metaclass__' in assignTargets and sys.version_info >= (3, 0): |
1428 self.violations.append((node, "M524")) |
1458 self.violations.append((node, "M524")) |
1429 |
1459 |
1430 elif len(node.targets) == 1: |
1460 elif len(node.targets) == 1: |
1431 target = node.targets[0] |
1461 target = node.targets[0] |
1432 if isinstance(target, ast.Attribute) and \ |
1462 if ( |
1433 isinstance(target.value, ast.Name): |
1463 isinstance(target, ast.Attribute) and |
|
1464 isinstance(target.value, ast.Name) |
|
1465 ): |
1434 if (target.value.id, target.attr) == ('os', 'environ'): |
1466 if (target.value.id, target.attr) == ('os', 'environ'): |
1435 self.violations.append((node, "M506")) |
1467 self.violations.append((node, "M506")) |
1436 |
1468 |
1437 self.generic_visit(node) |
1469 self.generic_visit(node) |
1438 |
1470 |