src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/NameOrder/NameOrderChecker.py

Sat, 23 Dec 2023 15:48:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 23 Dec 2023 15:48:12 +0100
branch
eric7
changeset 10439
21c28b0f9e41
parent 10169
0f70a4ef4592
child 11090
f5f5f5803935
permissions
-rw-r--r--

Updated copyright for 2024.

10046
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
35b27af462ef 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: 10169
diff changeset
3 # Copyright (c) 2021 - 2024 Detlev Offenbach <detlev@die-offenbachs.de>
10046
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a checker for import statements.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import ast
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import copy
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import re
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 class NameOrderChecker:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 Class implementing a checker for name ordering.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 Note: Name ordering is checked for import statements, the '__all__' statement
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 and exception names of exception handlers.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Codes = [
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 ## Imports order
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 "NO101",
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 "NO102",
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 "NO103",
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 "NO104",
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 "NO105",
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 ]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 def __init__(self, source, filename, tree, select, ignore, expected, repeat, args):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 Constructor
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @param source source code to be checked
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param filename name of the source file
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @param tree AST tree of the source code
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @type ast.Module
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @param select list of selected codes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @param ignore list of codes to be ignored
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param expected list of expected codes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @param repeat flag indicating to report each occurrence of a code
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @type bool
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 @param args dictionary of arguments for the various checks
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 @type dict
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 self.__select = tuple(select)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.__ignore = ("",) if select else tuple(ignore)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__expected = expected[:]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.__repeat = repeat
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 self.__filename = filename
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__source = source[:]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.__tree = copy.deepcopy(tree)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.__args = args
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 # parameters for import sorting
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 if args["SortOrder"] == "native":
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.__sortingFunction = sorted
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 else:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 # naturally is the default sort order
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 self.__sortingFunction = self.__naturally
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 self.__sortCaseSensitive = args["SortCaseSensitive"]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 # statistics counters
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.counters = {}
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 # collection of detected errors
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.errors = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 checkersWithCodes = [
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 (self.__checkNameOrder, ("NO101", "NO102", "NO103", "NO104", "NO105")),
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 ]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 self.__checkers = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 for checker, codes in checkersWithCodes:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 if any(not (code and self.__ignoreCode(code)) for code in codes):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 self.__checkers.append(checker)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 def __ignoreCode(self, code):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 Private method to check if the message code should be ignored.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 @param code message code to check for
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 @return flag indicating to ignore the given code
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @rtype bool
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 return code.startswith(self.__ignore) and not code.startswith(self.__select)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 def __error(self, lineNumber, offset, code, *args):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 Private method to record an issue.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 @param lineNumber line number of the issue
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @type int
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 @param offset position within line of the issue
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 @type int
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 @param code message code
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 @param args arguments for the message
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 @type list
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 if self.__ignoreCode(code):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 return
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 if code in self.counters:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 self.counters[code] += 1
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 else:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 self.counters[code] = 1
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 # Don't care about expected codes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 if code in self.__expected:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 return
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 if code and (self.counters[code] == 1 or self.__repeat):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 # record the issue with one based line number
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 self.errors.append(
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 {
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 "file": self.__filename,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 "line": lineNumber + 1,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 "offset": offset,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 "code": code,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 "args": args,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 }
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 )
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 def run(self):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 Public method to check the given source against miscellaneous
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 conditions.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 if not self.__filename:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 # don't do anything, if essential data is missing
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 return
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 if not self.__checkers:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 # don't do anything, if no codes were selected
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 return
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 for check in self.__checkers:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 check()
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 #######################################################################
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 ## Name Order
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 ##
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 ## adapted from: flake8-alphabetize v0.0.21
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 #######################################################################
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 def __checkNameOrder(self):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 """
10052
041d0785dd42 Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10046
diff changeset
157 Private method to check the order of import statements and handled exceptions.
10046
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 from .ImportNode import ImportNode
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 errors = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 imports = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 importNodes, aListNode, eListNodes = self.__findNodes(self.__tree)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 # check for an error in '__all__'
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 allError = self.__findErrorInAll(aListNode)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 if allError is not None:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 errors.append(allError)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 errors.extend(self.__findExceptionListErrors(eListNodes))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 for importNode in importNodes:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 if isinstance(importNode, ast.Import) and len(importNode.names) > 1:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 # skip suck imports because its already handled by pycodestyle
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 continue
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 imports.append(
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 ImportNode(
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 self.__args.get("ApplicationPackageNames", []),
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 importNode,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 self,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 self.__args.get("SortIgnoringStyle", False),
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 self.__args.get("SortFromFirst", False),
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 )
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 )
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 lenImports = len(imports)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 if lenImports > 0:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 p = imports[0]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 if p.error is not None:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 errors.append(p.error)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 if lenImports > 1:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 for n in imports[1:]:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 if n.error is not None:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 errors.append(n.error)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 if n == p:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 if self.__args.get("CombinedAsImports", False) or (
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 not n.asImport and not p.asImport
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 ):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 errors.append((n.node, "NO103", str(p), str(n)))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 elif n < p:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 errors.append((n.node, "NO101", str(n), str(p)))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 p = n
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 for error in errors:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 if not self.__ignoreCode(error[1]):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 node = error[0]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 reason = error[1]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 args = error[2:]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 self.__error(node.lineno - 1, node.col_offset, reason, *args)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 def __findExceptionListNodes(self, tree):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 Private method to find all exception types handled by given tree.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 @param tree reference to the ast node tree to be parsed
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 @type ast.AST
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 @return list of exception types
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 @rtype list of ast.Name
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 nodes = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 for node in ast.walk(tree):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 if isinstance(node, ast.ExceptHandler):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 nodeType = node.type
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 if isinstance(nodeType, (ast.List, ast.Tuple)):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 nodes.append(nodeType)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 return nodes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 def __findNodes(self, tree):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 Private method to find all import and import from nodes of the given
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 tree.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 @param tree reference to the ast node tree to be parsed
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 @type ast.AST
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 @return tuple containing a list of import nodes, the '__all__' node and
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 exception nodes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 @rtype tuple of (ast.Import | ast.ImportFrom, ast.List | ast.Tuple,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 ast.List | ast.Tuple)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 importNodes = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 aListNode = None
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 eListNodes = self.__findExceptionListNodes(tree)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 if isinstance(tree, ast.Module):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 body = tree.body
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 for n in body:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 if isinstance(n, (ast.Import, ast.ImportFrom)):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 importNodes.append(n)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 elif isinstance(n, ast.Assign):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 for t in n.targets:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 if isinstance(t, ast.Name) and t.id == "__all__":
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 value = n.value
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 if isinstance(value, (ast.List, ast.Tuple)):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 aListNode = value
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 return importNodes, aListNode, eListNodes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 def __findErrorInAll(self, node):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 Private method to check the '__all__' node for errors.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 @param node reference to the '__all__' node
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 @type ast.List or ast.Tuple
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 @return tuple containing a reference to the node an error code and the error
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 arguments
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 @rtype tuple of (ast.List | ast.Tuple, str, str)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 if node is not None:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 actualList = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 for el in node.elts:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 if isinstance(el, ast.Constant):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 actualList.append(el.value)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 else:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 # Can't handle anything that isn't a string literal
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 return None
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 expectedList = self.sorted(
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 actualList,
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 key=lambda k: self.moduleKey(k, subImports=True),
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 )
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 if expectedList != actualList:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 return (node, "NO104", ", ".join(expectedList))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 return None
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 def __findExceptionListStr(self, node):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 Private method to get the exception name out of an exception handler type node.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 @param node node to be treated
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 @type ast.Name or ast.Attribute
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 @return string containing the exception name
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302 @rtype str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 if isinstance(node, ast.Name):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 return node.id
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 elif isinstance(node, ast.Attribute):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 return f"{self.__findExceptionListStr(node.value)}.{node.attr}"
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 return ""
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 def __findExceptionListErrors(self, nodes):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 Private method to check the exception node for errors.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 @param nodes list of exception nodes
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 @type list of ast.List or ast.Tuple
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 @return DESCRIPTION
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 @rtype TYPE
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 errors = []
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 for node in nodes:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 actualList = [self.__findExceptionListStr(elt) for elt in node.elts]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 expectedList = self.sorted(actualList)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 if expectedList != actualList:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 errors.append((node, "NO105", ", ".join(expectedList)))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329 return errors
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 def sorted(self, toSort, key=None, reverse=False):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 Public method to sort the given list of names.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 @param toSort list of names to be sorted
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 @param key function to generate keys (defaults to None)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 @type function (optional)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 @param reverse flag indicating a reverse sort (defaults to False)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 @type bool (optional)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 @return sorted list of names
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 @rtype list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 return self.__sortingFunction(toSort, key=key, reverse=reverse)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 def __naturally(self, toSort, key=None, reverse=False):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 Private method to sort the given list of names naturally.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 Note: Natural sorting maintains the sort order of numbers (i.e.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 [Q1, Q10, Q2] is sorted as [Q1, Q2, Q10] while the Python
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 standard sort would yield [Q1, Q10, Q2].
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 @param toSort list of names to be sorted
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 @type list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 @param key function to generate keys (defaults to None)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 @type function (optional)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 @param reverse flag indicating a reverse sort (defaults to False)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 @type bool (optional)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 @return sorted list of names
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 @rtype list of str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 if key is None:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 keyCallback = self.__naturalKeys
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 else:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 def keyCallback(text):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 return self.__naturalKeys(key(text))
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 return sorted(toSort, key=keyCallback, reverse=reverse)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 def __atoi(self, text):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 Private method to convert the given text to an integer number.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 @param text text to be converted
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 @return integer number
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 @rtype int
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 return int(text) if text.isdigit() else text
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 def __naturalKeys(self, text):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 Private method to generate keys for natural sorting.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 @param text text to generate a key for
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 @return key for natural sorting
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390 @rtype list of str or int
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 return [self.__atoi(c) for c in re.split(r"(\d+)", text)]
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 def moduleKey(self, moduleName, subImports=False):
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 Public method to generate a key for the given module name.
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 @param moduleName module name
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 @type str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 @param subImports flag indicating a sub import like in
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 'from foo import bar, baz' (defaults to False)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 @type bool (optional)
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 @return generated key
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 @rtype str
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 """
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 prefix = ""
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 if subImports:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 if moduleName.isupper() and len(moduleName) > 1:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 prefix = "A"
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 elif moduleName[0:1].isupper():
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 prefix = "B"
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 else:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 prefix = "C"
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 if not self.__sortCaseSensitive:
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 moduleName = moduleName.lower()
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417
35b27af462ef Code Style Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418 return f"{prefix}{moduleName}"

eric ide

mercurial