Sun, 11 Oct 2015 19:29:38 +0200
Added some vulture improvements from vulture repository.
--- a/ChangeLog Fri Oct 09 19:00:49 2015 +0200 +++ b/ChangeLog Sun Oct 11 19:29:38 2015 +0200 @@ -1,4 +1,8 @@ ChangeLog --------- +Version 0.2.0: +- bug fixes +- added some vulture improvements from vulture repository + Version 0.1.0: - first development release
--- a/PluginVulture.py Fri Oct 09 19:00:49 2015 +0200 +++ b/PluginVulture.py Sun Oct 11 19:29:38 2015 +0200 @@ -24,7 +24,7 @@ author = "Detlev Offenbach <detlev@die-offenbachs.de>" autoactivate = True deactivateable = True -version = "0.1.0" +version = "0.2.0" className = "VulturePlugin" packageName = "VultureChecker" shortDescription = "Plug-in to detect unused code using the vulture library" @@ -329,9 +329,9 @@ project = e5App().getObject("Project") project.saveAllScripts() ppath = project.getProjectPath() - files = [os.path.join(ppath, file) - for file in project.pdata["SOURCES"] - if file.endswith( + files = [os.path.join(ppath, file_) + for file_ in project.pdata["SOURCES"] + if file_.endswith( tuple(Preferences.getPython("Python3Extensions")) + tuple(Preferences.getPython("PythonExtensions")))]
--- a/VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.VultureCheckerService.html Fri Oct 09 19:00:49 2015 +0200 +++ b/VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.VultureCheckerService.html Sun Oct 11 19:29:38 2015 +0200 @@ -75,34 +75,18 @@ <h3>Methods</h3> <table> <tr> -<td><a href="#EricVulture.__init__">EricVulture</a></td> -<td>Constructor</td> -</tr><tr> <td><a href="#EricVulture.__item2Dict">__item2Dict</a></td> <td>Private method to convert a vulture item to a dictionary.</td> </tr><tr> <td><a href="#EricVulture.getResults">getResults</a></td> <td>Public method to get the scan results.</td> -</tr><tr> -<td><a href="#EricVulture.scan">scan</a></td> -<td>Public method to scan the source text.</td> </tr> </table> <h3>Static Methods</h3> <table> <tr><td>None</td></tr> </table> -<a NAME="EricVulture.__init__" ID="EricVulture.__init__"></a> -<h4>EricVulture (Constructor)</h4> -<b>EricVulture</b>(<i>filename</i>) -<p> - Constructor -</p><dl> -<dt><i>filename</i> (str)</dt> -<dd> -source file name -</dd> -</dl><a NAME="EricVulture.__item2Dict" ID="EricVulture.__item2Dict"></a> +<a NAME="EricVulture.__item2Dict" ID="EricVulture.__item2Dict"></a> <h4>EricVulture.__item2Dict</h4> <b>__item2Dict</b>(<i>item</i>) <p> @@ -137,26 +121,16 @@ <dd> dict </dd> -</dl><a NAME="EricVulture.scan" ID="EricVulture.scan"></a> -<h4>EricVulture.scan</h4> -<b>scan</b>(<i>source</i>) -<p> - Public method to scan the source text. -</p><dl> -<dt><i>source</i> (str)</dt> -<dd> -source text -</dd> </dl> <div align="right"><a href="#top">Up</a></div> <hr /><hr /> <a NAME="__analyze" ID="__analyze"></a> <h2>__analyze</h2> -<b>__analyze</b>(<i>file, text=""</i>) +<b>__analyze</b>(<i>filename, text=""</i>) <p> Private function to analyze one Python file. </p><dl> -<dt><i>file</i> (str)</dt> +<dt><i>filename</i> (str)</dt> <dd> source file name </dd><dt><i>text</i> (str)</dt>
--- a/VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.vulture.html Fri Oct 09 19:00:49 2015 +0200 +++ b/VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.vulture.html Sun Oct 11 19:29:38 2015 +0200 @@ -23,7 +23,7 @@ <h3>Global Attributes</h3> <table> -<tr><td>FORMAT_STRING_PATTERNS</td></tr><tr><td>__version__</td></tr> +<tr><td>FORMAT_STRING_PATTERNS</td></tr><tr><td>IGNORED_VARIABLE_NAMES</td></tr><tr><td>__version__</td></tr> </table> <h3>Classes</h3> <table> @@ -78,7 +78,7 @@ </table> <a NAME="Item.__new__" ID="Item.__new__"></a> <h4>Item.__new__</h4> -<b>__new__</b>(<i>name, typ, file, lineno</i>) +<b>__new__</b>(<i>name, typ, filename, lineno</i>) <div align="right"><a href="#top">Up</a></div> <hr /><hr /> @@ -232,7 +232,7 @@ <b>report</b>(<i></i>) <a NAME="Vulture.scan" ID="Vulture.scan"></a> <h4>Vulture.scan</h4> -<b>scan</b>(<i>node_string</i>) +<b>scan</b>(<i>node_string, filename=''</i>) <a NAME="Vulture.scavenge" ID="Vulture.scavenge"></a> <h4>Vulture.scavenge</h4> <b>scavenge</b>(<i>paths</i>)
--- a/VultureChecker/VultureCheckerDialog.py Fri Oct 09 19:00:49 2015 +0200 +++ b/VultureChecker/VultureCheckerDialog.py Sun Oct 11 19:29:38 2015 +0200 @@ -584,14 +584,15 @@ """ return self.__getUnusedItems( self.__definedAttrs, - self.__usedAttrs + self.__data["WhiteLists"]["attribute"]) + self.__usedAttrs + self.__usedVars + + self.__data["WhiteLists"]["attribute"]) def __createResultItems(self): """ Private method to populate the list with the analysis result. """ # __IGNORE_WARNING__ def filename(item): - return item.file + return item.filename lastFileItem = None lastFileName = "" @@ -602,9 +603,9 @@ if not self.__slotsAreUsed: items += self.__unusedSlots() for item in sorted(items, key=filename): - if lastFileItem is None or lastFileName != item.file: - lastFileItem = self.__createFileItem(item.file) - lastFileName = item.file + if lastFileItem is None or lastFileName != item.filename: + lastFileItem = self.__createFileItem(item.filename) + lastFileName = item.filename self.__createResultItem(lastFileItem, item) @@ -623,7 +624,7 @@ translatedType = item.typ itm = QTreeWidgetItem(parent, [ "{0:6d}".format(item.lineno), str(item), translatedType]) - itm.setData(0, self.FilePathRole, item.file) + itm.setData(0, self.FilePathRole, item.filename) itm.setData(0, self.TypeRole, item.typ) itm.setTextAlignment(0, Qt.Alignment(Qt.AlignRight))
--- a/VultureChecker/VultureCheckerService.py Fri Oct 09 19:00:49 2015 +0200 +++ b/VultureChecker/VultureCheckerService.py Sun Oct 11 19:29:38 2015 +0200 @@ -14,8 +14,6 @@ except NameError: pass -import ast - import multiprocessing import sys @@ -119,11 +117,11 @@ output.put((filename, result)) -def __analyze(file, text=""): +def __analyze(filename, text=""): """ Private function to analyze one Python file. - @param file source file name + @param filename source file name @type str @param text source text @type str @@ -138,8 +136,8 @@ pass try: - v = EricVulture(file) - v.scan(text) + v = EricVulture() + v.scan(text, filename=filename) res = v.getResults() except Exception as err: res = {"error": str(err)} @@ -150,29 +148,6 @@ """ Class to adopt the Vulture class to the eric plug-in functionality. """ - def __init__(self, filename): - """ - Constructor - - @param filename source file name - @type str - """ - super(EricVulture, self).__init__() - - self.file = filename - self.code = None - - def scan(self, source): - """ - Public method to scan the source text. - - @param source source text - @type str - """ - self.code = source.splitlines() - node = ast.parse(source, filename=self.file) - self.visit(node) - def __item2Dict(self, item): """ Private method to convert a vulture item to a dictionary. @@ -185,7 +160,7 @@ d = { "name": str(item), "type": getattr(item, "typ", ""), - "file": getattr(item, "file", ""), + "file": getattr(item, "filename", ""), "line": getattr(item, "lineno", ""), } return d
--- a/VultureChecker/vulture.py Fri Oct 09 19:00:49 2015 +0200 +++ b/VultureChecker/vulture.py Sun Oct 11 19:29:38 2015 +0200 @@ -40,6 +40,11 @@ # Parse variable names in template strings. FORMAT_STRING_PATTERNS = [re.compile(r'\%\((\w+)\)'), re.compile(r'{(\w+)}')] +IGNORED_VARIABLE_NAMES = ['object'] +# True and False are NameConstants since Python 3.4. +if sys.version_info < (3, 4): + IGNORED_VARIABLE_NAMES += ['True', 'False'] + def _ignore_function(name): return ((name.startswith('__') and name.endswith('__')) or @@ -47,10 +52,10 @@ class Item(str): - def __new__(cls, name, typ, file, lineno): + def __new__(cls, name, typ, filename, lineno): item = str.__new__(cls, name) item.typ = typ - item.file = file + item.filename = filename item.lineno = lineno return item @@ -76,12 +81,13 @@ self.tuple_assign_vars = [] self.names_imported_as_aliases = [] - self.file = '' + self.filename = '' self.code = None - def scan(self, node_string): + def scan(self, node_string, filename=''): self.code = node_string.splitlines() - node = ast.parse(node_string, filename=self.file) + self.filename=filename + node = ast.parse(node_string, filename=self.filename) self.visit(node) def _get_modules(self, paths, toplevel=True): @@ -112,20 +118,19 @@ self.log('Scanning:', module) with open(module) as f: module_string = f.read() - self.file = module - self.scan(module_string) + self.scan(module_string, filename=module) def report(self): def file_lineno(item): - return (item.file.lower(), item.lineno) + return (item.filename.lower(), item.lineno) unused_item_found = False for item in sorted(self.unused_funcs + self.unused_props + self.unused_vars + self.unused_attrs, key=file_lineno): - relpath = os.path.relpath(item.file) - path = relpath if not relpath.startswith('..') else item.file - print("%s:%d: Unused %s '%s'" % (path, item.lineno, item.typ, - item)) + relpath = os.path.relpath(item.filename) + path = relpath if not relpath.startswith('..') else item.filename + print( + "%s:%d: Unused %s '%s'" % (path, item.lineno, item.typ, item)) unused_item_found = True return unused_item_found @@ -151,7 +156,8 @@ @property def unused_attrs(self): - return self.get_unused(self.defined_attrs, self.used_attrs) + return self.get_unused(self.defined_attrs, + self.used_attrs + self.used_vars) def _get_lineno(self, node): return getattr(node, 'lineno', 1) @@ -161,10 +167,10 @@ def _get_item(self, node, typ): name = getattr(node, 'name', None) - id = getattr(node, 'id', None) + id_ = getattr(node, 'id', None) attr = getattr(node, 'attr', None) - assert len([x for x in (name, id, attr) if x is not None]) == 1 - return Item(name or id or attr, typ, self.file, node.lineno) + assert bool(name) ^ bool(id_) ^ bool(attr) + return Item(name or id_ or attr, typ, self.filename, node.lineno) def log(self, *args): if self.verbose: @@ -203,7 +209,7 @@ self.used_attrs.append(item) def visit_Name(self, node): - if node.id != 'object': + if node.id not in IGNORED_VARIABLE_NAMES: if isinstance(node.ctx, ast.Load): self.log('used_vars <-', node.id) self.used_vars.append(node.id)