| # Checks related to the python code done with pylint |
| # |
| # Copyright (C) 2016 Intel Corporation |
| # |
| # SPDX-License-Identifier: GPL-2.0-only |
| |
| import base |
| from io import StringIO |
| from data import PatchTestInput |
| from pylint.reporters.text import TextReporter |
| import pylint.lint as lint |
| |
| |
| class PyLint(base.Base): |
| pythonpatches = [] |
| pylint_pretest = {} |
| pylint_test = {} |
| pylint_options = " -E --disable='E0611, E1101, F0401, E0602' --msg-template='L:{line} F:{module} I:{msg}'" |
| |
| @classmethod |
| def setUpClassLocal(cls): |
| # get just those patches touching python files |
| cls.pythonpatches = [] |
| for patch in cls.patchset: |
| if patch.path.endswith('.py'): |
| if not patch.is_removed_file: |
| cls.pythonpatches.append(patch) |
| |
| def setUp(self): |
| if self.unidiff_parse_error: |
| self.skip('Python-unidiff parse error') |
| if not PyLint.pythonpatches: |
| self.skip('No python related patches, skipping test') |
| |
| def pretest_pylint(self): |
| for pythonpatch in self.pythonpatches: |
| if pythonpatch.is_modified_file: |
| pylint_output = StringIO() |
| reporter = TextReporter(pylint_output) |
| lint.Run([self.pylint_options, pythonpatch.path], reporter=reporter, exit=False) |
| for line in pylint_output.readlines(): |
| if not '*' in line: |
| if line.strip(): |
| self.pylint_pretest[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1] |
| |
| def test_pylint(self): |
| for pythonpatch in self.pythonpatches: |
| # a condition checking whether a file is renamed or not |
| # unidiff doesn't support this yet |
| if pythonpatch.target_file is not pythonpatch.path: |
| path = pythonpatch.target_file[2:] |
| else: |
| path = pythonpatch.path |
| pylint_output = StringIO() |
| reporter = TextReporter(pylint_output) |
| lint.Run([self.pylint_options, pythonpatch.path], reporter=reporter, exit=False) |
| for line in pylint_output.readlines(): |
| if not '*' in line: |
| if line.strip(): |
| self.pylint_test[line.strip().split(' ',1)[0]] = line.strip().split(' ',1)[1] |
| |
| for issue in self.pylint_test: |
| if self.pylint_test[issue] not in self.pylint_pretest.values(): |
| self.fail('Errors in your Python code were encountered. Please check your code with a linter and resubmit', |
| data=[('Output', 'Please, fix the listed issues:'), ('', issue + ' ' + self.pylint_test[issue])]) |