Sat, 27 Jun 2020 12:08:12 +0200
Removed some more Python2 related code.
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
7360
9190402e4505
Updated copyright for 2020.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
3 | # Copyright (c) 2015 - 2020 Detlev Offenbach <detlev@die-offenbachs.de> |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a checker for code complexity. |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | import sys |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | import ast |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | from mccabe import PathGraphingAstVisitor |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
16 | class ComplexityChecker(object): |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | """ |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
18 | Class implementing a checker for code complexity. |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | Codes = [ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | "C101", |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
22 | "C111", "C112", |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | "C901", |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | ] |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
27 | def __init__(self, source, filename, select, ignore, args): |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | Constructor |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | @param source source code to be checked |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | @type list of str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | @param filename name of the source file |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | @type str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | @param select list of selected codes |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | @type list of str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | @param ignore list of codes to be ignored |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | @type list of str |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
39 | @param args dictionary of arguments for the miscellaneous checks |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
40 | @type dict |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | self.__filename = filename |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | self.__source = source[:] |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | self.__select = tuple(select) |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | self.__ignore = ('',) if select else tuple(ignore) |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
46 | self.__args = args |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
47 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
48 | self.__defaultArgs = { |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
49 | "McCabeComplexity": 10, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
50 | "LineComplexity": 15, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
51 | "LineComplexityScore": 10, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
52 | } |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | # statistics counters |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | self.counters = {} |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | # collection of detected errors |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | self.errors = [] |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
59 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
60 | checkersWithCodes = [ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
61 | (self.__checkMcCabeComplexity, ("C101",)), |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
62 | (self.__checkLineComplexity, ("C111", "C112")), |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
63 | ] |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
64 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
65 | self.__checkers = [] |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
66 | for checker, codes in checkersWithCodes: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
67 | if any(not (code and self.__ignoreCode(code)) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
68 | for code in codes): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
69 | self.__checkers.append(checker) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
70 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
71 | def __ignoreCode(self, code): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
72 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
73 | Private method to check if the message code should be ignored. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
74 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
75 | @param code message code to check for |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
76 | @type str |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
77 | @return flag indicating to ignore the given code |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
78 | @rtype bool |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
79 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
80 | return (code.startswith(self.__ignore) and |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
81 | not code.startswith(self.__select)) |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | def __error(self, lineNumber, offset, code, *args): |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | Private method to record an issue. |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | @param lineNumber line number of the issue |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | @type int |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | @param offset position within line of the issue |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | @type int |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | @param code message code |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | @type str |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | @param args arguments for the message |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | @type list |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | """ |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
96 | if self.__ignoreCode(code): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
97 | return |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
98 | |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | if code in self.counters: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | self.counters[code] += 1 |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | else: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | self.counters[code] = 1 |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | if code: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | # record the issue with one based line number |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | self.errors.append( |
7610
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
107 | { |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
108 | "file": self.__filename, |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
109 | "line": lineNumber, |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
110 | "offset": offset, |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
111 | "code": code, |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
112 | "args": args, |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
113 | } |
df7025fe26a3
Code Style Checker: reworked the API between frontend and backend to get some more flexibility for the future.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
114 | ) |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | def __reportInvalidSyntax(self): |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | Private method to report a syntax error. |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | exc_type, exc = sys.exc_info()[:2] |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | if len(exc.args) > 1: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | offset = exc.args[1] |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | if len(offset) > 2: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | offset = offset[1:3] |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | else: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | offset = (1, 0) |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | self.__error(offset[0] - 1, offset[1] or 0, |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | 'C901', exc_type.__name__, exc.args[0]) |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | def run(self): |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | Public method to check the given source for code complexity. |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | """ |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | if not self.__filename or not self.__source: |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | # don't do anything, if essential data is missing |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | return |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
138 | if not self.__checkers: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
139 | # don't do anything, if no codes were selected |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | return |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | try: |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
143 | self.__tree = compile(''.join(self.__source), self.__filename, |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
144 | 'exec', ast.PyCF_ONLY_AST) |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | except (SyntaxError, TypeError): |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | self.__reportInvalidSyntax() |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | return |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
149 | for check in self.__checkers: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
150 | check() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
151 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
152 | def __checkMcCabeComplexity(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
153 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
154 | Private method to check the McCabe code complexity. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
155 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
156 | try: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
157 | # create the AST again because it is modified by the checker |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
158 | tree = compile(''.join(self.__source), self.__filename, 'exec', |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
159 | ast.PyCF_ONLY_AST) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
160 | except (SyntaxError, TypeError): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
161 | # compile errors are already reported by the run() method |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
162 | return |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
163 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
164 | maxComplexity = self.__args.get("McCabeComplexity", |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
165 | self.__defaultArgs["McCabeComplexity"]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
166 | |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | visitor = PathGraphingAstVisitor() |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | visitor.preorder(tree, visitor) |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | for graph in visitor.graphs.values(): |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
170 | if graph.complexity() > maxComplexity: |
4423
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | self.__error(graph.lineno, 0, "C101", |
14f3ca3dcef6
Added a code complexity checker iaw. McCabe to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | graph.entity, graph.complexity()) |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
173 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
174 | def __checkLineComplexity(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
175 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
176 | Private method to check the complexity of a single line of code and |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
177 | the median line complexity of the source code. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
178 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
179 | Complexity is defined as the number of AST nodes produced by a line |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
180 | of code. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
181 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
182 | maxLineComplexity = self.__args.get( |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
183 | "LineComplexity", self.__defaultArgs["LineComplexity"]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
184 | maxLineComplexityScore = self.__args.get( |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
185 | "LineComplexityScore", self.__defaultArgs["LineComplexityScore"]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
186 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
187 | visitor = LineComplexityVisitor() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
188 | visitor.visit(self.__tree) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
189 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
190 | sortedItems = visitor.sortedList() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
191 | score = visitor.score() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
192 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
193 | for line, complexity in sortedItems: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
194 | if complexity > maxLineComplexity: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
195 | self.__error(line, 0, "C111", complexity) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
196 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
197 | if score > maxLineComplexityScore: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
198 | self.__error(0, 0, "C112", score) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
199 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
200 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
201 | class LineComplexityVisitor(ast.NodeVisitor): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
202 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
203 | Class calculating the number of AST nodes per line of code |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
204 | and the median nodes/line score. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
205 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
206 | def __init__(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
207 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
208 | Constructor |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
209 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
210 | super(LineComplexityVisitor, self).__init__() |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
211 | self.__count = {} |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
212 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
213 | def visit(self, node): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
214 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
215 | Public method to recursively visit all the nodes and add up the |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
216 | instructions. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
217 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
218 | @param node reference to the node |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
219 | @type ast.AST |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
220 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
221 | if hasattr(node, 'lineno'): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
222 | self.__count[node.lineno] = self.__count.get(node.lineno, 0) + 1 |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
223 | self.generic_visit(node) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
224 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
225 | def sortedList(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
226 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
227 | Public method to get a sorted list of (line, nodes) tuples. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
228 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
229 | @return sorted list of (line, nodes) tuples |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
230 | @rtype list of tuple of (int,int) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
231 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
232 | lst = [(line, self.__count[line]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
233 | for line in sorted(self.__count.keys())] |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
234 | return lst |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
235 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
236 | def score(self): |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
237 | """ |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
238 | Public method to calculate the median. |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
239 | |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
240 | @return median line complexity value |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
241 | @rtype float |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
242 | """ |
5671
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
243 | lst = self.__count.values() |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
244 | sortedList = sorted(lst) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
245 | listLength = len(lst) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
246 | medianIndex = (listLength - 1) // 2 |
5671
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
247 | |
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
248 | if listLength == 0: |
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
249 | return 0.0 |
47cc72334684
Fixed an issue with the complexity checker causing it to crash.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5661
diff
changeset
|
250 | elif (listLength % 2): |
5661
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
251 | return float(sortedList[medianIndex]) |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
252 | else: |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
253 | return ( |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
254 | (sortedList[medianIndex] + sortedList[medianIndex + 1]) / 2.0 |
ae4f5cdc3d00
Added a line complexity checker to the code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
5389
diff
changeset
|
255 | ) |