--- a/PipxInterface/PipxWidget.py Sat Jul 27 19:39:32 2024 +0200 +++ b/PipxInterface/PipxWidget.py Sun Jul 28 11:46:18 2024 +0200 @@ -36,6 +36,7 @@ AppPathRole = Qt.ItemDataRole.UserRole VersionRole = Qt.ItemDataRole.UserRole + 1 LatestVersionRole = Qt.ItemDataRole.UserRole + 2 + OutdatedDependenciesRole = Qt.ItemDataRole.UserRole + 3 def __init__(self, plugin, fromEric=True, parent=None): """ @@ -338,10 +339,16 @@ for row in range(self.packagesList.topLevelItemCount()): itm = self.packagesList.topLevelItem(row) package = itm.text(PipxWidget.PackageColumn) - latestVersion = self.__pipx.checkPackageOutdated(package) + latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated( + package + ) if latestVersion is not None: - self.__markPackageOutdated(itm, latestVersion) - # TODO: check outdated dependencies (configurable) + self.__markPackageOutdated(itm, latestVersion, outdatedDependencies) + elif ( + self.__plugin.getPreferences("IncludeOutdatedDependencies") + and outdatedDependencies + ): + self.__markPackageDependenciesOutdated(itm) self.__resizePackagesColumns() @pyqtSlot() @@ -470,7 +477,7 @@ self.packagesList.resizeColumnToContents(PipxWidget.VersionColumn) self.packagesList.resizeColumnToContents(PipxWidget.PythonVersionColumn) - def __markPackageOutdated(self, item, latestVersion): + def __markPackageOutdated(self, item, latestVersion, outdatedDependencies): """ Private method to mark the given package item as outdated. @@ -481,6 +488,7 @@ """ version = item.data(0, PipxWidget.VersionRole) item.setData(0, PipxWidget.LatestVersionRole, latestVersion) + item.setData(0, PipxWidget.OutdatedDependenciesRole, outdatedDependencies) item.setText( PipxWidget.VersionColumn, self.tr("{0} ({1})", "current version, latest version").format( @@ -489,6 +497,16 @@ ) item.setIcon(PipxWidget.VersionColumn, EricPixmapCache.getIcon("upgrade")) + def __markPackageDependenciesOutdated(self, item): + """ + Private method to mark the given package item as having outdated dependencies. + + @param item reference to the outdated package item + @type QTreeWidgetItem + """ + item.setData(0, PipxWidget.OutdatedDependenciesRole, True) + item.setIcon(PipxWidget.VersionColumn, EricPixmapCache.getIcon("upgrade")) + def __populatePackages(self): """ Private method to populate the packages list. @@ -512,6 +530,10 @@ for app, appPath in package["apps"]: itm = QTreeWidgetItem(topItem, [app]) itm.setData(0, PipxWidget.AppPathRole, appPath) + + if self.__plugin.getPreferences("AutoCheckOutdated"): + self.__checkOutdatedPackages() + self.__resizePackagesColumns() @pyqtSlot() @@ -528,8 +550,12 @@ if itm.isExpanded(): expandedPackages.append(itm.text(PipxWidget.PackageColumn)) latestVersion = itm.data(0, PipxWidget.LatestVersionRole) - if latestVersion is not None: - outdatedPackages[itm.text(PipxWidget.PackageColumn)] = latestVersion + outdatedDependencies = itm.data(0, PipxWidget.OutdatedDependenciesRole) + if latestVersion or outdatedDependencies: + outdatedPackages[itm.text(PipxWidget.PackageColumn)] = ( + latestVersion, + outdatedDependencies, + ) self.__populatePackages() @@ -539,11 +565,16 @@ if package in expandedPackages: itm.setExpanded(True) - if ( - package in outdatedPackages - and itm.data(0, PipxWidget.VersionRole) != outdatedPackages[package] - ): - self.__markPackageOutdated(itm, outdatedPackages[package]) + if package in outdatedPackages: + latestVersion, outdatedDependencies = outdatedPackages[package] + if itm.data(0, PipxWidget.VersionRole) != latestVersion: + self.__markPackageOutdated(itm, latestVersion, outdatedDependencies) + elif ( + itm.data(0, PipxWidget.OutdatedDependenciesRole) + != outdatedDependencies + and outdatedDependencies + ): + self.__markPackageDependenciesOutdated() self.__resizePackagesColumns() @@ -630,9 +661,13 @@ @rtype set of str """ runningApps = set() - - for proc in psutil.process_iter(["name"]): - if proc.info["name"] in apps: + venvs = self.venvsPathEdit.text() + for proc in psutil.process_iter(["name", "cmdline"]): + if ( + proc.info["name"] in apps + and proc.info["cmdline"] + and proc.info["cmdline"][0].startswith(venvs) + ): runningApps.add(proc.info["name"]) return runningApps