Wed, 28 Aug 2024 15:26:50 +0200
Fixed a few issues.
--- a/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html Sat Aug 24 15:36:20 2024 +0200 +++ b/PipxInterface/Documentation/Source/Plugin_Pipx_Interface.PipxInterface.PipxWidget.html Wed Aug 28 15:26:50 2024 +0200 @@ -70,6 +70,10 @@ <td>Private slot to check, if there are any outdated packages.</td> </tr> <tr> +<td><a href="#PipxWidget.__checkPackageOutdated">__checkPackageOutdated</a></td> +<td>Private method to check, if a package item is outdated or has outdated dependencies.</td> +</tr> +<tr> <td><a href="#PipxWidget.__createSpecMetadataFile">__createSpecMetadataFile</a></td> <td>Private slot to create a spec metadata file needed by 'pipx install-all'.</td> </tr> @@ -82,10 +86,18 @@ <td>Private method to determine all running pipx managed apps.</td> </tr> <tr> +<td><a href="#PipxWidget.__getItemForPackage">__getItemForPackage</a></td> +<td>Private method to get a reference to the item of a given package.</td> +</tr> +<tr> <td><a href="#PipxWidget.__getRunningApps">__getRunningApps</a></td> <td>Private method to determine, which app of the given list of apps is running.</td> </tr> <tr> +<td><a href="#PipxWidget.__hasOutdatedItems">__hasOutdatedItems</a></td> +<td>Private method to check, if the list of packages contains any entries which is outdated or has outdated dependencies.</td> +</tr> +<tr> <td><a href="#PipxWidget.__initPipxMenu">__initPipxMenu</a></td> <td>Private method to create the super menu and attach it to the super menu button.</td> </tr> @@ -242,6 +254,33 @@ Private slot to check, if there are any outdated packages. </p> +<a NAME="PipxWidget.__checkPackageOutdated" ID="PipxWidget.__checkPackageOutdated"></a> +<h4>PipxWidget.__checkPackageOutdated</h4> +<b>__checkPackageOutdated</b>(<i>itm</i>) +<p> + Private method to check, if a package item is outdated or has outdated + dependencies. +</p> + +<dl> + +<dt><i>itm</i> (QTreeWidgetItem)</dt> +<dd> +reference to the package item +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +flag indicating the outdated status +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> <a NAME="PipxWidget.__createSpecMetadataFile" ID="PipxWidget.__createSpecMetadataFile"></a> <h4>PipxWidget.__createSpecMetadataFile</h4> <b>__createSpecMetadataFile</b>(<i></i>) @@ -276,6 +315,32 @@ set of str </dd> </dl> +<a NAME="PipxWidget.__getItemForPackage" ID="PipxWidget.__getItemForPackage"></a> +<h4>PipxWidget.__getItemForPackage</h4> +<b>__getItemForPackage</b>(<i>package</i>) +<p> + Private method to get a reference to the item of a given package. +</p> + +<dl> + +<dt><i>package</i> (str)</dt> +<dd> +package name +</dd> +</dl> +<dl> +<dt>Return:</dt> +<dd> +reference to the associated item +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +QTreeWidgetItem +</dd> +</dl> <a NAME="PipxWidget.__getRunningApps" ID="PipxWidget.__getRunningApps"></a> <h4>PipxWidget.__getRunningApps</h4> <b>__getRunningApps</b>(<i>apps</i>) @@ -302,6 +367,26 @@ set of str </dd> </dl> +<a NAME="PipxWidget.__hasOutdatedItems" ID="PipxWidget.__hasOutdatedItems"></a> +<h4>PipxWidget.__hasOutdatedItems</h4> +<b>__hasOutdatedItems</b>(<i></i>) +<p> + Private method to check, if the list of packages contains any entries + which is outdated or has outdated dependencies. +</p> + +<dl> +<dt>Return:</dt> +<dd> +flag indicating outdated items +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool +</dd> +</dl> <a NAME="PipxWidget.__initPipxMenu" ID="PipxWidget.__initPipxMenu"></a> <h4>PipxWidget.__initPipxMenu</h4> <b>__initPipxMenu</b>(<i></i>)
--- a/PipxInterface/PipxWidget.py Sat Aug 24 15:36:20 2024 +0200 +++ b/PipxInterface/PipxWidget.py Wed Aug 28 15:26:50 2024 +0200 @@ -211,11 +211,27 @@ """ Private slot to set the action enabled status. """ - selectedPackages = self.__selectedPackages() + selectedPackageItems = self.__selectedPackageItems() - self.__reinstallPackagesAct.setEnabled(len(selectedPackages) == 1) - self.__upgradePackagesAct.setEnabled(bool(selectedPackages)) - self.__uninstallPackagesAct.setEnabled(len(selectedPackages) == 1) + self.__reinstallPackagesAct.setEnabled(len(selectedPackageItems) == 1) + self.__upgradePackagesAct.setEnabled( + len(selectedPackageItems) == 1 + and bool(selectedPackageItems[0].data(0, PipxWidget.LatestVersionRole)) + ) + self.__uninstallPackagesAct.setEnabled(len(selectedPackageItems) == 1) + self.__dependenciseSubmenuAct.setEnabled(len(selectedPackageItems) == 1) + self.__showOutdatedDependenciesAct.setEnabled( + len(selectedPackageItems) == 1 + and bool( + selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole) + ) + ) + self.__upgradeDependenciesAct.setEnabled( + len(selectedPackageItems) == 1 + and bool( + selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole) + ) + ) @pyqtSlot() def __installPackages(self): @@ -355,35 +371,47 @@ ) self.on_refreshButton_clicked() + def __checkPackageOutdated(self, itm): + """ + Private method to check, if a package item is outdated or has outdated + dependencies. + + @param itm reference to the package item + @type QTreeWidgetItem + @return flag indicating the outdated status + @rtype bool + """ + package = itm.text(PipxWidget.PackageColumn) + latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated(package) + if latestVersion is not None: + self.__markPackageOutdated(itm, latestVersion, outdatedDependencies) + isOutdated = True + elif ( + self.__plugin.getPreferences("IncludeOutdatedDependencies") + and outdatedDependencies + ): + self.__markPackageDependenciesOutdated(itm) + isOutdated = True + else: + self.__markPackageClean(itm) + isOutdated = False + return isOutdated + @pyqtSlot() def __checkOutdatedPackages(self): """ Private slot to check, if there are any outdated packages. """ - hasOutdated = False + outdatedItems = [] with EricOverrideCursor(): for row in range(self.packagesList.topLevelItemCount()): itm = self.packagesList.topLevelItem(row) - package = itm.text(PipxWidget.PackageColumn) - latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated( - package - ) - if latestVersion is not None: - self.__markPackageOutdated(itm, latestVersion, outdatedDependencies) - hasOutdated = True - elif ( - self.__plugin.getPreferences("IncludeOutdatedDependencies") - and outdatedDependencies - ): - self.__markPackageDependenciesOutdated(itm) - hasOutdated = True - else: - self.__markPackageClean(itm) - hasOutdated = False + if self.__checkPackageOutdated(itm): + outdatedItems.append(itm) self.__resizePackagesColumns() - self.__plugin.setOutdatedIndicator(hasOutdated) + self.__plugin.setOutdatedIndicator(bool(outdatedItems)) @pyqtSlot() def __upgradePackage(self): @@ -405,7 +433,12 @@ else: package = packageItem.text(PipxWidget.PackageColumn) self.__pipx.upgradePackage(package) - self.on_refreshButton_clicked() + packageItem = self.__getItemForPackage(package) + if packageItem: + self.__checkPackageOutdated(packageItem) + + self.__resizePackagesColumns() + self.__plugin.setOutdatedIndicator(self.__hasOutdatedItems()) @pyqtSlot() def __upgradeAllPackages(self): @@ -433,7 +466,6 @@ Private slot to upgrade the shared libraries. """ self.__pipx.upgradeSharedLibraries() - self.on_refreshButton_clicked() @pyqtSlot() def __uninstallPackage(self): @@ -545,7 +577,12 @@ """ package = self.__selectedPackages()[0] self.__pipx.upgradePackageDependencies(package=package) - self.on_refreshButton_clicked() + packageItem = self.__getItemForPackage(package) + if packageItem: + self.__checkPackageOutdated(packageItem) + + self.__resizePackagesColumns() + self.__plugin.setOutdatedIndicator(self.__hasOutdatedItems()) ####################################################################### ## Main widget related methods below @@ -690,6 +727,7 @@ self.__markPackageDependenciesOutdated(itm) self.__resizePackagesColumns() + self.__plugin.setOutdatedIndicator(bool(outdatedPackages)) @pyqtSlot(QTreeWidgetItem, int) def on_packagesList_itemActivated(self, item, column): @@ -711,25 +749,13 @@ """ Private slot to handle a change of selected packages and apps. """ - selectedPackages = self.__selectedPackages() selectedPackageItems = self.__selectedPackageItems() - self.upgradeButton.setEnabled(bool(selectedPackages)) - self.uninstallButton.setEnabled(len(selectedPackages) == 1) - - self.__dependenciseSubmenuAct.setEnabled(len(selectedPackages) == 1) - self.__showOutdatedDependenciesAct.setEnabled( - len(selectedPackages) == 1 - and bool( - selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole) - ) + self.upgradeButton.setEnabled( + len(selectedPackageItems) == 1 + and bool(selectedPackageItems[0].data(0, PipxWidget.LatestVersionRole)) ) - self.__upgradeDependenciesAct.setEnabled( - len(selectedPackages) == 1 - and bool( - selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole) - ) - ) + self.uninstallButton.setEnabled(len(selectedPackageItems) == 1) def __selectedPackages(self): """ @@ -814,3 +840,36 @@ allApps.extend(self.__packageApps(topItm)) return self.__getRunningApps(allApps) + + def __getItemForPackage(self, package): + """ + Private method to get a reference to the item of a given package. + + @param package package name + @type str + @return reference to the associated item + @rtype QTreeWidgetItem + """ + for row in range(self.packagesList.topLevelItemCount()): + itm = self.packagesList.topLevelItem(row) + if itm.text(PipxWidget.PackageColumn) == package: + return itm + + return None + + def __hasOutdatedItems(self): + """ + Private method to check, if the list of packages contains any entries + which is outdated or has outdated dependencies. + + @return flag indicating outdated items + @rtype bool + """ + for row in range(self.packagesList.topLevelItemCount()): + itm = self.packagesList.topLevelItem(row) + if itm.data(0, PipxWidget.LatestVersionRole) or itm.data( + 0, PipxWidget.OutdatedDependenciesRole + ): + return True + + return False
--- a/PluginPipxInterface.epj Sat Aug 24 15:36:20 2024 +0200 +++ b/PluginPipxInterface.epj Wed Aug 28 15:26:50 2024 +0200 @@ -69,7 +69,7 @@ "DocstringType": "eric_black", "EnabledCheckerCategories": "ASY, C, D, E, I, L, M, NO, N, Y, U, W", "ExcludeFiles": "*/Ui_*.py", - "ExcludeMessages": "C101,E203,E265,E266,E305,E402,M201,M701,M702,M811,M834,M852,N802,N803,N807,N808,N821,U101,W293,W503,Y119,Y401,Y402", + "ExcludeMessages": "M201,C101,E203,E265,E266,E305,E402,M251,M701,M702,M811,M834,M852,N802,N803,N807,N808,N821,U101,W293,W503,Y119,Y401,Y402", "FixCodes": "", "FixIssues": false, "FutureChecker": "",
--- a/PluginPipxInterface.py Sat Aug 24 15:36:20 2024 +0200 +++ b/PluginPipxInterface.py Wed Aug 28 15:26:50 2024 +0200 @@ -36,7 +36,7 @@ "author": "Detlev Offenbach <detlev@die-offenbachs.de>", "autoactivate": True, "deactivateable": True, - "version": "10.3.3", + "version": "10.3.4", "className": "PluginPipxInterface", "packageName": "PipxInterface", "shortDescription": "Graphical interface to the 'pipx' command.",