Sat, 24 Oct 2015 20:36:26 +0200
Started to add more code style checkers.
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 | from __future__ import unicode_literals |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | import sys |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | import ast |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | import re |
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", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | "M131", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | "M801", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | "M901", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | ] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | 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
|
32 | args): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | Constructor |
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 | @param source source code to be checked (list of string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | @param filename name of the source file (string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | @param select list of selected codes (list of string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | @param ignore list of codes to be ignored (list of string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | @param expected list of expected codes (list of string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | @param repeat flag indicating to report each occurrence of a code |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | (boolean) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | @param args dictionary of arguments for the miscellaneous checks (dict) |
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 | self.__select = tuple(select) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | self.__ignore = ('',) if select else tuple(ignore) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | self.__expected = expected[:] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | self.__repeat = repeat |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | self.__filename = filename |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | self.__source = source[:] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | self.__args = args |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | self.__blindExceptRegex = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | r'(except:)') # __IGNORE_WARNING__ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | self.__pep3101FormatRegex = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | r'^(?:[^\'"]*[\'"][^\'"]*[\'"])*\s*%|^\s*%') |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | # statistics counters |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | self.counters = {} |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | # collection of detected errors |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | self.errors = [] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | checkersWithCodes = [ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | # TODO: fill this |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | (self.__checkCoding, ("M101", "M102")), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | (self.__checkCopyright, ("M111", "M112")), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | (self.__checkBlindExcept, ("M121",)), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | (self.__checkPep3101, ("M131",)), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | (self.__checkPrintStatements, ("M801",)), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | ] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | self.__defaultArgs = { |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | "CodingChecker": 'latin-1, utf-8', |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | "CopyrightChecker": { |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | "MinFilesize": 0, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | "Author": "", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | }, |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | } |
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 | self.__checkers = [] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | for checker, codes in checkersWithCodes: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | 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
|
84 | for code in codes): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | self.__checkers.append(checker) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | def __ignoreCode(self, code): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | 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
|
90 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | @param code message code to check for (string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | @return flag indicating to ignore the given code (boolean) |
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 | return (code.startswith(self.__ignore) and |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | not code.startswith(self.__select)) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | def __error(self, lineNumber, offset, code, *args): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | Private method to record an issue. |
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 | @param lineNumber line number of the issue (integer) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | @param offset position within line of the issue (integer) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | @param code message code (string) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | @param args arguments for the message (list) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | if self.__ignoreCode(code): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | if code in self.counters: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | self.counters[code] += 1 |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | self.counters[code] = 1 |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | # Don't care about expected codes |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | if code in self.__expected: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | 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
|
119 | # 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
|
120 | self.errors.append( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | (self.__filename, lineNumber + 1, offset, (code, args))) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | def __reportInvalidSyntax(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | Private method to report a syntax error. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | exc_type, exc = sys.exc_info()[:2] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | if len(exc.args) > 1: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | offset = exc.args[1] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | if len(offset) > 2: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | offset = offset[1:3] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | offset = (1, 0) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | 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
|
135 | 'M901', exc_type.__name__, exc.args[0]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | def run(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | 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
|
140 | conditions. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | if not self.__filename: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | # 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
|
144 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | if not self.__checkers: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | # 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
|
148 | return |
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 | try: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | self.__tree = compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | ''.join(self.__source), '', 'exec', ast.PyCF_ONLY_AST) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | except (SyntaxError, TypeError): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | self.__reportInvalidSyntax() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | for check in self.__checkers: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | check() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | def __checkCoding(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | 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
|
163 | encodings. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | if len(self.__source) == 0: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | encodings = [e.lower().strip() |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | for e in self.__args.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170 | "CodingChecker", self.__defaultArgs["CodingChecker"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | .split(",")] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | for lineno, line in enumerate(self.__source[:2]): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173 | matched = re.search('coding[:=]\s*([-\w.]+)', line, re.IGNORECASE) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174 | if matched: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175 | if encodings and matched.group(1).lower() not in encodings: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | self.__error(lineno, 0, "M102", matched.group(1)) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177 | break |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178 | else: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179 | self.__error(0, 0, "M101") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181 | def __checkCopyright(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183 | 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
|
184 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185 | source = "".join(self.__source) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186 | copyrightArgs = self.__args.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187 | "CopyrightChecker", self.__defaultArgs["CopyrightChecker"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188 | copyrightMinFileSize = copyrightArgs.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189 | "MinFilesize", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | self.__defaultArgs["CopyrightChecker"]["MinFilesize"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | copyrightAuthor = copyrightArgs.get( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | "Author", |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193 | self.__defaultArgs["CopyrightChecker"]["Author"]) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194 | copyrightRegexStr = \ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195 | 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
|
196 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197 | tocheck = max(1024, copyrightMinFileSize) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198 | topOfSource = source[:tocheck] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199 | if len(topOfSource) < copyrightMinFileSize: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202 | copyrightRe = re.compile(copyrightRegexStr.format(author=r".*"), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203 | re.IGNORECASE) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204 | if not copyrightRe.search(topOfSource): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205 | self.__error(0, 0, "M111") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206 | return |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | if copyrightAuthor: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | copyrightAuthorRe = re.compile( |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | copyrightRegexStr.format(author=copyrightAuthor), |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | re.IGNORECASE) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | if not copyrightAuthorRe.search(topOfSource): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | self.__error(0, 0, "M112") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215 | def __checkBlindExcept(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217 | 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
|
218 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219 | for lineno, line in enumerate(self.__source): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220 | match = self.__blindExceptRegex.search(line) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221 | if match: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222 | self.__error(lineno, match.start(), "M121") |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224 | def __checkPep3101(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226 | Private method to check for old style string formatting. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228 | for lineno, line in enumerate(self.__source): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229 | match = self.__pep3101FormatRegex.search(line) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230 | if match: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231 | lineLen = len(line) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232 | pos = line.find('%') |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233 | formatPos = pos |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234 | formatter = '%' |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235 | if line[pos + 1] == "(": |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236 | pos = line.find(")", pos) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237 | c = line[pos] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238 | while c not in "diouxXeEfFgGcrs": |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239 | pos += 1 |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240 | if pos >= lineLen: |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241 | break |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242 | c = line[pos] |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243 | if c in "diouxXeEfFgGcrs": |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244 | formatter += c |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245 | self.__error(lineno, formatPos, "M131", formatter) |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246 | |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247 | def __checkPrintStatements(self): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249 | Private method to check for print statements. |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250 | """ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251 | for node in ast.walk(self.__tree): |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252 | if (isinstance(node, ast.Call) and |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253 | getattr(node.func, 'id', None) == 'print') or \ |
57666e501a42
Started to add more code style checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254 | (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
|
255 | self.__error(node.lineno - 1, node.col_offset, "M801") |