Thu, 27 Feb 2025 14:42:39 +0100
Code Style Checkers
- Refactored the various code style checkers for better maintainability.
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
11090
f5f5f5803935
Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10439
diff
changeset
|
3 | # Copyright (c) 2015 - 2025 Detlev Offenbach <detlev@die-offenbachs.de> |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a checker for code complexity. |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
9473
3f23dbf37dbe
Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9221
diff
changeset
|
10 | import ast |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
11 | |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
12 | from CodeStyleTopicChecker import CodeStyleTopicChecker |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | |
8168
bdb0258faf42
Code Style Checker: reorganized the code a little bit.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8166
diff
changeset
|
14 | from .mccabe import PathGraphingAstVisitor |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
17 | class ComplexityChecker(CodeStyleTopicChecker): |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | """ |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
19 | Class implementing a checker for code complexity. |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | """ |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
21 | |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | Codes = [ |
11147
dee6e106b4d3
Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11145
diff
changeset
|
23 | "C-101", |
dee6e106b4d3
Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11145
diff
changeset
|
24 | "C-111", |
dee6e106b4d3
Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11145
diff
changeset
|
25 | "C-112", |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | ] |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
27 | Category = "C" |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | |
8198
1c765dc90c21
Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8168
diff
changeset
|
29 | def __init__(self, source, filename, tree, select, ignore, args): |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | Constructor |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
32 | |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | @param source source code to be checked |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | @type list of str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | @param filename name of the source file |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | @type str |
8198
1c765dc90c21
Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8168
diff
changeset
|
37 | @param tree AST tree of the source code |
1c765dc90c21
Code Style Checker: changed code such, that the AST tree is built only once and passed to each checker module.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8168
diff
changeset
|
38 | @type ast.Module |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | @param select list of selected codes |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | @type list of str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | @param ignore list of codes to be ignored |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | @type list of str |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
43 | @param args dictionary of arguments for the miscellaneous checks |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
44 | @type dict |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | """ |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
46 | super().__init__( |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
47 | ComplexityChecker.Category, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
48 | source, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
49 | filename, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
50 | tree, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
51 | select, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
52 | ignore, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
53 | [], |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
54 | True, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
55 | args, |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
56 | ) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
57 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
58 | self.__defaultArgs = { |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
59 | "McCabeComplexity": 10, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
60 | "LineComplexity": 15, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
61 | "LineComplexityScore": 10, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
62 | } |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
63 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
64 | checkersWithCodes = [ |
11147
dee6e106b4d3
Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11145
diff
changeset
|
65 | (self.__checkMcCabeComplexity, ("C-101",)), |
dee6e106b4d3
Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11145
diff
changeset
|
66 | (self.__checkLineComplexity, ("C-111", "C-112")), |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
67 | ] |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
68 | self._initializeCheckers(checkersWithCodes) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
69 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
70 | def __checkMcCabeComplexity(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
71 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
72 | Private method to check the McCabe code complexity. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
73 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
74 | try: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
75 | # create the AST again because it is modified by the checker |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
76 | tree = compile( |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
77 | "".join(self.source), self.filename, "exec", ast.PyCF_ONLY_AST |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
78 | ) |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
79 | except (SyntaxError, TypeError): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
80 | # compile errors are already reported by the run() method |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
81 | return |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
82 | |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
83 | maxComplexity = self.args.get( |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
84 | "McCabeComplexity", self.__defaultArgs["McCabeComplexity"] |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
85 | ) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
86 | |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | visitor = PathGraphingAstVisitor() |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | visitor.preorder(tree, visitor) |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | for graph in visitor.graphs.values(): |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
90 | if graph.complexity() > maxComplexity: |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
91 | self.addError( |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
92 | graph.lineno + 1, 0, "C-101", graph.entity, graph.complexity() |
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
93 | ) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
94 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
95 | def __checkLineComplexity(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
96 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
97 | Private method to check the complexity of a single line of code and |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
98 | the median line complexity of the source code. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
99 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
100 | Complexity is defined as the number of AST nodes produced by a line |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
101 | of code. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
102 | """ |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
103 | maxLineComplexity = self.args.get( |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
104 | "LineComplexity", self.__defaultArgs["LineComplexity"] |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
105 | ) |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
106 | maxLineComplexityScore = self.args.get( |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
107 | "LineComplexityScore", self.__defaultArgs["LineComplexityScore"] |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
108 | ) |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
109 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
110 | visitor = LineComplexityVisitor() |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
111 | visitor.visit(self.tree) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
112 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
113 | sortedItems = visitor.sortedList() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
114 | score = visitor.score() |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
115 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
116 | for line, complexity in sortedItems: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
117 | if complexity > maxLineComplexity: |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
118 | self.addError(line + 1, 0, "C-111", complexity) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
119 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
120 | if score > maxLineComplexityScore: |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
121 | self.addError(1, 0, "C-112", score) |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
122 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
123 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
124 | class LineComplexityVisitor(ast.NodeVisitor): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
125 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
126 | Class calculating the number of AST nodes per line of code |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
127 | and the median nodes/line score. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
128 | """ |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
129 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
130 | def __init__(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
131 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
132 | Constructor |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
133 | """ |
8218
7c09585bd960
Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8207
diff
changeset
|
134 | super().__init__() |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
135 | self.__count = {} |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
136 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
137 | def visit(self, node): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
138 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
139 | Public method to recursively visit all the nodes and add up the |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
140 | instructions. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
141 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
142 | @param node reference to the node |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
143 | @type ast.AST |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
144 | """ |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
145 | if hasattr(node, "lineno"): |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
146 | self.__count[node.lineno] = self.__count.get(node.lineno, 0) + 1 |
11150
73d80859079c
Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
11147
diff
changeset
|
147 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
148 | self.generic_visit(node) |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
149 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
150 | def sortedList(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
151 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
152 | Public method to get a sorted list of (line, nodes) tuples. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
153 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
154 | @return sorted list of (line, nodes) tuples |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
155 | @rtype list of tuple of (int,int) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
156 | """ |
10373
093dcebe5ecb
Corrected some uses of dict.keys(), dict.values() and dict.items().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
157 | lst = [(line, self.__count[line]) for line in sorted(self.__count)] |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
158 | return lst |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
159 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
160 | def score(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
161 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
162 | Public method to calculate the median. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
163 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
164 | @return median line complexity value |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
165 | @rtype float |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
166 | """ |
10373
093dcebe5ecb
Corrected some uses of dict.keys(), dict.values() and dict.items().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
167 | sortedList = sorted(self.__count.values()) |
093dcebe5ecb
Corrected some uses of dict.keys(), dict.values() and dict.items().
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
168 | listLength = len(sortedList) |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
169 | medianIndex = (listLength - 1) // 2 |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
170 | |
5671
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
171 | if listLength == 0: |
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
172 | return 0.0 |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
173 | elif listLength % 2: |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
174 | return float(sortedList[medianIndex]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
175 | else: |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
176 | return (sortedList[medianIndex] + sortedList[medianIndex + 1]) / 2.0 |