diff -r f0d18add14ea -r 1e391f977124 eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py --- a/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py Wed Jan 13 19:12:35 2021 +0100 +++ b/eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py Wed Jan 13 20:13:26 2021 +0100 @@ -14,7 +14,7 @@ from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import ( QDialog, QTreeWidgetItem, QAbstractButton, QDialogButtonBox, QApplication, - QHeaderView, QListWidgetItem + QHeaderView, QListWidgetItem, QInputDialog, QLineEdit ) from E5Gui.E5Application import e5App @@ -463,10 +463,29 @@ "str": ["unicode", ], "chr": ["unichr", ], } + if "CommentedCodeChecker" not in self.__data: self.__data["CommentedCodeChecker"] = { "Aggressive": False, } + if "WhiteList" not in self.__data["CommentedCodeChecker"]: + self.__data["CommentedCodeChecker"]["WhiteList"] = [ + r'pylint', + r'pyright', + r'noqa', + r'type:\s*ignore', + r'fmt:\s*(on|off)', + r'TODO', + r'FIXME', + r'WARNING', + r'NOTE', + r'TEST', + r'DOCU', + r'XXX', + r'~ ', + r'- ', + ] + if "AnnotationsChecker" not in self.__data: self.__data["AnnotationsChecker"] = { "MinimumCoverage": 75, @@ -526,6 +545,8 @@ self.__initBuiltinsIgnoreList(self.__data["BuiltinsChecker"]) self.aggressiveCheckBox.setChecked( self.__data["CommentedCodeChecker"]["Aggressive"]) + self.__initCommentedCodeCheckerWhiteList( + self.__data["CommentedCodeChecker"]["WhiteList"]) self.minAnnotationsCoverageSpinBox.setValue( self.__data["AnnotationsChecker"]["MinimumCoverage"]) self.maxAnnotationsComplexitySpinBox.setValue( @@ -677,6 +698,7 @@ "BuiltinsChecker": self.__getBuiltinsIgnoreList(), "CommentedCodeChecker": { "Aggressive": self.aggressiveCheckBox.isChecked(), + "WhiteList": self.__getCommentedCodeCheckerWhiteList(), } } annotationArgs = { @@ -1082,6 +1104,7 @@ "BuiltinsChecker": self.__getBuiltinsIgnoreList(), "CommentedCodeChecker": { "Aggressive": self.aggressiveCheckBox.isChecked(), + "WhiteList": self.__getCommentedCodeCheckerWhiteList(), }, "AnnotationsChecker": { "MinimumCoverage": @@ -1882,3 +1905,63 @@ self.excludeMessagesEdit.setText(",".join(excludedMessages)) self.__initCategoriesList(",".join(enabledCheckers)) + + def __initCommentedCodeCheckerWhiteList(self, whitelist): + """ + Private method to populate the list of commented code whitelist + patterns. + + @param whitelist list of commented code whitelist patterns + @type list of str + """ + self.whitelistWidget.clear() + + for pattern in whitelist: + QListWidgetItem(pattern, self.whitelistWidget) + + self.on_whitelistWidget_itemSelectionChanged() + + def __getCommentedCodeCheckerWhiteList(self): + """ + Private method to get the list of commented code whitelist patterns. + + @return list of commented code whitelist patterns + @rtype list of str + """ + whitelist = [] + + for row in range(self.whitelistWidget.count()): + whitelist.append(self.whitelistWidget.item(row).text()) + + return whitelist + + @pyqtSlot() + def on_whitelistWidget_itemSelectionChanged(self): + """ + Private slot to react upon changes of the selected whitelist patterns. + """ + self.deleteWhitelistButton.setEnabled( + len(self.whitelistWidget.selectedItems()) > 0) + + @pyqtSlot() + def on_addWhitelistButton_clicked(self): + """ + Private slot to add a commented code whitelist pattern. + """ + pattern, ok = QInputDialog.getText( + self, + self.tr("Commented Code Whitelist Pattern"), + self.tr("Enter a Commented Code Whitelist Pattern"), + QLineEdit.Normal) + if ok and pattern: + QListWidgetItem(pattern, self.whitelistWidget) + + @pyqtSlot() + def on_deleteWhitelistButton_clicked(self): + """ + Private slot to delete the selected items from the list. + """ + for itm in self.whitelistWidget.selectedItems(): + index = self.whitelistWidget.indexOfTopLevelItem(itm) + self.whitelistWidget.takeTopLevelItem(index) + del itm