VultureChecker/VultureCheckerDialog.py

changeset 69
3c2922b45a9f
parent 68
d7a6b7ea640d
child 79
47e46cd3bb23
--- a/VultureChecker/VultureCheckerDialog.py	Wed Dec 30 11:02:01 2020 +0100
+++ b/VultureChecker/VultureCheckerDialog.py	Sun Apr 25 16:13:53 2021 +0200
@@ -9,6 +9,7 @@
 
 import os
 import fnmatch
+import contextlib
 
 from PyQt5.QtCore import pyqtSlot, qVersion, Qt, QTimer, QRegExp
 from PyQt5.QtWidgets import (
@@ -24,7 +25,7 @@
 import Utilities
 
 
-class VultureItem(object):
+class VultureItem:
     """
     Class to hold the name, type, confidence and location of defined code.
     """
@@ -70,7 +71,7 @@
         @param parent reference to the parent widget
         @type QWidget
         """
-        super(VultureCheckerDialog, self).__init__(parent)
+        super().__init__(parent)
         self.setupUi(self)
         self.setWindowFlags(Qt.Window)
         
@@ -112,7 +113,7 @@
         self.__translatedTypes = {
             "property": self.tr("Property"),
             "function": self.tr("Function"),
-            "slot": self.tr("Slot"),
+            "method": self.tr("Methode"),
             "attribute": self.tr("Attribute"),
             "variable": self.tr("Variable"),
             "class": self.tr("Class"),
@@ -169,7 +170,6 @@
             self.__data["WhiteLists"] = {
                 "property": [],
                 "function": [],
-                "slot": [],
                 "attribute": [],
                 "variable": [],
                 "class": [],
@@ -179,13 +179,12 @@
                     "visit_*",
                 ],
             }
+        if "method" not in self.__data["WhiteLists"]:
+            self.__data["WhiteLists"]["method"] = []
         if "import" not in self.__data["WhiteLists"]:
             self.__data["WhiteLists"]["import"] = []
-        if "SlotsAreUsed" not in self.__data:
-            self.__data["SlotsAreUsed"] = True
         
         self.excludeFilesEdit.setText(self.__data["ExcludeFiles"])
-        self.slotsCheckBox.setChecked(self.__data["SlotsAreUsed"])
     
     def start(self, fn):
         """
@@ -285,11 +284,9 @@
         The results are reported to the __processResult slot.
         """
         self.checkProgressLabel.setPath(self.tr("Preparing files..."))
-        progress = 0
         
         argumentsList = []
-        for filename in self.files:
-            progress += 1
+        for progress, filename in enumerate(self.files, start=1):
             self.checkProgress.setValue(progress)
             QApplication.processEvents()
             
@@ -438,12 +435,6 @@
                 fileList = [f for f in fileList
                             if not fnmatch.fnmatch(f, fileFilter)]
         
-        self.__slotsAreUsed = self.slotsCheckBox.isChecked()
-        if self.__slotsAreUsed != self.__data["SlotsAreUsed"]:
-            self.__data["SlotsAreUsed"] = self.__slotsAreUsed
-            self.__project.setData(
-                "CHECKERSPARMS", "Vulture", self.__data)
-        
         self.start(fileList)
     
     def clear(self):
@@ -476,16 +467,13 @@
         """
         Private method to prepare the result lists.
         """
-        self.__definedAttrs = []
-        self.__definedClasses = []
-        self.__definedFuncs = []
-        self.__definedImports = []
-        self.__definedSlots = []
-        self.__definedProps = []
-        self.__definedVars = []
-        
-        self.__usedAttrs = []
-        self.__usedNames = []
+        self.__unusedAttrs = []
+        self.__unusedClasses = []
+        self.__unusedFuncs = []
+        self.__unusedMethods = []
+        self.__unusedImports = []
+        self.__unusedProps = []
+        self.__unusedVars = []
     
     def __storeResult(self, result):
         """
@@ -494,22 +482,20 @@
         @param result result dictionary
         @type dict
         """
-        self.__definedAttrs.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedAttributes"]]))
-        self.__definedClasses.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedClasses"]]))
-        self.__definedFuncs.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedFunctions"]]))
-        self.__definedImports.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedImports"]]))
-        self.__definedSlots.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedSlots"]]))
-        self.__definedProps.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedProperties"]]))
-        self.__definedVars.extend(self.__filteredList(
-            [self.__dict2Item(d) for d in result["DefinedVariables"]]))
-        self.__usedAttrs.extend(result["UsedAttributes"])
-        self.__usedNames.extend(result["UsedNames"])
+        self.__unusedAttrs.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedAttributes"]]))
+        self.__unusedClasses.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedClasses"]]))
+        self.__unusedFuncs.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedFunctions"]]))
+        self.__unusedMethods.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedMethods"]]))
+        self.__unusedImports.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedImports"]]))
+        self.__unusedProps.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedProperties"]]))
+        self.__unusedVars.extend(self.__filteredList(
+            [self.__dict2Item(d) for d in result["UnusedVariables"]]))
     
     def __dict2Item(self, d):
         """
@@ -540,109 +526,84 @@
                             if not regExp.exactMatch(item.name)]
         return filteredList     # __IGNORE_WARNING_M834__
     
-    def __getUnusedItems(self, defined, used):
+    def __filterUnusedItems(self, unused, whitelistName):
         """
         Private method to get a list of unused items.
         
-        @param defined list of defined items
+        @param unused list of unused items
         @type list of VultureItem
-        @param used list of used names
-        @type list of str
+        @param whitelistName name of the whitelist to use as a filter
+        @type str
         @return list of unused items
         @rtype list of VultureItem
         """
-        return [item for item in set(defined) if item.name not in used]
+        return [
+            item for item in set(unused)
+            if item.name not in self.__data["WhiteLists"][whitelistName]
+        ]
 
-    def __unusedFunctions(self):
+    def __filterUnusedFunctions(self):
         """
         Private method to get the list of unused functions.
         
         @return list of unused functions
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedFuncs,
-            self.__usedAttrs + self.__usedNames +
-            self.__data["WhiteLists"]["function"]
-        )
+        return self.__filterUnusedItems(self.__unusedFuncs, "function")
 
-    def __unusedSlots(self):
+    def __filterUnusedMethods(self):
         """
-        Private method to get the list of unused PyQt/PySide slots.
+        Private method to get the list of unused methods.
         
-        @return list of unused PyQt/PySide slots
+        @return list of unused methods
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedSlots,
-            self.__usedAttrs + self.__usedNames +
-            self.__data["WhiteLists"]["slot"]
-        )
+        return self.__filterUnusedItems(self.__unusedMethods, "method")
 
-    def __unusedClasses(self):
+    def __filterUnusedClasses(self):
         """
         Private method to get the list of unused classes.
         
         @return list of unused classes
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedClasses,
-            self.__usedAttrs + self.__usedNames +
-            self.__data["WhiteLists"]["class"]
-        )
+        return self.__filterUnusedItems(self.__unusedClasses, "class")
 
-    def __unusedImports(self):
+    def __filterUnusedImports(self):
         """
         Private method to get a list of unused imports.
         
         @return list of unused imports
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedClasses,
-            self.__usedAttrs + self.__usedNames +
-            self.__data["WhiteLists"]["import"]
-        )
+        return self.__filterUnusedItems(self.__unusedImports, "import")
     
-    def __unusedProperties(self):
+    def __filterUnusedProperties(self):
         """
         Private method to get the list of unused properties.
         
         @return list of unused properties
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedProps,
-            self.__usedAttrs +
-            self.__data["WhiteLists"]["property"]
-        )
+        return self.__filterUnusedItems(self.__unusedProps, "property")
 
-    def __unusedVariables(self):
+    def __filterUnusedVariables(self):
         """
         Private method to get the list of unused variables.
         
         @return list of unused variables
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedVars,
-            self.__usedAttrs + self.__usedNames +
-            self.__data["WhiteLists"]["variable"]
-        )
+        return self.__filterUnusedItems(self.__unusedVars, "variable")
 
-    def __unusedAttributes(self):
+    def __filterUnusedAttributes(self):
         """
         Private method to get the list of unused attributes.
         
         @return list of unused attributes
         @rtype list of VultureItem
         """
-        return self.__getUnusedItems(
-            self.__definedAttrs,
-            self.__usedAttrs +
-            self.__data["WhiteLists"]["attribute"]
-        )
+        return self.__filterUnusedItems(self.__unusedAttrs, "attribute")
     
     def __createResultItems(self):
         """
@@ -650,14 +611,13 @@
         """
         lastFileItem = None
         lastFileName = ""
-        items = (self.__unusedFunctions() +
-                 self.__unusedClasses() +
-                 self.__unusedImports() +
-                 self.__unusedProperties() +
-                 self.__unusedVariables() +
-                 self.__unusedAttributes())
-        if not self.__slotsAreUsed:
-            items += self.__unusedSlots()
+        items = (self.__filterUnusedFunctions() +
+                 self.__filterUnusedMethods() +
+                 self.__filterUnusedClasses() +
+                 self.__filterUnusedImports() +
+                 self.__filterUnusedProperties() +
+                 self.__filterUnusedVariables() +
+                 self.__filterUnusedAttributes())
         for item in sorted(items, key=lambda item: item.filename):
             if lastFileItem is None or lastFileName != item.filename:
                 lastFileItem = self.__createFileItem(item.filename)
@@ -761,11 +721,8 @@
         for key in self.__data["WhiteLists"]:
             whitelists[key] = self.__data["WhiteLists"][key][:]
         for itm in self.__getSelectedNonFileItems():
-            try:
+            with contextlib.suppress(KeyError):
                 whitelists[itm.data(0, self.TypeRole)].append(itm.text(1))
-            except KeyError:
-                # ignore non-existing types
-                pass
             # remove the item from the result list
             pitm = itm.parent()
             pitm.removeChild(itm)
@@ -786,13 +743,10 @@
         changed = False
         for key in whitelists:
             whitelist = list(set(whitelists[key]))
-            try:
+            with contextlib.suppress(KeyError):
                 if sorted(whitelist) != sorted(self.__data["WhiteLists"][key]):
                     self.__data["WhiteLists"][key] = whitelist[:]
                     changed = True
-            except KeyError:
-                # ignore non-existing types
-                pass
         
         if changed:
             self.__project.setData("CHECKERSPARMS", "Vulture", self.__data)

eric ide

mercurial