summaryrefslogtreecommitdiffstats
path: root/meta/lib/patchtest/tests/test_python_pylint.py
blob: 304b2d5ee9aaf5a76b08122b82f2bcf0616510f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Checks related to the python code done with pylint
#
# Copyright (C) 2016 Intel Corporation
#
# SPDX-License-Identifier: GPL-2.0-only

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 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. Please check your code with a linter and resubmit',
                           data=[('Output', 'Please, fix the listed issues:'), ('', issue + ' ' + self.pylint_test[issue])])