Fri, 13 Nov 2015 22:52:26 +0100
Adjustments to future imports for Python 2 compatibility.
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3 | # Copyright (c) 2015 Detlev Offenbach <detlev@die-offenbachs.de> |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a checker for miscellaneous checks. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | import sys |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | import ast |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | import re |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
13 | import itertools |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
14 | from string import Formatter |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | class MiscellaneousChecker(object): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | Class implementing a checker for miscellaneous checks. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | Codes = [ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | "M101", "M102", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | "M111", "M112", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | "M121", |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
25 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
26 | "M601", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
27 | "M611", "M612", "M613", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
28 | "M621", "M622", "M623", "M624", "M625", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
29 | "M631", "M632", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
30 | |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
31 | "M701", "M702", |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
32 | |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | "M801", |
4507
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
34 | "M811", |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | "M901", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | ] |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
38 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
39 | Formatter = Formatter() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
40 | FormatFieldRegex = re.compile(r'^((?:\s|.)*?)(\..*|\[.*\])?$') |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | def __init__(self, source, filename, select, ignore, expected, repeat, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | args): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | Constructor |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
47 | @param source source code to be checked |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
48 | @type list of str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
49 | @param filename name of the source file |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
50 | @type str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
51 | @param select list of selected codes |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
52 | @type list of str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
53 | @param ignore list of codes to be ignored |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
54 | @type list of str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
55 | @param expected list of expected codes |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
56 | @type list of str |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | @param repeat flag indicating to report each occurrence of a code |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
58 | @type bool |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
59 | @param args dictionary of arguments for the miscellaneous checks |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
60 | @type dict |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | self.__select = tuple(select) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | self.__ignore = ('',) if select else tuple(ignore) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | self.__expected = expected[:] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | self.__repeat = repeat |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | self.__filename = filename |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | self.__source = source[:] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | self.__args = args |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | self.__blindExceptRegex = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | r'(except:)') # __IGNORE_WARNING__ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | self.__pep3101FormatRegex = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | r'^(?:[^\'"]*[\'"][^\'"]*[\'"])*\s*%|^\s*%') |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | # statistics counters |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | self.counters = {} |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | # collection of detected errors |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | self.errors = [] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | checkersWithCodes = [ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | (self.__checkCoding, ("M101", "M102")), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | (self.__checkCopyright, ("M111", "M112")), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | (self.__checkBlindExcept, ("M121",)), |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
85 | (self.__checkPep3101, ("M601",)), |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
86 | (self.__checkFormatString, ("M611", "M612", "M613", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
87 | "M621", "M622", "M623", "M624", "M625", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
88 | "M631", "M632")), |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
89 | (self.__checkFuture, ("M701", "M702")), |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | (self.__checkPrintStatements, ("M801",)), |
4507
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
91 | (self.__checkTuple, ("M811", )), |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | ] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | self.__defaultArgs = { |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | "CodingChecker": 'latin-1, utf-8', |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | "CopyrightChecker": { |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | "MinFilesize": 0, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | "Author": "", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | }, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | } |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | self.__checkers = [] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | for checker, codes in checkersWithCodes: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | if any(not (code and self.__ignoreCode(code)) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | for code in codes): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | self.__checkers.append(checker) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | def __ignoreCode(self, code): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | Private method to check if the message code should be ignored. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
112 | @param code message code to check for |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
113 | @type str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
114 | @return flag indicating to ignore the given code |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
115 | @rtype bool |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | return (code.startswith(self.__ignore) and |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | not code.startswith(self.__select)) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | def __error(self, lineNumber, offset, code, *args): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | Private method to record an issue. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
124 | @param lineNumber line number of the issue |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
125 | @type int |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
126 | @param offset position within line of the issue |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
127 | @type int |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
128 | @param code message code |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
129 | @type str |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
130 | @param args arguments for the message |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
131 | @type list |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | if self.__ignoreCode(code): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | if code in self.counters: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | self.counters[code] += 1 |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | self.counters[code] = 1 |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | # Don't care about expected codes |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | if code in self.__expected: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | if code and (self.counters[code] == 1 or self.__repeat): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | # record the issue with one based line number |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | self.errors.append( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | (self.__filename, lineNumber + 1, offset, (code, args))) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150 | def __reportInvalidSyntax(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | Private method to report a syntax error. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | exc_type, exc = sys.exc_info()[:2] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | if len(exc.args) > 1: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | offset = exc.args[1] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | if len(offset) > 2: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | offset = offset[1:3] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | offset = (1, 0) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | self.__error(offset[0] - 1, offset[1] or 0, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | 'M901', exc_type.__name__, exc.args[0]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164 | def run(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | Public method to check the given source against miscellaneous |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | conditions. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | if not self.__filename: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170 | # don't do anything, if essential data is missing |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173 | if not self.__checkers: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174 | # don't do anything, if no codes were selected |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | |
4510
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
177 | source = "".join(self.__source) |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
178 | # Check type for py2: if not str it's unicode |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
179 | if sys.version_info[0] == 2: |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
180 | try: |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
181 | source = source.encode('utf-8') |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
182 | except UnicodeError: |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
183 | pass |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184 | try: |
4510
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
185 | self.__tree = compile(source, self.__filename, 'exec', |
43437fc9f4c9
Fixed an encoding related issue in the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4509
diff
changeset
|
186 | ast.PyCF_ONLY_AST) |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187 | except (SyntaxError, TypeError): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188 | self.__reportInvalidSyntax() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | for check in self.__checkers: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | check() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193 | |
4515
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
194 | def __getCoding(self): |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
195 | """ |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
196 | Private method to get the defined coding of the source. |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
197 | |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
198 | @return tuple containing the line number and the coding |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
199 | @rtype tuple of int and str |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
200 | """ |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
201 | for lineno, line in enumerate(self.__source[:2]): |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
202 | matched = re.search('coding[:=]\s*([-\w_.]+)', line, re.IGNORECASE) |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
203 | if matched: |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
204 | return lineno, matched.group(1) |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
205 | else: |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
206 | return 0, "" |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
207 | |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | def __checkCoding(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | Private method to check the presence of a coding line and valid |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | encodings. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | if len(self.__source) == 0: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216 | encodings = [e.lower().strip() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217 | for e in self.__args.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218 | "CodingChecker", self.__defaultArgs["CodingChecker"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219 | .split(",")] |
4515
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
220 | lineno, coding = self.__getCoding() |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
221 | if coding: |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
222 | if coding.lower() not in encodings: |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
223 | self.__error(lineno, 0, "M102", coding) |
4506
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225 | self.__error(0, 0, "M101") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227 | def __checkCopyright(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229 | Private method to check the presence of a copyright statement. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231 | source = "".join(self.__source) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232 | copyrightArgs = self.__args.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233 | "CopyrightChecker", self.__defaultArgs["CopyrightChecker"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234 | copyrightMinFileSize = copyrightArgs.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235 | "MinFilesize", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236 | self.__defaultArgs["CopyrightChecker"]["MinFilesize"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237 | copyrightAuthor = copyrightArgs.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238 | "Author", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239 | self.__defaultArgs["CopyrightChecker"]["Author"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240 | copyrightRegexStr = \ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241 | r"Copyright\s+(\(C\)\s+)?(\d{{4}}\s+-\s+)?\d{{4}}\s+{author}" |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243 | tocheck = max(1024, copyrightMinFileSize) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244 | topOfSource = source[:tocheck] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245 | if len(topOfSource) < copyrightMinFileSize: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248 | copyrightRe = re.compile(copyrightRegexStr.format(author=r".*"), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249 | re.IGNORECASE) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250 | if not copyrightRe.search(topOfSource): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251 | self.__error(0, 0, "M111") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254 | if copyrightAuthor: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255 | copyrightAuthorRe = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256 | copyrightRegexStr.format(author=copyrightAuthor), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257 | re.IGNORECASE) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258 | if not copyrightAuthorRe.search(topOfSource): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259 | self.__error(0, 0, "M112") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261 | def __checkBlindExcept(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263 | Private method to check for blind except statements. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265 | for lineno, line in enumerate(self.__source): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266 | match = self.__blindExceptRegex.search(line) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267 | if match: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268 | self.__error(lineno, match.start(), "M121") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270 | def __checkPrintStatements(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272 | Private method to check for print statements. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274 | for node in ast.walk(self.__tree): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275 | if (isinstance(node, ast.Call) and |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276 | getattr(node.func, 'id', None) == 'print') or \ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
277 | (hasattr(ast, 'Print') and isinstance(node, ast.Print)): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278 | self.__error(node.lineno - 1, node.col_offset, "M801") |
4507
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
279 | |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
280 | def __checkTuple(self): |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
281 | """ |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
282 | Private method to check for one element tuples. |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
283 | """ |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
284 | for node in ast.walk(self.__tree): |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
285 | if isinstance(node, ast.Tuple) and \ |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
286 | len(node.elts) == 1: |
1a5bc1ac7c2e
Added a check for one element tuples.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4506
diff
changeset
|
287 | self.__error(node.lineno - 1, node.col_offset, "M811") |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
288 | |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
289 | def __checkFuture(self): |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
290 | """ |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
291 | Private method to check the __future__ imports. |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
292 | """ |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
293 | expectedImports = set( |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
294 | [i.strip() |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
295 | for i in self.__args.get("FutureChecker", "").split(",") |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
296 | if bool(i.strip())]) |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
297 | if len(expectedImports) == 0: |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
298 | # nothing to check for; disabling the check |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
299 | return |
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
300 | |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
301 | imports = set() |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
302 | node = None |
4540
45627d092846
Fixed the futures checker raising false psitives when a file only contains a docstring.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4515
diff
changeset
|
303 | hasCode = False |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
304 | |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
305 | for node in ast.walk(self.__tree): |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
306 | if (isinstance(node, ast.ImportFrom) and |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
307 | node.module == '__future__'): |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
308 | imports |= set(name.name for name in node.names) |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
309 | elif isinstance(node, ast.Expr): |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
310 | if not isinstance(node.value, ast.Str): |
4540
45627d092846
Fixed the futures checker raising false psitives when a file only contains a docstring.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4515
diff
changeset
|
311 | hasCode = True |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
312 | break |
4540
45627d092846
Fixed the futures checker raising false psitives when a file only contains a docstring.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4515
diff
changeset
|
313 | elif not isinstance(node, (ast.Module, ast.Str)): |
45627d092846
Fixed the futures checker raising false psitives when a file only contains a docstring.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4515
diff
changeset
|
314 | hasCode = True |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
315 | break |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
316 | |
4540
45627d092846
Fixed the futures checker raising false psitives when a file only contains a docstring.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4515
diff
changeset
|
317 | if isinstance(node, ast.Module) or not hasCode: |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
318 | return |
4508
a3b38825acf0
Added a check for __future__ imports.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4507
diff
changeset
|
319 | |
4509
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
320 | if not (imports >= expectedImports): |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
321 | if imports: |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
322 | self.__error(node.lineno - 1, node.col_offset, "M701", |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
323 | ", ".join(expectedImports), ", ".join(imports)) |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
324 | else: |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
325 | self.__error(node.lineno - 1, node.col_offset, "M702", |
7797ee4a45f9
Redid the future imports checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4508
diff
changeset
|
326 | ", ".join(expectedImports)) |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
327 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
328 | def __checkPep3101(self): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
329 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
330 | Private method to check for old style string formatting. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
331 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
332 | for lineno, line in enumerate(self.__source): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
333 | match = self.__pep3101FormatRegex.search(line) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
334 | if match: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
335 | lineLen = len(line) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
336 | pos = line.find('%') |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
337 | formatPos = pos |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
338 | formatter = '%' |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
339 | if line[pos + 1] == "(": |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
340 | pos = line.find(")", pos) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
341 | c = line[pos] |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
342 | while c not in "diouxXeEfFgGcrs": |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
343 | pos += 1 |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
344 | if pos >= lineLen: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
345 | break |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
346 | c = line[pos] |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
347 | if c in "diouxXeEfFgGcrs": |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
348 | formatter += c |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
349 | self.__error(lineno, formatPos, "M601", formatter) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
350 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
351 | def __checkFormatString(self): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
352 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
353 | Private method to check string format strings. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
354 | """ |
4515
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
355 | coding = self.__getCoding()[1] |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
356 | if not coding: |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
357 | # default to utf-8 |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
358 | coding = "utf-8" |
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
359 | |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
360 | visitor = TextVisitor() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
361 | visitor.visit(self.__tree) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
362 | for node in visitor.nodes: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
363 | text = node.s |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
364 | if sys.version_info[0] > 2 and isinstance(text, bytes): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
365 | try: |
4515
d7cebe39ffba
Some refinements to the miscellaneous checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4511
diff
changeset
|
366 | text = text.decode(coding) |
4511
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
367 | except UnicodeDecodeError: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
368 | continue |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
369 | fields, implicit, explicit = self.__getFields(text) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
370 | if implicit: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
371 | if node in visitor.calls: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
372 | self.__error(node.lineno - 1, node.col_offset, "M611") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
373 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
374 | if node.is_docstring: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
375 | self.__error(node.lineno - 1, node.col_offset, "M612") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
376 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
377 | self.__error(node.lineno - 1, node.col_offset, "M613") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
378 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
379 | if node in visitor.calls: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
380 | call, strArgs = visitor.calls[node] |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
381 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
382 | numbers = set() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
383 | names = set() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
384 | # Determine which fields require a keyword and which an arg |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
385 | for name in fields: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
386 | fieldMatch = self.FormatFieldRegex.match(name) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
387 | try: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
388 | number = int(fieldMatch.group(1)) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
389 | except ValueError: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
390 | number = -1 |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
391 | # negative numbers are considered keywords |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
392 | if number >= 0: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
393 | numbers.add(number) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
394 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
395 | names.add(fieldMatch.group(1)) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
396 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
397 | keywords = set(keyword.arg for keyword in call.keywords) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
398 | numArgs = len(call.args) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
399 | if strArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
400 | numArgs -= 1 |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
401 | if sys.version_info < (3, 5): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
402 | hasKwArgs = bool(call.kwargs) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
403 | hasStarArgs = bool(call.starargs) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
404 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
405 | hasKwArgs = any(kw.arg is None for kw in call.keywords) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
406 | hasStarArgs = sum(1 for arg in call.args |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
407 | if isinstance(arg, ast.Starred)) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
408 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
409 | if hasKwArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
410 | keywords.discard(None) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
411 | if hasStarArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
412 | numArgs -= 1 |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
413 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
414 | # if starargs or kwargs is not None, it can't count the |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
415 | # parameters but at least check if the args are used |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
416 | if hasKwArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
417 | if not names: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
418 | # No names but kwargs |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
419 | self.__error(call.lineno - 1, call.col_offset, "M623") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
420 | if hasStarArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
421 | if not numbers: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
422 | # No numbers but args |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
423 | self.__error(call.lineno - 1, call.col_offset, "M624") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
424 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
425 | if not hasKwArgs and not hasStarArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
426 | # can actually verify numbers and names |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
427 | for number in sorted(numbers): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
428 | if number >= numArgs: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
429 | self.__error(call.lineno - 1, call.col_offset, |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
430 | "M621", number) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
431 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
432 | for name in sorted(names): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
433 | if name not in keywords: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
434 | self.__error(call.lineno - 1, call.col_offset, |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
435 | "M622", name) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
436 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
437 | for arg in range(numArgs): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
438 | if arg not in numbers: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
439 | self.__error(call.lineno - 1, call.col_offset, "M631", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
440 | arg) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
441 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
442 | for keyword in keywords: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
443 | if keyword not in names: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
444 | self.__error(call.lineno - 1, call.col_offset, "M632", |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
445 | keyword) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
446 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
447 | if implicit and explicit: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
448 | self.__error(call.lineno - 1, call.col_offset, "M625") |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
449 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
450 | def __getFields(self, string): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
451 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
452 | Private method to extract the format field information. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
453 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
454 | @param string format string to be parsed |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
455 | @type str |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
456 | @return format field information as a tuple with fields, implicit |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
457 | field definitions present and explicit field definitions present |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
458 | @rtype tuple of set of str, bool, bool |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
459 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
460 | fields = set() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
461 | cnt = itertools.count() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
462 | implicit = False |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
463 | explicit = False |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
464 | try: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
465 | for literal, field, spec, conv in self.Formatter.parse(string): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
466 | if field is not None and (conv is None or conv in 'rsa'): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
467 | if not field: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
468 | field = str(next(cnt)) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
469 | implicit = True |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
470 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
471 | explicit = True |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
472 | fields.add(field) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
473 | fields.update(parsedSpec[1] |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
474 | for parsedSpec in self.Formatter.parse(spec) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
475 | if parsedSpec[1] is not None) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
476 | except ValueError: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
477 | return set(), False, False |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
478 | else: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
479 | return fields, implicit, explicit |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
480 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
481 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
482 | class TextVisitor(ast.NodeVisitor): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
483 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
484 | Class implementing a node visitor for bytes and str instances. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
485 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
486 | It tries to detect docstrings as string of the first expression of each |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
487 | module, class or function. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
488 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
489 | # modelled after the string format flake8 extension |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
490 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
491 | def __init__(self): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
492 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
493 | Constructor |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
494 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
495 | super(TextVisitor, self).__init__() |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
496 | self.nodes = [] |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
497 | self.calls = {} |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
498 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
499 | def __addNode(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
500 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
501 | Private method to add a node to our list of nodes. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
502 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
503 | @param node reference to the node to add |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
504 | @type ast.AST |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
505 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
506 | if not hasattr(node, 'is_docstring'): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
507 | node.is_docstring = False |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
508 | self.nodes.append(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
509 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
510 | def __isBaseString(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
511 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
512 | Private method to determine, if a node is a base string node. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
513 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
514 | @param node reference to the node to check |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
515 | @type ast.AST |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
516 | @return flag indicating a base string |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
517 | @rtype bool |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
518 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
519 | typ = (ast.Str,) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
520 | if sys.version_info[0] > 2: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
521 | typ += (ast.Bytes,) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
522 | return isinstance(node, typ) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
523 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
524 | def visit_Str(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
525 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
526 | Public method to record a string node. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
527 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
528 | @param node reference to the string node |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
529 | @type ast.Str |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
530 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
531 | self.__addNode(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
532 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
533 | def visit_Bytes(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
534 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
535 | Public method to record a bytes node. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
536 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
537 | @param node reference to the bytes node |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
538 | @type ast.Bytes |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
539 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
540 | self.__addNode(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
541 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
542 | def __visitDefinition(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
543 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
544 | Private method handling class and function definitions. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
545 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
546 | @param node reference to the node to handle |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
547 | @type ast.FunctionDef or ast.ClassDef |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
548 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
549 | # Manually traverse class or function definition |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
550 | # * Handle decorators normally |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
551 | # * Use special check for body content |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
552 | # * Don't handle the rest (e.g. bases) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
553 | for decorator in node.decorator_list: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
554 | self.visit(decorator) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
555 | self.__visitBody(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
556 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
557 | def __visitBody(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
558 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
559 | Private method to traverse the body of the node manually. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
560 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
561 | If the first node is an expression which contains a string or bytes it |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
562 | marks that as a docstring. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
563 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
564 | @param node reference to the node to traverse |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
565 | @type ast.AST |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
566 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
567 | if (node.body and isinstance(node.body[0], ast.Expr) and |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
568 | self.__isBaseString(node.body[0].value)): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
569 | node.body[0].value.is_docstring = True |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
570 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
571 | for subnode in node.body: |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
572 | self.visit(subnode) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
573 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
574 | def visit_Module(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
575 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
576 | Public method to handle a module. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
577 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
578 | @param node reference to the node to handle |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
579 | @type ast.Module |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
580 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
581 | self.__visitBody(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
582 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
583 | def visit_ClassDef(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
584 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
585 | Public method to handle a class definition. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
586 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
587 | @param node reference to the node to handle |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
588 | @type ast.ClassDef |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
589 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
590 | # Skipped nodes: ('name', 'bases', 'keywords', 'starargs', 'kwargs') |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
591 | self.__visitDefinition(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
592 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
593 | def visit_FunctionDef(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
594 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
595 | Public method to handle a function definition. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
596 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
597 | @param node reference to the node to handle |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
598 | @type ast.FunctionDef |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
599 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
600 | # Skipped nodes: ('name', 'args', 'returns') |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
601 | self.__visitDefinition(node) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
602 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
603 | def visit_Call(self, node): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
604 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
605 | Public method to handle a function call. |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
606 | |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
607 | @param node reference to the node to handle |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
608 | @type ast.Call |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
609 | """ |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
610 | if (isinstance(node.func, ast.Attribute) and |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
611 | node.func.attr == 'format'): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
612 | if self.__isBaseString(node.func.value): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
613 | self.calls[node.func.value] = (node, False) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
614 | elif (isinstance(node.func.value, ast.Name) and |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
615 | node.func.value.id == 'str' and node.args and |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
616 | self.__isBaseString(node.args[0])): |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
617 | self.calls[node.args[0]] = (node, True) |
b5e4e7efa904
Added a checker for string format strings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4510
diff
changeset
|
618 | super(TextVisitor, self).generic_visit(node) |
4555
861e1741985c
Adjustments to future imports for Python 2 compatibility.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
4540
diff
changeset
|
619 | |
861e1741985c
Adjustments to future imports for Python 2 compatibility.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
4540
diff
changeset
|
620 | # |
861e1741985c
Adjustments to future imports for Python 2 compatibility.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
4540
diff
changeset
|
621 | # eflag: noqa = M702 |