1
|
|
|
import radon.complexity |
2
|
|
|
import radon.visitors |
3
|
|
|
|
4
|
|
|
from coalib.bears.LocalBear import LocalBear |
5
|
|
|
from coalib.results.Result import Result |
6
|
|
|
from coalib.results.RESULT_SEVERITY import RESULT_SEVERITY |
7
|
|
|
from coalib.results.SourceRange import SourceRange |
8
|
|
|
from coalib.settings.Setting import typed_list |
9
|
|
|
|
10
|
|
|
|
11
|
|
|
class RadonBear(LocalBear): |
12
|
|
|
|
13
|
|
|
def run(self, filename, file, |
14
|
|
|
radon_ranks_info: typed_list(str)=(), |
15
|
|
|
radon_ranks_normal: typed_list(str)=('C', 'D'), |
16
|
|
|
radon_ranks_major: typed_list(str)=('E', 'F')): |
17
|
|
|
""" |
18
|
|
|
Uses radon to compute complexity of a given file. |
19
|
|
|
|
20
|
|
|
:param radon_ranks_info: The ranks (given by radon) to |
21
|
|
|
treat as severity INFO. |
22
|
|
|
:param radon_ranks_normal: The ranks (given by radon) to |
23
|
|
|
treat as severity NORMAL. |
24
|
|
|
:param radon_ranks_major: The ranks (given by radon) to |
25
|
|
|
treat as severity MAJOR. |
26
|
|
|
""" |
27
|
|
|
for visitor in radon.complexity.cc_visit("".join(file)): |
28
|
|
|
rank = radon.complexity.cc_rank(visitor.complexity) |
29
|
|
|
severity_map = { |
30
|
|
|
RESULT_SEVERITY.INFO: radon_ranks_info, |
31
|
|
|
RESULT_SEVERITY.NORMAL: radon_ranks_normal, |
32
|
|
|
RESULT_SEVERITY.MAJOR: radon_ranks_major |
33
|
|
|
} |
34
|
|
|
severity = None |
35
|
|
|
for result_severity, rank_list in severity_map.items(): |
36
|
|
|
if rank in rank_list: |
37
|
|
|
severity = result_severity |
38
|
|
|
if severity is None: |
39
|
|
|
continue |
40
|
|
|
|
41
|
|
|
visitor_range = SourceRange.from_values( |
42
|
|
|
filename, visitor.lineno, visitor.col_offset, visitor.endline) |
43
|
|
|
message = "{} has a cyclomatic complexity of {}".format( |
44
|
|
|
visitor.name, rank) |
45
|
|
|
|
46
|
|
|
yield Result(self, message, severity=severity, |
47
|
|
|
affected_code=(visitor_range,)) |
48
|
|
|
|