1
|
|
|
from io import StringIO |
2
|
|
|
from csv import DictReader |
3
|
|
|
|
4
|
|
|
from coalib.bearlib.abstractions.Lint import Lint |
5
|
|
|
from coalib.bears.LocalBear import LocalBear |
6
|
|
|
from coalib.results.RESULT_SEVERITY import RESULT_SEVERITY |
7
|
|
|
from coalib.results.Result import Result |
8
|
|
|
|
9
|
|
|
|
10
|
|
|
def convert_if_not_empty(value: str, conversion): |
11
|
|
|
""" |
12
|
|
|
Returns the value converted if it is not None or empty. |
13
|
|
|
|
14
|
|
|
:param value: The value to convert. |
15
|
|
|
:param conversion: The conversion callable. |
16
|
|
|
:return: None or the converted value. |
17
|
|
|
""" |
18
|
|
|
if value is not None and value != '': |
19
|
|
|
return conversion(value) |
20
|
|
|
|
21
|
|
|
return None |
22
|
|
|
|
23
|
|
|
|
24
|
|
|
class CoffeeLintBear(LocalBear, Lint): |
25
|
|
|
executable = 'coffeelint' |
26
|
|
|
arguments = '--reporter=csv' |
27
|
|
|
severity_map = {'warn': RESULT_SEVERITY.NORMAL, |
28
|
|
|
'error': RESULT_SEVERITY.MAJOR} |
29
|
|
|
|
30
|
|
|
def run(self, filename, file): |
31
|
|
|
""" |
32
|
|
|
Coffeelint's your files! |
33
|
|
|
""" |
34
|
|
|
return self.lint(filename) |
35
|
|
|
|
36
|
|
|
def _process_issues(self, output, filename, file): |
37
|
|
|
reader = DictReader(StringIO("".join(output))) |
38
|
|
|
|
39
|
|
|
for row in reader: |
40
|
|
|
try: |
41
|
|
|
yield Result.from_values( |
42
|
|
|
origin=self, |
43
|
|
|
message=row['message'], |
44
|
|
|
file=filename, |
45
|
|
|
line=convert_if_not_empty(row['lineNumber'], int), |
46
|
|
|
end_line=convert_if_not_empty(row['lineNumberEnd'], int), |
47
|
|
|
severity=self.severity_map[row['level']]) |
48
|
|
|
except KeyError: # Invalid CSV line, ignore |
49
|
|
|
pass |
50
|
|
|
|