VultureChecker/vulture.py

Sat, 03 Oct 2015 19:07:40 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 03 Oct 2015 19:07:40 +0200
changeset 1
ea6aed49cd69
child 7
a1a6ff3e5486
permissions
-rwxr-xr-x

Started implementing the vulture checker.

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 #
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 # Patched to support the Python 3.5 async functionality.
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 #
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 from __future__ import print_function
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 import ast
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 from fnmatch import fnmatchcase
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 import optparse
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 import os
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 import re
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 import sys
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 __version__ = '0.8.1-p1'
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 # Parse variable names in template strings.
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 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
37
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 def _ignore_function(name):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 return ((name.startswith('__') and name.endswith('__')) or
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 name.startswith('test_'))
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 class Item(str):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 def __new__(cls, name, typ, file, lineno):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 item = str.__new__(cls, name)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 item.typ = typ
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 item.file = file
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 item.lineno = lineno
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 return item
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 class Vulture(ast.NodeVisitor):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 """Find dead stuff."""
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 def __init__(self, exclude=None, verbose=False):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 self.exclude = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 for pattern in exclude or []:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 if not any(char in pattern for char in ['*', '?', '[']):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 pattern = '*%s*' % pattern
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.exclude.append(pattern)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 self.verbose = verbose
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.defined_attrs = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 self.defined_funcs = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 self.defined_props = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 self.defined_vars = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 self.used_attrs = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 self.used_vars = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 self.tuple_assign_vars = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.names_imported_as_aliases = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 self.file = ''
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 self.code = None
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 def scan(self, node_string):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 self.code = node_string.splitlines()
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 node = ast.parse(node_string, filename=self.file)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 self.visit(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 def _get_modules(self, paths, toplevel=True):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 """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
83 modules = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 for path in paths:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 path = os.path.abspath(path)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 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
87 modules.append(path)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 elif os.path.isdir(path):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 subpaths = [os.path.join(path, filename)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 for filename in sorted(os.listdir(path))]
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 modules.extend(self._get_modules(subpaths, toplevel=False))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 elif toplevel:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 sys.exit('Error: %s could not be found.' % path)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 return modules
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 def scavenge(self, paths):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 modules = self._get_modules(paths)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 included_modules = []
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 for module in modules:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 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
101 self.log('Excluded:', module)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 else:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 included_modules.append(module)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 for module in included_modules:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 self.log('Scanning:', module)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 with open(module) as f:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 module_string = f.read()
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 self.file = module
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 self.scan(module_string)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 def report(self):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 def file_lineno(item):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 return (item.file.lower(), item.lineno)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 unused_item_found = False
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 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
117 self.unused_vars + self.unused_attrs,
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 key=file_lineno):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 relpath = os.path.relpath(item.file)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 path = relpath if not relpath.startswith('..') else item.file
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 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
122 item))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 unused_item_found = True
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 return unused_item_found
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 def get_unused(self, defined, used):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 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
128
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 @property
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 def unused_funcs(self):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 return self.get_unused(
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 self.defined_funcs,
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 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
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_props(self):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 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
138
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 @property
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 def unused_vars(self):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 return self.get_unused(
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 self.defined_vars,
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 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
144 self.names_imported_as_aliases)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 @property
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 def unused_attrs(self):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 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
149
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 def _get_lineno(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 return getattr(node, 'lineno', 1)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 def _get_line(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 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
155
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 def _get_item(self, node, typ):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 name = getattr(node, 'name', None)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 id = getattr(node, 'id', None)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 attr = getattr(node, 'attr', None)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 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
161 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
162
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 def log(self, *args):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 if self.verbose:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 print(*args)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 def print_node(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 # 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
169 if self.verbose:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 self.log(
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 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
172
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 def visit_FunctionDef(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 for decorator in node.decorator_list:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 if getattr(decorator, 'id', None) == 'property':
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 self.defined_props.append(self._get_item(node, 'property'))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 break
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 else:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 # Function is not a property.
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 if not _ignore_function(node.name):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 self.defined_funcs.append(self._get_item(node, 'function'))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 visit_AsyncFunctionDef = visit_FunctionDef
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 def visit_Attribute(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 item = self._get_item(node, 'attribute')
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 if isinstance(node.ctx, ast.Store):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 self.log('defined_attrs <-', item)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 self.defined_attrs.append(item)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 elif isinstance(node.ctx, ast.Load):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 self.log('used_attrs <-', item)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 self.used_attrs.append(item)
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 def visit_Name(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 if node.id != 'object':
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 if isinstance(node.ctx, ast.Load):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 self.log('used_vars <-', node.id)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 self.used_vars.append(node.id)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 elif isinstance(node.ctx, ast.Store):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 # Ignore _x (pylint convention), __x, __x__ (special method).
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 if not node.id.startswith('_'):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 item = self._get_item(node, 'variable')
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 self.log('defined_vars <-', item)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 self.defined_vars.append(item)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 def visit_Import(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 self._add_aliases(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 def visit_ImportFrom(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 self._add_aliases(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 def _add_aliases(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 assert isinstance(node, (ast.Import, ast.ImportFrom))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 for name_and_alias in node.names:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 alias = name_and_alias.asname
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 if alias is not None:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 name = name_and_alias.name
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 self.log('names_imported_as_aliases <- %s' % name)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 self.names_imported_as_aliases.append(name)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 def _find_tuple_assigns(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 # Find all tuple assignments. Those have the form
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 # 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
224 for child in ast.iter_child_nodes(node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 if not isinstance(child, ast.Tuple):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 continue
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 for grandchild in ast.walk(child):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 if (isinstance(grandchild, ast.Name) and
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 isinstance(grandchild.ctx, ast.Store)):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 self.log('tuple_assign_vars <-', grandchild.id)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 self.tuple_assign_vars.append(grandchild.id)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 def visit_Assign(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 self._find_tuple_assigns(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 def visit_For(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 self._find_tuple_assigns(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 visit_AsyncFor = visit_For
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 def visit_comprehension(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 self._find_tuple_assigns(node)
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_ClassDef(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 self.defined_funcs.append(self._get_item(node, 'class'))
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_Str(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 """
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 Variables may appear in format strings:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 '%(my_var)s' % locals()
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 '{my_var}'.format(**locals())
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253
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 for pattern in FORMAT_STRING_PATTERNS:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 self.used_vars.extend(pattern.findall(node.s))
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(self, node):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 method = 'visit_' + node.__class__.__name__
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 visitor = getattr(self, method, None)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 if visitor is not None:
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 self.print_node(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 visitor(node)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 return self.generic_visit(node)
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
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 def parse_args():
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 def csv(option, opt, value, parser):
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 setattr(parser.values, option.dest, value.split(','))
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 usage = 'usage: %prog [options] PATH [PATH ...]'
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 parser = optparse.OptionParser(usage=usage)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 parser.add_option('--exclude', action='callback', callback=csv,
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 type='string', default=[],
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 help='Comma-separated list of filename patterns to '
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 'exclude (e.g. svn,external).')
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 parser.add_option('-v', '--verbose', action='store_true')
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 options, args = parser.parse_args()
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 return options, args
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 def main():
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 options, args = parse_args()
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 vulture = Vulture(exclude=options.exclude, verbose=options.verbose)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 vulture.scavenge(args)
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 sys.exit(vulture.report())
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 if __name__ == '__main__':
ea6aed49cd69 Started implementing the vulture checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 main()

eric ide

mercurial