Added some vulture improvements from vulture repository.

Sun, 11 Oct 2015 19:29:38 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 11 Oct 2015 19:29:38 +0200
changeset 18
e19e7622a428
parent 17
0063e49e772f
child 19
ceb1b909f72b

Added some vulture improvements from vulture repository.

ChangeLog file | annotate | diff | comparison | revisions
PluginVulture.py file | annotate | diff | comparison | revisions
PluginVulture.zip file | annotate | diff | comparison | revisions
VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.VultureCheckerService.html file | annotate | diff | comparison | revisions
VultureChecker/Documentation/source/Plugin_Checker_Vulture.VultureChecker.vulture.html file | annotate | diff | comparison | revisions
VultureChecker/VultureCheckerDialog.py file | annotate | diff | comparison | revisions
VultureChecker/VultureCheckerService.py file | annotate | diff | comparison | revisions
VultureChecker/vulture.py file | annotate | diff | comparison | revisions
--- 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")))]
         
Binary file PluginVulture.zip has changed
--- 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)

eric ide

mercurial