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

Thu, 27 Feb 2025 14:42:39 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 27 Feb 2025 14:42:39 +0100
branch
eric7
changeset 11150
73d80859079c
parent 11148
15e30f0c76a8
permissions
-rw-r--r--

Code Style Checkers
- Refactored the various code style checkers for better maintainability.

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
11090
f5f5f5803935 Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10754
diff changeset
3 # Copyright (c) 2023 - 2025 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 ##
11132
7cb530e18aba Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11090
diff changeset
13 ## adapted from: flake8-logging v1.7.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"""
11148
15e30f0c76a8 Adjusted the code to the modified issue codes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11147
diff changeset
78 % # noqa: M-601
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 (?P<spec>
11148
15e30f0c76a8 Adjusted the code to the modified issue codes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11147
diff changeset
80 % | # raw % character # noqa: M-601
10367
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"""
11148
15e30f0c76a8 Adjusted the code to the modified issue codes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11147
diff changeset
106 % # noqa: M-601
10367
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":
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
176 self.__error(
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
177 alias if sys.version_info >= (3, 10) else node, "L-109"
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
178 )
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 if not alias.asname:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 self.__fromImports[alias.name] = node.module
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 def visit_Attribute(self, node):
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 Public method to handle Attribute nodes.
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 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 @type ast.Attribute
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 and isinstance(node.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 and node.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 and node.attr == "WARN"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
197 self.__error(node, "L-109")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 self.generic_visit(node)
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 def visit_Call(self, node):
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 Public method to handle Call nodes.
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 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 and node.func.attr == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 and node.func.id == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 and self.__fromImports.get("Logger") == "logging"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 ) and not self.__atModuleLevel():
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
222 self.__error(node, "L-101")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 if (
10754
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
225 isinstance(node.func, ast.Attribute)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
226 and node.func.attr in _LoggerMethods
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
227 and isinstance(node.func.value, ast.Name)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
228 and self.__loggingName
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
229 and node.func.value.id == self.__loggingName
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
230 ) or (
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
231 isinstance(node.func, ast.Name)
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
232 and node.func.id in _LoggerMethods
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
233 and self.__fromImports.get(node.func.id) == "logging"
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
234 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
235 self.__error(node, "L-115")
10754
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
236
6faecb62f3a4 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10640
diff changeset
237 if (
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 and node.func.attr == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 and node.func.id == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 and self.__fromImports.get("getLogger") == "logging"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 len(self.__stack) >= 2
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 and isinstance(assign := self.__stack[-2], ast.Assign)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 and len(assign.targets) == 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 and isinstance(assign.targets[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 and not self.__atModuleLevel()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 self.__loggerName = assign.targets[0].id
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 node.args
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 and node.args[0].id in self.GetLoggerNames
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
262 self.__error(node.args[0], "L-102")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 and node.func.attr in _LoggerMethods
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 ) and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 (self.__loggingName and node.func.value.id == self.__loggingName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 or (self.__loggerName and node.func.value.id == self.__loggerName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 excHandler = self.__currentExceptHandler()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 # L108
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 if node.func.attr == "warn":
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
276 self.__error(node, "L-108")
10367
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 # L103
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 extraKeys = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 if any((extraNode := kw).arg == "extra" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 if isinstance(extraNode.value, ast.Dict):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 (k.value, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 for k in extraNode.value.keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 if isinstance(k, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 ]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 isinstance(extraNode.value, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 and isinstance(extraNode.value.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 and extraNode.value.func.id == "dict"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 (k.arg, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 for k in extraNode.value.keywords
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 if k.arg is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 ]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 for key, keyNode in extraKeys:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 if key in _LogrecordAttributes:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
300 self.__error(keyNode, "L-103", repr(key))
10367
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 if node.func.attr == "exception":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 # L104
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 if not excHandler:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
305 self.__error(node, "L-104")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 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
308 # L106
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 isinstance(excInfo.value, ast.Constant) and excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 excHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 and isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 and excInfo.value.id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
316 self.__error(excInfo, "L-106")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 # L107
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 and not excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
323 self.__error(excInfo, "L-107")
10367
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 # L105
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 elif node.func.attr == "error" and excHandler is not None:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 rewritable = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 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
329 if isinstance(excInfo.value, ast.Constant) and excInfo.value.value:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 and excInfo.value.id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 if rewritable:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
340 self.__error(node, "L-105")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 # L114
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 excHandler is None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 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
346 and isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 and excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
349 self.__error(excInfo, "L-114")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 # L110
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 node.func.attr == "exception"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 and len(node.args) >= 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 and excHandler is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 and node.args[0].id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
359 self.__error(node.args[0], "L-110")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 msgArgKwarg = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 if node.func.attr == "log" and len(node.args) >= 2:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 msgArg = node.args[1]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 elif node.func.attr != "log" and len(node.args) >= 1:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 msgArg = node.args[0]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 try:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 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
369 msgArgKwarg = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 except IndexError:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 msgArg = None
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 # L111
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 if isinstance(msgArg, ast.JoinedStr):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
375 self.__error(msgArg, "L-111a")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 isinstance(msgArg, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 and isinstance(msgArg.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 and isinstance(msgArg.func.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 and isinstance(msgArg.func.value.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 and msgArg.func.attr == "format"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
383 self.__error(msgArg, "L-111b")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 isinstance(msgArg, ast.BinOp)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 and isinstance(msgArg.op, ast.Mod)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 and isinstance(msgArg.left, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 and isinstance(msgArg.left.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 ):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
390 self.__error(msgArg, "L-111c")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 elif isinstance(msgArg, ast.BinOp) and self.__isAddChainWithNonStr(msgArg):
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
392 self.__error(msgArg, "L-111d")
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 msgArg is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 and not msgArgKwarg
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 and (msg := self.__flattenStrChain(msgArg))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 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
400 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 self.__checkMsgAndArgs(node, msgArg, msg)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 def __checkMsgAndArgs(self, node, msgArg, msg):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 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
408
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 @param node reference to the Call node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 @param msgArg message argument nodes
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 @param msg message
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 @type str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 if not isinstance(node.func, ast.Attribute):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 return
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 if (
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 (node.func.attr != "log" and (dictIdx := 1))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 or (node.func.attr == "log" and (dictIdx := 2))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 and len(node.args) == dictIdx + 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 and (dictNode := node.args[dictIdx])
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426 and isinstance(dictNode, ast.Dict)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 and all(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 isinstance(k, ast.Constant) and isinstance(k.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 for k in dictNode.keys
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 and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 modnames := {m["name"] for m in _modnamedPlaceholderRe().finditer(msg)}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 # L113
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 given = {cast(ast.Constant, k).value for k in dictNode.keys}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 if missing := modnames - given:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
438 # missing keys
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
439 self.__error(msgArg, "L-113a", ", ".join([repr(k) for k in missing]))
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 if missing := given - modnames:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
442 # unreferenced keys
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
443 self.__error(msgArg, "L-113b", ", ".join([repr(k) for k in missing]))
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 return
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 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 modposCount = sum(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 1 + (m["minwidth"] == "*") + (m["precision"] == ".*")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450 for m in _modposPlaceholderRe().finditer(msg)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 if m["spec"] != "%"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
453 argCount = len(node.args) - 1 - (node.func.attr == "log")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 if modposCount > 0 and modposCount != argCount:
11150
73d80859079c Code Style Checkers
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11148
diff changeset
456 self.__error(msgArg, "L-112", modposCount, "'%'", argCount) # noqa: M-601
10367
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 return
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 def __atModuleLevel(self):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 Private method to check, if we are on the module level.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 @return flag indicating the module level
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 @rtype bool
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 return any(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 isinstance(parent, (ast.FunctionDef, ast.AsyncFunctionDef))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 for parent in self.__stack
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 def __currentExceptHandler(self):
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 Private method to determine the current exception handler node.
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 @return reference to the current exception handler node or None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 @rtype ast.ExceptHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 for node in reversed(self.__stack):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 if isinstance(node, ast.ExceptHandler):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 return node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 elif isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482 break
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 None
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 __isAddChainWithNonStr(self, node):
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 the node is an Add with a non string argument.
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 @param node reference to the binary operator node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 @type ast.BinOp
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 @return flag indicating an Add with a non string argument
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 @rtype bool
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 if not isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
496 return False
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 for side in (node.left, node.right):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 if isinstance(side, ast.BinOp):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 if self.__isAddChainWithNonStr(side):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
502 elif not (isinstance(side, ast.Constant) and isinstance(side.value, str)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503 return True
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 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507 def __flattenStrChain(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509 Private method to flatten the given string chain.
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 @param node reference to the AST node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 @return flattened string
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 @rtype str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
515 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
516 parts = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 def visit(node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 if isinstance(node, ast.Constant) and isinstance(node.value, str):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
520 parts.append(node.value)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 elif isinstance(node, ast.BinOp) and isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
523 return visit(node.left) and visit(node.right)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
525
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
526 result = visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 if result:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
528 return "".join(parts)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530 return None

eric ide

mercurial