Tue, 06 Oct 2015 20:01:23 +0200
Patched the included vulture.py to support the @pyqtSlot() decorator.
1
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | #! /usr/bin/env python |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | # -*- coding: utf-8 -*- |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # vulture - Find dead code. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | # Copyright (C) 2012-2015 Jendrik Seipp (jendrikseipp@web.de) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | # This program is free software: you can redistribute it and/or modify |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | # it under the terms of the GNU General Public License as published by |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10 | # the Free Software Foundation, either version 3 of the License, or |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11 | # (at your option) any later version. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | # This program is distributed in the hope that it will be useful, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | # GNU General Public License for more details. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | # You should have received a copy of the GNU General Public License |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | # |
7
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
21 | # |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
22 | # |
1
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | # Patched to support the Python 3.5 async functionality. |
7
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
24 | # Patched to support PyQt's @pyqtSlot decorator to consider slots as |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
25 | # always used. |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
26 | # Patches: Copyright (C) 2015 Detlev Offenbach <detlev@die-offenbachs.de> |
1
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | # |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | from __future__ import print_function |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | import ast |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | from fnmatch import fnmatchcase |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | import optparse |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | import os |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | import re |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | import sys |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | __version__ = '0.8.1-p1' |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | # Parse variable names in template strings. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | FORMAT_STRING_PATTERNS = [re.compile(r'\%\((\w+)\)'), re.compile(r'{(\w+)}')] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | def _ignore_function(name): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | return ((name.startswith('__') and name.endswith('__')) or |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | name.startswith('test_')) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | class Item(str): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50 | def __new__(cls, name, typ, file, lineno): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | item = str.__new__(cls, name) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | item.typ = typ |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | item.file = file |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | item.lineno = lineno |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | return item |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | class Vulture(ast.NodeVisitor): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | """Find dead stuff.""" |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | def __init__(self, exclude=None, verbose=False): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | self.exclude = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | for pattern in exclude or []: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | if not any(char in pattern for char in ['*', '?', '[']): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | pattern = '*%s*' % pattern |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | self.exclude.append(pattern) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | self.verbose = verbose |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | self.defined_attrs = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | self.defined_funcs = [] |
7
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
71 | self.defined_slots = [] # @pyqtSlot support |
1
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | self.defined_props = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | self.defined_vars = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | self.used_attrs = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | self.used_vars = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | self.tuple_assign_vars = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | self.names_imported_as_aliases = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | self.file = '' |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | self.code = None |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | def scan(self, node_string): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | self.code = node_string.splitlines() |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | node = ast.parse(node_string, filename=self.file) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | self.visit(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | def _get_modules(self, paths, toplevel=True): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | """Take files from the command line even if they don't end with .py.""" |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | modules = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | for path in paths: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | path = os.path.abspath(path) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | if os.path.isfile(path) and (path.endswith('.py') or toplevel): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | modules.append(path) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | elif os.path.isdir(path): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | subpaths = [os.path.join(path, filename) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | for filename in sorted(os.listdir(path))] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | modules.extend(self._get_modules(subpaths, toplevel=False)) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | elif toplevel: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | sys.exit('Error: %s could not be found.' % path) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | return modules |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | def scavenge(self, paths): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | modules = self._get_modules(paths) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | included_modules = [] |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | for module in modules: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | if any(fnmatchcase(module, pattern) for pattern in self.exclude): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | self.log('Excluded:', module) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | else: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | included_modules.append(module) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | for module in included_modules: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | self.log('Scanning:', module) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | with open(module) as f: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | module_string = f.read() |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | self.file = module |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | self.scan(module_string) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | def report(self): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | def file_lineno(item): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | return (item.file.lower(), item.lineno) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | unused_item_found = False |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | for item in sorted(self.unused_funcs + self.unused_props + |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | self.unused_vars + self.unused_attrs, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124 | key=file_lineno): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125 | relpath = os.path.relpath(item.file) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126 | path = relpath if not relpath.startswith('..') else item.file |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127 | print("%s:%d: Unused %s '%s'" % (path, item.lineno, item.typ, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128 | item)) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129 | unused_item_found = True |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130 | return unused_item_found |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132 | def get_unused(self, defined, used): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133 | return list(sorted(set(defined) - set(used), key=lambda x: x.lower())) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135 | @property |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136 | def unused_funcs(self): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137 | return self.get_unused( |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138 | self.defined_funcs, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139 | self.used_attrs + self.used_vars + self.names_imported_as_aliases) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141 | @property |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142 | def unused_props(self): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143 | return self.get_unused(self.defined_props, self.used_attrs) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145 | @property |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146 | def unused_vars(self): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147 | return self.get_unused( |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148 | self.defined_vars, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149 | self.used_attrs + self.used_vars + self.tuple_assign_vars + |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150 | self.names_imported_as_aliases) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152 | @property |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153 | def unused_attrs(self): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154 | return self.get_unused(self.defined_attrs, self.used_attrs) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156 | def _get_lineno(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157 | return getattr(node, 'lineno', 1) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159 | def _get_line(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160 | return self.code[self._get_lineno(node) - 1] if self.code else '' |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162 | def _get_item(self, node, typ): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163 | name = getattr(node, 'name', None) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164 | id = getattr(node, 'id', None) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165 | attr = getattr(node, 'attr', None) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166 | assert len([x for x in (name, id, attr) if x is not None]) == 1 |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167 | return Item(name or id or attr, typ, self.file, node.lineno) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169 | def log(self, *args): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170 | if self.verbose: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171 | print(*args) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173 | def print_node(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174 | # Only create the strings, if we'll also print them. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175 | if self.verbose: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176 | self.log( |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177 | self._get_lineno(node), ast.dump(node), self._get_line(node)) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179 | def visit_FunctionDef(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180 | for decorator in node.decorator_list: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181 | if getattr(decorator, 'id', None) == 'property': |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182 | self.defined_props.append(self._get_item(node, 'property')) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183 | break |
7
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
184 | elif getattr(decorator, 'func', None) is not None: |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
185 | # @pyqtSlot support |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
186 | if getattr(getattr(decorator, 'func'), 'id') == 'pyqtSlot': |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
187 | self.defined_slots.append(self._get_item(node, 'slot')) |
a1a6ff3e5486
Patched the included vulture.py to support the @pyqtSlot() decorator.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
1
diff
changeset
|
188 | break |
1
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189 | else: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190 | # Function is not a property. |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191 | if not _ignore_function(node.name): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192 | self.defined_funcs.append(self._get_item(node, 'function')) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194 | visit_AsyncFunctionDef = visit_FunctionDef |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196 | def visit_Attribute(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197 | item = self._get_item(node, 'attribute') |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198 | if isinstance(node.ctx, ast.Store): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199 | self.log('defined_attrs <-', item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200 | self.defined_attrs.append(item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201 | elif isinstance(node.ctx, ast.Load): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202 | self.log('used_attrs <-', item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203 | self.used_attrs.append(item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205 | def visit_Name(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206 | if node.id != 'object': |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207 | if isinstance(node.ctx, ast.Load): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208 | self.log('used_vars <-', node.id) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209 | self.used_vars.append(node.id) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210 | elif isinstance(node.ctx, ast.Store): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211 | # Ignore _x (pylint convention), __x, __x__ (special method). |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212 | if not node.id.startswith('_'): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213 | item = self._get_item(node, 'variable') |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214 | self.log('defined_vars <-', item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215 | self.defined_vars.append(item) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217 | def visit_Import(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218 | self._add_aliases(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220 | def visit_ImportFrom(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221 | self._add_aliases(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223 | def _add_aliases(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224 | assert isinstance(node, (ast.Import, ast.ImportFrom)) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225 | for name_and_alias in node.names: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226 | alias = name_and_alias.asname |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227 | if alias is not None: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228 | name = name_and_alias.name |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229 | self.log('names_imported_as_aliases <- %s' % name) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230 | self.names_imported_as_aliases.append(name) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232 | def _find_tuple_assigns(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233 | # Find all tuple assignments. Those have the form |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234 | # Assign->Tuple->Name or For->Tuple->Name or comprehension->Tuple->Name |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235 | for child in ast.iter_child_nodes(node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236 | if not isinstance(child, ast.Tuple): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237 | continue |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238 | for grandchild in ast.walk(child): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239 | if (isinstance(grandchild, ast.Name) and |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240 | isinstance(grandchild.ctx, ast.Store)): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241 | self.log('tuple_assign_vars <-', grandchild.id) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242 | self.tuple_assign_vars.append(grandchild.id) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244 | def visit_Assign(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245 | self._find_tuple_assigns(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247 | def visit_For(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248 | self._find_tuple_assigns(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250 | visit_AsyncFor = visit_For |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252 | def visit_comprehension(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253 | self._find_tuple_assigns(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255 | def visit_ClassDef(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256 | self.defined_funcs.append(self._get_item(node, 'class')) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258 | def visit_Str(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259 | """ |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260 | Variables may appear in format strings: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262 | '%(my_var)s' % locals() |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263 | '{my_var}'.format(**locals()) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265 | """ |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266 | for pattern in FORMAT_STRING_PATTERNS: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267 | self.used_vars.extend(pattern.findall(node.s)) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269 | def visit(self, node): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270 | method = 'visit_' + node.__class__.__name__ |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271 | visitor = getattr(self, method, None) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272 | if visitor is not None: |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273 | self.print_node(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274 | visitor(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275 | return self.generic_visit(node) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
277 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278 | def parse_args(): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
279 | def csv(option, opt, value, parser): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
280 | setattr(parser.values, option.dest, value.split(',')) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
281 | usage = 'usage: %prog [options] PATH [PATH ...]' |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
282 | parser = optparse.OptionParser(usage=usage) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283 | parser.add_option('--exclude', action='callback', callback=csv, |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284 | type='string', default=[], |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285 | help='Comma-separated list of filename patterns to ' |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286 | 'exclude (e.g. svn,external).') |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
287 | parser.add_option('-v', '--verbose', action='store_true') |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
288 | options, args = parser.parse_args() |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289 | return options, args |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
290 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
291 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
292 | def main(): |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
293 | options, args = parse_args() |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
294 | vulture = Vulture(exclude=options.exclude, verbose=options.verbose) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
295 | vulture.scavenge(args) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
296 | sys.exit(vulture.report()) |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
298 | |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299 | if __name__ == '__main__': |
ea6aed49cd69
Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300 | main() |