mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-11 00:31:56 -06:00
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:
parent
88353edcb1
commit
7e0d4531c3
@ -29,6 +29,7 @@
|
||||
|
||||
# for selftesting
|
||||
try:
|
||||
#pylint: disable=F0401
|
||||
import fintl
|
||||
_ = fintl.gettext
|
||||
except ImportError:
|
||||
|
@ -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
|
||||
|
77
make-lint
77
make-lint
@ -25,15 +25,20 @@ import sys
|
||||
from optparse import OptionParser
|
||||
from fnmatch import fnmatch, fnmatchcase
|
||||
|
||||
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
|
||||
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:
|
||||
|
Loading…
Reference in New Issue
Block a user