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

Mon, 26 Feb 2024 10:41:10 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 26 Feb 2024 10:41:10 +0100
branch
server
changeset 10610
bb0149571d94
parent 10439
21c28b0f9e41
child 10640
7806ae725731
permissions
-rw-r--r--

Finished adapting the project functions to support an 'eric-ide' server.

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 ##
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 ## adapted from: flake8-logging v1.4.0
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",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 "module",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 "msecs",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 "msg",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 "name",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 "pathname",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 "process",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 "processName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 "relativeCreated",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 "stack_info",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 "taskName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 "thread",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 "threadName",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 )
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 @lru_cache(maxsize=None)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 def _modposPlaceholderRe():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 Function to generate a regular expression object for '%' formatting codes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 @return regular expression object
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 @rtype re.Pattern
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 # 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
75 return re.compile(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 r"""
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 % # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 (?P<spec>
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 % | # raw % character # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 (?:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 ([-#0 +]+)? # conversion flags
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 (?P<minwidth>\d+|\*)? # minimum field width
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 (?P<precision>\.\d+|\.\*)? # precision
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 [hlL]? # length modifier
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 [acdeEfFgGiorsuxX] # conversion type
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 )
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 re.VERBOSE,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 )
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 @lru_cache(maxsize=None)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 def _modnamedPlaceholderRe():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 Function to generate a regular expression object for '%' formatting codes using
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 names.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @return regular expression object
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @rtype re.Pattern
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 # 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
103 return re.compile(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 r"""
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 % # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 \(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 (?P<name>.*?)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 \)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 ([-#0 +]+)? # conversion flags
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 (\d+)? # minimum field width
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 (\.\d+)? # precision
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 [hlL]? # length modifier
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 [acdeEfFgGiorsuxX] # conversion type
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 """,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 re.VERBOSE,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 )
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 class LoggingVisitor(ast.NodeVisitor):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 Class implementing a node visitor to check for logging issues.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """
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 GetLoggerNames = frozenset(("__cached__", "__file__"))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 def __init__(self, errorCallback):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 Constructor
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 @param errorCallback callback function to register an error
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 @type func
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 super().__init__()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 self.__error = errorCallback
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 self.__loggingName = None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 self.__loggerName = None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 self.__fromImports = {}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 self.__stack = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 def visit(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 Public method to handle ast nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 self.__stack.append(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 super().visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 self.__stack.pop()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 def visit_Import(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 Public method to handle Import nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 @type ast.Import
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 for alias in node.names:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 if alias.name == "logging":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 self.__loggingName = alias.asname or alias.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 def visit_ImportFrom(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 Public method to handle ImportFrom nodes.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 @type ast.ImportFrom
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 if node.module == "logging":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 for alias in node.names:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 if alias.name == "WARN":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 if sys.version_info >= (3, 10):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 lineno = alias.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 colOffset = alias.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 lineno = node.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 colOffset = node.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 self.__error(lineno - 1, colOffset, "L109")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 if not alias.asname:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 self.__fromImports[alias.name] = node.module
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 def visit_Attribute(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 Public method to handle Attribute nodes.
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 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 @type ast.Attribute
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 and isinstance(node.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 and node.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 and node.attr == "WARN"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 self.__error(node.lineno - 1, node.col_offset, "L109")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 self.generic_visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 def visit_Call(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 Public method to handle Call nodes.
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 @param node reference to the node to be processed
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 and node.func.attr == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 and node.func.id == "Logger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 and self.__fromImports.get("Logger") == "logging"
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 ) and not self.__atModuleLevel():
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 self.__error(node.lineno - 1, node.col_offset, "L101")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 and isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 and node.func.attr == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 and node.func.value.id == self.__loggingName
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 isinstance(node.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 and node.func.id == "getLogger"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 and self.__fromImports.get("getLogger") == "logging"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 len(self.__stack) >= 2
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 and isinstance(assign := self.__stack[-2], ast.Assign)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 and len(assign.targets) == 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 and isinstance(assign.targets[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 and not self.__atModuleLevel()
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 self.__loggerName = assign.targets[0].id
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 node.args
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 and node.args[0].id in self.GetLoggerNames
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 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
253
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 isinstance(node.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 and node.func.attr in _LoggerMethods
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 and isinstance(node.func.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 ) and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 (self.__loggingName and node.func.value.id == self.__loggingName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 or (self.__loggerName and node.func.value.id == self.__loggerName)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 excHandler = self.__currentExceptHandler()
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 # L108
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 if node.func.attr == "warn":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 self.__error(node.lineno - 1, node.col_offset, "L108")
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 # L103
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 extraKeys = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 if any((extraNode := kw).arg == "extra" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 if isinstance(extraNode.value, ast.Dict):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 (k.value, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 for k in extraNode.value.keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 if isinstance(k, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 ]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 isinstance(extraNode.value, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 and isinstance(extraNode.value.func, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 and extraNode.value.func.id == "dict"
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 extraKeys = [
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 (k.arg, k)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 for k in extraNode.value.keywords
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 if k.arg is not None
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
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 for key, keyNode in extraKeys:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 if key in _LogrecordAttributes:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 if isinstance(keyNode, ast.keyword):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 lineno, colOffset = self.__keywordPos(keyNode)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 lineno = keyNode.lineno
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 colOffset = keyNode.col_offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 self.__error(lineno - 1, colOffset, "L103", repr(key))
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 if node.func.attr == "exception":
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 # L104
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 if not excHandler:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 self.__error(node.lineno - 1, node.col_offset, "L104")
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 any((excInfo := kw).arg == "exc_info" for kw in node.keywords):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 # L106
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 isinstance(excInfo.value, ast.Constant) and excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 ) or (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 excHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 and isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 and excInfo.value.id == excHandler.name
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 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 self.__error(lineno - 1, colOffset, "L106")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 # L107
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 and not excInfo.value.value
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 self.__error(lineno - 1, colOffset, "L107")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 # L105
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 elif node.func.attr == "error" and excHandler is not None:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 rewritable = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 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
326 if isinstance(excInfo.value, ast.Constant) and excInfo.value.value:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 isinstance(excInfo.value, ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 and excInfo.value.id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 rewritable = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 rewritable = True
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 if rewritable:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 self.__error(node.lineno - 1, node.col_offset, "L105")
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 # L114
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 excHandler is None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 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
343 and isinstance(excInfo.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 and excInfo.value.value
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 lineno, colOffset = self.__keywordPos(excInfo)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 self.__error(lineno - 1, colOffset, "L114")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 # L110
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 node.func.attr == "exception"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 and len(node.args) >= 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 and isinstance(node.args[0], ast.Name)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 and excHandler is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 and node.args[0].id == excHandler.name
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 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
358
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 msgArgKwarg = False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 if node.func.attr == "log" and len(node.args) >= 2:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 msgArg = node.args[1]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 elif node.func.attr != "log" and len(node.args) >= 1:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 msgArg = node.args[0]
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 try:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 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
367 msgArgKwarg = True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 except IndexError:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 msgArg = None
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 # L111
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 if isinstance(msgArg, ast.JoinedStr):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111a")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 isinstance(msgArg, ast.Call)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 and isinstance(msgArg.func, ast.Attribute)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 and isinstance(msgArg.func.value, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 and isinstance(msgArg.func.value.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 and msgArg.func.attr == "format"
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111b")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382 elif (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 isinstance(msgArg, ast.BinOp)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 and isinstance(msgArg.op, ast.Mod)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 and isinstance(msgArg.left, ast.Constant)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 and isinstance(msgArg.left.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111c")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 elif isinstance(msgArg, ast.BinOp) and self.__isAddChainWithNonStr(msgArg):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 self.__error(msgArg.lineno - 1, msgArg.col_offset, "L111d")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 if (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 msgArg is not None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 and not msgArgKwarg
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 and (msg := self.__flattenStrChain(msgArg))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 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
398 ):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 self.__checkMsgAndArgs(node, msgArg, msg)
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.generic_visit(node)
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 def __checkMsgAndArgs(self, node, msgArg, msg):
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 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
406
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 @param node reference to the Call node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 @type ast.Call
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 @param msgArg message argument nodes
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 @param msg message
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 @type str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 if not isinstance(node.func, ast.Attribute):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 return
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 if (
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 (node.func.attr != "log" and (dictIdx := 1))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420 or (node.func.attr == "log" and (dictIdx := 2))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 and len(node.args) == dictIdx + 1
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 and (dictNode := node.args[dictIdx])
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 and isinstance(dictNode, ast.Dict)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 and all(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426 isinstance(k, ast.Constant) and isinstance(k.value, str)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 for k in dictNode.keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 and (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430 modnames := {m["name"] for m in _modnamedPlaceholderRe().finditer(msg)}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 )
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 # L113
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 given = {cast(ast.Constant, k).value for k in dictNode.keys}
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435 if missing := modnames - given:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
439 "L113a", # missing keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
440 ", ".join([repr(k) for k in missing]),
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
441 )
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 if missing := given - modnames:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
444 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
445 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
446 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
447 "L113b", # unreferenced keys
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
448 ", ".join([repr(k) for k in missing]),
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449 )
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
451 return
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 # L112
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454 modposCount = sum(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
455 1 + (m["minwidth"] == "*") + (m["precision"] == ".*")
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456 for m in _modposPlaceholderRe().finditer(msg)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 if m["spec"] != "%"
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 argCount = len(node.args) - 1 - (node.func.attr == "log")
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 if modposCount > 0 and modposCount != argCount:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 self.__error(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 msgArg.lineno - 1,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 msgArg.col_offset,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 "L112",
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466 modposCount,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 "'%'", # noqa: M601
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 argCount,
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 return
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 def __atModuleLevel(self):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 Private method to check, if we are on the module level.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
476 @return flag indicating the module level
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
477 @rtype bool
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
478 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
479 return any(
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
480 isinstance(parent, (ast.FunctionDef, ast.AsyncFunctionDef))
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
481 for parent in self.__stack
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
482 )
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 def __currentExceptHandler(self):
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 Private method to determine the current exception handler 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 @return reference to the current exception handler node or None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
489 @rtype ast.ExceptHandler
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
490 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
491 for node in reversed(self.__stack):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
492 if isinstance(node, ast.ExceptHandler):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
493 return node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
494 elif isinstance(node, (ast.AsyncFunctionDef, ast.FunctionDef)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
495 break
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 return None
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
498
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
499 def __keywordPos(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
500 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
501 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
502
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
503 @param node reference to the keyword node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
504 @type ast.keyword
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
505 @return tuple containing the line number and the column offset
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506 @rtype tuple of (int, int)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
508 if sys.version_info >= (3, 9):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
509 return (node.lineno, node.col_offset)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
510 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
511 # Educated guess
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
512 return (
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
513 node.value.lineno,
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
514 max(0, node.value.col_offset - 1 - len(node.arg)),
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
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
517 def __isAddChainWithNonStr(self, node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
518 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
519 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
520
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
521 @param node reference to the binary operator node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
522 @type ast.BinOp
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
523 @return flag indicating an Add with a non string argument
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
524 @rtype bool
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 if not isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
527 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
528
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
529 for side in (node.left, node.right):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
530 if isinstance(side, ast.BinOp):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
531 if self.__isAddChainWithNonStr(side):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
533 elif not (isinstance(side, ast.Constant) and isinstance(side.value, str)):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
535
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
538 def __flattenStrChain(self, node):
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 Private method to flatten the given string chain.
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542 @param node reference to the AST node
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
543 @type ast.AST
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 @return flattened string
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 @rtype str
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 """
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 parts = []
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
548
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
549 def visit(node):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 if isinstance(node, ast.Constant) and isinstance(node.value, str):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
551 parts.append(node.value)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
552 return True
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 elif isinstance(node, ast.BinOp) and isinstance(node.op, ast.Add):
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
554 return visit(node.left) and visit(node.right)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555 return False
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
556
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
557 result = visit(node)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
558 if result:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559 return "".join(parts)
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
560 else:
b189ca1f5d53 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
561 return None

eric ide

mercurial