src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Logging/LoggingVisitor.py

Sat, 08 Jun 2024 15:25:29 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 08 Jun 2024 15:25:29 +0200
branch
eric7
changeset 10754
6faecb62f3a4
parent 10640
7806ae725731
child 11090
f5f5f5803935
permissions
-rw-r--r--

Code Style Checker
- Updated these checkers.
- Miscellaneous to `flake8-bugbear v24.4.26`
- Logging to `flake8-logging v1.6.0`

10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
10439
21c28b0f9e41 Updated copyright for 2024.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10367
diff changeset
3 # Copyright (c) 2023 - 2024 Detlev Offenbach <detlev@die-offenbachs.de>
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a node visitor to check for logging issues.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 #######################################################################
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 ## LoggingVisitor
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 ##
10640
7806ae725731 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
13 ## adapted from: flake8-logging v1.5.0
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 ##
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 ## Original: Copyright (c) 2023 Adam Johnson
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 #######################################################################
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 import ast
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 import re
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 import sys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 from functools import lru_cache
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 from typing import cast
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 _LoggerMethods = frozenset(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 "debug",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 "info",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 "warn",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 "warning",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 "error",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 "critical",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 "log",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 "exception",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 _LogrecordAttributes = frozenset(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 "asctime",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 "args",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 "created",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 "exc_info",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 "exc_text",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 "filename",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 "funcName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 "levelname",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 "levelno",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 "lineno",
10640
7806ae725731 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
50 "message",
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 "module",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 "msecs",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 "msg",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 "name",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 "pathname",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 "process",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 "processName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 "relativeCreated",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 "stack_info",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 "taskName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 "thread",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 "threadName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 @lru_cache(maxsize=None)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 def _modposPlaceholderRe():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 Function to generate a regular expression object for '%' formatting codes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 @return regular expression object
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 @rtype re.Pattern
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 # https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 return re.compile(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 r"""
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 % # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 (?P<spec>
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 % | # raw % character # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 (?:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 ([-#0 +]+)? # conversion flags
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 (?P<minwidth>\d+|\*)? # minimum field width
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 (?P<precision>\.\d+|\.\*)? # precision
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 [hlL]? # length modifier
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 [acdeEfFgGiorsuxX] # conversion type
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 """,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 re.VERBOSE,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 @lru_cache(maxsize=None)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 def _modnamedPlaceholderRe():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 Function to generate a regular expression object for '%' formatting codes using
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 names.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @return regular expression object
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @rtype re.Pattern
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 # https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 return re.compile(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 r"""
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 % # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 \(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 (?P<name>.*?)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 \)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 ([-#0 +]+)? # conversion flags
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 (\d+)? # minimum field width
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 (\.\d+)? # precision
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 [hlL]? # length modifier
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 [acdeEfFgGiorsuxX] # conversion type
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 """,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 re.VERBOSE,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 class LoggingVisitor(ast.NodeVisitor):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 Class implementing a node visitor to check for logging issues.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 GetLoggerNames = frozenset(("__cached__", "__file__"))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 def __init__(self, errorCallback):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 Constructor
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 @param errorCallback callback function to register an error
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 @type func
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 super().__init__()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 self.__error = errorCallback
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 self.__loggingName = None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 self.__loggerName = None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 self.__fromImports = {}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 self.__stack = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 def visit(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 Public method to handle ast nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 self.__stack.append(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 super().visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 self.__stack.pop()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 def visit_Import(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 Public method to handle Import nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 @type ast.Import
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 for alias in node.names:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 if alias.name == "logging":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 self.__loggingName = alias.asname or alias.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 def visit_ImportFrom(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 Public method to handle ImportFrom nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 @type ast.ImportFrom
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 if node.module == "logging":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 for alias in node.names:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 if alias.name == "WARN":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 if sys.version_info >= (3, 10):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 lineno = alias.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 colOffset = alias.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 lineno = node.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 colOffset = node.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 self.__error(lineno - 1, colOffset, "L109")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 if not alias.asname:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 self.__fromImports[alias.name] = node.module
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 def visit_Attribute(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 Public method to handle Attribute nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 @type ast.Attribute
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 and isinstance(node.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 and node.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 and node.attr == "WARN"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 self.__error(node.lineno - 1, node.col_offset, "L109")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 def visit_Call(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 Public method to handle Call nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 and node.func.attr == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 and node.func.id == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 and self.__fromImports.get("Logger") == "logging"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 ) and not self.__atModuleLevel():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 self.__error(node.lineno - 1, node.col_offset, "L101")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 if (
10754
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
229 isinstance(node.func, ast.Attribute)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
230 and node.func.attr in _LoggerMethods
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
231 and isinstance(node.func.value, ast.Name)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
232 and self.__loggingName
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
233 and node.func.value.id == self.__loggingName
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
234 ) or (
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
235 isinstance(node.func, ast.Name)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
236 and node.func.id in _LoggerMethods
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
237 and self.__fromImports.get(node.func.id) == "logging"
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
238 ):
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
239 self.__error(node.lineno - 1, node.col_offset, "L115")
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
240
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
241 if (
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 and node.func.attr == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 and node.func.id == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 and self.__fromImports.get("getLogger") == "logging"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 len(self.__stack) >= 2
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 and isinstance(assign := self.__stack[-2], ast.Assign)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 and len(assign.targets) == 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 and isinstance(assign.targets[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 and not self.__atModuleLevel()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 self.__loggerName = assign.targets[0].id
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 node.args
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 and node.args[0].id in self.GetLoggerNames
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 self.__error(node.args[0].lineno - 1, node.args[0].col_offset, "L102")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 and node.func.attr in _LoggerMethods
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 ) and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 (self.__loggingName and node.func.value.id == self.__loggingName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 or (self.__loggerName and node.func.value.id == self.__loggerName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 excHandler = self.__currentExceptHandler()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 # L108
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 if node.func.attr == "warn":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 self.__error(node.lineno - 1, node.col_offset, "L108")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 # L103
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 extraKeys = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 if any((extraNode := kw).arg == "extra" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 if isinstance(extraNode.value, ast.Dict):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 (k.value, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 for k in extraNode.value.keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 if isinstance(k, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 ]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 isinstance(extraNode.value, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 and isinstance(extraNode.value.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 and extraNode.value.func.id == "dict"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 (k.arg, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 for k in extraNode.value.keywords
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 if k.arg is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 ]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 for key, keyNode in extraKeys:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 if key in _LogrecordAttributes:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 if isinstance(keyNode, ast.keyword):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 lineno, colOffset = self.__keywordPos(keyNode)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 lineno = keyNode.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 colOffset = keyNode.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 self.__error(lineno - 1, colOffset, "L103", repr(key))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 if node.func.attr == "exception":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 # L104
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 if not excHandler:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 self.__error(node.lineno - 1, node.col_offset, "L104")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 if any((excInfo := kw).arg == "exc_info" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 # L106
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 isinstance(excInfo.value, ast.Constant) and excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 excHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 and isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 and excInfo.value.id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 self.__error(lineno - 1, colOffset, "L106")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 # L107
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 and not excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 self.__error(lineno - 1, colOffset, "L107")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 # L105
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 elif node.func.attr == "error" and excHandler is not None:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 rewritable = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 if any((excInfo := kw).arg == "exc_info" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 if isinstance(excInfo.value, ast.Constant) and excInfo.value.value:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 and excInfo.value.id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 if rewritable:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 self.__error(node.lineno - 1, node.col_offset, "L105")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 # L114
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 excHandler is None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 and any((excInfo := kw).arg == "exc_info" for kw in node.keywords)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 and isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 and excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 self.__error(lineno - 1, colOffset, "L114")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 # L110
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 node.func.attr == "exception"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 and len(node.args) >= 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 and excHandler is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 and node.args[0].id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 self.__error(node.args[0].lineno - 1, node.args[0].col_offset, "L110")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 msgArgKwarg = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 if node.func.attr == "log" and len(node.args) >= 2:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 msgArg = node.args[1]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 elif node.func.attr != "log" and len(node.args) >= 1:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 msgArg = node.args[0]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 try:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 msgArg = [k for k in node.keywords if k.arg == "msg"][0].value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 msgArgKwarg = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 except IndexError:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 msgArg = None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 # L111
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 if isinstance(msgArg, ast.JoinedStr):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111a")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 isinstance(msgArg, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 and isinstance(msgArg.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 and isinstance(msgArg.func.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 and isinstance(msgArg.func.value.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 and msgArg.func.attr == "format"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111b")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 isinstance(msgArg, ast.BinOp)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 and isinstance(msgArg.op, ast.Mod)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 and isinstance(msgArg.left, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 and isinstance(msgArg.left.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111c")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 elif isinstance(msgArg, ast.BinOp) and self.__isAddChainWithNonStr(msgArg):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111d")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 msgArg is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 and not msgArgKwarg
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 and (msg := self.__flattenStrChain(msgArg))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 and not any(isinstance(arg, ast.Starred) for arg in node.args)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 self.__checkMsgAndArgs(node, msgArg, msg)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 def __checkMsgAndArgs(self, node, msgArg, msg):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
419 Private method to check the message and arguments a given Call node.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 @param node reference to the Call node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 @param msgArg message argument nodes
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 @param msg message
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426 @type str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 if not isinstance(node.func, ast.Attribute):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 return
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 (node.func.attr != "log" and (dictIdx := 1))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 or (node.func.attr == "log" and (dictIdx := 2))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 and len(node.args) == dictIdx + 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 and (dictNode := node.args[dictIdx])
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 and isinstance(dictNode, ast.Dict)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439 and all(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 isinstance(k, ast.Constant) and isinstance(k.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 for k in dictNode.keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
442 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
443 and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 modnames := {m["name"] for m in _modnamedPlaceholderRe().finditer(msg)}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 # L113
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 given = {cast(ast.Constant, k).value for k in dictNode.keys}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 if missing := modnames - given:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 "L113a", # missing keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 ", ".join([repr(k) for k in missing]),
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 if missing := given - modnames:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 "L113b", # unreferenced keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 ", ".join([repr(k) for k in missing]),
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 return
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 modposCount = sum(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 1 + (m["minwidth"] == "*") + (m["precision"] == ".*")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 for m in _modposPlaceholderRe().finditer(msg)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 if m["spec"] != "%"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 argCount = len(node.args) - 1 - (node.func.attr == "log")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 if modposCount > 0 and modposCount != argCount:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 "L112",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 modposCount,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 "'%'", # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482 argCount,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
483 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
484 return
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
485
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
486 def __atModuleLevel(self):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
487 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
488 Private method to check, if we are on the module level.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 @return flag indicating the module level
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 @rtype bool
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 return any(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 isinstance(parent, (ast.FunctionDef, ast.AsyncFunctionDef))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 for parent in self.__stack
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
497
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498 def __currentExceptHandler(self):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 Private method to determine the current exception handler node.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502 @return reference to the current exception handler node or None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503 @rtype ast.ExceptHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
504 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
505 for node in reversed(self.__stack):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506 if isinstance(node, ast.ExceptHandler):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507 return node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 elif isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509 break
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
510
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
511 return None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 def __keywordPos(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
515 Private method determine line number and column offset of a given keyword node.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 @param node reference to the keyword node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 @type ast.keyword
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 @return tuple containing the line number and the column offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520 @rtype tuple of (int, int)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 if sys.version_info >= (3, 9):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
523 return (node.lineno, node.col_offset)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
525 # Educated guess
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 return (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 node.value.lineno,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
528 max(0, node.value.col_offset - 1 - len(node.arg)),
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
531 def __isAddChainWithNonStr(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
533 Private method to check, if the node is an Add with a non string argument.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
535 @param node reference to the binary operator node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 @type ast.BinOp
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537 @return flag indicating an Add with a non string argument
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
538 @rtype bool
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
539 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 if not isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
543 for side in (node.left, node.right):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 if isinstance(side, ast.BinOp):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 if self.__isAddChainWithNonStr(side):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 elif not (isinstance(side, ast.Constant) and isinstance(side.value, str)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 def __flattenStrChain(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 Private method to flatten the given string chain.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
556 @param node reference to the AST node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 @return flattened string
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559 @rtype str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
560 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
561 parts = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
562
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
563 def visit(node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
564 if isinstance(node, ast.Constant) and isinstance(node.value, str):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
565 parts.append(node.value)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
566 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
567 elif isinstance(node, ast.BinOp) and isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
568 return visit(node.left) and visit(node.right)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
569 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
570
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 result = visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
572 if result:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
573 return "".join(parts)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
574 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
575 return None

eric ide

mercurial