src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/Imports/ImportsChecker.py

Mon, 24 Feb 2025 15:11:18 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 24 Feb 2025 15:11:18 +0100
branch
eric7
changeset 11147
dee6e106b4d3
parent 11145
d328a7b74fd8
child 11150
73d80859079c
permissions
-rw-r--r--

Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).

8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
11090
f5f5f5803935 Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
3 # Copyright (c) 2021 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a checker for import statements.
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
8802
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
10 import ast
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import copy
9275
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
12 import re
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 class ImportsChecker:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 Class implementing a checker for import statements.
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
19
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 Codes = [
8801
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
21 ## Local imports
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
22 "I-101",
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
23 "I-102",
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
24 "I-103",
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
25 ## Various other import related
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
26 "I-901",
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
27 "I-902",
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
28 "I-903",
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
29 "I-904",
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 ]
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
32 def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
35
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @param source source code to be checked
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @type list of str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param filename name of the source file
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @param tree AST tree of the source code
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @type ast.Module
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @param select list of selected codes
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @type list of str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @param ignore list of codes to be ignored
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type list of str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param expected list of expected codes
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type list of str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @param repeat flag indicating to report each occurrence of a code
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @type bool
8801
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
50 @param args dictionary of arguments for the various checks
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 @type dict
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__select = tuple(select)
11142
2f0fb22c1d63 Fixed a few issues in the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11135
diff changeset
54 self.__ignore = tuple(ignore)
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__expected = expected[:]
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.__repeat = repeat
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 self.__filename = filename
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__source = source[:]
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.__tree = copy.deepcopy(tree)
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.__args = args
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
61
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 # statistics counters
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 self.counters = {}
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
64
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 # collection of detected errors
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 self.errors = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
67
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 checkersWithCodes = [
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
69 (self.__checkLocalImports, ("I-101", "I-102", "I-103")),
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
70 (self.__tidyImports, ("I-901", "I-902", "I-903", "I-904")),
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 ]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
72
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 self.__checkers = []
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 for checker, codes in checkersWithCodes:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
75 if any(not (code and self.__ignoreCode(code)) for code in codes):
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 self.__checkers.append(checker)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
77
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 def __ignoreCode(self, code):
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 Private method to check if the message code should be ignored.
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 @param code message code to check for
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 @type str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 @return flag indicating to ignore the given code
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 @rtype bool
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 """
11145
d328a7b74fd8 Corrected some code formatting issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11142
diff changeset
87 return code in self.__ignore or (
d328a7b74fd8 Corrected some code formatting issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11142
diff changeset
88 code.startswith(self.__ignore) and not code.startswith(self.__select)
11142
2f0fb22c1d63 Fixed a few issues in the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11135
diff changeset
89 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
90
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 def __error(self, lineNumber, offset, code, *args):
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 Private method to record an issue.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
94
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 @param lineNumber line number of the issue
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 @type int
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @param offset position within line of the issue
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 @type int
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 @param code message code
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @type str
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @param args arguments for the message
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 @type list
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 if self.__ignoreCode(code):
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
106
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 if code in self.counters:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 self.counters[code] += 1
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 else:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 self.counters[code] = 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
111
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 # Don't care about expected codes
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 if code in self.__expected:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
115
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 if code and (self.counters[code] == 1 or self.__repeat):
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 # record the issue with one based line number
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 self.errors.append(
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 {
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 "file": self.__filename,
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 "line": lineNumber + 1,
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 "offset": offset,
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 "code": code,
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 "args": args,
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 }
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 )
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
127
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 def run(self):
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 Public method to check the given source against miscellaneous
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 conditions.
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 """
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 if not self.__filename:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 # don't do anything, if essential data is missing
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
136
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 if not self.__checkers:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 # don't do anything, if no codes were selected
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
140
8789
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 for check in self.__checkers:
b165effc3c62 Started implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 check()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
143
8801
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
144 #######################################################################
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
145 ## Local imports
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
146 ##
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
147 ## adapted from: flake8-local-import v1.0.6
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
148 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
149
8801
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
150 def __checkLocalImports(self):
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
151 """
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
152 Private method to check local imports.
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
153 """
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
154 from .LocalImportVisitor import LocalImportVisitor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
155
8801
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
156 visitor = LocalImportVisitor(self.__args, self)
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
157 visitor.visit(copy.deepcopy(self.__tree))
8fbb21be8579 Continued implementing a checker for import statements.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8789
diff changeset
158 for violation in visitor.violations:
8802
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
159 if not self.__ignoreCode(violation[1]):
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
160 node = violation[0]
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
161 reason = violation[1]
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
162 self.__error(node.lineno - 1, node.col_offset, reason)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
163
8802
129a973fc33e Continued implementing a checker for import statements (import order).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8801
diff changeset
164 #######################################################################
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
165 ## Tidy imports
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
166 ##
11135
5af56f31c53f Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11090
diff changeset
167 ## adapted from: flake8-tidy-imports v4.11.0
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
168 #######################################################################
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
169
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
170 def __tidyImports(self):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
171 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
172 Private method to check various other import related topics.
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
173 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
174 self.__banRelativeImports = self.__args.get("BanRelativeImports", "")
9275
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
175 self.__bannedModules = []
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
176 self.__bannedStructuredPatterns = []
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
177 self.__bannedUnstructuredPatterns = []
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
178 for module in self.__args.get("BannedModules", []):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
179 module = module.strip()
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
180 if "*" in module[:-1] or module == "*":
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
181 # unstructured
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
182 self.__bannedUnstructuredPatterns.append(
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
183 self.__compileUnstructuredGlob(module)
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
184 )
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
185 elif module.endswith(".*"):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
186 # structured
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
187 self.__bannedStructuredPatterns.append(module)
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
188 # Also check for exact matches without the wildcard
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
189 # e.g. "foo.*" matches "foo"
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
190 prefix = module[:-2]
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
191 if prefix not in self.__bannedModules:
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
192 self.__bannedModules.append(prefix)
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
193 else:
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
194 self.__bannedModules.append(module)
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
195
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
196 # Sort the structured patterns so we match the specifc ones first.
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
197 self.__bannedStructuredPatterns.sort(key=lambda x: len(x[0]), reverse=True)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
198
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
199 ruleMethods = []
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
200 if not self.__ignoreCode("I-901"):
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
201 ruleMethods.append(self.__checkUnnecessaryAlias)
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
202 if not self.__ignoreCode("I-902") and bool(self.__bannedModules):
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
203 ruleMethods.append(self.__checkBannedImport)
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
204 if (
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
205 not self.__ignoreCode("I-903") and self.__banRelativeImports == "parents"
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
206 ) or (not self.__ignoreCode("I-904") and self.__banRelativeImports == "true"):
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
207 ruleMethods.append(self.__checkBannedRelativeImports)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
208
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
209 for node in ast.walk(self.__tree):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
210 for method in ruleMethods:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
211 method(node)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
212
9275
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
213 def __compileUnstructuredGlob(self, module):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
214 """
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
215 Private method to convert a pattern to a regex such that ".*" matches zero or
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
216 more modules.
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
217
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
218 @param module module pattern to be converted
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
219 @type str
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
220 @return compiled regex
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
221 @rtype re.regex object
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
222 """
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
223 parts = module.split(".")
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
224 transformedParts = [
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
225 "(\\..*)?" if p == "*" else "\\." + re.escape(p) for p in parts
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
226 ]
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
227 if parts[0] == "*":
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
228 transformedParts[0] = ".*"
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
229 else:
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
230 transformedParts[0] = re.escape(parts[0])
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
231 return re.compile("".join(transformedParts) + "\\Z")
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
232
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
233 def __checkUnnecessaryAlias(self, node):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
234 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
235 Private method to check unnecessary import aliases.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
236
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
237 @param node reference to the node to be checked
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
238 @type ast.AST
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
239 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
240 if isinstance(node, ast.Import):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
241 for alias in node.names:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
242 if "." not in alias.name:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
243 fromName = None
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
244 importedName = alias.name
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
245 else:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
246 fromName, importedName = alias.name.rsplit(".", 1)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
247
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
248 if importedName == alias.asname:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
249 if fromName:
10184
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
250 rewritten = f"from {fromName} import {importedName}"
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
251 else:
10184
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
252 rewritten = f"import {importedName}"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
253
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
254 self.__error(node.lineno - 1, node.col_offset, "I-901", rewritten)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
255
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
256 elif isinstance(node, ast.ImportFrom):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
257 for alias in node.names:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
258 if alias.name == alias.asname:
10184
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
259 rewritten = f"from {node.module} import {alias.name}"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
260
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
261 self.__error(node.lineno - 1, node.col_offset, "I-901", rewritten)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
262
9275
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
263 def __isModuleBanned(self, moduleName):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
264 """
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
265 Private method to check, if the given module name banned.
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
266
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
267 @param moduleName module name to be checked
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
268 @type str
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
269 @return flag indicating a banned module
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
270 @rtype bool
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
271 """
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
272 if moduleName in self.__bannedModules:
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
273 return True
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
274
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
275 # Check unustructed wildcards
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
276 if any(
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
277 bannedPattern.match(moduleName)
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
278 for bannedPattern in self.__bannedUnstructuredPatterns
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
279 ):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
280 return True
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
281
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
282 # Check structured wildcards
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
283 if any(
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
284 moduleName.startswith(bannedPrefix[:-1])
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
285 for bannedPrefix in self.__bannedStructuredPatterns
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
286 ):
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
287 return True
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
288
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
289 return False
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
290
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
291 def __checkBannedImport(self, node):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
292 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
293 Private method to check import of banned modules.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
294
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
295 @param node reference to the node to be checked
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
296 @type ast.AST
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
297 """
10184
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
298 if (
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
299 not bool(self.__bannedModules)
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
300 and not bool(self.__bannedUnstructuredPatterns)
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
301 and not bool(self.__bannedStructuredPatterns)
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
302 ):
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
303 # nothing to check
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
304 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
305
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
306 if isinstance(node, ast.Import):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
307 moduleNames = [alias.name for alias in node.names]
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
308 elif isinstance(node, ast.ImportFrom):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
309 nodeModule = node.module or ""
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
310 moduleNames = [nodeModule]
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
311 for alias in node.names:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
312 moduleNames.append("{0}.{1}".format(nodeModule, alias.name))
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
313 else:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
314 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
315
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
316 # Sort from most to least specific paths.
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
317 moduleNames.sort(key=len, reverse=True)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
318
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
319 warned = set()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
320
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
321 for moduleName in moduleNames:
9275
1a7d545d3ef2 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9274
diff changeset
322 if self.__isModuleBanned(moduleName):
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
323 if any(mod.startswith(moduleName) for mod in warned):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
324 # Do not show an error for this line if we already showed
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
325 # a more specific error.
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
326 continue
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
327 else:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
328 warned.add(moduleName)
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
329 self.__error(node.lineno - 1, node.col_offset, "I-902", moduleName)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
330
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
331 def __checkBannedRelativeImports(self, node):
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
332 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
333 Private method to check if relative imports are banned.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
334
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
335 @param node reference to the node to be checked
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
336 @type ast.AST
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
337 """
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
338 if not self.__banRelativeImports:
10184
af82cb6e0298 Updated some codestyle checkers for imports and too complex annotations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
339 # nothing to check
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
340 return
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
341
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
342 elif self.__banRelativeImports == "parents":
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
343 minNodeLevel = 1
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
344 msgCode = "I-903"
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
345 else:
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
346 minNodeLevel = 0
11147
dee6e106b4d3 Modified the code style checker such, that the issue category and issue number are separated by a '-' to make up the issue code (e.g E-901).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 11145
diff changeset
347 msgCode = "I-904"
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
348
10186
91c3ba0767ad Updated the 'flake8-bugbear' based checker code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10184
diff changeset
349 if isinstance(node, ast.ImportFrom) and node.level > minNodeLevel:
8808
033fa34447d0 Finished implementing a checker for import statements (unnecessary alias, banned relative and banned modules).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8802
diff changeset
350 self.__error(node.lineno - 1, node.col_offset, msgCode)

eric ide

mercurial