Several improvements of the lint script.

Report missing python packages, inform about false positives, fail
gracefully if pylint isn't installed. Fixed a bug in the ignore
list and added few more files/directories to it.

ticket 1184
This commit is contained in:
Jan Cholasta authored and Martin Kosek committed 2011-05-05 11:54:07 +02:00
1 parent 88353edcb1
commit 7e0d4531c3
3 files changed
+59 -10

No files matched your search

+1
View File
@@ -29,6 +29,7 @@
# for selftesting
try:
#pylint: disable=F0401
import fintl
_ = fintl.gettext
except ImportError:
+1
View File
@@ -33,6 +33,7 @@ import termios
import struct
import base64
try:
#pylint: disable=F0401
import default_encoding_utf8
except ImportError:
# This is a chicken-and-egg problem. The api can't be imported unless
+57 -10
View File
@@ -25,15 +25,20 @@ import sys
from optparse import OptionParser
from fnmatch import fnmatch, fnmatchcase
try:
from pylint import checkers
from pylint.lint import PyLinter
from pylint.reporters.text import ParseableTextReporter
from pylint.checkers.typecheck import TypeChecker
from logilab.astng import Class, Instance, InferenceError
except ImportError:
print >> sys.stderr, "To use {0}, please install pylint.".format(sys.argv[0])
sys.exit(32)
# File names to ignore when searching for python source files
IGNORE_FILES = ('.*', '*~', '*.in', '*.pyc', '*.pyo')
IGNORE_PATHS = ('build', 'tests')
IGNORE_PATHS = ('build', 'dist', 'install/po/test_i18n.py', 'lite-server.py',
'make-lint', 'make-test', 'tests')
class IPATypeChecker(TypeChecker):
# 'class': ('generated', 'properties',)
@@ -82,11 +87,11 @@ class IPATypeChecker(TypeChecker):
def visit_getattr(self, node):
try:
infered = list(node.expr.infer())
inferred = list(node.expr.infer())
except InferenceError:
return
inferred = []
for owner in infered:
for owner in inferred:
if not isinstance(owner, Class) and not isinstance(owner, Instance):
continue
@@ -100,16 +105,27 @@ class IPATypeChecker(TypeChecker):
class IPALinter(PyLinter):
ignore = (TypeChecker,)
def __init__(self):
super(IPALinter, self).__init__()
self.missing = set()
def register_checker(self, checker):
if type(checker) in self.ignore:
return
super(IPALinter, self).register_checker(checker)
def find_files(path, basepath):
for pattern in IGNORE_PATHS:
if path == os.path.join(basepath, pattern):
return []
def add_message(self, msg_id, line=None, node=None, args=None):
if line is None and node is not None:
line = node.fromlineno
# Record missing packages
if msg_id == 'F0401' and self.is_message_enabled(msg_id, line):
self.missing.add(args)
super(IPALinter, self).add_message(msg_id, line, node, args)
def find_files(path, basepath):
entries = os.listdir(path)
# If this directory is a python package, look no further
@@ -118,14 +134,22 @@ def find_files(path, basepath):
result = []
for filename in entries:
filepath = os.path.join(path, filename)
for pattern in IGNORE_FILES:
if fnmatch(filename, pattern):
filename = None
break
if not filename:
if filename is None:
continue
filepath = os.path.join(path, filename)
for pattern in IGNORE_PATHS:
patpath = os.path.join(basepath, pattern).replace(os.sep, '/')
if filepath == patpath:
filename = None
break
if filename is None:
continue
if os.path.islink(filepath):
continue
@@ -177,12 +201,35 @@ def main():
if options.errors_only:
linter.disable_noerror_messages()
linter.enable('F')
linter.set_reporter(ParseableTextReporter())
linter.set_option('include-ids', True)
linter.set_option('reports', False)
linter.set_option('persistent', False)
linter.check(files)
if linter.msg_status != 0:
print >> sys.stderr, """
===============================================================================
Errors were found during the static code check.
"""
if len(linter.missing) > 0:
print >> sys.stderr, "There are some missing imports:"
for mod in sorted(linter.missing):
print >> sys.stderr, " " + mod
print >> sys.stderr, """
Please make sure all of the required and optional (python-krbV, python-rhsm)
python packages are installed.
"""
print >> sys.stderr, """\
If you are certain that any of the reported errors are false positives, please
mark them in the source code according to the pylint documentation.
===============================================================================
"""
if options.fail:
return linter.msg_status
else: