--- 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)