Sat, 26 Oct 2024 12:25:21 +0200
- changed use of modal dialogs to ensure a valid parent
- changed to new style header
--- a/.hgignore Tue Jul 09 17:05:59 2024 +0200 +++ b/.hgignore Sat Oct 26 12:25:21 2024 +0200 @@ -14,4 +14,3 @@ glob:tmp glob:__pycache__ glob:**.DS_Store -glob:**Ui_*.py
--- a/ChangeLog Tue Jul 09 17:05:59 2024 +0200 +++ b/ChangeLog Sat Oct 26 12:25:21 2024 +0200 @@ -1,5 +1,9 @@ ChangeLog --------- +Version 10.3.4 +- changed use of modal dialogs to ensure a valid parent +- changed to new style header + Version 10.3.3 - reworked the recent change
--- a/PluginCheckerVulture.epj Tue Jul 09 17:05:59 2024 +0200 +++ b/PluginCheckerVulture.epj Sat Oct 26 12:25:21 2024 +0200 @@ -27,6 +27,7 @@ "OverloadDecorators": [ "overload" ], + "RespectTypeIgnore": false, "SuppressDummyArgs": false, "SuppressNoneReturning": true }, @@ -68,7 +69,7 @@ "DocstringType": "eric_black", "EnabledCheckerCategories": "C, D, E, I, L, M, NO, N, Y, U, W", "ExcludeFiles": "*/Ui_*.py", - "ExcludeMessages": "C101,E265,E266,E305,E402,M201,M301,M302,M303,M304,M305,M306,M307,M308,M311,M312,M313,M314,M315,M321,M701,M702,M811,M834,M852,N802,N803,N807,N808,N821,U200,W293,W503,Y119,Y401,Y402", + "ExcludeMessages": "M201,C101,E265,E266,E305,E402,M251,M301,M302,M303,M304,M305,M306,M307,M308,M311,M312,M313,M314,M315,M321,M701,M702,M811,M834,M852,N802,N803,N807,N808,N821,U200,W293,W503,Y119,Y401,Y402", "FixCodes": "", "FixIssues": false, "FutureChecker": "", @@ -246,13 +247,14 @@ "OTHERTOOLSPARMS": { "Black": { "exclude": "/(\\.direnv|\\.eggs|\\.git|\\.hg|\\.ipynb_checkpoints|\\.mypy_cache|\\.nox|\\.pytest_cache|\\.ruff_cache|\\.tox|\\.svn|\\.venv|\\.vscode|__pypackages__|_build|buck-out|build|dist|venv)/", - "extend-exclude": "", + "extend-exclude": "Ui_.*\\.py", "force-exclude": "", "line-length": 88, "skip-magic-trailing-comma": false, "skip-string-normalization": false, "source": "project", "target-version": [ + "py313", "py312", "py311", "py310",
--- a/PluginVulture.py Tue Jul 09 17:05:59 2024 +0200 +++ b/PluginVulture.py Sat Oct 26 12:25:21 2024 +0200 @@ -17,18 +17,20 @@ from eric7.SystemUtilities import PythonUtilities # Start-Of-Header -name = "Unused Code Checker Plug-in" -author = "Detlev Offenbach <detlev@die-offenbachs.de>" -autoactivate = True -deactivateable = True -version = "10.3.3" -className = "VulturePlugin" -packageName = "VultureChecker" -shortDescription = "Plug-in to detect unused code using the 'vulture' library" -longDescription = """Plug-in to detect unused code using the 'vulture' library.""" -needsRestart = False -hasCompiledForms = True -pyqtApi = 2 +__header__ = { + "name": "Unused Code Checker Plug-in", + "author": "Detlev Offenbach <detlev@die-offenbachs.de>", + "autoactivate": True, + "deactivateable": True, + "version": "10.3.4", + "className": "VulturePlugin", + "packageName": "VultureChecker", + "shortDescription": "Plug-in to detect unused code using the 'vulture' library", + "longDescription": "Plug-in to detect unused code using the 'vulture' library.", + "needsRestart": False, + "hasCompiledForms": True, + "pyqtApi": 2, +} # End-Of-Header error = "" @@ -61,7 +63,7 @@ self.backgroundService = ericApp().getObject("BackgroundService") - path = os.path.join(os.path.dirname(__file__), packageName) + path = os.path.join(os.path.dirname(__file__), __header__["packageName"]) self.backgroundService.serviceConnect( "vulture", "Python3", @@ -308,8 +310,9 @@ ] if self.__projectVultureCheckerDialog is None: - from VultureChecker.VultureCheckerDialog import VultureCheckerDialog - # noqa: I101 + from VultureChecker.VultureCheckerDialog import ( # noqa: I101 + VultureCheckerDialog, + ) self.__projectVultureCheckerDialog = VultureCheckerDialog(self) self.__projectVultureCheckerDialog.show()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VultureChecker/Ui_EditWhiteListDialog.py Sat Oct 26 12:25:21 2024 +0200 @@ -0,0 +1,174 @@ +# Form implementation generated from reading ui file 'VultureChecker/EditWhiteListDialog.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_EditWhiteListDialog(object): + def setupUi(self, EditWhiteListDialog): + EditWhiteListDialog.setObjectName("EditWhiteListDialog") + EditWhiteListDialog.resize(600, 650) + EditWhiteListDialog.setSizeGripEnabled(True) + self.verticalLayout_10 = QtWidgets.QVBoxLayout(EditWhiteListDialog) + self.verticalLayout_10.setObjectName("verticalLayout_10") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.listsWidget = QtWidgets.QTabWidget(parent=EditWhiteListDialog) + self.listsWidget.setObjectName("listsWidget") + self.tab_1 = QtWidgets.QWidget() + self.tab_1.setObjectName("tab_1") + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.tab_1) + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.classesList = QtWidgets.QListWidget(parent=self.tab_1) + self.classesList.setAlternatingRowColors(True) + self.classesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.classesList.setObjectName("classesList") + self.verticalLayout_6.addWidget(self.classesList) + self.listsWidget.addTab(self.tab_1, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.tab_2) + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.functionsList = QtWidgets.QListWidget(parent=self.tab_2) + self.functionsList.setAlternatingRowColors(True) + self.functionsList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.functionsList.setObjectName("functionsList") + self.verticalLayout_5.addWidget(self.functionsList) + self.listsWidget.addTab(self.tab_2, "") + self.tab_9 = QtWidgets.QWidget() + self.tab_9.setObjectName("tab_9") + self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.tab_9) + self.verticalLayout_11.setObjectName("verticalLayout_11") + self.methodsList = QtWidgets.QListWidget(parent=self.tab_9) + self.methodsList.setAlternatingRowColors(True) + self.methodsList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.methodsList.setObjectName("methodsList") + self.verticalLayout_11.addWidget(self.methodsList) + self.listsWidget.addTab(self.tab_9, "") + self.tab_4 = QtWidgets.QWidget() + self.tab_4.setObjectName("tab_4") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.tab_4) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.attributesList = QtWidgets.QListWidget(parent=self.tab_4) + self.attributesList.setAlternatingRowColors(True) + self.attributesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.attributesList.setObjectName("attributesList") + self.verticalLayout_4.addWidget(self.attributesList) + self.listsWidget.addTab(self.tab_4, "") + self.tab_5 = QtWidgets.QWidget() + self.tab_5.setObjectName("tab_5") + self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.tab_5) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.variablesList = QtWidgets.QListWidget(parent=self.tab_5) + self.variablesList.setAlternatingRowColors(True) + self.variablesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.variablesList.setObjectName("variablesList") + self.verticalLayout_3.addWidget(self.variablesList) + self.listsWidget.addTab(self.tab_5, "") + self.tab_6 = QtWidgets.QWidget() + self.tab_6.setObjectName("tab_6") + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab_6) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.propertiesList = QtWidgets.QListWidget(parent=self.tab_6) + self.propertiesList.setAlternatingRowColors(True) + self.propertiesList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.propertiesList.setObjectName("propertiesList") + self.verticalLayout_2.addWidget(self.propertiesList) + self.listsWidget.addTab(self.tab_6, "") + self.tab_7 = QtWidgets.QWidget() + self.tab_7.setObjectName("tab_7") + self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.tab_7) + self.verticalLayout_9.setObjectName("verticalLayout_9") + self.importsList = QtWidgets.QListWidget(parent=self.tab_7) + self.importsList.setAlternatingRowColors(True) + self.importsList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.importsList.setObjectName("importsList") + self.verticalLayout_9.addWidget(self.importsList) + self.listsWidget.addTab(self.tab_7, "") + self.tab_8 = QtWidgets.QWidget() + self.tab_8.setObjectName("tab_8") + self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.tab_8) + self.verticalLayout_7.setObjectName("verticalLayout_7") + self.patternsList = QtWidgets.QListWidget(parent=self.tab_8) + self.patternsList.setAlternatingRowColors(True) + self.patternsList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.patternsList.setObjectName("patternsList") + self.verticalLayout_7.addWidget(self.patternsList) + self.listsWidget.addTab(self.tab_8, "") + self.horizontalLayout_2.addWidget(self.listsWidget) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.addButton = QtWidgets.QPushButton(parent=EditWhiteListDialog) + self.addButton.setObjectName("addButton") + self.verticalLayout.addWidget(self.addButton) + self.line = QtWidgets.QFrame(parent=EditWhiteListDialog) + self.line.setLineWidth(3) + self.line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.verticalLayout.addWidget(self.line) + self.removeButton = QtWidgets.QPushButton(parent=EditWhiteListDialog) + self.removeButton.setObjectName("removeButton") + self.verticalLayout.addWidget(self.removeButton) + self.removeAllButton = QtWidgets.QPushButton(parent=EditWhiteListDialog) + self.removeAllButton.setObjectName("removeAllButton") + self.verticalLayout.addWidget(self.removeAllButton) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + self.verticalLayout.addItem(spacerItem1) + self.horizontalLayout_2.addLayout(self.verticalLayout) + self.verticalLayout_10.addLayout(self.horizontalLayout_2) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=EditWhiteListDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout_10.addWidget(self.buttonBox) + + self.retranslateUi(EditWhiteListDialog) + self.listsWidget.setCurrentIndex(7) + self.buttonBox.accepted.connect(EditWhiteListDialog.accept) # type: ignore + self.buttonBox.rejected.connect(EditWhiteListDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(EditWhiteListDialog) + EditWhiteListDialog.setTabOrder(self.listsWidget, self.classesList) + EditWhiteListDialog.setTabOrder(self.classesList, self.functionsList) + EditWhiteListDialog.setTabOrder(self.functionsList, self.methodsList) + EditWhiteListDialog.setTabOrder(self.methodsList, self.attributesList) + EditWhiteListDialog.setTabOrder(self.attributesList, self.variablesList) + EditWhiteListDialog.setTabOrder(self.variablesList, self.propertiesList) + EditWhiteListDialog.setTabOrder(self.propertiesList, self.importsList) + EditWhiteListDialog.setTabOrder(self.importsList, self.patternsList) + EditWhiteListDialog.setTabOrder(self.patternsList, self.addButton) + EditWhiteListDialog.setTabOrder(self.addButton, self.removeButton) + EditWhiteListDialog.setTabOrder(self.removeButton, self.removeAllButton) + + def retranslateUi(self, EditWhiteListDialog): + _translate = QtCore.QCoreApplication.translate + EditWhiteListDialog.setWindowTitle(_translate("EditWhiteListDialog", "Vulture Whitelists")) + self.classesList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_1), _translate("EditWhiteListDialog", "Classes")) + self.functionsList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_2), _translate("EditWhiteListDialog", "Functions")) + self.methodsList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_9), _translate("EditWhiteListDialog", "Methods")) + self.attributesList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_4), _translate("EditWhiteListDialog", "Attributes")) + self.variablesList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_5), _translate("EditWhiteListDialog", "Variables")) + self.propertiesList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_6), _translate("EditWhiteListDialog", "Properties")) + self.importsList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_7), _translate("EditWhiteListDialog", "Imports")) + self.patternsList.setSortingEnabled(True) + self.listsWidget.setTabText(self.listsWidget.indexOf(self.tab_8), _translate("EditWhiteListDialog", "Patterns")) + self.addButton.setToolTip(_translate("EditWhiteListDialog", "Press to add a whitelist entry")) + self.addButton.setText(_translate("EditWhiteListDialog", "Add...")) + self.removeButton.setToolTip(_translate("EditWhiteListDialog", "Press to remove the selected whitelist entries")) + self.removeButton.setText(_translate("EditWhiteListDialog", "Remove")) + self.removeAllButton.setToolTip(_translate("EditWhiteListDialog", "Press to remove all whitelist entries")) + self.removeAllButton.setText(_translate("EditWhiteListDialog", "Remove All"))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VultureChecker/Ui_VultureCheckerDialog.py Sat Oct 26 12:25:21 2024 +0200 @@ -0,0 +1,103 @@ +# Form implementation generated from reading ui file 'VultureChecker/VultureCheckerDialog.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_VultureCheckerDialog(object): + def setupUi(self, VultureCheckerDialog): + VultureCheckerDialog.setObjectName("VultureCheckerDialog") + VultureCheckerDialog.resize(832, 587) + VultureCheckerDialog.setSizeGripEnabled(True) + self.verticalLayout = QtWidgets.QVBoxLayout(VultureCheckerDialog) + self.verticalLayout.setContentsMargins(6, 6, 6, 6) + self.verticalLayout.setSpacing(6) + self.verticalLayout.setObjectName("verticalLayout") + self.filterFrame = QtWidgets.QFrame(parent=VultureCheckerDialog) + self.filterFrame.setFrameShape(QtWidgets.QFrame.Shape.NoFrame) + self.filterFrame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) + self.filterFrame.setObjectName("filterFrame") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.filterFrame) + self.horizontalLayout.setContentsMargins(0, 0, 0, 0) + self.horizontalLayout.setSpacing(6) + self.horizontalLayout.setObjectName("horizontalLayout") + self.label_2 = QtWidgets.QLabel(parent=self.filterFrame) + self.label_2.setObjectName("label_2") + self.horizontalLayout.addWidget(self.label_2) + self.excludeFilesEdit = QtWidgets.QLineEdit(parent=self.filterFrame) + self.excludeFilesEdit.setClearButtonEnabled(True) + self.excludeFilesEdit.setObjectName("excludeFilesEdit") + self.horizontalLayout.addWidget(self.excludeFilesEdit) + self.line = QtWidgets.QFrame(parent=self.filterFrame) + self.line.setLineWidth(2) + self.line.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line.setObjectName("line") + self.horizontalLayout.addWidget(self.line) + self.startButton = QtWidgets.QPushButton(parent=self.filterFrame) + self.startButton.setObjectName("startButton") + self.horizontalLayout.addWidget(self.startButton) + self.verticalLayout.addWidget(self.filterFrame) + self.line_2 = QtWidgets.QFrame(parent=VultureCheckerDialog) + self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_2.setObjectName("line_2") + self.verticalLayout.addWidget(self.line_2) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setSpacing(6) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label = QtWidgets.QLabel(parent=VultureCheckerDialog) + self.label.setObjectName("label") + self.horizontalLayout_2.addWidget(self.label) + self.typeFilterComboBox = QtWidgets.QComboBox(parent=VultureCheckerDialog) + self.typeFilterComboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.SizeAdjustPolicy.AdjustToContents) + self.typeFilterComboBox.setObjectName("typeFilterComboBox") + self.horizontalLayout_2.addWidget(self.typeFilterComboBox) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.horizontalLayout_2.addItem(spacerItem) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.resultList = QtWidgets.QTreeWidget(parent=VultureCheckerDialog) + self.resultList.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.CustomContextMenu) + self.resultList.setAlternatingRowColors(True) + self.resultList.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.resultList.setObjectName("resultList") + self.verticalLayout.addWidget(self.resultList) + self.checkProgress = QtWidgets.QProgressBar(parent=VultureCheckerDialog) + self.checkProgress.setProperty("value", 0) + self.checkProgress.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.checkProgress.setObjectName("checkProgress") + self.verticalLayout.addWidget(self.checkProgress) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=VultureCheckerDialog) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Close) + self.buttonBox.setObjectName("buttonBox") + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(VultureCheckerDialog) + QtCore.QMetaObject.connectSlotsByName(VultureCheckerDialog) + VultureCheckerDialog.setTabOrder(self.startButton, self.excludeFilesEdit) + VultureCheckerDialog.setTabOrder(self.excludeFilesEdit, self.typeFilterComboBox) + VultureCheckerDialog.setTabOrder(self.typeFilterComboBox, self.resultList) + + def retranslateUi(self, VultureCheckerDialog): + _translate = QtCore.QCoreApplication.translate + VultureCheckerDialog.setWindowTitle(_translate("VultureCheckerDialog", "Unused Code Checker")) + VultureCheckerDialog.setWhatsThis(_translate("VultureCheckerDialog", "<b>Unused Code Checker</b>\n" +"<p>This dialog shows unused classes, function, variables, attributes and properties. These are determined through a static analysis. False reports can be added to a whitelist through the context menu.</p>")) + self.label_2.setText(_translate("VultureCheckerDialog", "Exclude Files:")) + self.excludeFilesEdit.setToolTip(_translate("VultureCheckerDialog", "Enter filename patterns of files to be excluded separated by a comma")) + self.startButton.setToolTip(_translate("VultureCheckerDialog", "Press to start the check")) + self.startButton.setText(_translate("VultureCheckerDialog", "Start")) + self.label.setText(_translate("VultureCheckerDialog", "Filter by Type:")) + self.typeFilterComboBox.setToolTip(_translate("VultureCheckerDialog", "Select the type of entries to be shown.")) + self.resultList.headerItem().setText(0, _translate("VultureCheckerDialog", "Line")) + self.resultList.headerItem().setText(1, _translate("VultureCheckerDialog", "Name")) + self.resultList.headerItem().setText(2, _translate("VultureCheckerDialog", "Confidence")) + self.resultList.headerItem().setText(3, _translate("VultureCheckerDialog", "Type")) + self.checkProgress.setToolTip(_translate("VultureCheckerDialog", "Shows the progress of the check")) + self.checkProgress.setFormat(_translate("VultureCheckerDialog", "%v/%m Files"))
--- a/VultureChecker/VultureCheckerDialog.py Tue Jul 09 17:05:59 2024 +0200 +++ b/VultureChecker/VultureCheckerDialog.py Sat Oct 26 12:25:21 2024 +0200 @@ -769,7 +769,7 @@ """ from .EditWhiteListDialog import EditWhiteListDialog - dlg = EditWhiteListDialog(self.__data["WhiteLists"]) + dlg = EditWhiteListDialog(self.__data["WhiteLists"], parent=self) if dlg.exec() == QDialog.DialogCode.Accepted: whitelists = dlg.getWhiteLists() self.__storeWhiteLists(whitelists)