| # Checks related to the python code done with pylint |
| # |
| # Copyright (C) 2016 Intel Corporation |
| # |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| import base |
| from data import PatchTestInput |
| import pylint.epylint 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 PatchTestInput.repo.canbemerged: |
| self.skip('Patch cannot be merged, no reason to execute the test method') |
| 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_stdout, pylint_stderr) = lint.py_run(command_options = pythonpatch.path + self.pylint_options, return_std=True) |
| for line in pylint_stdout.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_stdout, pylint_stderr) = lint.py_run(command_options = path + self.pylint_options, return_std=True) |
| for line in pylint_stdout.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', |
| 'Correct the lines introduced by your patch', |
| data=[('Output', 'Please, fix the listed issues:'), ('', issue + ' ' + self.pylint_test[issue])]) |