Fri, 01 Dec 2023 16:19:15 +0100
Code Style Checker
- Updated the logging checker to support more cases (based on flake8_logging 1.4.0).
10362 | 1 | # -*- coding: utf-8 -*- |
2 | ||
3 | # Copyright (c) 2023 Detlev Offenbach <detlev@die-offenbachs.de> | |
4 | # | |
5 | ||
6 | """ | |
7 | Module implementing a checker for logging related issues. | |
8 | """ | |
9 | ||
10 | import copy | |
11 | ||
12 | ||
13 | class LoggingChecker: | |
14 | """ | |
15 | Class implementing a checker for logging related issues. | |
16 | """ | |
17 | ||
18 | Codes = [ | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
19 | ## Logging |
10362 | 20 | "L101", |
21 | "L102", | |
22 | "L103", | |
23 | "L104", | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
24 | "L105", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
25 | "L106", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
26 | "L107", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
27 | "L108", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
28 | "L109", |
10362 | 29 | "L110", |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
30 | "L111", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
31 | "L112", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
32 | "L113", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
33 | "L114", |
10362 | 34 | ] |
35 | ||
36 | def __init__(self, source, filename, tree, select, ignore, expected, repeat, args): | |
37 | """ | |
38 | Constructor | |
39 | ||
40 | @param source source code to be checked | |
41 | @type list of str | |
42 | @param filename name of the source file | |
43 | @type str | |
44 | @param tree AST tree of the source code | |
45 | @type ast.Module | |
46 | @param select list of selected codes | |
47 | @type list of str | |
48 | @param ignore list of codes to be ignored | |
49 | @type list of str | |
50 | @param expected list of expected codes | |
51 | @type list of str | |
52 | @param repeat flag indicating to report each occurrence of a code | |
53 | @type bool | |
54 | @param args dictionary of arguments for the various checks | |
55 | @type dict | |
56 | """ | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
57 | self.__select = tuple(select) # noqa: M188 |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
58 | self.__ignore = ("",) if select else tuple(ignore) # noqa: M188 |
10362 | 59 | self.__expected = expected[:] |
60 | self.__repeat = repeat | |
61 | self.__filename = filename | |
62 | self.__source = source[:] | |
63 | self.__tree = copy.deepcopy(tree) | |
64 | self.__args = args | |
65 | ||
66 | # statistics counters | |
67 | self.counters = {} | |
68 | ||
69 | # collection of detected errors | |
70 | self.errors = [] | |
71 | ||
72 | checkersWithCodes = [ | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
73 | ( |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
74 | self.__checkLogging, |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
75 | ( |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
76 | "L101", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
77 | "L102", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
78 | "L103", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
79 | "L104", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
80 | "L105", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
81 | "L106", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
82 | "L107", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
83 | "L108", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
84 | "L109", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
85 | "L110", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
86 | "L111", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
87 | "L112", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
88 | "L113", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
89 | "L114", |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
90 | ), |
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
91 | ), |
10362 | 92 | ] |
93 | ||
94 | self.__checkers = [] | |
95 | for checker, codes in checkersWithCodes: | |
96 | if any(not (code and self.__ignoreCode(code)) for code in codes): | |
97 | self.__checkers.append(checker) | |
98 | ||
99 | def __ignoreCode(self, code): | |
100 | """ | |
101 | Private method to check if the message code should be ignored. | |
102 | ||
103 | @param code message code to check for | |
104 | @type str | |
105 | @return flag indicating to ignore the given code | |
106 | @rtype bool | |
107 | """ | |
108 | return code.startswith(self.__ignore) and not code.startswith(self.__select) | |
109 | ||
110 | def __error(self, lineNumber, offset, code, *args): | |
111 | """ | |
112 | Private method to record an issue. | |
113 | ||
114 | @param lineNumber line number of the issue | |
115 | @type int | |
116 | @param offset position within line of the issue | |
117 | @type int | |
118 | @param code message code | |
119 | @type str | |
120 | @param args arguments for the message | |
121 | @type list | |
122 | """ | |
123 | if self.__ignoreCode(code): | |
124 | return | |
125 | ||
126 | if code in self.counters: | |
127 | self.counters[code] += 1 | |
128 | else: | |
129 | self.counters[code] = 1 | |
130 | ||
131 | # Don't care about expected codes | |
132 | if code in self.__expected: | |
133 | return | |
134 | ||
135 | if code and (self.counters[code] == 1 or self.__repeat): | |
136 | # record the issue with one based line number | |
137 | self.errors.append( | |
138 | { | |
139 | "file": self.__filename, | |
140 | "line": lineNumber + 1, | |
141 | "offset": offset, | |
142 | "code": code, | |
143 | "args": args, | |
144 | } | |
145 | ) | |
146 | ||
147 | def run(self): | |
148 | """ | |
149 | Public method to check the given source against miscellaneous | |
150 | conditions. | |
151 | """ | |
152 | if not self.__filename: | |
153 | # don't do anything, if essential data is missing | |
154 | return | |
155 | ||
156 | if not self.__checkers: | |
157 | # don't do anything, if no codes were selected | |
158 | return | |
159 | ||
160 | for check in self.__checkers: | |
161 | check() | |
162 | ||
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
163 | def __checkLogging(self): |
10362 | 164 | """ |
165 | Private method to check logging statements. | |
166 | """ | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
167 | from .LoggingVisitor import LoggingVisitor |
10362 | 168 | |
10367
b189ca1f5d53
Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10363
diff
changeset
|
169 | visitor = LoggingVisitor(errorCallback=self.__error) |
10362 | 170 | visitor.visit(self.__tree) |